BeautifulReport是一个基于unittest.TestResult模块实现的测试用例模板,可以把测试中的结果整合成一个可视化的HTML测试报告。
1. 安装BeautifulReport
pip install BeautifulReport
BeautifulReport.report
report (
filename -> 测试报告名称, 如果不指定默认文件名为report.html
description -> 测试报告用例名称展示 report_dir='.' -> 报告文件写入路径 theme='theme_default' -> 报告主题样式 theme_default theme_cyan theme_candy theme_memories
)
· 主题样式
theme: 报告主题名 theme_default、theme_cyan、theme_candy、theme_memories
· BeautifulReport.add_test_img
如果使用报告过程中需要把测试报告的截图放在报告中, 可以使用
add_test_img
方法· add_test_img ( *pargs )
可以在测试用例上挂载一个装饰器, 实例内容如下
· 默认存放图片路径是img,需要在当前测试项目启动路径下,创建一个img文件夹;
· 传递给装饰器的图片,在运行测试前可以不存在,运行测试之后生成即可;
先使用unittest框架编写测试用例脚本, 例如先创建一个
AutoTestCase.py
文件,用来编写测试用例脚本;
import unittest
import time, os
from selenium import webdriver
from BeautifulReport import BeautifulReport
class AutoTestCase(unittest.TestCase):
# 定义一个保存截图函数(必须)
def save_img(self, test_method):
root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))).replace('\\', '/')
img_path = root_dir + '/img'
self.driver.get_screenshot_as_file('{}/{}.png'.format(img_path, test_method))
# 启动函数,每个用例测试开始前,都会执行该函数
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.get('https://www.baidu.com')
# 结束函数,每个用例测试结束后,都会执行该函数
def tearDown(self):
self.driver.quit()
@BeautifulReport.add_test_img('test_01_ldh')
def test_01_ldh(self):
"""case1:搜索关键词刘德华"""
try:
# 这里的id我故意写错,用来查看失败效果
self.driver.find_element_by_id('kw1').send_keys('刘德华')
self.driver.find_element_by_id('su').click()
time.sleep(2)
except Exception as error:
# 失败后会有报错截图,注意命名必要格式:类名_函数名
self.save_img("AutoTestCase_test_01_ldh")
print("case1:测试执行失败!")
raise error # 必须要抛出异常,不然测试报告中会认为测试成功
else:
print("case1:测试执行通过。")
@BeautifulReport.add_test_img('test_02_test')
def test_02_test(self):
"""case2:搜索关键词test"""
try:
self.driver.find_element_by_id('kw').send_keys('test')
self.driver.find_element_by_id('su').click()
time.sleep(2)
except Exception as error:
self.save_img("AutoTestCase_test_02_test")
print("case1:测试执行失败!")
raise error
else:
print("case1:测试执行通过。")
@unittest.skip('跳过该测试用例') # 跳过,但会在测试报告中显示该用例
def test_03_zdh(self):
"""case3:搜索关键词自动化测试"""
self.driver.find_element_by_id('kw').send_keys('自动化测试')
self.driver.find_element_by_id('su').click()
time.sleep(3)
@BeautifulReport.stop # 不执行,且测试报告中不会显示该用例
def test_04_selenium(self):
self.driver.find_element_by_id('kw').send_keys('selenium')
self.driver.find_element_by_id('su').click()
time.sleep(3)
if __name__ == '__main__':
unittest.main()
然后编写执行文件test_execute_cases.py
# -*- coding: UTF-8 -*-
import os
import unittest
import datetime
from BeautifulReport import BeautifulReport
root_dir = os.path.dirname(os.path.abspath(__file__)).replace('\\', '/')
# 用例存放位置
test_dir = root_dir + '/Test_cases'
# 测试报告存放位置
report_dir = root_dir + '/Test_report/test'
# 测试报告名称
now = datetime.datetime.now().strftime('%Y_%m%d_%H%M%S')
filename = '自动化测试报告' + str(now)
# 用例名称
description = '功能自动化测试报告'
# 需要执行哪些用例,如果目录下的全部,可以改为"*.py",如果是部分带test后缀的,可以改为"test*.py"
pattern = "AutoTestCase.py"
if __name__ == '__main__':
test_suite = unittest.defaultTestLoader.discover(test_dir, pattern=pattern)
result = BeautifulReport(test_suite)
result.report(filename=filename, description=description, report_dir=report_dir)
运行执行文件后生成如下测试报告;
解析BeautifulReport的截图装饰器
C:\Python\Python38\Lib\site-packages\BeautifulReport\BeautifulReport.py
可以看到,将图片拼接到HTML实际上是add_test_img()装饰器的业务。点进去看代码如下:
首先,装饰器的固定写法,定义一个
_wrap()
,然后再写一个__wrap()用@wraps保留原函数的属性。接下去就是具体的业务逻辑了,先定义img_path的路径,然后用try except尝试去运行原函数,如果运行成功,将原函数的结果记入result变量;如果失败,则在原函数的参数里检查是否存在
save_img
函数,如果有,则说明需要保存图片,通过getattr函数获得save_img
函数,并将当前函数的名字func.__name__
设为其参数并运行。默认的save_img函数在BR库的另一个py文件里:BeautifulReport/tests/test_make_report.py这样,如果用户定义过save_img函数,那在执行抛异常时,就会自动去调用
save_img
函数去截图。 然后再将截图结果通过image2base函数转一下格式,赋给一个data变量。 可以看到image2base函数很简单,就是转格式而已:转好的base64格式字符串会被填充到一个
HTML_IMG_TEMPLATE
常量里。 这个HTML_IMG_TEMPLATE
在之前定义过,可以点进去看是这么一个值:其实就是把图片拼接到一个HTML里啦。
经过这一步步操作,BeautifulRepor就做到了在抛异常时,自动截图并嵌入HTML的操作。
后面还有一段代码:
这都很好理解了,就是有多个截图时,逐个去截并镶嵌到HTML里。