Ответ
Для запуска одного теста с несколькими наборами входных данных в pytest используется декоратор @pytest.mark.parametrize.
Это основной способ избежать дублирования кода при проверке функции на множестве различных кейсов, что делает тесты более читаемыми и масштабируемыми.
Синтаксис:
@pytest.mark.parametrize("имена_аргументов", [список_значений])
"имена_аргументов": Строка с именами параметров через запятую, которые будут переданы в тестовую функцию.[список_значений]: Список кортежей или других итерируемых объектов, где каждый элемент представляет один тестовый случай.
Пример:
import pytest
# Тестовые данные: (входное_число, ожидаемый_результат)
test_cases = [
(2, 4),
(0, 0),
(-3, 9),
(1.5, 2.25)
]
@pytest.mark.parametrize("input_number, expected_square", test_cases)
def test_square_function(input_number, expected_square):
"""Тестирует функцию возведения в квадрат."""
assert input_number ** 2 == expected_square
В этом примере test_square_function будет выполнен четыре раза, по одному для каждой пары значений из списка test_cases. Если один из тестов упадет, pytest точно укажет, на каком наборе данных произошла ошибка.
Ответ 18+ 🔞
А, ну ты глянь, какой вопрос подкинули! Прям как будто специально для тех, кто ненавидит копипасту в тестах, а любит, чтобы всё было красиво и по полочкам. Сейчас разложу, как боженька черепаху.
Вот представь: у тебя есть функция, и ты её, сука, проверяешь. Раз, два, три... Десять раз пишешь один и тот же assert, только числа разные. Ну это же пиздец какой-то, да? Руки отсохнут. Так вот, умные дядьки из pytest придумали волшебный пинок под жопу под названием @pytest.mark.parametrize.
Этот декоратор — просто ядрёна вошь! Он берёт твою тестовую функцию и хуяк — запускает её кучу раз, подсовывая каждый раз новые данные. И всё это в три строчки кода, ёпта!
Смотри, как это выглядит, на примере простом, как три копейки. Допустим, тестируем возведение в квадрат.
import pytest
# Вот тут мы готовим наши "патроны" для теста.
# Каждый кортеж — это один выстрел: (что_входило, что_должно_выйти).
test_cases = [
(2, 4), # 2 в квадрате — 4, логично же?
(0, 0), # Ноль — он и в Африке ноль.
(-3, 9), # Минус на минус даёт плюс, школа, блядь!
(1.5, 2.25) # С дробями тоже должно работать, а не "ой, всё".
]
# А вот и магия! Говорим: "Эй, функция, будешь принимать два аргумента:
# input_number и expected_square. И вот тебе список значений для них!"
@pytest.mark.parametrize("input_number, expected_square", test_cases)
def test_square_function(input_number, expected_square):
"""Тестирует функцию возведения в квадрат."""
# И просто проверяем. Pytest сам подставит все комбинации.
assert input_number ** 2 == expected_square
И что происходит? Pytest берёт эту одну функцию и запускает её ЧЕТЫРЕ РАЗА, подставляя каждый раз новую парочку из списка. Если где-то наебнётся — он тебе так красиво в отчёте напишет: "Э, дружок-пирожок, у тебя тут на кейсе (-3, 9) всё пошло по пизде, ожидал 9, а получил...". Красота!
Главное, чувак, не выёбывайся и не пытайся впихнуть туда овердохуища данных. А то будет не тест, а адская карусель. Всё должно быть в меру, как хороший коньяк.
Короче, запомни: хочешь не копировать тесты — юзай parametrize. И жизнь станет чуть менее ебучой, честное пионерское.