Вопрос проверяет понимание параметризованных тестов, их назначения для избежания дублирования кода и повышения читаемости тестовых сценариев.
Параметризованные тесты — это мощная техника в модульном тестировании, которая позволяет разработчикам определять один тестовый метод, но выполнять его многократно с различными наборами входных параметров и ожидаемых результатов. Основная идея заключается в том, чтобы отделить логику теста от конкретных тестовых данных, что делает тестовую базу более гибкой и легко расширяемой.
Вместо написания нескольких отдельных тестовых функций для каждого набора данных вы создаёте одну функцию и указываете, какие данные должны быть в неё переданы. Фреймворк тестирования (например, pytest) автоматически запустит эту функцию для каждого набора, генерируя отдельный тестовый случай в отчёте. Если один из наборов данных приводит к падению теста, остальные продолжают выполняться, что помогает локализовать проблему.
Рассмотрим простую функцию, которую нужно протестировать с разными аргументами.
# Функция для тестирования
def add(a, b):
return a + b
# Параметризованный тест с использованием декоратора pytest.mark.parametrize
import pytest
@pytest.mark.parametrize("a, b, expected", [
(1, 2, 3),
(0, 0, 0),
(-1, 5, 4),
(10, -3, 7),
])
def test_add(a, b, expected):
result = add(a, b)
assert result == expected
В этом примере декоратор @pytest.mark.parametrize принимает строку с именами параметров и список кортежей с тестовыми данными. Тест test_add будет выполнен четыре раза, каждый раз с новыми значениями a, b и expected.
Использование параметризованных тестов значительно сокращает дублирование кода, улучшает читаемость и облегчает добавление новых тестовых случаев. Однако важно не злоупотреблять ими: если тестовые данные становятся слишком сложными или логика теста начинает ветвиться в зависимости от параметров, возможно, стоит разбить тест на несколько отдельных.
Итог: Параметризованные тесты стоит применять, когда вам нужно проверить одну и ту же функциональность на множестве однотипных данных, особенно при тестировании граничных условий и различных сценариев ввода.