Python pytest fixtrue 装饰器介绍及使用
fixture 装饰器
简介:
fixture
是一种用于 准备测试环境 的函数。它可以在测试函数执行前设置资源(如数据库连接、临时文件等),并在测试结束后清理资源。
特点:
- 模块化: 可共享和重用,减少重复性代码。
- 参数化: 允许通过不同的输入值运行相同的测试。
- 作用域控制(Scope): 通过不同的作用域控制
fixture
的生命周期和执行频率,包括:function
(默认)、class
、module
、package
和session
。 - 自动注入: 当在测试函数中声明一个与
fixture
名称相同的参数时,pytest
会自动找到并调用相应的fixture
函数,将返回值传递给测试函数作为该参数的值。
示例:
import pytest
@pytest.fixture()
def fixture_demo():
print("\n前置处理。。。。。。")
yield
print("\n后置处理。。。。。。")
def test_case6(fixture_demo):
assert 1 == 1
yield
的作用是:
yield
是pytest
中实现 setup/teardown 的推荐方式,既能返回数据,又能执行清理操作,是编写 fixture 的最佳实践。
作用域:
作用域 | 生命周期 | 执行频率 | 说明 | 适用场景 |
---|---|---|---|---|
function (默认) |
每个测试函数 | 每次测试函数运行前执行 setup ,测试结束后执行 teardown |
每个测试函数都会单独执行一次 setup 和 teardown | 每次测试需要独立环境(如数据库事务、临时文件) |
class |
每个测试类 | 每个测试类运行前执行一次 setup ,类中所有测试完成后执行一次 teardown |
整个类的所有测试共享同一个 setup/teardown | 同一个类中多个测试共享资源(如登录状态) |
module |
每个模块(.py 文件) |
每个模块运行前执行一次 setup ,模块中所有测试完成后执行一次 teardown |
模块内所有测试共享同一个 setup/teardown | 同一个文件中多个测试共享资源(如配置加载) |
package |
每个包(含 __init__.py 的目录) |
每个包运行前执行一次 setup ,包中所有测试完成后执行一次 teardown |
包内所有模块共享同一个 setup/teardown | 包内多个模块共享资源(如模拟服务) |
session |
整个测试会话 | 整个会话只执行一次 setup ,所有测试完成后执行一次 teardown |
所有测试共享同一个 setup/teardown | 所有测试共享资源(如数据库连接池) |
执行顺序:
假设一个测试函数中同时使用了多个不同作用域的 fixture(例如:session
、module
、class
、function
、package
),那么 pytest 会按照 fixture 的作用域优先级顺序来执行它们!
import pytest
@pytest.fixture(scope="function")
def function_fixture():
print("function 作用域执行了setup")
yield
print("\nfunction 作用域执行了teardown")
@pytest.fixture(scope="class")
def class_fixture():
print("class 作用域执行了setup")
yield
print("class 作用域执行了teardown")
@pytest.fixture(scope="module")
def module_fixture():
print("module 作用域执行了setup")
yield
print("module 作用域执行了teardown")
@pytest.fixture(scope="package")
def package_fixture():
print("package 作用域执行了setup")
yield
print("package 作用域执行了teardown")
@pytest.fixture(scope="session")
def session_fixture():
print("\nsession 作用域执行了setup")
yield
print("package 作用域执行了teardown")
def test_all_scope(function_fixture, class_fixture, module_fixture, package_fixture, session_fixture):
assert 1 == 1
总结:
- Setup阶段 按照
session -> module -> class -> function
的顺序进行。 - Teardown阶段 则按照相反的顺序,即
function -> class -> module -> session
进行。
补充:
在 pytest
中,全局的 fixture 通常是指在整个测试项目中都可以使用的 fixture。我们可以使用 conftest.py
文件来定义这些 fixture,并且不需要被显式导入,pytest
会自动识别并加载它。
注意: conftest.py
的作用范围是该文件所在目录及其所有子目录下的测试文件(test_*.py)都可以使用其中定义的 fixture。
my_project/
├── conftest.py <-- 全局 fixtures
├── test_root.py
├── api/
│ ├── conftest.py <-- API 模块专属 fixtures
│ └── test_api.py
└── ui/
├── conftest.py <-- UI 模块专属 fixtures
└── test_ui.py
项目中多级目录下都定义 conftest.py
文件,它们都会被加载!!!
test_api.py
会加载my_project/api/conftest.py
和上级的my_project/conftest.py
- 如果函数同名的话,优先使用当前目录下的
conftest.py
里面的!
评论区