Модульное тестирование с pytest
Докажите, что код работает -- автоматически, при каждом изменении
pytest собирает все ваши тесты, выполняет их за секунду и точно показывает, какие из них не прошли -- поэтому ошибка, внесённая сегодня, не попадёт незаметно в продакшн завтра.
- объяснить, зачем нужны автоматические тесты,
- писать тест-функции и проверять ожидаемое через
assert, - запускать набор тестов командой
pytestи читать её отчёт, - переиспользовать подготовку данных через фикстуры,
- проверять, что исключения возникают, с помощью
pytest.raises, и покрывать множество случаев черезparametrize.
1. Зачем нужно тестирование
Вы уже тестируете свой код -- запуская его и глядя на вывод. Проблема в том, что ручная проверка не масштабируется. В настоящей программе десятки функций, и любое изменение может тихо сломать то, что вы починили на прошлой неделе. Автоматические тесты превращают "дай-ка я гляну" в кнопку, которую вы нажимаете: машина заново проверяет каждое правило меньше чем за секунду.
Считайте тесты страховочной сеткой для воздушного гимнаста. Сетка не выполняет трюки за вас, но позволяет смело вносить изменения -- переписать функцию, переименовать переменную, ускорить участок -- зная, что если вы сорвётесь, сетка тут же поймает вас, а не пользователь обнаружит ошибку в продакшне.
Хорошие тесты дают три конкретных преимущества:
- Уверенность при изменении кода. Зелёные тесты означают, что правка не сломала то, чему вы уже доверяли.
- Живая документация. Тест с именем
test_withdraw_too_muchпоказывает, как именно должна вести себя функция. - Быстрая отладка. Упавший тест указывает на одну функцию, а не на всю программу.