Проще всего тестировать код, состоящий из чистых функций. Данные на вход, результат на выходе. Никаких неожиданностей, никакого состояния, никакого взаимодействия с внешним миром:
# На вход HTML, на выходе – список ссылок
links = extract_links(html)
assert links == # ожидаемый список тут
Далеко не весь код можно назвать чистым. Без побочных эффектов не обходится ни одна реальная программа. В этом уроке мы познакомимся с побочными эффектами ближе и на практике увидим, как они проявляются.
Как появляются побочные эффекты
В реальной программе редко встречается чистый код без побочных эффектов. Результаты вычислений нужно куда-то записать, отправить, сохранить. Побочные эффекты резко усложняют тестирование. Они требуют более глубоких навыков написания тестов и лучшего понимания того, как организовывать такой код.
Вот лишь некоторые примеры использования побочных эффектов:
- Случайные числа
- HTTP-запросы
- Отправка писем
- Взаимодействие с базой данных
- Взаимодействие с глобальными переменными
- Чтение и запись файлов
- Оперирование текущим временем
В чем заключается сложность? Представьте функцию, которая выполняет отправку письма пользователю:
if send_greeting_email(user):
# Вывести на сайте сообщение, что письмо было отправлено
Вот гипотетический тест этой функции:
assert send_greeting_email(user)
С этим тестом определенно не все в порядке. Единственное, что мы здесь проверяем – возвращает ли функция значение True
. При этом мы не знаем, отправляет ли эта функция письмо, и если отправляет, то какое? Все ли нормально с этим письмом?
Но реальность еще сложнее. Отправлять настоящие письма ради теста ни в коем случае нельзя. Во-первых, это не этично по отношению к людям. Во-вторых, даже если отправлять письма на фейковые аккаунты, мы все равно взаимодействуем с внешней системой.
Внешние системы — это долго, такие тесты будут выполняться значительно дольше по времени, чем тесты чистых функций. Кроме того, любое взаимодействие с внешней средой не детерминировано:
- Сеть может быть ненадежна
- Тесты могут падать с ошибками без видимой причины
- Почтовая служба может заблокировать IP-адрес за слишком частую отправку писем
Все это небезопасно, а ведь это всего лишь отправка писем. С другими побочными эффектами будут еще и другие сложности. Для их решения потребуются другие подходы к организации кода и тестов. Далее в курсе мы разберем наиболее распространенные примеры побочных эффектов и узнаем, как правильно с ними работать.
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.