zoukankan      html  css  js  c++  java
  • python自动化测试之多线程生成BeautifulReport测试报告

      引言

      在前面讲过一遍Python接口自动化之ExtentHTMLTestRunner测试报告的文章,这篇分享另一种报告:BeautifulReport。此报告已经在Github上,地址:BeautifulReport

      应用背景,比如执行很多条用例,多线程跑测试用例,不可能每个线程生成一个测试报告,那所有线程生成一个测试报告,岂不完美? 有了BeautifulReport,就可以解决这个问题。

      环境配置

    python3.6 : BeautifulReport不支持2.7
    tomorrow : pip install tomorrow安装
    BeautifulReport : github下载后放到/Lib/site-packages/目录下
    

      安装方式1:

    # 会使用git的直接用git下载到本地
    git clone https://github.com/TesterlifeRaymond/BeautifulReport
    

      安装方式2:

      使用案例

      先看一下项目结构:

     

       测试用例代码:

    # -*- coding: utf-8 -*-
    '''
    @author: Leo
    
    @software: pycharm
    
    @file:  test_baidu.py
    
    @time: 2020/7/26 0026 21:33
    
    @Desc:
    
    '''
    __author__ = 'Leo'
    
    import os,unittest,time
    from selenium import webdriver
    from BeautifulReport import BeautifulReport
    from lxml import etree
    
    
    class TestBaidu(unittest.TestCase):
        """测试报告"""
        dr = None
        if not os.path.exists('img'):
            os.makedirs('img')
        img_path = r'img'
    
        @staticmethod
        def parse(html,xpath):
            """
                        解析页面中的元素并返回一个对象
                    :param xpath: 需要获取页面中的元素对应的xpath
                    :param html: 页面的html元素
                    :return:
                    """
            return etree.HTML(html).xpath(xpath)
    
        def save_img(self,img_name):
            """
                      传入一个img_name, 并存储到默认的文件路径下
                  :param img_name:
                  :return:
                  """
            self.dr.get_screenshot_as_file('{}/{}.png'.format(os.path.abspath(self.img_path),img_name))
            print("图片存放路径:{}".format(os.path.abspath(self.img_path)))
    
        @classmethod
        def setUpClass(cls) -> None:
            cls.dr = webdriver.Firefox()
            cls.url = 'https://www.baidu.com'
        @classmethod
        def tearDownClass(cls) -> None:
            cls.dr.close()
    
        def test_baidu_index(self):
            """
            测试访问首页正常, 并使用title进行断言
            """
            self.dr.get(self.url)
            print('打开浏览器, 访问: {}'.format(self.url))
            title = TestBaidu.parse(self.dr.page_source,'//title/text()')[0]
            print("获取对应的title: {}".format(title))
            self.assertEqual(title,"百度一下,你就知道")
    
        # 测试之前->截图,测试之后->截图
        @BeautifulReport.add_test_img('百度首页访问截图','点击按钮后截图')
        def test_save_img(self):
            """
            打开首页, 截图, 在截图后点击第一篇文章连接, 跳转页面完成后再次截图
            """
            self.dr.get(self.url)
            self.save_img('百度首页访问截图')
            self.dr.find_element_by_id('su').click()
            self.save_img('点击按钮后截图')
            title = TestBaidu.parse(self.dr.page_source, '//title/text()')[0]
            self.assertEqual(title,'百度一下,你就知道')
    
    
        # 测试出错->截图,名称与方法名一致
        @BeautifulReport.add_test_img('test_errors_save_imgs')
        def test_errors_save_imgs(self):
            """
                      如果在测试过程中, 出现不确定的错误, 程序会自动截图, 并返回失败, 如果你需要程序自动截图, 则需要咋测试类中定义 save_img方法
                  """
            self.dr.get(self.url)
            self.dr.find_element_by_id('kw22').send_keys('selenium')
    
        # 测试成功->截图,名称与方法名一致
        @BeautifulReport.add_test_img('test_success_case_img')
        def test_success_case_img(self):
            """
                       如果case没有出现错误, 即使使用了错误截图装饰器, 也不会影响case的使用
            """
            self.dr.get(self.url)
            self.dr.find_element_by_xpath('//title/text()')
            # title = TestBaidu.parse(self.dr.page_source, '//title/text()')[0]
            # print(title)
    

      主程序代码:

    # -*- coding: utf-8 -*-
    '''
    @author: Leo
    
    @software: pycharm
    
    @file:  run_main.py
    
    @time: 2020/7/26 0026 21:33
    
    @Desc:
    
    '''
    __author__ = 'Leo'
    
    
    import unittest,os,time
    from BeautifulReport import BeautifulReport
    from tomorrow import threads
    import sys
    sys.stdout.flush()
    
    if not os.path.exists('report'):
        os.makedirs('report')
    
    def add_case(case_path='./test_case', rule="test*.py"):
        '''加载所有的测试用例'''
    
        discover = unittest.defaultTestLoader.discover(case_path,
                                                      pattern=rule,
                                                      top_level_dir=None)
        return discover
    
    
    @threads(10)
    def run_case(test_suite):
        t1 = time.time()
        result = BeautifulReport(test_suite)
        result.report(filename='测试报告', description='访问百度', log_path='./report')
        t2 = time.time()
        print("运行时间:%s" % (t2 - t1))
    
    if __name__ == '__main__':
        cases = add_case()
        run_case(cases)
    
    
    # 启动线程 运行时间:20.49521040916443
    
    # 非多线程:运行时间:22.228379249572754
    

      报告效果图

       截图:

      代码都有注释,看不懂的可以看我的代码注释或者看源码:https://github.com/TesterlifeRaymond/BeautifulReport,需要注意的是如果只有一个用例模块,tomorrow效果是不明显的,所以我弄了两个,得出来的结论是:

    # 启动线程 运行时间:20.49521040916443
    
    # 非多线程:运行时间:22.228379249572754
    

      多线程和单线程的时候,用例数少的情况下,tomorrow的速度并不明显。

      总结

      多线程执行测试用例,输出测试报告的案例已经讲完,需要进一步学习,可以集成到平台上。另外,对测试开发及自动化测试感兴趣的伙伴可以加入我们学习交流QQ群,见右下角。

  • 相关阅读:
    洛谷 P1850 换教室(期望dp)
    简单异或 && 洛谷 P1469 找筷子 && 洛谷 P3908 数列之异或
    2020 CSP-J复赛题解
    2018 ICPC 南京 D Country Meow(模拟退火|三分)
    佩尔方程
    块速幂/光速幂
    1436F
    反Nim游戏
    P1447 [NOI2010]能量采集(莫比乌斯反演)
    P3768 简单的数学题 (莫比乌斯反演+杜教筛)
  • 原文地址:https://www.cnblogs.com/liudinglong/p/13388422.html
Copyright © 2011-2022 走看看