当前位置: 首页 > news >正文

Pytest 插件方法:pytest_runtest_makereport

pytest_runtest_makereport 是 pytest 的一个钩子函数,用于在测试运行过程中生成测试报告。它允许用户在测试执行的不同阶段(setup、call、teardown)拦截并修改测试报告的内容,常用于定制化报告、收集额外信息或处理测试结果。

钩子函数的调用时机

该钩子函数会在以下阶段被调用:

  • setup:测试用例的初始化阶段。
  • call:测试用例的实际执行阶段。
  • teardown:测试用例的清理阶段。

每次调用会传入一个 item(测试项)和 call(调用信息)参数,返回一个 TestReport 对象,包含测试结果的状态(如 passedfailedskipped)。

import pytest@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):outcome = yieldreport = outcome.get_result()if report.when == "call":print(f"Test {item.name} finished with status: {report.outcome}")

  • item: 当前测试项(测试函数或方法)的对象。
  • call: 包含测试阶段信息的对象(setupcallteardown)。

主要用途

1.动态修改测试报告:根据测试结果添加额外信息(如日志、截图)。

def pytest_runtest_makereport(item, call):if call.when == "call" and call.excinfo is not None:item.add_marker(pytest.mark.skip(reason="条件不满足"))

2.失败重试逻辑:在报告生成阶段触发重试机制。

3.自定义报告字段:向报告中插入自定义属性或元数据。

def pytest_runtest_makereport(item, call):report = item._reportif call.when == "call":report.user_properties.append(("自定义字段", "值"))

4.自定义日志记录:在测试报告中添加额外信息(如测试环境变量)。

@pytest.fixture
def data(request):request.node.test_data = "临时数据"def pytest_runtest_makereport(item, call):if hasattr(item, "test_data"):print(f"测试数据: {item.test_data}")

5.失败截图处理:对于 UI 自动化测试,可在测试失败时自动截图。

以下代码展示如何通过 pytest_runtest_makereport 捕获测试失败并附加额外信息:

def pytest_runtest_makereport(item, call):# 仅在测试执行阶段(call)处理  if call.when == "call":  report = item._report  if report.failed:  # 添加失败时的额外信息  report.sections.append(("自定义错误", "这里是失败时的详细描述"))  # 动态添加属性  setattr(report, "user_data", {"key": "value"})  

关键属性与方法

  • call.when:标识当前测试阶段("setup""call""teardown")。
  • report.outcome:测试结果状态("passed""failed""skipped")。
  • report.sections:用于向报告中添加多段文本(格式为 (title, content) 的元组列表)。

结合其他钩子

常与 pytest_runtest_protocol 或 pytest_collection_modifyitems 配合使用,实现更复杂的测试流程控制。例如:

# 在 conftest.py 中全局生效  
def pytest_runtest_protocol(item, nextitem):  # 自定义测试协议逻辑  pass  

注意事项

  • 执行顺序:该钩子会在每个测试阶段的报告生成时调用。
  • 避免副作用:修改报告时需谨慎,避免影响其他插件或 pytest 的正常流程。
  • 报告对象:通过 item._report 或 call.excinfo 访问详细的错误信息。

通过灵活使用 pytest_runtest_makereport,可以实现高度定制化的测试报告和结果处理逻辑。如果需要更复杂的报告处理,可以结合 pytest-html 或 allure-pytest 等插件使用。

http://www.dtcms.com/a/357157.html

相关文章:

  • 多方调研赋能AI+智慧消防 豪越科技人工智能创新获认可
  • 【网络安全领域】边界安全是什么?目前的发展及应用场景
  • java基本类型关键字
  • EasyExcel处理大数据量导出
  • 新手法务合同审查,有什么建议?
  • 单点登录(SSO)前端(Vue2.X)改造
  • 关于锁相放大器(LIA)的系统论文研究(重点于FPGA部分)
  • 设计模式:装饰模式(Decorator Pattern)
  • iOS开发之苹果系统包含的所有字体库
  • 最小生成树——Kruskal
  • 【机器学习入门】3.1 关联分析——从“购物篮”到推荐系统的核心逻辑
  • 响应式编程框架Reactor【2】
  • Windows C盘完全占满会如何?
  • 2024-06-13-debian12安装Mariadb-Galera-Cluster+Nginx+Keepalived高可用多主集群
  • 毕马威 —— 公众对人工智能的信任、态度及使用情况调查
  • C++基础(②VS2022创建项目)
  • docker compose设置命令别名的方法
  • Windows WizTree-v4.27.0.0-x64[磁盘空间分析软件]
  • C++中类,this指针,构造函数,析构函数。拷贝构造函数,初步理解运算符重载,初步理解赋值运算符重载
  • 2.4G串口透传模组 XL2417D无线模块,实测通讯距离300m左右!
  • 第23章笔记|PowerShell 高级远程控制配置(端点、自定义、双向认证、多跳)
  • 常见视频编码格式对比
  • GraphRAG 知识图谱核心升级:集成 langextract 与 Gemini ----实现高精度实体与关系抽取
  • 捡捡java——2、基础05
  • Redis不同场景下的注意事项
  • 如何在FastAPI中玩转全链路追踪,让分布式系统故障无处遁形?
  • 【golang长途旅行第34站】网络编程
  • c++ template
  • Vue2+Element 初学
  • LRU 内存淘汰策略