直接安装 pytest 和 pytest-html 即可生成带样式的 html 报告,无需修改测试逻辑;--self-contained-html 参数将 css/js 打包进单文件便于分发,需注意时区、编码、截图路径及报告自定义配置。

用 pytest + pytest-html 生成带样式的HTML报告
直接装两个包就能跑,不用改测试逻辑。pytest 是主流选择,pytest-html 插件负责把 pytest 的原始结果转成可读的 HTML 页面,支持失败截图、用例分类、执行时间统计。
安装命令:
pip install pytest pytest-html运行时加参数:
pytest --html=report.html --self-contained-html
--self-contained-html 很关键——它把 CSS 和 JS 打包进单个 HTML 文件,方便邮件发送或离线查看;不加的话会生成多个文件,容易漏传。常见坑:
- 报告里显示“unknown”或时间异常:检查系统时区是否和 pytest 运行环境一致,尤其在 Docker 容器里没挂载
/etc/localtime时容易出这问题 - 中文用例名乱码:确保 Python 文件开头有
# -*- coding: utf-8 -*-,且 pytest 运行时终端编码是 UTF-8(Linux/macOS 一般默认 OK,Windows 命令提示符需先执行chcp 65001) - 报告里看不到日志输出:默认 pytest 不捕获
print()或logging,加-s(输出 stdout)和--log-cli-level=INFO参数才能在报告详情页里看到
让 pytest 自动收集并运行测试函数
pytest 不需要写测试套件或手动注册用例,它靠命名约定自动发现:test_*.py 文件里的 test_* 函数,或 *_test.py 里的 test_* 方法。只要符合规则,直接 pytest 就能跑。
实操建议:
- 测试文件名必须以
test_开头或以_test.py结尾,比如test_login.py或api_test.py,否则pytest直接跳过 - 测试函数名必须是
test_开头,比如def test_user_can_login():;写成def login_test():不会被识别 - 如果想跳过某个测试,加装饰器
@pytest.mark.skip(reason="暂不验证"),报告里会标为 “skipped”,不会报错也不会执行 - 避免在测试函数里用
if __name__ == "__main__":启动逻辑——pytest 运行时不是以 main 模式导入的,这段代码永远不会触发
捕获异常并生成失败截图(Selenium 场景)
做 Web UI 自动化时,用 Selenium 遇到失败,光看报错堆栈很难定位页面状态。得在异常发生时主动截屏,并把截图路径写进 HTML 报告。
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
关键点:
- 不能只靠
driver.get_screenshot_as_file()存图,要配合 pytest 的add_report机制,把图片嵌入报告。推荐用pytest-selenium或手动在conftest.py里写 fixture,在except块中调用driver.get_screenshot_as_base64(),再通过extra参数传给pytest_html - 截图保存路径别用绝对路径(如
C:\screenshots\),不然报告发给别人打不开;统一存到项目根目录下的screenshots/,并在 HTML 中用相对路径引用 - 截图命名建议含时间戳和用例名,例如
screenshots/test_login_failed_20240520_142305.png,避免并发运行时覆盖 - 注意浏览器窗口大小:无头模式下默认尺寸小,可能导致元素截不全,启动时加上
options.add_argument("--window-size=1920,1080")
HTML 报告里自定义标题和描述
默认报告标题是 “pytest report”,太笼统。可以通过 --html-title 参数改,但更灵活的方式是在 pytest.ini 里配置,一劳永逸。
在项目根目录建 pytest.ini,内容如下:
[tool:pytest] html_title = 登录模块自动化测试报告(v2.3.1) description = 测试环境:staging.example.com,执行时间:2024-05-20 14:00这样每次生成报告都会带上版本号和环境信息,交接或复盘时不容易搞混。
额外提醒:
-
description字段只在 pytest-html ≥ 4.0 版本才支持,老版本会静默忽略,升级前先查pip show pytest-html - 如果用了 CI(比如 Jenkins),可以把
html_title动态设为构建号,例如html_title = Jenkins #${BUILD_NUMBER} 测试报告,前提是 CI 环境变量能透传进 pytest - 报告里“Environment”表格默认只显示 Python 和 pytest 版本,想加自定义字段(如 API 版本、DB 版本),得用
pytest_configure(config)hook 注入,不是简单配个 ini 就能搞定
实际生成报告最常卡在路径权限和编码上,尤其是 Windows 用户在非管理员命令行里往 C 盘根目录写 report.html,或者用记事本另存为 UTF-8 时悄悄加了 BOM 头,导致 pytest 解析失败。先确认当前目录可写、文件名不含特殊字符、终端编码干净,再折腾高级功能。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










