我的测试学习站TEST LEARNING HUB
开始学习
首页/精华文章/8. Pytest fixture 怎么理解

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。

十三、练习清单

  1. 写一个 token fixture;
  2. 用 fixture 返回 headers;
  3. 用 yield 清理数据;
  4. 练习 function scope;
  5. 练习 session scope;
  6. 创建 conftest.py;
  7. 写 fixture 依赖 fixture;
  8. 避免 autouse 滥用;
  9. 用 fixture 准备订单数据;
  10. 准备 fixture 面试回答。

fixture 是 Pytest 框架化能力的核心。用得好,自动化用例会更清晰、更稳定、更容易维护。

配套刷题: