python自动化测试之多线程生成BeautifulReport测试报告

发表于:2021-12-02 09:28

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:全栈测试开发日记    来源:CSDN

分享:
  引言
  在前面讲过一遍Python接口自动化之ExtentHTMLTestRunner测试报告的文章,这篇分享另一种报告:BeautifulReport。此报告已经在Github上,地址:BeautifulReport。
  应用背景,比如执行很多条用例,多线程跑测试用例,不可能每个线程生成一个测试报告,那所有线程生成一个测试报告,岂不完美?有了BeautifulReport,就可以解决这个问题。
  环境配置
  python3.6:BeautifulReport不支持2.7
  tomorrow:pipinstalltomorrow安装
  BeautifulReport:github下载后放到/Lib/site-packages/目录下
  安装方式1:
  #会使用git的直接用git下载到本地
  gitclonehttps://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的速度并不明显。

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号