如何将测试运行时间纳入HTML覆盖率报告文件?
解决方法:将pytest运行时间加入coverage HTML报告
方法1:自定义coverage模板+Python脚本生成报告
这种方式更灵活,适合批量处理:
获取coverage模板文件
执行pip show coverage查看coverage的安装位置,找到htmlfiles/index.html模板文件(路径类似/usr/local/lib/python3.x/site-packages/coverage/htmlfiles/index.html),将其复制到项目根目录,命名为custom_index.html。修改模板内容
打开custom_index.html,找到头部的覆盖率标题行:<h1>Coverage for {{ title }}: {{ total.percent|percent }}%</h1>修改为:
<h1>Coverage for {{ title }}: {{ total.percent|percent }}% in {{ runtime }}s</h1>编写通用执行脚本
创建run_test_with_cov.py脚本,内容如下:import coverage import pytest import time from pathlib import Path def run_test_and_generate_report(script_name): test_file = f"test_{script_name}.py" start_time = time.time() # 运行pytest测试 pytest.main([test_file]) # 计算总运行时间 total_time = round(time.time() - start_time, 2) # 生成带时间的coverage HTML报告 cov = coverage.Coverage() cov.load() # 按脚本名指定报告目录,避免覆盖 report_dir = Path(f"htmlcov_{script_name}") cov.html_report( directory=report_dir, template_file="custom_index.html", extra_context={"runtime": str(total_time)} ) print(f"报告已生成至 {report_dir}") # 批量处理示例:替换为你的脚本列表 if __name__ == "__main__": scripts = ["script1", "script2", "script3"] for script in scripts: run_test_and_generate_report(script)
方法2:生成报告后批量替换内容
如果不想修改模板,可直接在报告生成后通过文本替换插入运行时间:
- 编写批量处理脚本
创建post_process_report.py脚本:import time import subprocess import re from pathlib import Path def run_test_and_update_report(script_name): test_file = f"test_{script_name}.py" report_dir = Path(f"htmlcov_{script_name}") start_time = time.time() # 运行pytest并生成coverage报告 subprocess.run( ["pytest", test_file, "--cov-report", f"html:{report_dir}"], check=True, capture_output=True ) # 计算运行时间 total_time = round(time.time() - start_time, 2) time_str = f" in {total_time}s" # 修改HTML报告内容 index_html = report_dir / "index.html" content = index_html.read_text() # 正则匹配覆盖率标题行并插入时间 updated_content = re.sub( r"(Coverage for .*?: \d+%)", rf"\1{time_str}", content ) index_html.write_text(updated_content) print(f"已更新报告:{index_html}") # 批量处理 if __name__ == "__main__": scripts = ["script1", "script2", "script3"] for script in scripts: run_test_and_update_report(script)
两种方法都能让运行时间出现在HTML报告的固定位置(原覆盖率标题行末尾),方便后续批量提取。
内容的提问来源于stack exchange,提问作者Daniel Sherman
相关产品推荐
相关产品推荐

