Когда вы тестируете функции, работающие с многострочным текстом, JSON или сложными объектами, декоратор
@pytest.mark.parametrize быстро превращается в «простыню» текста. Основные боли:
- Нарушение отступов: Многострочные строки (`"""`) ломают структуру кода.
- Дублирование логики: В каждом тесте приходится вызывать
textwrap.dedent или Path().read_text().- Нечитаемые ID: По умолчанию pytest генерирует ID теста из самих данных. Если данных много, лог тестов превращается в хаос.
Вместо того чтобы передавать в
parametrize сырой список кортежей, создайте функцию (например, `nb_case`), которая подготавливает данные.1. Умная обработка данных
Ваш хелпер может сам решать, что перед ним: путь к файлу или текст.
def nb_case(text, short, long, id=None):
if "\n" in text:
# Это текст: убираем лишние отступы
text = textwrap.dedent(text.lstrip("\n"))
else:
# Это путь: читаем файл
id = id or text
text = Path(text).read_text()
# Возвращаем специальный объект pytest.param
return pytest.param(text, short, long, id=id)
2. Использование
pytest.paramГлавный секрет — возвращать не просто кортеж, а
pytest.param. Это позволяет:
- Назначать понятные ID (имена тестов).
- Добавлять метки (например, `marks=pytest.mark.xfail`) к конкретным наборам данных.
🔗 Ссылка на статью
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
