pure报告1.0版本
美观、实用的 pytest HTML 报告插件,提供清晰的测试统计和丰富的交互功能。
文件路径>类名>方法名
allure
pure.step
assert
pure.record*
pure.attach
pure.feature
pure.story
pure.severity
# 从本地安装(开发模式) cd pytest-pure-report pip install -e . # 或者从 PyPI 安装(如果已发布) pip install pytest-pure-report
安装插件后,运行 pytest 时会自动生成报告:
pytest test_cases/
pytest test_cases/ --report-dir=outputs/reports
pytest test_cases/ --env=test
支持本地图片路径或远程 URL:
# 使用本地图片 pytest test_cases/ --logo=assets/logo.png # 使用远程 URL pytest test_cases/ --logo=https://example.com/logo.png
pytest test_cases/ --title="API 自动化测试报告"
pytest test_cases/ \ --report-dir=outputs/reports \ --report-filename=test_report.html \ --env=prod \ --logo=assets/logo.png \ --title="自动化测试报告" \ -v
--report-dir
pure_report
--report-filename
--env
test
--logo
--title
在项目根目录创建 pytest.ini 文件:
pytest.ini
[pytest] report_dir = outputs/reports report_filename = test_report.html env = test logo = assets/logo.png title = 自动化测试报告 screenshot_scope = fail_only video_scope = never trace_scope = never
# 设置测试环境 export TEST_ENV=prod # ========== 浏览器信息(仅 UI 测试需要设置,接口测试无需设置) ========== # 注意:浏览器信息为按需显示,只有设置了 BROWSER_TYPE 才会在报告中渲染浏览器行。 # 未设置 BROWSER_TYPE 时(如接口测试),报告将不显示浏览器、模式、分辨率等信息。 # 设置浏览器类型(chromium, firefox, webkit)—— 设置后报告才显示浏览器信息 export BROWSER_TYPE=chromium # 设置无头模式(true 或 false)—— 未设置时默认为 false(有头模式) export HEADLESS=true # 设置浏览器窗口分辨率 —— 未设置时报告不显示分辨率 export BROWSER_WIDTH=1920 export BROWSER_HEIGHT=1080 # ========== 媒体捕获配置 ========== # 设置截图捕获策略(always/fail_only/never) export SCREENSHOT_SCOPE=fail_only # 设置录屏捕获策略(always/fail_only/never) export VIDEO_SCOPE=never # 设置 Trace 录制策略(always/fail_only/never) export TRACE_SCOPE=never # 设置截图和录屏文件路径 export SCREENSHOT_PATH=/path/to/screenshots export VIDEO_PATH=/path/to/videos # 设置 trace 文件路径 export TRACE_PATH=/path/to/traces # 运行测试 pytest test_cases/
配置项按以下优先级生效(高优先级覆盖低优先级):
命令行参数 > 环境变量 > pytest.ini 配置 > 默认值
SCREENSHOT_SCOPE
fail_only
VIDEO_SCOPE
never
TRACE_SCOPE
SCREENSHOT_PATH
outputs/screenshots
VIDEO_PATH
outputs/videos
TRACE_PATH
outputs/traces
截图/录屏/Trace 策略说明:
always
Trace 是 Playwright 提供的测试过程可视化能力,开启后会录制测试执行全过程,打包为 .zip 文件,包含:
.zip
按用例录制:每个用例独立录制一个 trace zip 文件,文件按用例名分子目录存储:
traces/ ├── test_login_success/ │ └── test_login_success_1790662054676.zip ├── test_enter_via_avatar_click/ │ └── test_enter_via_avatar_click_1790662059536.zip
报告集成:报告中每个用例卡片下会显示「🎬 Trace 记录」区段(绿色背景),点击「查看 Trace」按钮在新标签页打开 Playwright Trace Viewer 进行可视化回放。
Trace Viewer 部署:报告生成时会自动复制 Playwright 自带的 Trace Viewer SPA 资源到报告目录的 trace-viewer/ 子目录,无需额外安装。由于 Trace Viewer 依赖 Service Worker,必须通过 HTTP 服务器访问报告(直接用 file:// 协议打开会显示友好提示):
trace-viewer/
# 进入报告目录启动 HTTP 服务器 cd outputs/pure_reports/<timestamp> python -m http.server 8000 # 浏览器访问报告,点击用例卡片下的「查看 Trace」按钮 # http://localhost:8000/test_report_<timestamp>.html
报告采用全屏自适应布局,主要区域包括:
点击左侧测试用例后,右侧展示:
import pytest class TestLogin: @pytest.fixture(params=[ {"name": "登录页面URL正确", "url": "/login"}, {"name": "用户名输入框存在", "selector": "#username"}, {"name": "密码输入框存在", "selector": "#password"}, ]) def test_case(self, request): return request.param def test_login_page_load(self, test_case): """测试登录页面加载""" print(f"测试用例: {test_case['name']}") assert True
import pytest class TestExample: def test_passed(self): """测试通过的用例""" assert True def test_failed(self): """测试失败的用例""" assert False, "故意失败" @pytest.mark.skip(reason="跳过原因") def test_skipped(self): """测试跳过的用例""" assert True @pytest.mark.xfail(reason="已知问题") def test_xfail(self): """预期失败的用例""" assert False def test_with_logs(self): """带有日志输出的用例""" print("这是一条输出日志") assert True
在 conftest.py 中配置 page fixture,测试失败时自动捕获截图和录屏:
conftest.py
page
import os import time import pytest @pytest.fixture(scope="function") def page(): """浏览器页面 fixture""" from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=True) page = browser.new_page() yield page browser.close() @pytest.hookimpl(hookwrapper=True) def pytest_runtest_makereport(item, call): """测试失败时自动截图""" outcome = yield report = outcome.get_result() if report.when == "call" and report.failed: page = item.funcargs.get("page") if page: screenshot_dir = os.path.join(os.getcwd(), "outputs", "screenshots") os.makedirs(screenshot_dir, exist_ok=True) screenshot_path = os.path.join(screenshot_dir, f"{item.name}_{int(time.time()*1000)}.png") page.screenshot(path=screenshot_path)
-s
--log-cli-level
name
BROWSER_TYPE
<test_name>_<timestamp>.png
<test_name>_<timestamp>.webm
report_dir/trace-viewer/
python -m http.server 8000
pure 是本插件提供的一套完全参考 allure 的公共 API,用于在报告中展示 操作步骤、断言结果 和 附件。 所有 API 均为可选调用,不写也不影响测试执行。
pure
from pytest_pure_report import pure
pure.step(title)
pure.fixture(name)
pure.attach(body, ...)
pure.attach.file(source, ...)
pure.record(...)
pure.record_equal(...)
pure.record_contains(...)
pure.record_visible(...)
pure.title(title)
pure.feature(*names)
pure.story(*names)
pure.severity(level)
pure.tag(*tags)
pure.link(url, name)
pure.dynamic
pure.severity_level
pure.attachment_type
与 allure.step 完全一致,支持两种写法:
allure.step
from pytest_pure_report import pure # 上下文管理器 with pure.step("打开登录页面"): page.goto("/login") # 装饰器(自动用函数名作 step 标题,自动提取参数) @pure.step("输入用户名和密码") def fill_credentials(page, username, password): page.fill("#username", username) page.fill("#password", password) # 装饰器也可以不传参数,使用函数名作标题 @pure.step def open_login_page(page): page.goto("/login")
step 内部自动捕获异常状态:
passed
AssertionError
failed
broken
step 自动识别阶段(setup / call / teardown),无需手动指定:
setup
call
teardown
step 自动捕获步骤级日志和附件:
step_data['log']
step_data['attachments']
与 allure.fixture 一致,装饰 fixture 函数,插件通过 pytest hook 自动追踪阶段:
allure.fixture
import pytest from pytest_pure_report import pure @pytest.fixture @pure.fixture("登录") def login(page): with pure.step("打开登录页面"): page.goto("/login") yield page with pure.step("关闭浏览器"): page.context.close() # 也可不传参数 @pytest.fixture @pure.fixture def page(): ...
与原生 assert 配合,在报告中展示断言对比:
# 通用 API assert actual == expected pure.record("描述", actual, expected, type="==") # 便捷方法(自动判断 passed) pure.record_equal(page.title(), "GitLink", "验证页面标题") pure.record_contains(resp.text, "success", "验证响应包含 success") pure.record_visible(is_visible, "验证元素可见")
与 allure.attach 一致,附件自动关联到当前步骤(如果在 pure.step 上下文内调用):
allure.attach
# 文本附件 pure.attach("hello world", name="问候", attachment_type=pure.attachment_type.TEXT) # JSON 附件 pure.attach('{"key": "value"}', name="数据", attachment_type=pure.attachment_type.JSON) # 文件附件 pure.attach.file("path/to/screenshot.png", name="截图")
与 allure 完全一致,用于测试用例树的层级分组:
@pure.feature("登录") @pure.story("成功登录") @pure.severity(pure.severity_level.CRITICAL) @pure.tag("smoke") @pure.title("验证用户使用正确账号可以登录") @pure.link("https://gitlink.org.cn/issue/1", name="issue-1") def test_login_success(page): ...
与 allure.dynamic 一致,在运行时动态修改信息:
allure.dynamic
def test_something(page): pure.dynamic.title("动态标题") pure.dynamic.tag("dynamic-tag") pure.dynamic.severity(pure.severity_level.BLOCKER)
import pytest from pytest_pure_report import pure @pure.feature("登录") class TestLogin: @pytest.fixture @pure.fixture("登录") def login(self, page): with pure.step("打开登录页面"): page.goto("/login") yield page @pure.story("成功登录") @pure.severity(pure.severity_level.CRITICAL) @pure.title("验证用户使用正确账号可以登录") def test_login_success(self, page, login): with pure.step("验证用户头像可见"): is_visible = page.locator(".currentImg").is_visible() assert is_visible pure.record_visible(is_visible, "验证用户头像可见")
更详细的 API 说明请参考 pure.py 源码文档。
pure.py
pytest-pure-report/ ├── pyproject.toml # 项目配置文件 ├── README.md # 项目文档 ├── LICENSE # 许可证 ├── tests/ # 测试文件 ├── images/ # 图标资源 ├── example/ # 示例文件 │ └── test_report_*.html # 示例报告 └── src/ └── pytest_pure_report/ ├── __init__.py # 包初始化 ├── models.py # 数据模型(TestResult) ├── generator.py # 报告生成器(HTML 生成) ├── pure.py # pure 公共 API(step/attach/record 等) └── plugin.py # pytest 插件(钩子和命令行选项)
# 进入项目目录 cd pytest-pure-report # 安装开发依赖 pip install -e . # 运行测试(在项目根目录执行) pytest tests/ -v # 构建包(可选) python -m build
MIT License
欢迎提交 Issue 和 Pull Request!
pytest-pure-report - 让测试报告更美观、更实用!
一个美观的 pytest HTML 报告插件,具有全面的统计功能和交互特性。
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
pytest-pure-report
美观、实用的 pytest HTML 报告插件,提供清晰的测试统计和丰富的交互功能。
功能特性
统计与可视化
自定义与设计
测试结果(左右结构)
文件路径>类名>方法名执行过程(Execution)
媒体支持
交互功能
pure 公共 API(推荐使用)
allure的 API 设计,提供装饰器、上下文管理器和动态函数pure.step记录步骤(自动捕获异常状态、自动识别阶段、自动捕获步骤级日志和附件)assert后调用pure.record*即可在报告中展示pure.attach添加文本/JSON/图片等附件(自动关联到当前步骤)pure.feature/pure.story/pure.severity等装饰器添加标签(用于层级分组,不在详情中单独展示)安装
快速开始
基本使用
安装插件后,运行 pytest 时会自动生成报告:
指定报告目录
指定测试环境
自定义 Logo
支持本地图片路径或远程 URL:
自定义标题
完整示例
配置选项
命令行选项
--report-dirpure_report--report-filename--envtest--logo--titlepytest.ini 配置
在项目根目录创建
pytest.ini文件:环境变量配置
配置优先级
配置项按以下优先级生效(高优先级覆盖低优先级):
命令行参数 > 环境变量 > pytest.ini 配置 > 默认值
截图、录屏和 Trace 配置
SCREENSHOT_SCOPEfail_onlyVIDEO_SCOPEneverTRACE_SCOPEneverSCREENSHOT_PATHoutputs/screenshotsVIDEO_PATHoutputs/videosTRACE_PATHoutputs/traces截图/录屏/Trace 策略说明:
always:所有用例都捕获/录制fail_only:仅失败用例捕获/保留(默认截图策略;trace 录制后通过用例会自动删除)never:不捕获/录制Trace 录制说明
Trace 是 Playwright 提供的测试过程可视化能力,开启后会录制测试执行全过程,打包为
.zip文件,包含:按用例录制:每个用例独立录制一个 trace zip 文件,文件按用例名分子目录存储:
报告集成:报告中每个用例卡片下会显示「🎬 Trace 记录」区段(绿色背景),点击「查看 Trace」按钮在新标签页打开 Playwright Trace Viewer 进行可视化回放。
Trace Viewer 部署:报告生成时会自动复制 Playwright 自带的 Trace Viewer SPA 资源到报告目录的
trace-viewer/子目录,无需额外安装。由于 Trace Viewer 依赖 Service Worker,必须通过 HTTP 服务器访问报告(直接用 file:// 协议打开会显示友好提示):报告结构
整体布局
报告采用全屏自适应布局,主要区域包括:
用例详情面板
点击左侧测试用例后,右侧展示:
文件路径>类名>方法名测试状态说明
状态含义
统计公式
示例测试用例
参数化测试用例
普通测试用例
截图和录屏
在
conftest.py中配置pagefixture,测试失败时自动捕获截图和录屏:使用注意事项
-s(禁用输出捕获)参数--log-cli-level设置日志级别)name字段,将自动作为用例名称显示BROWSER_TYPE(环境变量或命令行参数)时才在报告中显示。接口测试等不涉及浏览器的场景无需设置,报告将自动隐藏浏览器、模式、分辨率等信息。命令行参数优先级高于环境变量<test_name>_<timestamp>.png格式,报告插件会自动匹配并显示<test_name>_<timestamp>.webm格式,报告插件会自动匹配并显示TRACE_SCOPE后,每个用例独立录制一个 trace zip 文件,按用例名分子目录存储在TRACE_PATH目录下。报告生成时会自动复制 Playwright 自带 Trace Viewer SPA 到report_dir/trace-viewer/子目录,点击用例卡片下的「查看 Trace」按钮可在新标签页打开 Trace Viewer 进行可视化回放。由于 Trace Viewer 依赖 Service Worker,必须通过 HTTP 服务器访问报告(如python -m http.server 8000),直接用 file:// 协议打开会显示友好提示pure 公共 API 使用指南
pure是本插件提供的一套完全参考allure的公共 API,用于在报告中展示 操作步骤、断言结果 和 附件。 所有 API 均为可选调用,不写也不影响测试执行。导入方式
API 一览
pure.step(title)pure.fixture(name)pure.attach(body, ...)pure.attach.file(source, ...)pure.record(...)pure.record_equal(...)pure.record_contains(...)pure.record_visible(...)pure.title(title)pure.feature(*names)pure.story(*names)pure.severity(level)pure.tag(*tags)pure.link(url, name)pure.dynamicpure.severity_levelpure.attachment_type1. step(装饰器 + 上下文管理器)
与
allure.step完全一致,支持两种写法:step 内部自动捕获异常状态:
passedAssertionError→failedbroken(并重新抛出)step 自动识别阶段(setup / call / teardown),无需手动指定:
setupcallteardownstep 自动捕获步骤级日志和附件:
step_data['log']pure.attach添加的附件自动关联到step_data['attachments']2. fixture(自动追踪)
与
allure.fixture一致,装饰 fixture 函数,插件通过 pytest hook 自动追踪阶段:3. 断言记录(pure 扩展)
与原生
assert配合,在报告中展示断言对比:4. 附件
与
allure.attach一致,附件自动关联到当前步骤(如果在pure.step上下文内调用):5. 标签装饰器
与 allure 完全一致,用于测试用例树的层级分组:
6. 运行时动态信息(Dynamic)
与
allure.dynamic一致,在运行时动态修改信息:报告展示效果
完整示例
更详细的 API 说明请参考
pure.py源码文档。项目结构
开发
本地开发
许可证
MIT License
贡献
欢迎提交 Issue 和 Pull Request!
pytest-pure-report - 让测试报告更美观、更实用!