Как параметризовать fixture (params) и чем это отличается от @pytest.mark.parametrize?
1️⃣ Как кратко ответить
Параметризация fixture с помощью params позволяет передавать разные значения в fixture, которые будут использоваться в тестах. Это удобно для повторного использования одной и той же логики с разными данными. В отличие от @pytest.mark.parametrize, который параметризует сами тестовые функции, params параметризует только fixture, что позволяет использовать одну и ту же fixture с разными наборами данных в разных тестах.
2️⃣ Подробное объяснение темы
В тестировании с использованием библиотеки Pytest, параметризация — это способ запуска тестов с различными входными данными. Это позволяет проверить, как код работает с разными наборами данных, не дублируя тестовые функции. Pytest предоставляет два основных способа параметризации: через params в fixture и через декоратор @pytest.mark.parametrize.
Параметризация fixture с помощью params
Когда вы создаете fixture в Pytest, вы можете использовать параметр params для передачи списка значений, которые fixture будет принимать. Pytest автоматически запустит все тесты, использующие эту fixture, для каждого значения из списка.
Пример:
import pytest
@pytest.fixture(params=[1, 2, 3])
def number(request):
# request.param содержит текущее значение из списка params
return request.param
def test_even(number):
# Проверяем, что число четное
assert number % 2 == 0
@pytest.fixture(params=[1, 2, 3]): Определяет fixture с именемnumber, которая будет принимать значения 1, 2 и 3.request.param: Специальный объект, предоставляемый Pytest, который содержит текущее значение параметра.test_even(number): Тестовая функция, которая будет запущена трижды, по одному разу для каждого значения из списка[1, 2, 3].
Отличия от @pytest.mark.parametrize
@pytest.mark.parametrize используется для параметризации самих тестовых функций, а не fixtures. Это позволяет передавать разные наборы данных непосредственно в тестовую функцию.
Пример:
import pytest
@pytest.mark.parametrize("number", [1, 2, 3])
def test_even(number):
# Проверяем, что число четное
assert number % 2 == 0
@pytest.mark.parametrize("number", [1, 2, 3]): Параметризует тестовую функциюtest_even, передавая в нее значения 1, 2 и 3.test_even(number): Тестовая функция, которая будет запущена трижды, по одному разу для каждого значения из списка[1, 2, 3].
Когда использовать params в fixture
- Если у вас есть сложная логика инициализации, которую вы хотите повторно использовать с разными данными.
- Если вы хотите использовать одну и ту же fixture в нескольких тестах с разными параметрами.
Когда использовать @pytest.mark.parametrize
- Если вы хотите параметризовать только одну конкретную тестовую функцию.
- Если вы хотите передать несколько параметров в тестовую функцию.
Оба подхода имеют свои преимущества и могут использоваться в зависимости от структуры тестов и требований к параметризации.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться