一. 生命周期简介
在 pytest 中,测试用例的生命周期所指的是,用例执行前的准备条件以及执行过程中乃至结束后的环境条件的清理的一系列过程的管理,比如前面学的setup/teardown 函数的作用域,本身就是一种生命周期的表现形式
-
测试用例生命周期管理的步骤
🔹 准备(Setup):在测试函数执行之前,可以通过配置进行初始化工作。可以使用 setup 或者 fixture 等相关测试装置。
🔹 执行(Test Execution):pytest 执行测试函数,并进行断言验证。
🔹 清理(Teardown):测试函数执行完后,可以通过配置进行清理工作。可以使用 teardown 或者 fixture 等相关测试装置。
二. fixture 生命周期管理
fixture 是 pytest 中提供的一种机制,用于在测试函数执行前进行资源的准备,在测试完成后进行清理操作。fixture 更加灵活,支持不同的作用域、依赖注入和自动清理。
Pytest 的 fixture 功能使测试编写变得更加灵活、模块化和可维护,它是 Pytest 的核心特性之一。
使用步骤
-
定义 fixture:定义一个函数,在其上方使用
@pytest.fixture装饰器,这样就定义好了一个 fixture 函数。 -
使用 fixture:将 fixture 函数的函数名作为参数传递给测试用例,pytest 会自动注入该 fixture。在该测试用例执行之前,会自动执行 fixture。类似于 setup 的操作。
实战案例
-
场景: 测试⽤例执⾏时,有的⽤例需要登录才能执⾏,有些⽤例不需要登录。setup ⽆法满⾜。需要使用 fixture,它的默认作用域为 function,每个测试用例都使用新的 fixture 实例。
-
步骤
-
1.导⼊ pytest
-
2.在登录的函数上⾯加 @pytest.fixture()
-
3.在要使⽤登录前提的测试⽅法中传⼊(登录函数名称),就先登录
-
4.不传⼊的就不登录直接执⾏测试⽅法。
-
-
代码示例
pythonimport pytest # 默认作用域 @pytest.fixture() def login(): print("完成登录操作") return 200 def test_search(): print("搜索") def test_cart(login): assert login == 200 print("购物车")- 运行结果

- 运行结果
三. fixture 作用域
pytest 允许控制 fixture 的 作用域。常见的作用域有 function(默认)、module、class、package 和 session。
- 使用步骤:将
@pytest.fixture()中的scope参数设置成对应的作用域取值。- 举例 : @pytest.fixture(scope="function")
| 取值 | 范围 | 对比说明 |
|---|---|---|
| function | 函数级 | 默认作用域,每一个函数或方法都会调用,每个测试函数都会创建一个新的 fixture 实例 |
| class | 类级别 | 每个测试类只运行一次,同一类内的所有测试方法共享同一个 fixture 实例 |
| module | 模块级 | 每一个 py 文件调用一次,同一模块内的所有测试函数共享同一个 fixture 实例 |
| package | 包级 | 每一个 python 包只调用一次,同一包内的所有测试函数共享同一个 fixture 实例 |
| session | 会话级 | 每次会话只需要运行一次,会话内所有方法及类,模块都共享同一个 fixture 实例 |
四. fixture 与 setup teardown 的区别
| 特性/功能 | fixture | setup/teardown |
|---|---|---|
| 定义方式 | 使用 @pytest.fixture 装饰器定义 | 在测试类中定义 setup 和 teardown 方法 |
| 作用范围 | 可以通过 scope 控制作用域 | 需要修改方法名称来修改作用域 |
| 资源管理方式 | 支持资源的初始化与清理,可以在 fixture 中使用 yield 来分隔设置和清理部分 | 通过 setup 进行资源初始化,通过 teardown 进行清理 |
| 灵活性 | 高,支持作用域、依赖关系、参数化等高级功能 | 相对较低,在作用域范围内自动全部生效 |
| 参数化支持 | 支持参数化,可以用不同的数据集多次执行测试 | 不支持内建的参数化功能 |
| 测试函数之间的共享 | 可以跨多个测试函数、模块、类甚至整个会话共享资源 | 每个测试方法之间的资源是独立的,不能共享 |
| 测试用例依赖 | 支持多个 fixture 作为参数传递给测试用例,方便依赖注入 | 无法直接传递,依赖关系需要手动管理 |
| 适用场景 | 适用于复杂的测试用例、跨多个测试函数共享资源的情况 | 适用于简单的测试用例 |