Фикстуры с параметрами в pytest
создаются с помощью декоратора @pytest.fixture(params=[...])
.
params
- это список значений, которые будут переданы в фикстуру. Для каждого значения из списка фикстура будет вызвана один раз.
Использовать параметризованную фикстуру в тесте можно, просто указав ее имя в качестве аргумента тестовой функции. request
объект внутри фикстуры предоставляет доступ к параметру через request.param
.
Пример:
import pytest
@pytest.fixture(params=[1, 2, 3])
def my_fixture(request):
return request.param
def test_my_test(my_fixture):
assert my_fixture > 0
В pytest фикстуры с параметрами позволяют запускать один и тот же тест с разными входными данными, делая тестирование более эффективным и всесторонним. Вот как это делается:
Определение параметризованной фикстуры:
import pytest
@pytest.fixture(params=[1, 2, 3])
def my_fixture(request):
return request.param
@pytest.fixture
: Декоратор, определяющий фикстуру.params=[1, 2, 3]
: Ключевое слово params
определяет список значений, которые будут использоваться для параметризации фикстуры. В данном случае, фикстура будет вызвана три раза, с request.param
равным 1, 2 и 3 соответственно.request
: Объект request
предоставляет информацию о текущем запросе фикстуры, включая доступ к параметрам через request.param
.Использование параметризованной фикстуры в тесте:
def test_my_fixture(my_fixture):
assert my_fixture > 0
print(f"Текущее значение фикстуры: {my_fixture}")
test_my_fixture(my_fixture)
: Тестовая функция принимает фикстуру my_fixture
как аргумент. pytest автоматически вызывает фикстуру и передает возвращаемое значение в тестовую функцию.params
фикстуры.Более сложные примеры с использованием ID для фикстур:
import pytest
@pytest.fixture(
params=[(1, 2, 3), (4, 5, 6)],
ids=["first_set", "second_set"]
)
def data_set(request):
return request.param
def test_data_set(data_set):
a, b, c = data_set
assert a + b + c > 0
print(f"a: {a}, b: {b}, c: {c}")
ids=["first_set", "second_set"]
: Ключевое слово ids
позволяет задать понятные имена для каждого набора параметров. Это облегчает чтение результатов тестов.request.param
будет сначала (1, 2, 3)
, а затем (4, 5, 6)
.Параметризация с использованием pytest.mark.parametrize
:
Вместо параметризации самой фикстуры, можно параметризовать непосредственно тестовую функцию, используя декоратор @pytest.mark.parametrize
. Это может быть более удобным в некоторых случаях.
import pytest
@pytest.mark.parametrize(
"input,expected",
[
(2, 4),
(3, 9),
(4, 16),
],
ids=["two", "three", "four"]
)
def test_square(input, expected):
assert input * input == expected
@pytest.mark.parametrize("input,expected", [...])
: Декоратор parametrize
принимает список кортежей. Каждый кортеж содержит входные данные для тестовой функции (в данном случае input
и expected
).ids
: Позволяет присвоить имена тестовым случаям.Когда использовать параметризованные фикстуры против pytest.mark.parametrize
?
pytest.mark.parametrize
: Подходит, когда параметризация специфична только для одного теста или небольшого набора тестов, и логика инициализации не требуется.Преимущества параметризации: