• 有很多种自动化测试报告样式,接下来主要看下这些常用样式的效果是怎样的

  • 每个样式各有特点,选择自己喜欢的使用就好了

  • 自动化测试时你用的最多的是哪个呢?

1 框架设计(准备工作)

  • 我们需要把HTMLTestRunner、BeautifulReport、HTMLReport、Allure这几个报告样式用在自动化测试框架中;

  • 以下是我们设计了一个简易的WebUI自动化框架,便于后续的报告样式讲解使用。

1.1 简易框架图

图片

在这里插入图片描述

1.2 common/reportOut.py
  • 报告的封装,详细的在后续的内容讲解;

1.3 report
  • 存放报告的路径;

  • common/reportOut.py中指定存放在此处。

1.4 testcase/test_baidu.py
  • 写了一个简单的用例,用于后续报告数据的展示;

  • 用例中3个成功,2个失败,故意这样设计是为了查看报告的样式显示;

  • 脚本如下:


  1. # 作者:虫无涯

  2. # 日期:2023/7/7

  3. # 文件名称:test_baidu.py

  4. # Function:打开百度网主页,在搜索栏输入“helloworld”

  5. from selenium import webdriver

  6. from selenium.webdriver.common.keys import Keys

  7. import time

  8. import unittest

  9. class Test_Baidu(unittest.TestCase):

  10. @classmethod

  11. def setUpClass(cls) -> None:

  12. cls.driver = webdriver.Chrome() # 打开Chrome浏览器

  13. cls.driver.get("http://www.baidu.com") # 输入百度网址

  14. print("============验证浏览器的基本控制==========")

  15. @classmethod

  16. def tearDownClass(cls) -> None:

  17. cls.driver.quit() # 关闭浏览器

  18. def test_01_search(self):

  19. """1、搜索helloworld.并回车......"""

  20. time.sleep(2)

  21. self.driver.find_element_by_id("kw").send_keys("helloworld") # 输入“helloworld”

  22. time.sleep(2)

  23. self.driver.find_element_by_id("kw").send_keys(Keys.ENTER) # 回车进行搜索

  24. time.sleep(2)

  25. self.driver.maximize_window() # 最大化当前窗口

  26. time.sleep(0.5)

  27. size = self.driver.get_window_size()

  28. print(type(size))

  29. get_size = {'height': 696, 'width': 1296} # 根据自己电脑的最大化尺寸赋值

  30. self.assertEqual(size, get_size, "最大化窗口失败~")

  31. def test_02_windows_size(self):

  32. """2、浏览器窗口大小缩小为640*480......"""

  33. time.sleep(2)

  34. self.driver.set_window_size(640, 480) # 控制浏览器显示尺寸为640*480

  35. time.sleep(2)

  36. get_size = {'height': 480, 'width': 640}

  37. size = self.driver.get_window_size()

  38. self.assertEqual(size, get_size, "设置窗口为640*480失败~")

  39. def test_03_back_refresh(self):

  40. """3、先进行浏览器后退,再次输入csdn进行搜索"""

  41. self.driver.maximize_window() # 最大化当前窗口

  42. self.driver.back()

  43. input_text = "csdn"

  44. self.driver.find_element_by_id("kw").send_keys(input_text) # 输入csdn

  45. time.sleep(1)

  46. get_text = self.driver.find_element_by_id("kw").text

  47. self.assertEqual(get_text, input_text, "输入内容失败~")

  48. def test_04_serach_clear(self):

  49. """4、清空输入的内容......"""

  50. self.driver.refresh() # 刷新

  51. self.driver.find_element_by_id("kw").send_keys("csdn") # 输入csdn

  52. time.sleep(2)

  53. self.driver.find_element_by_id("kw").clear()

  54. time.sleep(0.5)

  55. get_text = self.driver.find_element_by_id("kw").text

  56. self.assertEqual(get_text, "", "清空内容失败~")

  57. def test_05_csdn(self):

  58. """5、进入csdn官网"""

  59. self.driver.find_element_by_id("kw").send_keys("csdn") # 输入csdn

  60. time.sleep(2)

  61. self.driver.find_element_by_id("kw").send_keys(Keys.ENTER) # 回车进行搜索

  62. time.sleep(2)

  63. self.driver.find_element_by_xpath("//*[@id='1']/h3/a[1]").click()

  64. time.sleep(2)

  65. windows = self.driver.window_handles

  66. self.driver.switch_to.window(windows[-1])

  67. now_url = self.driver.current_url

  68. m_get_url = "https://www.csdn.net/"

  69. self.assertEqual(now_url, m_get_url, "经过判断,没有进入csdn官网")

  70. if __name__ == '__main__':

  71. unittest.main()

1.5 mian.py
  • 框架的主入口;

  • 脚本如下:


  1. # -*- coding:utf-8 -*-

  2. # 作者:虫无涯

  3. # 日期:2023/7/7

  4. # 文件名称:main.py

  5. # 作用:框架的主入口函数

  6. # coding=utf-8

  7. import time

  8. from common.reportOut import report_out

  9. import os

  10. def run_case():

  11. print("======开始执行!!!======")

  12. curpath = os.path.dirname(os.path.realpath(__file__))

  13. report_dir = os.path.join(curpath, "report/") # 测试报告存放目录

  14. test_dir = os.path.join(curpath, "testcase/") # 测试用例读取目录

  15. name_project = "BaiDu "

  16. report_out(test_dir, report_dir, name_project)

  17. time.sleep(5)

  18. print("======执行结束!!!======")

  19. if __name__ == '__main__':

  20. run_case()

2 HTMLTestRunner

2.1 下载使用
  • 直接下载对应的HTMLTestRunner.py版本,放到项目的common目录下,进行调用即可;

  • 下载路径:


  1. 链接:https://pan.baidu.com/s/1br2jtJf1IBFCMpcPyupGOg

  2. 提取码:fumb

2.2 reportOut.py设计

  1. # -*- coding:utf-8 -*-

  2. # 作者:虫无涯

  3. # 日期:2023/7/7

  4. # 文件名称:reportOut.py

  5. # 作用:封装测试报告功能

  6. import time

  7. import unittest

  8. from common import HTMLTestRunner # 引入导入的报告模板

  9. # from BeautifulReport import BeautifulReport as bf

  10. def report_out(test_dir, report_dir, name_project):

  11. '''

  12. :test_dir: 用例路径

  13. :report_dir : 报告路径

  14. :name_project : 项目名称=>用于报告命名及描述

  15. :return: 无

  16. '''

  17. now = time.strftime("%Y_%m_%d %H_%M_%S")

  18. discover = unittest.defaultTestLoader.discover(test_dir,pattern='test*.py') # 加载测试用例

  19. report_name = report_dir + now + '-' + name_project+'_test_report.html'# 报告名称

  20. with open(report_name,'wb') as f: # 运行用例生成测试报告

  21. runner = HTMLTestRunner.HTMLTestRunner(stream=f,

  22. title=name_project + 'WebUI Auto Testing Report',

  23. description=(name_project + U"美多商城UI自动化功能回归测试"),

  24. verbosity=2)

  25. runner.run(discover)

  26. f.close()

  27. """

  28. stream:要操作的文件;

  29. title:测试报告标题;

  30. description:报告描述;

  31. verbosity:报告级别。

  32. """

2.3 报告样式效果
  • 直接运行main.py,即可;

  • 样式如下:

    图片

  • 错误的用例:

    图片

  • 失败的用例:

    图片

3 BeautifulReport

3.1 下载安装
  • 直接使用命令安装即可:

pip install BeautifulReport

图片

在这里插入图片描述

3.2 使用方法
  • 直接调用即可;

  • 直接在reportOut.py设计调用方法。

3.3 reportOut.py设计
  • 屏蔽掉调用HTMLTestRunner的方法;

  • 重新设计调用BeautifulReport的方法;

  • 脚本如下:


  1. # -*- coding:utf-8 -*-

  2. # 作者:虫无涯

  3. # 日期:2023/7/7

  4. # 文件名称:reportOut.py

  5. # 作用:封装测试报告功能

  6. import time

  7. import unittest

  8. # from common import HTMLTestRunner # 引入导入的报告模板

  9. from BeautifulReport import BeautifulReport as bf

  10. def report_out(test_dir, report_dir, name_project):

  11. '''

  12. :test_dir: 用例路径

  13. :report_dir : 报告路径

  14. :name_project : 项目名称=>用于报告命名及描述

  15. :return: 无

  16. '''

  17. now = time.strftime("%Y_%m_%d %H_%M_%S")

  18. discover = unittest.defaultTestLoader.discover(test_dir,pattern='test*.py') # 加载测试用例

  19. report_name = now + '-' + name_project + '_test_report.html'# 报告名称

  20. run = bf(discover)

  21. run.report(filename=report_name, report_dir=report_dir, description=U"美多商城UI自动化功能回归测试")

  22. """

  23. stream:要操作的文件;

  24. title:测试报告标题;

  25. description:报告描述;

  26. verbosity:报告级别。

  27. """

3.4 报告样式效果
  • 全部样式效果:

图片

在这里插入图片描述

  • 错误样式:

    图片

  • 失败用例样式:

    图片

4 HTMLReport

4.1 下载安装
  • 直接使用命令安装即可:


  1. pip install HTMLReport


  1. C:\Users\Administrator>pip install HTMLReport

  2. Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple

  3. Collecting HTMLReport

  4. Using cached https://pypi.tuna.tsinghua.edu.cn/packages/ea/f5/b95ada8e79548e60b690207f41f18aedc9bdacafce7afaa91aefeb514b18/HTMLReport-2.3.1-py3-none-any.whl (33 kB)

  5. Installing collected packages: HTMLReport

  6. Successfully installed HTMLReport-2.3.1

  7. C:\Users\Administrator>

4.2 使用方法
  • 直接调用即可,屏蔽掉调用HTMLTestRunner、BeautifulReport

  • 重新设计调用HTMLReport的方法;

  • 脚本如下:


  1. # -*- coding:utf-8 -*-

  2. # 作者:虫无涯

  3. # 日期:2023/7/7

  4. # 文件名称:reportOut.py

  5. # 作用:封装测试报告功能

  6. import time

  7. import unittest

  8. # from common import HTMLTestRunner # 引入导入的报告模板

  9. # from BeautifulReport import BeautifulReport as bf

  10. from HTMLReport import ddt, TestRunner, add_image, no_retry, retry

  11. def report_out(test_dir, report_dir, name_project):

  12. '''

  13. :test_dir: 用例路径

  14. :report_dir : 报告路径

  15. :name_project : 项目名称=>用于报告命名及描述

  16. :return: 无

  17. '''

  18. now = time.strftime("%Y_%m_%d %H_%M_%S")

  19. discover = unittest.defaultTestLoader.discover(test_dir, pattern='test*.py') # 加载测试用例

  20. # report_name = now + '-' + name_project + '_test_report.html' # 报告名称

  21. test_runner = TestRunner(

  22. report_file_name=now,

  23. output_path=report_dir,

  24. title=name_project,

  25. description="关于HTMLReport的实际项目应用",

  26. thread_count=1,

  27. thread_start_wait=0.1,

  28. tries=0,

  29. delay=0,

  30. back_off=1,

  31. retry=True,

  32. sequential_execution=True,

  33. lang="cn"

  34. )

  35. test_runner.run(discover)

4.3 参数说明
参数 说明
report_file_name 报告文件名,如果未赋值,将采用“test+时间戳”
log_file_name 日志文件名,如果未赋值,将采用报告文件名,如果报告文件名也没有,将采用“test+时间戳”
output_path 报告保存文件夹名,默认“report
title 报告标题,默认“测试报告”
description 报告描述,默认“无测试描述”
tries 重试次数
delay 重试延迟间隔,单位为 秒
back_off 扩展每次重试等待时间的乘数
max_delay 最大重试等待时间长度,单位为 秒
retry 如果为 True 表示所有用例遵循重试规则,False 只针对添加了 @retry 用例有效
thread_count 并发线程数量(无序执行测试),默认数量 1
thread_start_wait 各线程启动延迟,默认 0 s
sequential_execution 是否按照套件添加(addTests)顺序执行, 会等待一个addTests执行完成,再执行下一个,默认 False。如果用例中存在 tearDownClass ,建议设置为True否则 tearDownClass 将会在所有用例线程执行完后才会执行。
lang ("cn", "en") 支持中文与英文报告输出,默认采用中文
image 默认支持添加图片,False 放弃所有图片添加
failed_image true 只有失败才添加图片,成功用例添加的图片会被删除
4.4 报告样式效果
  • 整体效果:

    图片

  • 中英文切换

    图片

  • 错误用例效果:

    图片

  • 失败用例效果

    图片

5 Allure

5.1 allure-pytest插件安装
pip3 install allure-pytest

  1. C:\Users\Administrator>pip3 install allure-pytest

  2. Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple

  3. Requirement already satisfied: allure-pytest in d:\python37\lib\site-packages (2.8.12)

  4. Requirement already satisfied: six>=1.9.0in d:\python37\lib\site-packages (from allure-pytest) (1.15.0)

  5. Requirement already satisfied: allure-python-commons==2.8.12in d:\python37\lib\site-packages (from allure-pytest) (2.8.12)

  6. Requirement already satisfied: pytest>=4.5.0in d:\python37\lib\site-packages (from allure-pytest) (6.2.4)

  7. Requirement already satisfied: attrs>=16.0.0in d:\python37\lib\site-packages (from allure-python-commons==2.8.12->allure-pytest) (20.3.0)

  8. Requirement already satisfied: pluggy>=0.4.0in d:\python37\lib\site-packages (from allure-python-commons==2.8.12->allure-pytest) (0.13.1)

  9. Requirement already satisfied: importlib-metadata>=0.12in d:\python37\lib\site-packages (from pytest>=4.5.0->allure-pytest) (2.1.1)

  10. Requirement already satisfied: iniconfig in d:\python37\lib\site-packages (from pytest>=4.5.0->allure-pytest) (1.1.1)

  11. Requirement already satisfied: py>=1.8.2in d:\python37\lib\site-packages (from pytest>=4.5.0->allure-pytest) (1.10.0)

  12. Requirement already satisfied: packaging in d:\python37\lib\site-packages (from pytest>=4.5.0->allure-pytest) (20.8)

  13. Requirement already satisfied: colorama in d:\python37\lib\site-packages (from pytest>=4.5.0->allure-pytest) (0.4.4)

  14. Requirement already satisfied: atomicwrites>=1.0in d:\python37\lib\site-packages (from pytest>=4.5.0->allure-pytest) (1.4.0)

  15. Requirement already satisfied: toml in d:\python37\lib\site-packages (from pytest>=4.5.0->allure-pytest) (0.10.2)

  16. Requirement already satisfied: zipp>=0.5in d:\python37\lib\site-packages (from importlib-metadata>=0.12->pytest>=4.5.0->allure-pytest) (1.2.0)

  17. Requirement already satisfied: pyparsing>=2.0.2in d:\python37\lib\site-packages (from packaging->pytest>=4.5.0->allure-pytest) (2.4.7)

5.2 pytest安装

  1. pip3 install pytest

5.3 allure文件下载
  • 下载地址:https://github.com/allure-framework/allure2/releases;

    图片

  • 往下找,找到下载链接,这里使用的Windows操作系统,所以下载zip文件:

    图片

  • 如果以上下载比较慢,可以使用以下地址:

https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/

5.4 allure环境变量配置
  • 下载后解压到本地即可,比如:

    图片


  1. D:\allure-2.21.0\bin

  • 然后把以上路径添加到系统环境变量中:

    图片

5.5 配置java环境
  • 因为allure是依赖java环境的,所以还需要配置java变量;

  • 详细java环境配置可以直接网上搜索即可,或者查看本文有关java的配置:Jmeter安装配置详细教程。

5.6 查看allure版本

  1. allure --version


  1. C:\Users\Administrator>allure --version

  2. 2.13.2

5.7 设计用例
  • 这里我们重新写一个脚本,不在以上代码框架中运行,因为Allure用的是pytest框架,以上时unittest框架;

  • 脚本为:


  1. # -*- coding:utf-8 -*-

  2. # 作者:虫无涯

  3. # 日期:2023/7/7

  4. # 文件名称:test_xxx.py

  5. # 作用:示例

  6. # 联系:VX(NoamaNelson)

  7. # 博客:https://blog.csdn.net/NoamaNelson

  8. import pytest

  9. import time

  10. class TestCase01():

  11. def test_case_01(self):

  12. time.sleep(1)

  13. print("case01$$$$$$$$$$$$$$$$$$$$$")

  14. def test_case_02(self):

  15. time.sleep(1)

  16. print("case02$$$$$$$$$$$$$$$$$$$$$")

  17. def test_case_03(self):

  18. time.sleep(1)

  19. print("case03$$$$$$$$$$$$$$$$$$$$$")

  20. def test_case_04(self):

  21. time.sleep(1)

  22. print("case04$$$$$$$$$$$$$$$$$$$$$")

  23. def test_case_05(self):

  24. time.sleep(1)

  25. print("case05$$$$$$$$$$$$$$$$$$$$$")

  26. def test_case_06(self):

  27. time.sleep(1)

  28. print("case06$$$$$$$$$$$$$$$$$$$$$")

  29. class TestCase02():

  30. def test_case_07(self):

  31. time.sleep(1)

  32. print("case07$$$$$$$$$$$$$$$$$$$$$")

  33. def test_case_08(self):

  34. time.sleep(1)

  35. print("case08$$$$$$$$$$$$$$$$$$$$$")

  36. def test_case_09(self):

  37. time.sleep(1)

  38. print("case08$$$$$$$$$$$$$$$$$$$$$")

  39. if __name__ == '__main__':

  40. pytest.main(["-s", "test_xxx.py"])

5.8 执行方法
  • 执行pytest -n auto --alluredir=xxx/xxx/xxx来运行查看测试结果,其中--alluredir是指定报告存放的路径,比如:


  1. pytest -n auto --alluredir=allure

  • 我只运行以上代码,所以我指定了要运行的脚本为:test_xxx.py,报告存放路径在当前脚本的路径:


  1. pytest -n auto --alluredir=allure test_xxx.py

  • 运行:


  1. gw0 [9] / gw1 [9] / gw2 [9] / gw3 [9] / gw4 [9] / gw5 [9] / gw6 [9] / gw7 [9]

  2. ......... [100%]

  3. ============================================= 9 passed in4.66s ==============================================

5.9 查看报告方法
  • 运行完成后在test_xxx.py的相同路径下,生成一个allure的文件夹;

  • 可以看到有很多文件,我们需要使用allure命令来显示测试报告:

    图片


  1. allure serve allure


  1. (venv) F:\pytest_study\test_case\test_j>allure serve allure

  2. Generating report to temp directory...

  3. Report successfully generated to C:\Users\ADMINI~1\AppData\Local\Temp\743714976960418009\allure-report

  4. Starting web server...

  5. 2023-07-0711:16:28.270:INFO::main: Logging initialized @4392ms to org.eclipse.jetty.util.log.StdErrLog

  6. Server started at <http://172.16.1.33:13959/>. Press <Ctrl+C> to exit

  • 使用以上命令会自动打开报告,如下:

5.10 切换语言

图片

图片

5.11 查看测试套件

5.12 查看运行图表数据

图片

5.13 查看用例执行时间

 5.14 查看用例数据

图片

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取   

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐