Python: Продвинутое тестирование
2026-02-26 23:21 Diff

Проще всего тестировать код, состоящий из чистых функций. Данные на вход, результат на выходе. Никаких неожиданностей, никакого состояния, никакого взаимодействия с внешним миром:

Далеко не весь код можно назвать чистым. Без побочных эффектов не обходится ни одна реальная программа. В этом уроке мы познакомимся с побочными эффектами ближе и на практике увидим, как они проявляются.

Как появляются побочные эффекты

В реальной программе редко встречается чистый код без побочных эффектов. Результаты вычислений нужно куда-то записать, отправить, сохранить. Побочные эффекты резко усложняют тестирование. Они требуют более глубоких навыков написания тестов и лучшего понимания того, как организовывать такой код.

Вот лишь некоторые примеры использования побочных эффектов:

  • Случайные числа
  • HTTP-запросы
  • Отправка писем
  • Взаимодействие с базой данных
  • Взаимодействие с глобальными переменными
  • Чтение и запись файлов
  • Оперирование текущим временем

В чем заключается сложность? Представьте функцию, которая выполняет отправку письма пользователю:

Вот гипотетический тест этой функции:

С этим тестом определенно не все в порядке. Единственное, что мы здесь проверяем – возвращает ли функция значение True. При этом мы не знаем, отправляет ли эта функция письмо, и если отправляет, то какое? Все ли нормально с этим письмом?

Но реальность еще сложнее. Отправлять настоящие письма ради теста ни в коем случае нельзя. Во-первых, это не этично по отношению к людям. Во-вторых, даже если отправлять письма на фейковые аккаунты, мы все равно взаимодействуем с внешней системой.

Внешние системы — это долго, такие тесты будут выполняться значительно дольше по времени, чем тесты чистых функций. Кроме того, любое взаимодействие с внешней средой не детерминировано:

  • Сеть может быть ненадежна
  • Тесты могут падать с ошибками без видимой причины
  • Почтовая служба может заблокировать IP-адрес за слишком частую отправку писем

Все это небезопасно, а ведь это всего лишь отправка писем. С другими побочными эффектами будут еще и другие сложности. Для их решения потребуются другие подходы к организации кода и тестов. Далее в курсе мы разберем наиболее распространенные примеры побочных эффектов и узнаем, как правильно с ними работать.