В тесте pytest два аргумента параметризованы независимо: сколько случаев создаст pytest при трёх значениях первого, четырёх второго?
Pytest создаст 12 тестовых случаев: он построит декартово произведение наборов параметров, то есть проверит каждую комбинацию значения первого аргумента со значением второго.
Параметризация появилась как способ не дублировать почти одинаковые тестовые функции для разных входных данных. Она сохраняет каждый набор данных отдельным тестовым случаем, поэтому результаты и ошибки видны раздельно.
При трёх значениях первого аргумента и четырёх значениях второго возможны 3 × 4 комбинации. Ошибка в расчёте может привести к недооценке времени выполнения или к ошибочному ожиданию количества проверок.
Если вместо параметризации вручную перебирать значения внутри одного теста, pytest обычно покажет этот тест как один результат. При падении будет сложнее понять, какая именно комбинация вызвала проблему.
Каждая комбинация получает отдельный экземпляр теста на этапе сборки. В данном случае создаются случаи для первого значения со всеми четырьмя значениями второго, затем для второго значения — также со всеми четырьмя, и так далее.
Минимальный пример:
В примере будет 12 узлов тестирования. Порядок их отображения зависит от порядка применения параметризации, но полное множество комбинаций от этого не меняется; полагаться на порядок выполнения тестов не следует.
Количество случаев влияет на стоимость фикстур. Если фикстура имеет область действия function, она обычно будет подготовлена отдельно для каждого случая; более широкая область действия может уменьшить затраты, но требует безопасного совместного использования состояния.
Декораторы не означают попарное сопоставление значений по индексам. Для попарного поведения наборы пришлось бы формировать как единый параметр или явно ограничивать комбинации, например через пропуск отдельных случаев.
Команда проверяет права доступа для трёх регионов и четырёх ролей. Полный набор из 12 комбинаций нужен, потому что ошибка может зависеть от конкретного сочетания региона и роли.
Рассматривались три варианта. Один тест с внутренним циклом уменьшил бы видимое количество тестов и ухудшил диагностику. Ручное написание 12 функций создало бы дублирование. Параметризация сохранила независимые отчёты и компактно описала матрицу.
Выбран полный декартов продукт с замоканным внешним сервисом. В результате каждая комбинация отображается отдельно, а тесты остаются быстрыми и воспроизводимыми. Если матрица станет слишком большой, можно отдельно обосновать выбор подмножества или применить попарное покрытие, но это уже компромисс по полноте проверки.
Что произойдёт, если один из наборов параметров окажется пустым?
Pytest не создаст обычные проверяемые комбинации. Поведение определяется настройкой empty_parameter_set_mark: по умолчанию пустой набор обычно приводит к пропуску соответствующего теста, но проект может настроить другой исход, например ошибку. Поэтому пустые данные не следует считать эквивалентом одного случая.
Можно ли с помощью идентификаторов параметров уменьшить число комбинаций?
Нет. Идентификаторы, включая автоматически или явно заданные ids, меняют отображаемое имя тестового случая, но не его набор. Для уменьшения количества запусков нужно изменить сами параметры, исключить комбинации или пометить их как пропускаемые.
Что произойдёт, если один из 12 случаев завершится ошибкой?
Остальные случаи останутся независимыми и будут запущены, если выполнение не остановлено специальной настройкой или плагином. В отчёте будет указан конкретный набор параметров неудачного случая, поэтому параметризация обычно даёт более точную диагностику, чем цикл внутри одного теста.