8. Pytest fixture 怎么理解
fixture 是 Pytest 中非常重要的机制,也是自动化测试面试中高频考点。很多测试同学知道 fixture 是前置和后置,但说不清楚它在项目里怎么用。实际上,fixture 不只是 setup 和 teardown 的替代品,它可以用于登录获取 Token、准备测试数据、创建数据库连接、初始化浏览器、清理环境、共享公共资源,是 Pytest 框架设计中的核心能力。
面试中问 fixture,重点要讲清楚:fixture 解决什么问题,怎么定义和使用,scope 有哪些级别,yield 如何实现后置,conftest.py 有什么作用,以及在接口自动化中如何用 fixture 管理登录态和测试数据。
一、fixture 解决什么问题
自动化测试中很多用例都有共同前置条件:
- 登录获取 Token;
- 准备用户数据;
- 创建订单;
- 连接数据库;
- 初始化浏览器;
- 清理测试数据;
- 读取配置;
- 初始化请求头。
如果每个用例都重复写这些代码,会非常冗余。fixture 可以把这些公共前置封装起来,用例需要时直接引用。
二、fixture 基本写法
import pytest
@pytest.fixture
def token():
return "mock_token"
def test_order(token):
assert token == "mock_token"
用例函数参数名和 fixture 名一致时,Pytest 会自动注入返回值。
三、fixture 用于登录 Token
接口自动化中最常见场景:
@pytest.fixture
def login_token():
token = "mock_token"
return token
def test_create_order(login_token):
headers = {"Authorization": f"Bearer {login_token}"}
assert "Authorization" in headers
真实项目中,fixture 会调用登录接口获取 Token,供后续接口使用。
四、fixture 的 yield 后置清理
如果 fixture 需要前置和后置,可以使用 yield。
@pytest.fixture
def test_data():
order_id = "NO10001"
yield order_id
print("清理测试订单")
yield 前是前置,yield 后是后置。
测试场景:
- 创建测试数据;
- 用例执行;
- 删除测试数据。
五、fixture scope 作用域
fixture 可以设置作用域:
- function:每个用例执行一次,默认;
- class:每个测试类执行一次;
- module:每个模块执行一次;
- session:整个测试会话执行一次。
例如:
@pytest.fixture(scope="session")
def base_url():
return "https://test-api.example.com"
登录 Token 如果整个测试过程可复用,可以设置 session;如果每个用例需要独立登录,可以使用 function。
六、autouse 自动使用
@pytest.fixture(autouse=True)
def print_case_start():
print("用例开始")
autouse=True 表示不需要显式传参,每个用例自动执行。
适合公共日志、环境检查等,但不要滥用,否则用例行为不透明。
七、conftest.py 的作用
conftest.py 是 Pytest 的配置文件,可以放公共 fixture。
例如项目结构:
testcases/
test_order.py
conftest.py
conftest.py 中的 fixture 可以被同目录及子目录用例自动发现,不需要 import。
常放:
- 登录 fixture;
- base_url;
- 数据库连接;
- 浏览器驱动;
- 全局配置;
- 测试数据清理。
八、fixture 依赖 fixture
fixture 可以依赖另一个 fixture。
@pytest.fixture
def token():
return "abc"
@pytest.fixture
def auth_headers(token):
return {"Authorization": f"Bearer {token}"}
接口用例直接使用 auth_headers,更清晰。
九、接口自动化中的 fixture 设计
常见设计:
base_url:环境地址;token:登录 Token;auth_headers:鉴权头;db:数据库连接;create_order:创建订单并返回订单号;clear_data:用例后清理数据。
fixture 的目标是让测试用例聚焦业务断言,而不是前置细节。
十、常见错误
1. scope 设置不合理
Token 如果容易过期,却设置 session,可能导致后续用例 401。
2. fixture 做太多事
一个 fixture 里登录、创建订单、支付、断言,职责过重。
3. 清理不完整
创建测试数据后不清理,导致环境污染。
4. autouse 滥用
所有用例自动执行隐藏逻辑,排查问题困难。
十一、面试回答模板
如果面试官问“Pytest fixture 怎么理解”,可以这样回答:
fixture 是 Pytest 用来管理前置、后置和公共资源的机制。接口自动化中,我常用 fixture 做登录获取 Token、生成鉴权 Header、准备测试数据、连接数据库和清理数据。fixture 可以通过 return 返回数据给用例,也可以用 yield 实现前置和后置清理。scope 可以控制执行频率,比如 function、module、session。公共 fixture 通常放在 conftest.py 中,让多个用例复用。设计 fixture 时要注意职责清晰、作用域合理,避免 Token 过期或测试数据污染。
十二、常见追问
追问:yield 有什么用?
yield 前是前置,yield 后是后置,适合创建数据后清理数据。
追问:conftest.py 为什么不用 import?
Pytest 会自动发现 conftest.py 中的 fixture,供同目录和子目录使用。
追问:fixture 和 setup/teardown 区别?
fixture 更灵活,可以按需使用、传递返回值、设置作用域、组合依赖。
追问:scope 怎么选?
看资源复用范围。每用例独立用 function,全局配置或稳定 Token 可用 session。
十三、练习清单
- 写一个 token fixture;
- 用 fixture 返回 headers;
- 用 yield 清理数据;
- 练习 function scope;
- 练习 session scope;
- 创建 conftest.py;
- 写 fixture 依赖 fixture;
- 避免 autouse 滥用;
- 用 fixture 准备订单数据;
- 准备 fixture 面试回答。
fixture 是 Pytest 框架化能力的核心。用得好,自动化用例会更清晰、更稳定、更容易维护。
配套刷题:

