Проще всего тестировать код, состоящий из чистых функций. Данные на вход, результат на выходе. Никаких неожиданностей, никакого состояния, никакого взаимодействия с внешним миром:
html = '''
<div class="content">
<a href="/home">Главная</a>
<div class="nav">
<a href="/about">О нас</a>
<a href="/contacts">Контакты</a>
</div>
<div class="footer">
<a href="/terms">Условия</a>
<a href="https://external.com">Внешняя ссылка</a>
</div>
</div>
'''
# На вход HTML, на выходе – список ссылок
links = extract_links(html)
assert links == [
'/home',
'/about',
'/contacts',
'/terms',
'https://external.com'
]
Далеко не весь код можно назвать чистым. Без побочных эффектов не обходится ни одна реальная программа. В этом уроке мы познакомимся с побочными эффектами ближе и на практике увидим, как они проявляются.
Как появляются побочные эффекты
В реальной программе редко встречается чистый код без побочных эффектов. Результаты вычислений нужно куда-то записать, отправить, сохранить. Побочные эффекты резко усложняют тестирование. Они требуют более глубоких навыков написания тестов и лучшего понимания того, как организовывать такой код.
Вот лишь некоторые примеры использования побочных эффектов:
- Случайные числа
- HTTP-запросы
- Отправка писем
- Взаимодействие с базой данных
- Взаимодействие с глобальными переменными
- Чтение и запись файлов
- Оперирование текущим временем
В чем заключается сложность? Представьте функцию, которая выполняет отправку письма пользователю:
if send_greeting_email(user):
# Вывести на сайте сообщение, что письмо было отправлено
Вот гипотетический тест этой функции:
assert send_greeting_email(user) is True
С этим тестом определенно не все в порядке. Единственное, что мы здесь проверяем – возвращает ли функция значение True
. При этом мы не знаем, отправляет ли эта функция письмо, и если отправляет, то какое? Все ли нормально с этим письмом?
Но реальность еще сложнее. Отправлять настоящие письма ради теста ни в коем случае нельзя. Во-первых, это не этично по отношению к людям. Во-вторых, даже если отправлять письма на фейковые аккаунты, мы все равно взаимодействуем с внешней системой.
Внешние системы — это долго, такие тесты будут выполняться значительно дольше по времени, чем тесты чистых функций. Кроме того, любое взаимодействие с внешней средой не детерминировано:
- Сеть может быть ненадежна
- Тесты могут падать с ошибками без видимой причины
- Почтовая служба может заблокировать IP-адрес за слишком частую отправку писем
Все это небезопасно, а ведь это всего лишь отправка писем. С другими побочными эффектами будут еще и другие сложности. Для их решения потребуются другие подходы к организации кода и тестов. Далее в курсе мы разберем наиболее распространенные примеры побочных эффектов и узнаем, как правильно с ними работать.

Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.