Pytest框架之fixture详解(二):autouse参数与session/module级作用域

星野
星野
发布时间:2026-10-16 | 4人浏览过
原创

本文深入解析Pytest中fixture的autouse参数及session和module级别的作用域机制。详细讲解如何通过设置autouse=True实现自动化执行,并对比function/class级别的差异。同时阐述session和module级别fixture的定义、执行时机及适用场景,结合conftest.py配置示例,帮助开发者优化测试前置与清理逻辑。

相关文章

Pytest框架之fixture详解(一)

Pytest框架之fixture详解(二)

Pytest框架之fixture详解(三)

本文关于 fixture 的内容如下:

  • fixture 的 autouse 参数
  • session 和 module 级别的 fixture

1、fixture 的 autouse 参数

在 pytest 框架中,fixture 默认行为是被动调用。即开发者定义好 fixture 后,必须通过测试用例或测试类显式请求(如使用参数名),该 fixture 才会被执行。

然而,fixture 提供了一个名为 autouse 的参数,其默认值为 False。

当 autouse 为 False 时,即关闭了 fixture 的自动调用或自动执行功能。

若将 autouse 设置为 True,则意味着该 fixture 将在其定义的作用域范围内自动执行,无需测试用例显式请求。

针对 autouse=True 的情况,主要分为以下两种场景进行说明。

第 1 种情况:当定义的 fixture 在测试类内部时

如果某个 fixture 定义在测试类内部且设置了 autouse=True,那么该自动执行逻辑仅在该测试类内部生效。类外部的其他测试用例不会受此影响,仍保持默认行为。

我们可以创建一个名为 test_pytest-autouse.py 的文件,并在其中定义一个 TestDemo 类来进行演示。

在 TestDemo 类中定义两个 fixture:一个设置 autouse=True,另一个保持默认值 False。

执行上述代码后的结果如下:

第 2 种情况,在 conftest.py 当中的 fixture 设置 autouse=True

conftest.py 文件具有全局配置特性,其中的 fixture 可以影响所有测试类或测试用例的执行(具体生效范围取决于 fixture 定义的作用域)。

假设存在如下目录结构:

在测试用例文件(test_autouse1.py 和 test_autouse2.py)中,并未使用 @pytest.mark.usefixture("func_fix") 来主动请求 func_fix fixture。

conftest.py 文件的具体内容如下:

这里定义的 func_fix fixture 设置了 autouse=True,且其作用域为 function。

因此,在 pytest20210301 包下的每一个测试用例,在执行具体测试逻辑之前都会自动执行该 fixture 的前置准备动作,在执行完测试逻辑后也会自动执行其后置清理动作。

运行 main.py(用于收集用例并执行)后的结果如下:

基于以上分析,通常建议对于 function、class 或 module 级别的 fixture,不要随意开启 autouse=True。

因为不同的测试用例或测试类,对于前置准备工作和后置清理工作的具体需求往往存在差异。

如果强制开启 autouse=True,无论测试用例是否真正需要,都会强制执行该 fixture,可能导致不必要的资源消耗或副作用。

因此,让测试用例根据实际需求主动请求使用 fixture,才是更合理和灵活的做法。

2、session 和 module 级别的 fixture

除了常见的 function 和 class 级别外,pytest 的 fixture 还支持 session 和 module 级别的作用域。

session 级别的 fixture

这里的 session 指的是整个测试会话周期。

它涵盖从 pytest 开始收集测试用例,直到所有用例执行完毕的整个过程。

例如,如果收集到了 100 个测试用例,那么 session 级别的 fixture 将覆盖这全部 100 个用例。

同理,如果收集到 30 个测试用例,session 级别的 fixture 则覆盖这 30 个用例。

由于 session 级别的 fixture 在整个测试会话期间仅执行一次(无论包含多少用例)。

如果定义了 session 级别的 fixture,通常意味着开发者确实需要执行它。

因此,session 级别的 fixture 是可以安全设置 autouse=True 的。

在自动化测试实践中,如果某些前置准备工作是针对整个测试会话的(例如清理或创建全局文件、初始化数据库连接等),可以定义 session 级别的 fixture。

沿用上述用例结构,在 conftest.py 中添加一个 session 级别的 fixture,并设置 autouse=True:

执行结果如下:

module 级别的 fixture

module 级别指的是单个测试 py 文件。该级别的 fixture 覆盖整个 test_*.py 文件中的所有测试用例。

在 test_*.py 文件中,具体哪一行代码调用了 module 级别的 fixture,那么该 fixture 就覆盖从调用点之后的所有测试用例。

举例说明,沿用上述用例结构,在 conftest.py 中添加 module 级别的 fixture:

在 test_autouse2.py 中调用 module 级别的 fixture,但并未在第一个用例前调用。

执行结果如下:

到此这篇关于Pytest框架之fixture的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表