conftest的使用以及pytest的夹具函数和钩子函数

conftest.py 的作用

  1. 共享 fixtures:在多个测试文件间共享测试夹具

  2. 作用域控制:conftest.py 的位置决定了其影响范围

  3. 插件配置:配置 pytest 插件和钩子函数

  4. conftest.py 是 pytest 的局部配置文件。pytest 会自动加载它,一般用于放置“多个测试共同使用”的内容,不需要手动导入。
  5. conftest.py 是 pytest 约定的自动发现文件:
    pytest 启动
        ↓
    查找 conftest.py
        ↓
    加载其中的 fixture 和 hook
        ↓
    在适用范围内使用

    所以准确关系是:

    内容属于谁conftest.py 的作用
    fixture 夹具 pytest 可以存放和共享夹具
    hook 钩子 pytest/pluggy 可以实现 pytest 钩子
    conftest.py pytest 识别的配置文件 自动注册其中的夹具和钩子

    一句话概括:

    夹具和钩子是 pytest 的能力,conftest.py 是承载这些能力的常用配置文件。

 

基本结构

text
tests/
├── conftest.py          # 影响整个 tests/ 目录
├── test_user.py
├── test_order.py
└── api/
    ├── conftest.py      # 只影响 api/ 目录
    └── test_api.py

也就是当前目录及其子目录中的测试通常都能使用。但父目录或兄弟目录不能使用!

可以这样理解:
pytest
├── 提供 fixture(夹具)机制
├── 提供 hook(钩子)机制
└── 自动发现并加载 conftest.py

 

pytest提供了有夹具函数和钩子函数

1. 钩子函数是内部定义的?

更准确地说,它们是内部定义好“规范”的,但需要由用户来实现

pytest 内部定义了一套钩子规范(Hook Specification),但具体的实现代码需要由用户提供。你需要在 conftest.py 文件或自定义插件中,定义一个函数名与钩子规范完全一致的函数,pytest 就会在对应的测试生命周期节点自动调用它。pytest 在注册时还会检查你函数中的参数名是否与规范匹配

 

常用的pytest钩子函数: https://www.cnblogs.com/pingguomang/p/22904900

2. 夹具函数是需要用户自己实现的吗?

是的,夹具函数完全由用户自己实现,并且是实现局部资源初始化和清理最推荐的方式。

相比钩子函数,夹具(Fixture)更加灵活:

  • 用户定义:通过 @pytest.fixture 装饰器来定义

  • 作用域控制:你可以通过 scope 参数精确控制其生命周期,例如 scope="session" 的夹具就实现了类似会话级初始化和清理的效果

  • 实现方式:使用 yield 语句来分隔设置和清理代码,yield 之前的代码在测试前执行,之后的代码在测试结束后执行

pytest 夹具函数可以写在多个位置,不只限于 conftest.py

参考: https://www.cnblogs.com/pingguomang/p/22909106

posted @ 2026-09-09 13:48  苹果芒  阅读(2)  评论(0)    收藏  举报