我用Dummy类来实现fixture功能。那就从你的测试中打出来。提供明确的方法名称,以便更好地理解您的测试在做什么。
- import pytest
-
- @pytest.fixture
- def login():
- class Dummy:
- def make_user(self):
- return 'New user name'
- return Dummy()
-
- def test_something(login):
- a = login.make_user()
- b = login.make_user()
- assert a == b
诀窍是利用标记参数化使用“间接”开关,因此:
- @pytest.fixture
- def data_repeated(request):
- return [deepcopy({'a': 1, 'b': 2}) for _ in range(request.param)]
-
-
- @pytest.mark.parametrize('data_repeated', [3], indirect=['data_repeated'])
- def test(data_repeated):
- assert data_repeated == [
- {'a': 1, 'b': 2},
- {'a': 1, 'b': 2},
- {'a': 1, 'b': 2}]
-
pytest.mark.parametrize里面indirect参数详细解释
@pytest.mark.parametrize里面indirect参数,默认是False
False: 就是parametrize里面argnames 参数当作一个普通的变量,不会去找变量对应函数的名的方法
True: 就是parametrize里面argnames 参数当作函数执行,它会去找对应的函数,去执行
另一种方法是复制fixture函数。这既简单又正确地处理了参数化fixture,并使用两个fixture的所有参数组合调用test函数。下面的示例代码引发了9个断言:
- import pytest
-
- @pytest.fixture(params=[0, 1, 2])
- def first(request):
- return request.param
-
- second = first
-
- def test_double_fixture(first, second):
- assert False, '{} {}'.format(first, second)