pytest-html 默认使用内置Jinja2模板,需用--html-template指定外部模板才生效;关键变量如{{ results }}、{{ passed }}等不可修改,CSS定制应追加而非覆盖,截图链接需通过report.extra添加并用| safe过滤。

pytest-html 的模板文件在哪,怎么改才生效
默认情况下 pytest-html 不读取你本地写的 HTML 模板,它用的是内置的 Jinja2 模板硬编码在包里。想定制样式,不能直接改源码,得用 --html-template 参数指定外部模板路径。
实操建议:
- 先运行
pytest --html=report.html --self-contained-html生成一次默认报告,确认插件可用 - 用
python -c "import pytest_html; print(pytest_html.__file__)"找到安装路径,进入resources/目录可看到原始template.html(仅作参考,别直接改) - 复制一份原始模板(比如从 GitHub 仓库 下载),保存为
my_template.html,再用--html-template=my_template.html引入 - 注意:模板路径必须是相对当前执行命令的路径,不是相对于
conftest.py或测试文件
修改 template.html 时哪些变量名不能乱动
Jinja2 模板里很多变量是 pytest-html 渲染时传入的上下文,改错名字会导致页面空白或报错 UndefinedError: 'results' is undefined。
关键保留字段(必须原样保留):
-
{{ results }}:测试结果列表,每个元素含test_id、outcome、duration、log等 -
{{ passed }}、{{ failed }}、{{ skipped }}:数字计数,用于统计栏 -
{{ generated }}:生成时间字符串 -
{{ stylesheets }}和{{ scripts }}:必须保留,否则 CSS/JS 不加载(即使你清空内容也得留着标签)
常见错误:把 {{ results }} 改成 {{ test_results }},然后整个表格不渲染——因为插件没传这个 key。
加自定义 CSS 样式但不破坏响应式布局
直接在 标签里写 CSS 最简单,但要注意 pytest-html 默认用了 table { width: 100% } 和媒体查询适配小屏,粗暴覆盖可能让手机端表格横向溢出。
推荐做法:
- 在模板的
区域末尾追加你的规则,用更具体的 selector,比如table#results-table tbody tr.pass > td而不是泛泛的tr.pass - 避免重置
table-layout: auto,保留原模板里的table-layout: fixed,不然长测试名会撑破容器 - 如果要改字体,优先用系统字体栈(
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI"),别硬写"Microsoft YaHei"——Linux/macOS 机器没这字体,会降级成等宽字体,难看 - 深色模式支持?原生不支持,但可以加一段 JS 检测
window.matchMedia('(prefers-color-scheme: dark)')动态切 class,不过得确保{{ scripts }}位置在你的 JS 之前
生成带截图链接的失败用例报告(非内联图片)
很多人想点“Failed”行就跳转到对应截图,但 pytest-html 默认不处理附件。你需要自己在 pytest_runtest_makereport hook 里把截图路径塞进 report.extra,再在模板里渲染。
操作要点:
- 测试函数里用
driver.get_screenshot_as_file("screenshots/test_login_01.png")保存图,路径需对齐报告生成位置(比如都放在./reports/screenshots/) - 在
conftest.py里加 hook,判断report.when == "call" and report.failed,然后report.extra.append(extra.html('@#@#@#@#@#@#@#@#@#@1')) - 模板中,在
results循环内找到{{ result.extra_html | safe }}这行(原模板有),确保它在里;没这行就手动加 - 注意路径是相对 HTML 报告文件的,不是相对 Python 脚本。如果报告在
./reports/report.html,截图在./reports/screenshots/,链接写screenshots/xxx.png即可 - 注意路径是相对 HTML 报告文件的,不是相对 Python 脚本。如果报告在
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











