以pytest_addoption 为例,讲解pytest框架中钩子函数的应用

钩子函数(Hook Function)的概念

钩子函数(Hook Function)是软件框架中预定义的回调接口,允许开发者在程序执行的特定阶段插入自定义逻辑,以扩展或修改框架的默认行为。在 pytest 中,钩子函数覆盖了测试生命周期的各个环节(如初始化、用例收集、执行、报告生成等),用户通过实现这些钩子函数,可以深度定制测试流程。

pytest_addoption 的作用与运行原理

1. pytest_addoption 的功能
  • 核心作用:向 pytest 添加自定义命令行参数或配置文件选项,使测试能根据外部输入动态调整行为。

  • 典型场景

    • 指定测试环境(如 --env=production)。

    • 控制测试模式(如 --headless 无头模式)。

    • 动态过滤用例(如 --runslow 运行耗时测试)。

2. 钩子函数的运行原理

钩子函数的执行遵循以下流程:

2.1 框架初始化阶段
  1. 加载插件与 conftest.py
    pytest 启动时,会递归扫描项目目录下的 conftest.py 文件和已安装的插件,加载其中的代码。

  2. 注册钩子函数
    框架检测所有实现了约定名称的钩子函数(如 pytest_addoption),并将它们注册到内部的钩子管理系统中。

2.2 参数解析阶段
  1. 调用 pytest_addoption
    在解析命令行参数前,pytest 主动调用所有已注册的 pytest_addoption 钩子函数。开发者在此通过 parser.addoption() 添加自定义参数。

    # conftest.py
    def pytest_addoption(parser):parser.addoption("--env", action="store", default="dev", help="Select environment: dev|staging|production")
  2. 解析命令行/配置文件
    pytest 根据已注册的参数(包括自定义参数和内置参数)解析用户的输入(如 pytest --env=staging),并将结果存储在 config 对象中。

2.3 参数传递与使用
  1. 在测试中获取参数
    测试用例或 Fixture 通过 request.config.getoption("--env") 访问参数值:

    # test_demo.py
    def test_env(request):env = request.config.getoption("--env")assert env in ["dev", "staging", "production"]

钩子函数的本质与设计模式

1. 观察者模式(Observer Pattern)
  • pytest 的钩子机制基于观察者模式:

    • 发布者:pytest 框架,在特定事件(如参数解析)发生时通知钩子。

    • 订阅者:用户实现的钩子函数(如 pytest_addoption),订阅感兴趣的事件并响应。

2. 控制反转(Inversion of Control)
  • 框架控制流程,用户通过钩子函数注入逻辑,无需直接调用框架代码。
    例如:用户无需手动调用 pytest_addoption,框架会在正确时机自动触发它。

完整示例:自定义参数控制测试行为

1. 定义命令行参数
# conftest.py
def pytest_addoption(parser):parser.addoption("--env",action="store",default="dev",choices=["dev", "staging", "production"],help="Select environment to run tests")parser.addoption("--headless",action="store_true",help="Run browser tests in headless mode")
2. 在 Fixture 中使用参数
# conftest.py
import pytest@pytest.fixture
def browser_env(request):env = request.config.getoption("--env")headless = request.config.getoption("--headless")return {"env": env, "headless": headless}
3. 编写测试用例
# test_browser.py
def test_browser_settings(browser_env):print(f"Environment: {browser_env['env']}, Headless: {browser_env['headless']}")assert browser_env["env"] != "production"  # 示例断言
4. 运行测试
# 指定环境和无头模式
pytest -s --env=staging --headless# 输出示例
test_browser.py Environment: staging, Headless: True
PASSED

钩子函数的执行顺序与优先级

  1. 插件加载顺序
    插件和 conftest.py 的加载顺序影响钩子执行顺序。通常:

    • 内置插件最先加载。

    • 外部插件按注册顺序加载。

    • conftest.py 按目录层级从近到远加载(最内层优先)。

  2. 钩子函数叠加
    多个插件或 conftest.py 实现同一钩子时,所有实现均会被调用。例如,多个 pytest_addoption 可共存,共同添加参数。

常见问题与调试

1. 钩子未生效
  • 原因:函数名拼写错误、未放置在 conftest.py 或插件中。

  • 调试:使用 pytest --trace-config 查看已加载的钩子。

2. 参数冲突
  • 原因:多个钩子添加同名参数。

  • 解决:通过 parser.addoption 的 dest 参数避免命名冲突。

总结

  • 钩子函数是 pytest 扩展性的核心机制,允许在框架关键节点插入逻辑。

  • pytest_addoption 是参数定制的入口,通过解析命令行/配置,驱动测试动态行为。

  • 运行原理基于观察者模式与控制反转,框架自动触发用户定义的钩子,实现灵活扩展。

pytest中还有很多钩子函数,大家可以参考文章

收藏一下Deepseek统计的Pytest中 常用的Hook函数-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/82001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

合并两个有序链表 - 简单

************* C topic: 21. 合并两个有序链表 - 力扣(LeetCode) ************* Give the topic an inspection. Hi, guys, how is your holiday break? I went to 黄山 in the past few days. The mount Huang is really beautiful. 天都峰 is real…

13.Spring boot中使用Actuator 监控

13.Spring boot中使用Actuator 监控 Spring Boot Actuator 是 Spring Boot 提供的一个强大的监控和管理工具,它通过暴露各种端点(Endpoints)来提供应用程序的运行时信息。这些端点可以帮助开发者和管理员监控应用程序的健康状况、性能指标、…

Python+Scrapy跨境电商爬虫实战:从亚马逊/沃尔玛数据采集到反爬攻克(附Pangolin API高效方案)

从零实战到反爬攻克,揭秘跨境数据抓取全流程与Pangolin Scrape API终极方案 在当今数据驱动的跨境电商时代,谁掌握了优质的市场数据,谁就掌握了成功的关键。随着全球电商市场规模持续扩大(据Statista最新报告显示,2025…

0基础学习鸿蒙开发-HarmonyOS4

一、初识 1. 开发工具 官网 开发-HarmonyOS NEXT鸿蒙应用开发平台-华为开发者联盟 2. ArkTS 二、TypeScript 基本语法 1.变量声明 2. 条件控制 注意 在TypeScrips中 空字符串数字0、null、undefined 都坡认为是false 其它值则为true if (num) {// num 非空执行 } 3. 循环迭…

深度学习中常用的符号表达式

在论文写作过程中,常常涉及到一些关键的符号的表达,为了更加规范常用的一些符号表达,现将其总结如下(该文件会持续性更新): 数字 x x x : 标量 x \mathbf{x} x : 向量 X \mathbf{X} X : 矩阵 X \mathsf{X}…

react naive 网络框架源码解析

本文取 react native 两个区别很大的版本做分析(0.76.5、0.53.3) 一、0.76.5 版fetch 全流程排查 1、JS 端的实现 随手写一个fetch,点开。 我们这里常用的还是手机端,因此选择 react-native,react-native-windows …

OpenCV 图形API(81)图像与通道拼接函数-----透视变换函数warpPerspective()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 对图像应用透视变换。 函数 warpPerspective 使用指定的矩阵对源图像进行变换: dst ( x , y ) src ( M 11 x M 12 y M 13 M 31 x…

深度学习在油气地震资料反卷积中的应用

深度学习在油气地震资料反卷积中的应用 基本原理 在油气地震勘探中,反卷积(Deconvolution)是一种重要的信号处理技术,用于提高地震资料的分辨率。传统方法(如维纳滤波、预测反卷积等)存在对噪声敏感、假设条件严格等局限。深度学习方法通过数据驱动的方…

Java开发者面试实录:微服务架构与Spring Cloud的应用

面试场景 面试官: 请介绍一下你的基本情况。 程序员: 大家好,我叫张小明,今年27岁,硕士学历,拥有5年的Java后端开发经验。主要负责基于Spring Boot开发企业级应用,以及微服务架构的设计和实现。 面试官: 好的&#…

​Spring + Shiro 整合的核心要点及详细实现说明

在 Spring 项目中集成 Apache Shiro 可以实现轻量级的安全控制(认证、授权、会话管理等)。以下是 ​Spring Shiro 整合的核心要点及详细实现说明: 一、Spring 与 Shiro 整合的核心组件 ​组件​​作用​ShiroFilterFactoryBean创建 Shiro 过…

网络编程核心技术解析:从Socket基础到实战开发

网络编程核心技术解析:从Socket基础到实战开发 一、Socket编程核心基础 1. 主机字节序与网络字节序:数据传输的统一语言 在计算机系统中,不同架构对多字节数据的存储顺序存在差异,而网络通信需要统一的字节序标准,这…

SQLark可以支持PostgreSQL了,有哪些新功能?

SQLark(百灵连接)是一款国产的数据库开发和管理工具,用于快速查询、创建和管理不同类型的数据库系统,支持达梦、Oracle 和 MySQL 数据库。 最新发布的 SQLark V3.4 版本新增了对 PostgreSQL 数据库的支持。我试用了一下&#xff…

【全面解析】Poco C++ Libraries 模块详解与使用指南

Poco(The Portable Components) 是一套现代 C 的跨平台开发库,广泛应用于嵌入式系统、服务端程序、工业控制和 AI 后端服务等领域。其设计理念类似于 Java 的标准库,为 C 提供“标准的非标准功能”。 本篇文章将带你全面了解 Poco…

Vue+tdesign t-input-number 设置长度和显示X号

一、需求 Vuetdesign t-input-number 想要设置input的maxlen和显示X号 二、实现 t-input&#xff0c;可以直接使用maxlength和clearable属性 <t-input v-model"value" clearable maxlength10 placeholder"请输入" clear"onClear" blur&q…

(Go Gin)Gin学习笔记(二):路由配置、基本路由、表单参数、上传单个文件、上传多个文件、浅扒路由原理

1. 路由 gin 框架中采用的路优酷是基于httprouter做的 HttpRouter 是一个高性能的 HTTP 请求路由器&#xff0c;适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用&#xff0c;特别适合需要高性能和简单路由的应用场景。 主要特点 显式匹配&#xff1a;与其他路由…

Linux下的好玩的命令

在 CentOS 下&#xff0c;有许多有趣且实用的 Linux 命令&#xff0c;可以帮助你更好地了解系统、提升效率或进行娱乐。以下是一些好玩的 Linux 命令及其说明&#xff1a; 1. cowsay 和 cowthink 功能&#xff1a;让一只牛&#xff08;或其他动物&#xff09;说出你想说的话。…

OpenharmonyOS+RK3568,【编译烧录】

文章目录 1. 摘要 ✨2. 代码下载 &#x1f4e9;3. 编译 &#x1f5a5;️4. 修改&适配 ✂️4.1 编译框架基本概念4.2 vendor & device 目录4.3 内核编译4.3.1 如何修改、适配自己的开发板&#xff1f; 4.4 修改外设驱动 5. 烧录&验证 &#x1f4cb;参考 1. 摘要 ✨ …

深度学习模型优化:如何让数据科学更智能?

深度学习模型优化:如何让数据科学更智能? 一、引言:为什么优化深度学习模型如此重要? 深度学习的应用已经渗透到数据科学的各个领域,从图像识别到自然语言处理,从推荐系统到金融风控,每一个智能模型都依赖于数据驱动的训练。然而,一个模型的性能不仅仅取决于其架构,…

学习Python的第二天之网络爬虫

30岁程序员学习Python的第二天之网络爬虫的信息提取 BeautifulSoup库 地址&#xff1a;https://beautifulsoup.readthedocs.io/zh-cn/v4.4.0/ 1、BeautifulSoup4安装 在windows系统下通过管理员权限运行cmd窗口 运行pip install beautifulsoup4 测试实例 import requests…

n8n 键盘快捷键和控制键

n8n 键盘快捷键和控制键 工作流控制键画布操作移动画布画布缩放画布上的节点操作选中一个或多个节点时的快捷键 节点面板操作节点面板分类操作 节点内部操作 n8n 为部分操作提供了键盘快捷键。 工作流控制键 Ctrl Alt n&#xff1a;创建新工作流Ctrl o&#xff1a;打开工作…