Большинство тестов на одну и ту же функциональность сильно похожи друг на друга, особенно в части начальной подготовки данных. В прошлом уроке каждый тест начинался со строчки: stack = []
. Это еще не дублирование, но уже шаг в опасную сторону. В этом уроке мы поговорим о том, как избегать дублирования при подготовке одинаковых данных для разных тестов.
Допустим, мы разрабатываем библиотеку funcy, которая предоставляет функции для работы с коллекциями в Python. Среди них есть такие функции:
compact
select
flatten
Как их протестировать? Для работы этих функций нужна заранее подготовленная коллекция. Создаем нужную коллекцию, передаем ее в тестируемую функцию, смотрим результат:
def test_compact():
# Подготовим коллекцию coll
coll = ['One', True, 3, [1, 'hexlet', [0]], 'cat', {}, '', [], False]
# Используем coll для тестирования
result = compact(coll)
assert result == # тут ожидаемое значение
Затем то же самое делаем для всех остальных функций:
def test_select():
# Точно такая же коллекция, получилось дублирование
coll = ['One', True, 3, [1, 'hexlet', [0]], 'cat', {}, '', [], False]
# Используем coll для тестирования
result = select(coll)
assert result == # тут ожидаемое значение
Затем проделываем эту операцию для всех остальных тестируемых функций. Код инициализации коллекции начнет кочевать из одного места в другое, порождая все больше и больше одинакового кода.
Самый простой способ избежать этого — вынести определение коллекции на уровень модуля:
# Создание коллекции теперь описано в одном месте сразу для всех функций
coll = ['One', True, 3, [1, 'hexlet', [0]], 'cat', {}, '', [], False]
def test_compact():