官方实例
# content of test_append.py
import pytest# Arrange
@pytest.fixture
def first_entry():return "a"# Arrange
@pytest.fixture
def order(first_entry):return [first_entry]def test_string(order):# Actorder.append("b")# Assertassert order == ['a','b']
# content of test_reuse_fixture.py
import pytest# Arrange
@pytest.fixture
def first_entry():return "a"# Arrange
@pytest.fixture()
def order(first_entry):return [first_entry]def test_string(order):# Actorder.append("b")# Assertassert order == ["a","b"]def test_int(order):# Actorder.append(2)# Assertassert order == ["a",2]
解读与实操
pytest最大的优势之一是其极其灵活的fixture系统。它允许我们将复杂的测试需求简化成更简单和有组织的功能,我们只需要让每个功能描述它们所依赖的东西。
pytest的fixture系统如此强大的原因之一是,它使我们能够定义一个可以反复重用的通用步骤,就像使用普通函数一样。两个不同的测试可以请求相同的fixture,并让pytest从该fixture为每个测试提供各自的结果。
这对于确保测试不受彼此影响非常有用。我们可以使用这个系统来确保每个测试都获得自己的新一批数据,并且从一个干净的状态开始,这样它就可以提供一致的、可重复的结果。
场景应用
fixture可以调用其它fixture;重复使用fixture时,每个测试都会获得不受影响的一批数据。在登录类应用时比较方便,创建一个获取token的fixture,其它测试函数重复使用这个fixture,获取鉴权。后面会说明fixture作用域,设置为类级或会话级,可以保证多次测试只请求了一个token。