在自动化测试领域,虽然 Pytest 测试框架提供了多种现成的测试报告生成工具,如 Pytest-html 和 Allure,但这些工具可能无法完全满足特定的测试需求。本文将介绍一种自定义测试报告生成的方法,并提供相应的代码实现。通过这种方法,你可以根据项目的具体需求,灵活地定制测试报告的内容和格式,从而更有效地展示测试结果和分析数据。
一、环境准备
// An highlighted block
pip install pytest
Jinja2 是一个用于 Python 的模板引擎,它允许我们将数据动态地插入到 HTML 模板中,从而生成个性化的 HTML 页面。安装 Jinja2 的命令如下:
// An highlighted block
pip install Jinja2
二、创建 HTML 模板文件
在测试目录中创建一个名为 templates 的子目录,并在其中创建一个名为 A.html 的 HTML 模板文件。以下是模板文件的内容:
注意:需要测试报告中展示的内容在此处定义,如:用例执行时间、数据饼图、用例执行详情等
// templates/A.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>自动化测试报告</title>
<style>
/\* 在这里添加 CSS 样式 \*/
body { font-family: Arial, sans-serif; }
table { width: 100%; border-collapse: collapse; }
th, td { border: 1px solid #ddd; padding: 8px; }
th { background-color: #f2f2f2; }
.canvas-container { width: 50%; margin: 20px auto; }
canvas { max-width: 70%; height: auto !important; }
</style>
</head>
<body>
<h1>自动化测试报告</h1>
<p>执行时间: {{ execution\_time }}</p>
<p>用例总数: {{ total\_tests }}</p>
<p>失败用例数: {{ failed\_tests }}</p>
<div class="canvas-container">
<canvas id="resultChart"></canvas>
</div>
<p>日志记录:</p>
<pre>{{ log }}</pre>
<table>
<tr>
<th>用例名称</th>
<th>结果</th>
<th>耗时</th>
</tr>
{% for test in tests %}
<tr>
<td>{{ test.name }}</td>
<td>{{ test.result }}</td>
<td>{{ test.duration }}</td>
</tr>
{% endfor %}
</table>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
var ctx = document.getElementById('resultChart').getContext('2d');
var resultChart = new Chart(ctx, {
type: 'pie',
data: {
labels: ['通过', '失败'],
datasets: [{
label: '测试结果比例',
data: [{{ passed\_tests }}, {{ failed\_tests }}],
backgroundColor: [
'rgba(0, 128, 0, 0.2)', // 绿色
'rgba(255, 0, 0, 0.2)' // 红色
],
borderColor: [
'rgba(0, 128, 0, 1)',
'rgba(255, 0, 0, 1)'
],
borderWidth: 1
}]
},
options: {
responsive: true,
plugins: {
legend: {
position: 'top',
},
}
}
});
});
</script>
</body>
</html>
三、编写测试用例
首先,我们需要编写一些测试用例。假设我们有一个名为 test_demo.py 的文件,包含以下测试用例:
# test_demo.py
def test_example1():
assert 1 + 1 == 2
def test_example2():
assert 2 - 1 == 1
四、创建 conftest.py 文件
conftest.py 文件是 Pytest 的配置文件,我们可以在这里定义一些全局的 fixture 和钩子函数。以下是 conftest.py 文件的代码:
import os
import pytest
from jinja2 import Environment, FileSystemLoader
# 定义一个全局变量来收集测试结果
results = []
# pytest 钩子函数,用于在测试结束时收集结果
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
outcome = yield
report = outcome.get_result()
# print("\n测试结果:", report)
if report.when == "call":
# 根据测试结果添加到全局的 results 列表
result = '通过' if report.outcome == "passed" else '失败'
results.append({
'name': item.name,
'result': result,
'duration': report.duration
})
# pytest 钩子函数,用于在会话结束时生成报告
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_sessionfinish(session, exitstatus):
yield
# 确保使用的是全局的 results 列表
generate_report(results)
# 定义生成报告的函数
def generate_report(results):
print("开始生成报告...")
# 计算通过和失败的用例数
passed_tests = sum(1 for result in results if result['result'] == '通过')
failed_tests = sum(1 for result in results if result['result'] == '失败')
total_tests = len(results)
execution_time = sum(result['duration'] for result in results)
# 准备报告数据
report_data = {
'execution_time': execution_time,
'total_tests': total_tests,
'failed_tests': failed_tests,
'passed_tests': passed_tests,
'log': "这里是日志记录",
'tests': results # 使用全局的 results 列表
}
print(f"测试数据:{report_data}")
# 使用 Jinja2 渲染报告模板
template_path = os.path.join(os.path.dirname(__file__), 'templates')
env = Environment(loader=FileSystemLoader(template_path))
template = env.get_template('A.html')
report_html = template.render(report_data)
# 保存报告到文件
with open('test_report.html', 'w') as f:
f.write(report_html)
# 打印报告已生成的消息
print('测试报告已生成。')
五、运行测试并生成报告
在命令行中运行以下命令来执行测试用例并生成测试报告:
// 终端中执行如下命令
pytest -s -vv test_demo.py
运行完成后,你将在当前目录下找到一个名为 test_report.html 的文件,它包含了根据 Jinja2 模板渲染的测试报告。报告中包括了测试结果的汇总信息、执行时间、用例条数、日志记录以及一个展示通过和失败用例比例的饼图。
执行报告如下:
六、总结
通过使用 Pytest 和 Jinja2,我们可以生成自定义的自动化测试报告,展示各种自己所需要的信息,不受已有插件的限制(如Pytest-html、allure等)
本文所实现的为一个demo,主要提供一种实现方法以及思路,具体的报告样式展示可由前端或者UI同学帮设计(更美观、专业),写法符合jinja2语法格式即可(即模版html中变量取值{{xxx}})
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。