Pytest 测试用例生命周期管理 - fixture
简介
在 pytest 中,测试用例生命周期管理指的是测试用例从执行之前、执行过程中到执行之后的一系列操作和过程管理。
pytest 提供了丰富的机制来控制测试用例的生命周期,包括如何初始化和清理测试环境、如何设置和拆解测试数据、如何管理依赖关系等。
测试用例生命周期管理的步骤
- 准备(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.不传⼊的就不登录直接执⾏测试⽅法。
代码示例:
import pytest
@pytest.fixture()
def login():
print("完成登录操作")
def test_search():
print("搜索")
def test_cart(login):
print("购物车")
def test_order(login):
print("下单功能")
运行结果:
fixture 与 setup teardown 的区别
特性/功能 | fixture |
setup/teardown |
---|---|---|
定义方式 | 使用 @pytest.fixture 装饰器定义 |
在测试类中定义 setup 和 teardown 方法 |
作用范围 | 可以通过 scope 控制作用域 |
需要修改方法名称来修改作用域 |
资源管理方式 | 支持资源的初始化与清理,可以在 fixture 中使用 yield 来分隔设置和清理部分 |
通过 setup 进行资源初始化,通过 teardown 进行清理 |
灵活性 | 高,支持作用域、依赖关系、参数化等高级功能 | 相对较低,在作用域范围内自动全部生效 |
参数化支持 | 支持参数化,可以用不同的数据集多次执行测试 | 不支持内建的参数化功能 |
测试函数之间的共享 | 可以跨多个测试函数、模块、类甚至整个会话共享资源 | 每个测试方法之间的资源是独立的,不能共享 |
测试用例依赖 | 支持多个 fixture 作为参数传递给测试用例,方便依赖注入 |
无法直接传递,依赖关系需要手动管理 |
适用场景 | 适用于复杂的测试用例、跨多个测试函数共享资源的情况 | 适用于简单的测试用例 |
总结
- fixture 在自动化中的基本用法
- fixture 与 setup teardown 的区别