pytest中的hook清单(下)

本文详细剖析了pytest的执行过程,包括加载插件、配置内容、收集测试用例、setup-run-teardown等阶段。同时揭示了未在特定阶段执行的hook及其功能,如断言处理、fixture管理和调试。后续将探讨内置插件如何利用hook实现特殊功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文系《pytest源码剖析》系列内容

正在连载,欢迎关注

3. 分析 pytest 执行的过程

因为整个文件行数有 1K+,通过 Python 脚本辅助分析后发现,有共用 38 个 hook 累计被调用 440 次,

将其简化后,结果如下

根据这个 hook 记录,咱们可以梳理出 pytest 整个执行的过程,大致分为以下几个阶段

  1. 加载插件

    • 在第 1 行,

    • pytest_plugin_registered 以插件为参数,被反复调用

  2. 初始化框架

    • 在第 2~6 行

    • 为框架增设 hook、配置项、conftest 文件

    • 从命令行参数、配置文件中,加载配置内容

### Pytest Hooks 的使用与定制 Pytest 是一种强大的 Python 测试框架,提供了丰富的插件机制和钩子函数(hooks),允许开发者扩展或修改其行为。Hooks 可以让使用者在特定事件发生时介入并执行自定义逻辑。 #### 使用内置 Hook 函数 Pytest 提供了一系列标准的 hook 接口来响应不同阶段的操作。例如,在配置文件 `conftest.py` 中实现这些接口即可激活相应的行为: ```python def pytest_addoption(parser): parser.addoption("--browser", action="store", default="chrome", help="Browser option") def pytest_configure(config): config.option.browser = 'firefox' # 修改默认浏览器设置为例 ``` 上述代码展示了两个常用的 hooks:一个是用来向命令行添加选项;另一个则是在初始化过程中调整全局配置[^5]。 #### 自定义 Hook 实现 除了利用现有的 hooks 外,还可以创建自己的 hook 来满足特殊需求。这通常涉及到注册新的 hookspec 和 hookimpl 方法,并确保它们被正确加载到环境中。下面是一个简单的例子说明如何做到这一点: 1. **定义 Hook Specification** 需要在项目的根目录下建立一个名为 `plugin/` 的包,并在此处声明一个新的 hook specification 文件 `_hooks.py`: ```python from typing import Any, Dict def pytest_my_custom_hook(data: Dict[str, Any]) -> None: """A custom hook example.""" ``` 2. **实现 Hook Implementation** 同样位于 `plugin/` 下面新建模块 `_impl.py`, 定义具体要做的工作: ```python def pytest_my_custom_hook(data: dict) -> None: print(f"Custom data received: {data}") ``` 3. **使 Plugin 生效** 将 plugin 注册至 pytest 环境中,可以通过编辑项目中的 `setup.cfg` 或者直接放置于 `conftest.py` 内部完成此过程: ```ini [options.entry_points] pytest11 = my_plugin = plugin._impl ``` 以上步骤完成后,每当调用该 hook 所关联的时间节点时就会触发对应的处理程序[^6]。 #### 解决常见问题 当遇到无法正常运行 hooks 的情况时,建议检查以下几个方面: - 确认所有的 hook 名字拼写无误; - 查看是否遗漏了必要的导入语句; - 如果是第三方库引起的冲突,则尝试更新依赖版本或将相关部分隔离测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值