Как pk786 упоминает в своем комментарии, вы должны использовать прибор "... если у вас есть что-то для настройки и разрыва для теста или использовать один и тот же набор данных для нескольких тестов, тогда используйте прибор ".
Например, вы можете загрузить несколько наборов данных, с которыми вы тестируете, в разных тестовых функциях. Использование прибора позволяет вам загружать эти наборы данных только один раз и совместно использовать их в тестовых функциях. Вы можете использовать params
аргумент @pytest.fixture
для загрузки и кэширования каждого набора данных. Затем тестовые функции, использующие эти приборы, будут работать с каждым загруженным набором данных. В коде это может выглядеть примерно так:
import json
import pytest
test_files = ["test_file1.json", "test_file2.json"]
@pytest.fixture(params=test_files)
def example_data(request):
with open(request.param, "r") as f:
data = json.load(f)
return data
def test_function1(example_data):
# run test with example data.
# this test will be run once for each file in the list `test_files` above.
...
def test_function2(example_data):
# run a different test with example data.
# this test will be run once for each file in the list `test_files` above.
# this test takes advantage of automatic caching mechanisms of fixtures...
# ...so that data is not loaded again.
...
В качестве альтернативы, как pk786 заявляет: «Если вы используете набор данных только один раз, то @ pytest.mark.parametrize должен будьте подходом ».
Это утверждение относится к примеру, который вы предоставили, поскольку вы не выполняете никаких настроек в приборе, которые вы хотите использовать в тесте. В этом случае, даже если вы используете «токены» в нескольких тестах, я бы подумал о том, чтобы украсить каждую функцию @pytest.mark.parameterize
, так как я считаю, что этот подход более явно выражает ваши намерения и его будет легче понять всем, кто читает ваш код. Это будет выглядеть так:
...
def tokens():
yield from ["+", "*", "?"]
@pytest.mark.parametrize("token", tokens())
def test_stuff(token):
assert stuff
@pytest.mark.parametrize("token", tokens())
def test_other_stuff("token", tokens())
assert other_stuff