pytest 的核心 fixture 是一个装饰器函数,用于定义和管理测试用例中共享的对象和资源。fixture 可以提供一些预定义的对象,以便在测试用例中使用,例如数据库连接、临时文件、测试数据等。
pytest 提供了一些常用的 fixture,例如:
- autouse:自动使用的 fixture,无需在测试用例中显式调用。
- scope:指定 fixture 的作用域,可以是函数级别、模块级别、类级别、整个会话级别等。
- params:为 fixture 提供参数化的值,可以在多个测试用例中使用不同的参数值。
- yield:使用 yield 关键字可以在 fixture 中进行一些清理操作,在测试用例执行完毕后自动执行。
除了这些常用的 fixture,pytest 还支持自定义 fixture,可以在 conftest.py 文件中定义。
【conftest.py的名称是固定的,不能修改名称。别问为什么……-_-!!!】
Pytest对于fixture的自动发现有一些命名约定:
-
以
conftest.py
命名的文件被视为pytest的根目录。pytest将自动递归查找该文件所在目录及其子目录下的所有conftest.py
文件,并读取其中定义的fixture。 -
定义fixture的函数应以
test_
或fixture_
开头,以便与其他普通测试函数区分开来。 -
如果需要将fixture作用于特定的范围:如整个session、整个module、整个class或单个function,可以使用pytest提供的装饰器来指定作用域,如
@pytest.fixture(scope='session')
scope参数值及例子:
- "function":每个测试函数运行一次,默认值。即每个测试函数调用时都会创建一个新的 fixture 实例。
- "class":每个测试类运行一次。即每个测试类中的所有测试函数共享同一个 fixture 实例。
- "module":每个测试模块运行一次。即每个测试模块中的所有测试类和函数共享同一个 fixture 实例。
- "session":整个测试会话只运行一次。即在整个测试会话期间,所有测试模块、类和函数共享同一个 fixture 实例。
例子:
import pytest
class MyFixtureClass:
def __init__(self):
# 在这里初始化需要的资源
self.resource = "some_resource"
def setup(self):
# 在测试之前进行准备工作
print("Setting up the test...")
def teardown(self):
# 在测试之后进行清理工作
print("Tearing down the test...")
@pytest.fixture
def my_fixture():
fixture = MyFixtureClass()
yield fixture
# 在fixture使用完之后进行清理
fixture.teardown()
def test_fixture_example(my_fixture):
my_fixture.setup()
# 执行测试代码
print(f"Using the fixture with resource: {my_fixture.resource}")
assert 1 + 1 == 2
需要注意:
1、自定义的fixture必须在package下,不能在文件下,否则无法识别到fixture,区别是否package看看文件中有没有__init__.py文件即可如图
2、如果项目创建了多个conftest.py,同名fixture查找时会优先用最近的,如图conftest.py与testcases/conftest.py中fixture同名,test_case_1.py优先寻找testcases/conftest.py中的fixture
3、fixture定义在非conftest.py文件中需要import导入操作否则定义的fixture不生效,如test_case_2.py中自定义了fixture,并非在conftest.py中,在test_case_3.py中使用时需要import test_case_2,否则会提示找不到fixture
4、在同文件中可以直接调用不需要import操作
参考:
API Reference — pytest documentationhttps://docs.pytest.org/en/stable/reference/reference.html#pytest.fixture【pytest】pytest精通fixture — 测试开发刚哥 latest documentation
https://dongfanger.gitee.io/blog/%E6%9B%B4%E5%A4%9A%E8%AF%AD%E8%A8%80/003003-%E3%80%90pytest%E3%80%91pytest%E7%B2%BE%E9%80%9Afixture.html