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

Как работает @pytest.mark.parametrize

1️⃣ Как кратко ответить

@pytest.mark.parametrize — это декоратор в библиотеке Pytest, который позволяет запускать один и тот же тест с разными наборами входных данных. Он упрощает тестирование функций с различными параметрами, улучшая покрытие тестами и снижая дублирование кода.

2️⃣ Подробное объяснение темы

@pytest.mark.parametrize — это мощный инструмент в Pytest, который позволяет тестировать функции с различными входными данными без необходимости писать отдельные тесты для каждого набора данных. Это особенно полезно, когда нужно проверить, как функция ведет себя с разными входными значениями, и убедиться, что она правильно обрабатывает все возможные случаи.

Зачем это нужно

  1. Улучшение покрытия тестами: Позволяет протестировать функцию на большем количестве случаев, что увеличивает вероятность обнаружения ошибок.
  2. Снижение дублирования кода: Вместо написания нескольких тестов с разными данными, можно использовать один тест с параметризацией.
  3. Удобство и читаемость: Код тестов становится более компактным и легким для понимания.

Как это работает

Декоратор @pytest.mark.parametrize принимает два основных аргумента:

  • Список параметров: Перечисление имен переменных, которые будут использоваться в тесте.
  • Список значений: Наборы значений, которые будут подставляться в параметры.

Пример использования

Рассмотрим пример, где у нас есть функция, которая проверяет, является ли число четным:

def is_even(number):
    return number % 2 == 0

Теперь создадим тест с использованием @pytest.mark.parametrize:

import pytest
​
@pytest.mark.parametrize("input,expected", [
    (2, True),   # Четное число, ожидаем True
    (3, False),  # Нечетное число, ожидаем False
    (0, True),   # Ноль, четное число, ожидаем True
    (-2, True),  # Отрицательное четное число, ожидаем True
    (-3, False)  # Отрицательное нечетное число, ожидаем False
])
def test_is_even(input, expected):
    assert is_even(input) == expected

Объяснение кода

  • @pytest.mark.parametrize("input,expected", [...]): Декоратор принимает два аргумента. Первый — это строка с именами параметров, которые будут использоваться в тесте. Второй — список кортежей, где каждый кортеж содержит набор значений для параметров.

  • def test_is_even(input, expected):: Определение тестовой функции, которая принимает параметры input и expected. Эти параметры будут автоматически заполняться значениями из списка значений, переданных в декоратор.

  • assert is_even(input) == expected: Проверка, что результат вызова функции is_even с параметром input соответствует ожидаемому значению expected.

Применение

Этот подход позволяет легко добавлять новые тестовые случаи, просто добавляя новые кортежи в список значений. Это делает тесты более гибкими и масштабируемыми. @pytest.mark.parametrize широко используется в автоматизированном тестировании для проверки функций с различными входными данными, что делает его незаменимым инструментом для специалистов по AQA.

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

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

Твои заметки