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

Pytest 插件:pytest_runtest_protocol

Hook 方法之 pytest_runtest_protocol:

pytest_runtest_protocol :
官方给的解释是:为给定的测试项目执行runtest_setup / call / teardown协议;

可以在执行每个测试用例的各个阶段进行钩子拦截,比如在测试用例开始执行前、执行中间某一步骤、执行完成后等,从而可以方便地进行一些额外的操作或者扩展功能。

pytest 的默认 pytest_runtest_protocol 实现会按顺序执行以下操作:

  1. 调用 pytest_runtest_logstart 钩子,标记测试开始
  2. 调用 pytest_runtest_setup 钩子,执行测试前置条件
  3. 调用 pytest_runtest_call 钩子,执行测试函数本身
  4. 调用 pytest_runtest_teardown 钩子,执行测试后置清理
  5. 调用 pytest_runtest_logfinish 钩子,标记测试结束

The default runtest protocol is this (see individual hooks for full details):

  • pytest_runtest_logstart(nodeid, location)

  • Setup phase:

    • call = pytest_runtest_setup(item) (wrapped in CallInfo(when="setup"))

    • report = pytest_runtest_makereport(item, call)

    • pytest_runtest_logreport(report)

    • pytest_exception_interact(call, report) if an interactive exception occurred

  • Call phase, if the setup passed and the setuponly pytest option is not set:

    • call = pytest_runtest_call(item) (wrapped in CallInfo(when="call"))

    • report = pytest_runtest_makereport(item, call)

    • pytest_runtest_logreport(report)

    • pytest_exception_interact(call, report) if an interactive exception occurred

  • Teardown phase:

    • call = pytest_runtest_teardown(item, nextitem) (wrapped in CallInfo(when="teardown"))

    • report = pytest_runtest_makereport(item, call)

    • pytest_runtest_logreport(report)

    • pytest_exception_interact(call, report) if an interactive exception occurred

  • pytest_runtest_logfinish(nodeid, location)

Parameters:

  • item (Item) – Test item for which the runtest protocol is performed.

  • nextitem (Item | None) – The scheduled-to-be-next test item (or None if this is the end my friend).


def pytest_runtest_protocol(item, nextitem):print("\n[pytest_generate_protocol]这个钩子函数在每个测试用例开始和结束时被调用",item.name)
def pytest_runtest_protocol(item, nextitem):# 自定义测试开始逻辑item.ihook.pytest_runtest_logstart(nodeid=item.nodeid, location=item.location)# 自定义测试执行流程item.ihook.pytest_runtest_setup(item=item)item.ihook.pytest_runtest_call(item=item)item.ihook.pytest_runtest_teardown(item=item, nextitem=nextitem)# 自定义测试结束逻辑item.ihook.pytest_runtest_logfinish(nodeid=item.nodeid, location=item.location)return True

常见应用场景

  1. 性能监控:在协议中插入时间记录逻辑,统计每个测试用例的执行时长。
  2. 动态跳过测试:根据运行时条件(如环境变量)决定是否跳过某些测试。修改测试执行顺序或逻辑。
  3. 日志增强:在测试执行前后输出详细日志,便于调试。
  4. 在特定条件下跳过某些测试步骤 集成自定义报告生成机制。
  5. 实现特殊的测试环境管理。

注意事项

自定义实现时需要确保正确处理所有必要的钩子调用,返回 True 表示测试协议已处理,False 表示交由其他实现处理 避免在钩子中引入过多复杂逻辑,以免影响测试性能 确保正确处理异常情况,避免影响后续测试执行。

 自定义实现示例

以下是一个自定义 pytest_runtest_protocol 的示例,通过重写钩子添加日志功能:

def pytest_runtest_protocol(item, nextitem):# 自定义前置操作print(f"Starting test: {item.name}")# 调用默认的测试协议(包括 setup/call/teardown)result = pytest_runtest_protocol.__wrapped__(item, nextitem) if hasattr(pytest_runtest_protocol, '__wrapped__') else None# 自定义后置操作print(f"Finished test: {item.name}")return result

注意事项

  • 修改 pytest_runtest_protocol 需谨慎,避免破坏默认流程导致测试失败。
  • 建议优先通过标准钩子(如 pytest_runtest_setup)实现扩展,而非直接重写协议。
  • 使用 pytest_runtest_logstart 和 pytest_runtest_logfinish 等辅助钩子可以减少侵入性。

通过合理利用此协议,可以高度灵活地控制 pytest 的测试行为,满足复杂项目的需求。

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

相关文章:

  • Dify 1.8.0 全网首发,预告发布
  • ZArchiver解压器:强大的安卓解压缩工具
  • 外缺圆圆心检测
  • 【Linux】Make/Makefile (自动化构建):从“是什么”到“会用它”
  • [Ai Agent] 本地知识库检索运用
  • 控制系统仿真之PID校正-PID校正(八)
  • 从2M到G时代:WiFi如何重塑我们的生活?
  • 人工智能之数学基础:透过频率直方图理解概率密度函数
  • 计算机网络:数据库(sqlite3)
  • 【机器学习入门】3.2 ALS算法——从评分矩阵到精准推荐的核心技术
  • OpenAI Sora深度解析:AI视频生成技术如何重塑广告电商行业?影业合作已落地
  • LeetCode100-73矩阵置零
  • windows中Qwen3‑Coder 与 Claude Code 搭配使用
  • 网络请求优化:用 Retrofit 拦截器玩转日志、重试与缓存,OkHttp 和 Volley 谁更香?
  • React前端开发_Day4
  • 华为HCIP数通学习与认证解析!
  • 基于STM32设计的智能宠物喂养系统(华为云IOT)_273
  • STM32F103C8T6的智能实验室危化品管理系统设计与华为云实现
  • Java 获取淘宝关键词搜索(item_search)API 接口实战指南
  • vue3+antd实现华为云OBS文件拖拽上传详解
  • 华为云CCE的Request和Limit
  • AI+云,双擎驱动——华为云让智能触手可及
  • Django Admin 管理工具
  • Java中协变逆变的实现与Kotlin中的区别
  • 如何用 Kotlin 在 Android 手机开发一个应用程序获取国家或地区信息
  • echo、seq、{}、date、bc命令
  • 如何用 Kotlin 在 Android 手机开发一个应用程序获取网络时间
  • OpenCV之霍夫变换
  • 在C++11中实现函数式编程的组合子
  • AI推介-大语言模型LLMs论文速览(arXiv方向):2025.04.25-2025.04.30