(一)安装xmlrunner

使用Jenkins执行测试时,测试代码中会用到这个模块。

pip install xmlrunner

下文安装Jenkins环境:Windows 10

Ubuntu安装Jenkins可参考:https://www.cnblogs.com/clemente/p/10642760.html

亲测可行。

(二)安装jenkins

(1)   下载jekins

https://jenkins.io/download/

下载适合自己的,我是下载长期稳定版的。

(2)   解压后运行jenkins.msi这个文件,然后一直下一步就是了。

(3)   http://localhost:8080 登录

(4)   根据提示输入密码后,下一步。

(6)   这里第一个应该是默认安装jenkins community的常用插件,第二个应该是选择需要安装的插件。不熟悉的时候选第一个就是了。

(7)   插件安装成功后如下图所示。(如果这步有部分插件安装失败的话,就重新下载,实在安装不了就重启Jenkins服务(Windows的服务里重启),然后重新登陆后跳过这步,安装失败的插件以后再在Jenkins的插件管理中去安装)

(8)   安装完成。

(三)新建任务

(1)      首页点击【新建】。

(2)      填写相关信息后,点击【确定】。

(3)      构建触发器设置自动构建的时间。下面的是工作日每晚10点自动执行,这样第二天早上上班就能看到测试结果了。

这里有5个参数:可以点击后面?查看说明文档,*代表任意时间

第一个:分钟(0-59)

第二个:小时(0-23)

第三个:日(1-31)

第四个:月份(1-12)

第五个:星期几(0-7,0和7都代表星期日)

(4)      构建部分增加构建步骤,这里选择Windows批处理命令。

copy F:\Python\firstselenium\smoketest\*.py

python smoketests.py

(5)      构建后操作,增加操作步骤,选择Publish JUnit test result report,然后在测试报告字段填写 测试报告/*.xml。(测试报告是测试套件中配置的output参数的值,看下面的smoketests.py的代码就知道了)这样Jenkins每次运行测试的时候都会从这个文件夹读取测试结果。

(6)      配置完成后点击【保存】。

(7)      点击下图的【立即构建】,蓝色就代表成功了。

(8)      点击上图的最新测试结果可以查看最新的测试结果。(也可以点击具体Build History下面的时间,查看具体哪一次构建的测试结果,点击蓝色的球形图标的话,可以查看控制台输出)

下面的代码部分,主要的就是测试套件中的这句,其他的自己随便写一个或几个测试用例就行了

xmlrunner.XMLTestRunner(verbosity=2,output='测试报告').run(smoke_tests)

(四)smoketests.py

 import unittest
from searchtest import SearchTest
from homepagetest import HomePageTest
from xmlrunner import xmlrunner
#获取SearchTest类 和 HomePageTest类中的所有测试方法
search_test = unittest.TestLoader().loadTestsFromTestCase(SearchTest)
home_page_test = unittest.TestLoader().loadTestsFromTestCase(HomePageTest)
#创建一个包括SearchTest和HomePageTest的测试套件
smoke_tests = unittest.TestSuite([home_page_test,search_test])
#运行测试套件
# unittest.TextTestRunner(verbosity=2).run(smoke_tests)
xmlrunner.XMLTestRunner(verbosity=2,output='测试报告').run(smoke_tests)

(五)searchtest.py

 import  sys
import unittest
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
class SearchTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.driver = webdriver.Chrome()
# cls.driver.implicitly_wait(20)
cls.driver.maximize_window()
cls.driver.get("https://www.cnblogs.com/") def test_search_by_category(self):
category_list = ['Java', 'C++', 'PHP', 'Delphi', 'Python', 'Ruby',\
'C语言', 'Erlang', 'Go', 'Swift', 'Scala', 'R语言', 'Verilog', '其它语言']
#定位首页网站分类中的编程语言
search_class = self.driver.find_element_by_xpath('//li/a[@href="/cate/2/"]')
#光标悬停在“编程语言”上
ActionChains(self.driver).move_to_element(search_class).perform()
WebDriverWait(self.driver, 20).until(lambda l: len(l.find_elements_by_xpath( \
'//div[@id="cate_content_block_2"]/div[@class="cate_content_block"]/ul/li')) == 14)
# 以列表形式返回编程语言下的所有小类
search_small = self.driver.find_elements_by_xpath(\
'//div[@id="cate_content_block_2"]/div[@class="cate_content_block"]/ul/li')
small_cate = []
for s in search_small:
#去掉小类最后面的(0),并添加到列表small_cate中
small = str(s.text).split('(')
small_cate.append(small[0])
#检查表达式是否为true(此处检查编程语言下的小类是否与预期结果一致)
self.assertTrue(small_cate == category_list)
self.assertEqual(small_cate,category_list) def test_search_by_look(self):
seach_class = self.driver.find_element_by_xpath('//li/a[@href="/cate/2/"]')
#定位编程语言下的小类Python
seach_small = self.driver.find_element_by_xpath('//li/a[@href="/cate/python/"]')
ActionChains(self.driver).move_to_element(seach_class).click(seach_small).perform()
#检查打开的网页标题是不是 Python - 网站分类 - 博客园
self.assertEqual(self.driver.title,"Python - 网站分类 - 博客园" ) @classmethod
def tearDownClass(cls):
cls.driver.quit()
#加上下面2句,可以通过命令行运行测试,不加的话不影响通过IDE运行测试
if __name__ == '__main__': #加verbosity=2参数,在命令行中显示具体的测试方法
unittest.main(verbosity=2)

(六)homepagetest.py

 import sys
import unittest
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
class HomePageTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.driver = webdriver.Chrome()
cls.driver.implicitly_wait(10)
cls.driver.maximize_window()
cls.driver.get("https://www.cnblogs.com/") def test_search_field(self):
#检查博客园首页有没有搜索框,is_element_present()是自定义的方法
self.assertTrue(self.is_element_present(By.ID,"zzk_q"))
def test_search_btn(self):
# 检查博客园首页有没有找找看按钮
self.assertTrue(self.is_element_present(By.CLASS_NAME,"search_btn")) # 检查博客园首页菜单栏信息是否与预期一致
def test_menu(self):
menu_data =['园子https://home.cnblogs.com/', '新闻https://news.cnblogs.com/',
'博问https://q.cnblogs.com/', '闪存https://ing.cnblogs.com/',
'小组https://group.cnblogs.com/', '收藏https://wz.cnblogs.com/',
'招聘https://job.cnblogs.com/', '班级https://edu.cnblogs.com/',
'找找看http://zzk.cnblogs.com/']
#以列表形式返回博客园首页菜单栏信息
self.check_menu = self.driver.find_elements_by_xpath('//div[@id="nav_menu"]/a')
the_menu = []
for c in self.check_menu:
#将博客园首页的菜单名称和URL添加到列表the_menu
the_menu.append(c.text + c.get_attribute('href'))
#检查2个列表是否一致(检查博客园首页的菜单名称及URL是否和预期一致)
self.assertListEqual(the_menu,menu_data) # 找到元素,返回True,否则返回False
def is_element_present(self,how,what):
try:
self.driver.find_element(by=how,value = what)
except NoSuchElementException as e:
return False
return True @classmethod
def tearDownClass(cls):
cls.driver.quit() # 加上下面2句,可以通过命令行运行测试,不加的话不影响通过IDE运行测试
if __name__ == '__main__': # 加verbosity=2参数,在命令行中显示具体的测试方法
unittest.main(verbosity=2)

Python+Selenium笔记(十八):持续集成jenkins的更多相关文章

  1. python 学习笔记十八 django深入学习三 分页,自定义标签,权限机制

    django  Pagination(分页) django 自带的分页功能非常强大,我们来看一个简单的练习示例: #导入Paginator>>> from django.core.p ...

  2. Python+Selenium笔记(八):操作下拉菜单

    (一) Select类 Select类是selenium的一个特定的类,用来与下拉菜单和列表交互. 下拉菜单和列表是通过HTML的<select> 元素实现的.选择项是通过<sele ...

  3. python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置

    python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置Download JetBrains Python IDE :: PyCharmhttp://www. ...

  4. Selenium Web 自动化 - 项目持续集成(进阶)

    Selenium Web 自动化 - 项目持续集成(进阶) 2017-03-09 目录 1 背景及目标2 环境配置  2.1 SVN的安装及使用  2.2 新建Jenkins任务3 过程分析 1 背景 ...

  5. Selenium Web 自动化 - 项目持续集成

    Selenium Web 自动化 - 项目持续集成 2017-02-13 目录 1环境准备  1.1 安装git  1.2 安装jenkins  1.3 安装jenkins插件  1.4 jekins ...

  6. Spring Boot 2.X(十八):集成 Spring Security-登录认证和权限控制

    前言 在企业项目开发中,对系统的安全和权限控制往往是必需的,常见的安全框架有 Spring Security.Apache Shiro 等.本文主要简单介绍一下 Spring Security,再通过 ...

  7. 这些年我们一起搞过的持续集成~Jenkins+Perl and Shell script

    这些年我们一起搞过的持续集成~Jenkins+Perl and Shell script ##转载注明出处:http://www.cnblogs.com/wade-xu/p/4378224.html ...

  8. Python学习笔记(八)

    Python学习笔记(八): 复习回顾 递归函数 内置函数 1. 复习回顾 1. 深浅拷贝 2. 集合 应用: 去重 关系操作:交集,并集,差集,对称差集 操作: 定义 s1 = set('alvin ...

  9. 自动化持续集成Jenkins

    自动化持续集成Jenkins 使用Jenkins配置自动化构建http://blog.csdn.net/littlechang/article/details/8642149 Jenkins入门总结h ...

  10. 持续集成~Jenkins构建GitHub项目的实现

    有了前两讲的基础,这回我们就可以把github上的项目做到CI(jenkins)里了,让它自动去集成部署,持续集成~Jenkins里的NuGet和MSBuild插件,持续集成~Jenkins里的pow ...

随机推荐

  1. tensorflow 根据节点名称获取节点

    ckpt_file = os.path.join(self.args.bert_dir, 'model.ckpt-6123') # 获取图的reader reader = self.tf_instan ...

  2. Vue.js基础拾遗

    本篇目录: 模版语法 插值 指令 v-bind指令 v-on指令 计算属性与侦听器 计算属性VS方法 计算属性VS侦听属性 Class与Style绑定 绑定HTML Class 绑定内联样式 条件渲染 ...

  3. lucene-01-简介

    1, 介绍 hadoop作者开发的 hdfs最开始作为netch的文件存储来使用的 2, 存储结构 lucene快的原因, 是因为添加数据的时候会对数据进行分词, 将分词后的词建立索引, 存储到索引库 ...

  4. CentOS系统中文改英文

    一.进入语言配置文件 vi  /etc/sysconfig/i18n 用SSH执行以上命令,用vi编辑器修改/etc/sysconfig/i18n文件. 二.修改语言 将默认的LANG="z ...

  5. 拓展KMP算法详解

    拓展KMP解决的问题是给两个串S和T,长度分别是n和m,求S的每一个后缀子串与T的最长公共前缀分别是多少,记作extend数组,也就是说extend[i]表示S[i,n-1](i从0开始)和T的最长公 ...

  6. SpringCloud+Hystrix服务容错

    Netflix Hystrix — 应对复杂分布式系统中的延时和故障容错 +应用场景 分布式系统中经常会出现某个基础服务不可用造成整个系统不可用的情况, 这种现象被称为服务雪崩效应. 为了应对服务雪崩 ...

  7. 猜生日 Java小游戏

    最近看到一个很有趣的小游戏: 询问朋友5个问题,找到他出生在一个月的哪一天.每个问题都是询问他的生日是否是5个数字集合中的一个. 这5个集合分别是: set1:1 3 5 7 9 11 13 15 1 ...

  8. 1.Strategy Pattern(策略模式)

    策略模式(Strategy Pattern): 我的理解,将代码中每个变化之处抽出,提炼成一个一个的接口或者抽象类,让这些变化实现接口或继承抽象类成为具体的变化类.再利用多态的功能,可将变化之处用接口 ...

  9. volatile关键值

    happens-before原则 我们编写的程序都要经过优化后(编译器和处理器会对我们的程序进行优化以提高运行效率)才会被运行,优化分为很多种,其中有一种优化叫做重排序,重排序需要遵守happens- ...

  10. 排序算法(4)--Selection Sorting--选择排序[1]--Simple Selection Sort--简单(直接)选择排序

    1.基本思想   在要排序的一组数中,选出最小的一个数与第一个位置的数交换:然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止. 2.实现原理 每趟从待排序的 ...