毫不夸张的说 fixture 是 pytest 的利器,是 pytest 最重要的部分!
若没有 pytest 基础,请点击前往:零基础测开学习 10——pytest_基础
在用例执行之前,执行之后,自动执行代码(准备、请求代码)
之前:启动浏览器;之后:关闭浏览器
之前:连接数据库;之后:关闭数据库连接
之前:注册账号;之后:删除账号
1.创建一个函数(不要以 test_开头)
2.添加装饰器(@pytest.fixture)
3.添加关键字(yield)
示例:
import pytest
@pytest.fixture
def func():
print(‘前置:在用例执行之前’)
pytest 123
print(‘后置,在用例执行之后’)
请求框架调用 fixture,并返回结果:
1.把 fixture 名字写在用例参数列表(可以接受结果:yield 中的结果)
2.使用@pytest.mark.usefixtures 标记(不可以接受结果)
3.不允许直接调用 fixture
作用域是通过定义来进行控制
function:函数默认值
class:类
module:模块(文件)
package:包(目录),要定义在 conftest.py
session:全局(所有的用例),要定义在 confteset.py
同一个作用域,fixture 不会重复执行:
package 作用域的 fixture,在共一个作用域里,不会重复执行
session 作用域的 fixture,整个框架运行过程中,只执行 1 次
场景:
10 个用例,希望使用同一个浏览器
希望所有测试用例执行完成后,做某事
示例:
import pytest
@pytest.fixture(scope = ‘class’)
def func():
print(‘前置:在用例执行之前’)
pytest 123
print(‘后置,在用例执行之后’)
谨慎使用!优先考虑使用 mark 实现参数化
示例:
import pytest
from my_math import add
# 定义一个参数化的fixture
@pytest.fixture(params = [
(1,2,3),
(-1,5,4),
(0,0,0)
])
def add_test_data(request):
return request.param
def test_add(test_data):
a,b,c = test_data
assert add(a,b) == c
直接把 fixture 放在根目录的 conftest 包中即可
其中:conftest.py : 自动发现和加载 fixture
示例:

1.直接调用 fixture
2.不清晰的作用域和依赖
3.在 fixture 中编写递归函数
4.fixture 的异常处理:fixture 中产生的异常会导致测试被标记为 ERROR,而不是 FAILED。这意味着是测试环境搭建失败了,而非测试逻辑本身失败。为了优雅处理,可以在 fixture 中使用 try...except...finally 语句来捕获异常、记录日志,并确保清理工作(如关闭文件、断开连接)在 finally 块或 yield 后的 teardown 代码中一定会执行。
pytest 的英文名称对应的是家具,这里谐音为了夹具,方便记忆、理解,更加生动形象。