← Назад ко всем вопросам

Как параметризовать 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

  • Если вы хотите параметризовать только одну конкретную тестовую функцию.
  • Если вы хотите передать несколько параметров в тестовую функцию.

Оба подхода имеют свои преимущества и могут использоваться в зависимости от структуры тестов и требований к параметризации.

Тема: PyTest
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки