Python Selenium自动化测试框架 持续集成Jenkins

Time will tell.

1、安装

xmlrunner

使用 Jenkins 执行测试时,测试代码中需要用到 xmlrunner 模块。

 pip install xmlrunner


jenkins

  1. 下载jekins
  • https://jenkins.io/download/

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

Python Selenium自动化测试框架  持续集成Jenkins

  1. 解压后运行jenkins.msi这个文件,然后一直下一步。
    Python Selenium自动化测试框架  持续集成Jenkins

  2. http://localhost:8080登录。

  3. 根据提示输入密码后,下一步。
    Python Selenium自动化测试框架  持续集成Jenkins

  4. 这里第一个应该是默认安装 jenkins community 的常用插件,第二个应该是选择需要安装的插件。不熟悉的时候选第一个就是了。
    Python Selenium自动化测试框架  持续集成Jenkins

  5. 插件安装成功后如下图。

    如果这步有部分插件安装失败的话,就重新下载,实在安装不了就重启Jenkins服务(Windows的服务里重启),然后重新登陆后跳过这步,安装失败的插件以后再在Jenkins的插件管理中去安装。
    Python Selenium自动化测试框架  持续集成Jenkins

  6. 安装完成。
    Python Selenium自动化测试框架  持续集成Jenkins

2、新建任务

  1. 首页点击【新建】。
    Python Selenium自动化测试框架  持续集成Jenkins

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

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

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

    第一个:分钟(0-59)

    第二个:小时(0-23)

    第三个:日(1-31)

    第四个:月份(1-12)

    第五个:星期几(0-7,0和7都代表星期日)
    Python Selenium自动化测试框架  持续集成Jenkins

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

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

    python smoketests.py
    Python Selenium自动化测试框架  持续集成Jenkins

  5. 构建后操作,增加操作步骤,选择 Publish JUnit test result report,然后在测试报告字段填写 测试报告/*.xml。

    测试报告是测试套件中配置的output参数的值,看下面的smoketests.py的代码就知道了。这样Jenkins每次运行测试的时候都会从这个文件夹读取测试结果。
    Python Selenium自动化测试框架  持续集成Jenkins

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

  7. 点击下图的【立即构建】,蓝色就代表成功了。
    Python Selenium自动化测试框架  持续集成Jenkins

  8. 点击上图的最新测试结果可以查看最新的测试结果。

    也可以点击具体Build History下面的时间,查看具体哪一次构建的测试结果,点击蓝色的球形图标的话,可以查看控制台输出。
    Python Selenium自动化测试框架  持续集成Jenkins
    Python Selenium自动化测试框架  持续集成Jenkins
    下面的代码部分,主要的就是测试套件中的这句,其他的自己随便写一个或几个测试用例就行了

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

3、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)

4、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__':51     # 加verbosity=2参数,在命令行中显示具体的测试方法
    unittest.main(verbosity=2)

5、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__':54     # 加verbosity=2参数,在命令行中显示具体的测试方法
    unittest.main(verbosity=2)

学习犹如逆水行舟,不进则退。

测试工程师职业发展路线:
功能测试 — 接口测试 — 自动化测试 — 测试开发 — 测试架构师

如果你对Python自动化软件测试、面试题等更多内容感兴趣,在这里推荐一个学习资料分享扣裙:175317069。有各项已整理好的测试学习资源,也有行业深潜多年的技术人分析讲解。

作为测试工程师,不断提升自己工作能力是提高薪资待遇最重要的基础。另外也要注重学习, IT 行业是个不断发展、更新迭代相对较快的行业,技术具有明显的时代特征,所以紧跟时代技术的发展才能让自己不掉队,在职场当中具有足够的竞争力。

好喽,内容分享就带这里。

觉得还不错,欢迎【点赞】、【评论】、【关注】喔~

Time will tell.(时间会说明一切)

上一篇:实验二 结构化分析与设计


下一篇:NoSuchMethodError 解决方法