pytest-html测试报告定制优化
测试报告优化要点
实际项目中需调整环境信息展示,优化用例描述显示,移除冗余列并控制日志输出。以下配置均在conftest.py中实现:
环境信息配置
from py.xml import html
import pytest
def pytest_configure(config):
config._metadata["项目名称"] = "汽车钣喷应用测试"
if "JAVA_HOME" in config._metadata:
del config._metadata["JAVA_HOME"]
if "Plugins" in config._metadata:
del config._metadata["Plugins"]
@pytest.mark.optionalhook
def pytest_html_results_summary(prefix):
prefix.append(html.p("测试团队: QA部门"))
prefix.append(html.p("执行人员: 李明"))
用例描述与列调整
@pytest.mark.optionalhook
def pytest_html_results_table_header(cells):
cells.insert(1, html.th('用例说明'))
del cells[-1]
@pytest.mark.optionalhook
def pytest_html_results_table_row(report, cells):
cells.insert(1, html.td(report.test_desc))
del cells[-1]
@pytest.mark.hookwrapper
def pytest_runtest_makereport(item, call):
outcome = yield
result = outcome.get_result()
result.test_desc = str(item.function.__doc__)
日志输出控制
@pytest.mark.optionalhook
def pytest_html_results_table_html(report, data):
if report.passed:
data.clear()
data.append(html.div('用例执行成功', class_='log-info'))
失败截图功能
shared_values = {}
@pytest.fixture
def store_value():
def _store(key, val):
shared_values[key] = val
return _store
@pytest.mark.hookwrapper
def pytest_runtest_makereport(item):
pytest_html = item.config.pluginmanager.getplugin('html')
outcome = yield
test_report = outcome.get_result()
extras = getattr(test_report, 'extra', [])
if test_report.when in ('call', 'setup'):
if test_report.failed:
case_id = test_report.nodeid.replace("::", "_")
img_data = capture_screenshot()
if img_data:
img_html = f'<div><img src="data:image/png;base64,{img_data}" style="width:600px;" /></div>'
extras.append(pytest_html.extras.html(img_html))
test_report.extra = extras
def capture_screenshot():
return shared_values.get('driver').get_screenshot_as_base64()
测试统计收集
def pytest_terminal_summary(reporter, exitstatus, config):
total_cases = reporter._numcollected
passed = len([r for r in reporter.stats.get('passed', []) if r.when != 'teardown'])
failed = len([r for r in reporter.stats.get('failed', []) if r.when != 'teardown'])
pass_rate = f"{passed/total_cases*100:.2f}"
duration = time.time() - reporter._sessionstarttime
time_used = f"{duration:.2f}秒"
stats_text = f"总用例: {total_cases} | 通过: {passed} | 失败: {failed} | 成功率: {pass_rate}% | 耗时: {time_used}"
shared_values['test_stats'] = stats_text
应用示例
class TestUI:
@pytest.fixture(autouse=True)
def init_driver(self, store_value):
driver = webdriver.Remote(
command_executor='http://localhost:4723/wd/hub',
options=webdriver.ChromeOptions()
)
store_value('driver', driver)
统计结果通过shared_values['test_stats']获取,可直接用于邮件通知: