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群,见右下角。

 

posted @ 2020-07-27 23:32  全栈测试开发日记  阅读(850)  评论(0编辑  收藏  举报