官方实例
# content of test_use_more_fixture.py
import pytest
# Arrange
@pytest.fixture
def first_entry():
return "a"
# Arrange
@pytest.fixture
def second_entry():
return 2
# Arrange
@pytest.fixture
def order(first_entry, second_entry):
return [first_entry, second_entry]
# Arrange
@pytest.fixture
def expected_list():
return ["a",2,3.0]
def test_string(order, expected_list):
# Act
order.append(3.0)
# Assert
assert order == expected_list
# content of test_use_more_than_once.py
import pytest
# Arrange
@pytest.fixture
def first_entry():
return "a"
# Arrange
@pytest.fixture
def order():
return []
# Act
@pytest.fixture
def append_first(order, first_entry):
return order.append(first_entry)
def test_string_only(append_first, order, first_entry):
# Assert
assert order == [first_entry]
解读与实操
测试或fixture中并不局限于一次请求一个fixture,他们要请求多少就可以请求多少。
每个测试可以多次请求fixture(返回值被缓存起来),在同一测试期间也可以多次请求fixture,并且pytest不会在该测试中再次执行它们。这意味着我们可以请求依赖于它们的多个fixture中的fixture,而无需多次执行这些fixture。
如果在测试期间,每请求fixture就执行一次,这个测试会失败,因为append_first和test_string_only将order作为一个空列表,但是order缓存了其返回值,append_first和test_string_only都引用了同一个对象。
场景应用
一个fixture或测试函数可以一次请求多个fixture,不同fixture用于实现不同功能,例如,一个fixture用于获取token,其它fixture用于获取搜索项,两个fixture共同为测试一个搜索功能提供测试前提数据;只需要请求一次获取token的fixture,其它测试函数可以多次使用这个fixture,而不会每次都要获取一个新的token。