06. 生成HTML测试报告
2024年10月28日大约 5 分钟
06. 生成HTML测试报告
1. HTML测试报告介绍
HTML测试报告
- 就是执行完测试用例后,以HTML(网页)方式将执行结果生成报告
为什么要生成测试报告?
测试报告是本次测试结果的体现形态
测试报告内包含了有关本次测试用例的详情
2. HTMLTestReport说明
UnitTest框架本身不支持生成HTML格式的测试报告
网上有很多类库都可以实现,基本用法都类似,只是生成的HTML报告样式有差别本
课程中使用 HTMLTestReport 类库来生成测试报告,本质是 TestRunner
安装
- pip install HTMLTestReport
测试报告截图
3. 测试报告生成步骤
- 导包
- from htmltestreport import HTMLTestReport
- 封装测试套件
- 实例化HTMLTestReport对象
- report = HTMLTestReport(file_path, [title], [description])
- 参数说明:
- file_path:测试报告文件路径
- title:[可选参数],为报告标题,如XXX测试报告
- description:[可选参数],为报告描述信息
- 参数说明:
- report = HTMLTestReport(file_path, [title], [description])
- 执行测试套件 report.run(suite)
- runner = HTMLTestReport(file_path=‘', title='', description='')
- runner.run(suite)
4. 使用相对路径设置测试报告存放位置
将来的项目是分目录书写的, 使用相对路径,可能会出现找不到文件的情况,此时需要使用绝对路径
方法
在项目的根目录, 创建一个 Python 文件(app.py 或者 config.py)
在这个文件中 获取项目的目录,在其他代码中使用 路径拼接完成绝对路径的书写
获取项目的绝对路径获取当前文件的绝对路径
abspath = os.path.abspath(file)
- 获取文件路径的目录名称:
dirname = os.path.dirname(filepath)
# __file__ 特殊的变量,表示当前代码文件名
# app.py
# 注意:此处app.py位于项目的根目录下!
import os
import sys
# 获取当前文件的绝对路径:abspath = os.path.abspath(file)
# 获取文件路径的目录名称:dirname = os.path.dirname(filepath)
# __file__ 特殊的变量,表示当前代码文件名
path1 = os.path.abspath(__file__)
print('path1 = ', path1)
path2 = os.path.dirname(path1)
print('path2 = ', path2)
# sys.path python模块在搜索路径列表
sys.path.append(os.path.dirname(__file__))
print('sys.path = ', sys.path, end='\n')
print('os.path.dirname(__file__) = ', os.path.dirname(__file__), end='\n')
# BASE_DIR = os.path.dirname(os.path.abspath(__file__))
BASE_DIR = os.path.dirname(__file__)
if __name__ == '__main__':
print('BASE_DIR = ', BASE_DIR)
# hm_05_report.py
import unittest
# 导包
from htmltestreport import HTMLTestReport
from app import BASE_DIR
from hm_04_pa1 import TestAdd
# 套件
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestAdd))
# suite.addTest(unittest.defaultTestLoader.loadTestsFromTestCase(TestAdd))
# 运行对象: 实例化HTMLTestReport对象
# runner = HTMLTestReport(报告的文件路径后缀.html, 报告的标题, 其他的描述信息)
# runner = HTMLTestReport('test_add_report.html', '加法用例测试报告', 'xxx')
# runner = HTMLTestReport('./report/test_add_report.html', '加法用例测试报告', 'xxx')
# runner = HTMLTestReport('report/test_add_report.html', '加法用例测试报告', 'xxx')
runner = HTMLTestReport(file_path=BASE_DIR + '/report/login_report.html', title='登录测试报告', description='V1.0')
# 执行测试套件
runner.run(suite)
5. 案例
需求分析
1. 封装初始化配置 app.py 2. 对登录函数进行测试, 登录函数定义在 tools.py 中 3. 在 case 目录中书写用例对 login 函数进行测试, 使用断言 4. 在 common/read_data.py 定义参数化函数 4. 将 login 函数的测试数据定义在 json 文件中并放到 data 目录中 5. 生成测试报告 report 目录中
绝对路径
# app.py import os # __file__ 特殊的变量,表示当前代码文件名 BASE_DIR = os.path.dirname(__file__) if __name__ == '__main__': print(BASE_DIR)
定义登陆函数
# tools.py def login(username, password): if username == 'admin' and password == '123456': return '登录成功' else: return '登录失败'
测试数据
// data/login_data.json [ { "desc": "正确的用户名和密码", "username": "admin", "password": "123456", "expect": "登录成功" }, { "desc": "错误的用户名", "username": "root", "password": "123456", "expect": "登录失败" }, { "desc": "错误的密码", "username": "admin", "password": "123123", "expect": "登录失败" }, { "desc": "错误的用户名和密码", "username": "root", "password": "123123", "expect": "登录失败" } ]
读取测试数据的方法
# common/read_data.py def build_login_data(): with open(BASE_DIR + '/data/login_data.json', encoding='utf-8') as f: data_list = json.load(f) # [{}, {}] ---> [()] new_list = [] for data in data_list: # 字典中的 desc 不需要 username = data.get('username') password = data.get('password') expect = data.get('expect') desc = data.get('desc') new_list.append((username, password, expect, desc)) return new_list
测试用例代码
# case/test_login.py import unittest from common.read_data import build_login_data from tools import login from parameterized import parameterized class TestLogin(unittest.TestCase): @parameterized.expand(build_login_data()) def test_login(self, username, password, expect, desc): result = login(username, password) self.assertEqual(expect, result)
Suite 报告代码
# hm_06_report_login.py import unittest # 导包 from htmltestreport import HTMLTestReport from app import BASE_DIR # 套件 # 方式一: # suite = unittest.TestSuite() # suite.addTest(unittest.makeSuite(TestLogin)) # suite.addTest(unittest.defaultTestLoader.loadTestsFromTestCase(TestLogin)) # 方式二: suite = unittest.TestLoader().discover(start_dir=BASE_DIR + '/case', pattern='test_*.py') # 运行对象: 实例化HTMLTestReport对象 runner = HTMLTestReport(file_path=BASE_DIR + '/report/login_report.html', title='登录测试报告', description='V1.0') # 执行测试套件 runner.run(suite)
6. 自定义测试报告
默认测试报告
- 问题
- 用例标题显示不友好
1. 自定义
详见 htmltestreport 源代码
- template.py html模版
- core.py 核心文件
self._testMethodName:用例函数名 self._testMethodDoc:用力函数的描述注释
# case/test_login.py
import unittest
from parameterized import parameterized
from common.read_data import build_login_data
from tools import login
class TestLogin(unittest.TestCase):
# __doc__ = """登录测试"""
"""登录测试"""
@parameterized.expand(build_login_data())
def test_login(self, username, password, expect, desc):
# """测试一下"""
self._testMethodName = f"{desc}"
self._testMethodDoc = f"[username={username}, password={password}, expect:{expect}]"
print(f'username: {username}, password: {password}, expect: {expect}')
self.assertEqual(expect, login(username, password))
7. unittestreport
pip install unittestreport
# 1.导包 import time import unittest # pip install unittestreport from unittestreport import TestRunner import config from script.test_index import TestIndex from script.test_order import TestOrder from script.test_product import TestProduct from script.test_user import TestUser # 2.创建测试套件对象 suite = unittest.TestSuite() # 3.添加测试用例到套件 suite.addTest(unittest.makeSuite(TestIndex)) suite.addTest(unittest.makeSuite(TestProduct)) suite.addTest(unittest.makeSuite(TestUser)) suite.addTest(unittest.makeSuite(TestOrder)) # 4.批量执行测试用例 # runner = unittest.TextTestRunner() # 实例化执行器对象 # runner.run(suite) # 运行测试套件执行的结果有: . 成功 F 失败 E 错误 # 5.生成测试报告 # 5.1 定义测试报告文件 rep_file = config.BASE_DIR + "/reports/Ego-{}.html".format(time.strftime("%Y-%m-%d_%H-%M-%S")) # 5.2 创建第三方执行器对象 runner = TestRunner(suite, # 测试套件对象 filename=rep_file, # 报告文件 title="Ego微商项目接口测试报告", # 报告标题 tester="Frankie.Lee", # 测试执行人 desc="V1.0", # 报告描述信息 templates=1) # 报告的模板 # 5.3 执行器调用run方法执行生成报告 runner.run()