Параметризация тестов в pytest

Как использовать параметризация тестов в pytest

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

Как использовать @pytest.mark.parametrize

Базовый пример

Допустим, у вас есть функция, которая проверяет, является ли число четным, и вы хотите протестировать ее с несколькими значениями.

import pytest

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

@pytest.mark.parametrize("number, expected_result", [(2, True), (3, False), (4, True)])
def test_is_even(number, expected_result):
    assert is_even(number) == expected_result

В данном примере тест test_is_even будет запущен три раза с различными наборами данных.

Параметризация нескольких аргументов

Вы можете параметризировать несколько аргументов одновременно, передавая их в кортеже.

@pytest.mark.parametrize("a, b, expected_sum", [(1, 2, 3), (4, 5, 9), (10, 20, 30)])
def test_addition(a, b, expected_sum):
    assert a + b == expected_sum

Использование списка

Чтобы упростить структуру и повысить читаемость, вы можете вынести тестовые данные в отдельный список.

data = [
    (1, 2, 3),
    (4, 5, 9),
    (10, 20, 30)
]

@pytest.mark.parametrize("a, b, expected_sum", data)
def test_addition(a, b, expected_sum):
    assert a + b == expected_sum

Комбинирование параметризации

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

@pytest.mark.parametrize("a", [1, 2, 3])
@pytest.mark.parametrize("b", [4, 5])
def test_combinations(a, b):
    pass

В этом примере test_combinations будет запущен 6 раз с каждой комбинацией значений a и b.

Заключение

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

Содержание: