Тестирование Telegram-бота: автотесты, мок-объекты и песочницы

Если вы разрабатываете Telegram-бота, то просто запустить его и надеяться, что всё работает - это как садить дерево и ждать, что оно не упадёт. Всё может работать на вашем компьютере, но сломаться, когда бот попадёт в реальную среду. Пользователи отправят странные сообщения, API Telegram изменит ответ, а ваша база данных внезапно перестанет отвечать. Без тестирования вы рискуете потерять доверие пользователей, а иногда и весь аккаунт бота.

Почему тестирование Telegram-бота - это не опционально

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

В 2024 году Telegram заблокировал более 12 000 ботов из-за сбоев в работе, которые приводили к массовым рассылкам или утечкам данных. Большинство из них - боты, которые не проходили даже базового тестирования. Это не теория. Это реальные цифры от Telegram.

Тестирование - это не про то, чтобы быть идеальным. Это про то, чтобы не сломаться в момент, когда пользователь зависит от вашего бота.

Автотесты: автоматизируйте, что можно

Ручное тестирование - это утомительно. Вы отправляете сообщение, смотрите ответ, меняете параметр, снова отправляете. Делаете это 50 раз в день. Автотесты позволяют сделать это за секунду.

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

  1. Пользователь отправляет /start
  2. Бот должен ответить приветствием и клавиатурой
  3. Проверяете, что ответ содержит нужный текст и кнопки

Такой тест можно запустить перед каждым коммитом. Если что-то сломалось - вы узнаете сразу. Никаких неожиданных сюрпризов в продакшене.

Пример простого теста на pytest:

def test_start_command():
    update = MockMessage(text="/start")
    bot = MyTelegramBot()
    response = bot.handle_message(update)
    assert "Добро пожаловать" in response.text
    assert len(response.keyboard) == 2

Это не сложный код. Но он экономит часы ручного тестирования.

Мок-объекты: изолируйте бота от внешнего мира

Ваш бот обращается к базе данных? К API погоды? К платежной системе? Проблема: если вы тестируете бота, а база данных выключена - тест падает. Не потому что ваш код плохой, а потому что внешний сервис не работает.

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

Вместо того чтобы обращаться к реальной базе PostgreSQL, вы создаёте мок-объект, который всегда возвращает один и тот же ответ:

  • Запрос к базе: «Получить пользователя с ID 123»
  • Мок-объект отвечает: «Пользователь найден: имя - Иван, баланс - 500 руб»

Теперь ваш тест не зависит от состояния базы данных. Вы можете проверить, как бот обработает успешный ответ, ошибку, пустой результат - всё в контролируемой среде.

В Python для этого используют unittest.mock - это встроенная библиотека для создания моков, которая работает с любым Python-кодом. Вы можете заменить любой вызов функции - даже тот, который подключается к Telegram API.

Это особенно важно, если вы используете Telegram Bot API - это официальный интерфейс для взаимодействия с Telegram, который требует токена и может быть ограничен по частоте запросов. Тесты с настоящим API могут привести к блокировке из-за слишком частых запросов. Моки решают это.

Telegram-бот в цифровой песочнице, окруженной мок-объектами, в то время как внешний мир размыт и не влияет на тестирование.

Песочницы: тестирование без риска

Вы не хотите тестировать бота на основном аккаунте. Потому что если что-то пойдёт не так - вы начнёте слать тестовые сообщения реальным пользователям. Это раздражает, а иногда и нарушает правила Telegram.

Решение - песочница - это отдельный Telegram-аккаунт, созданный только для тестирования, без реальных пользователей.

Как создать песочницу?

  1. Зарегистрируйте нового бота через @BotFather
  2. Дайте ему другое имя: «MyBot_Test»
  3. Используйте другой токен - не тот, что в продакшене
  4. Добавьте в тестовую группу только вас и ваших коллег

Теперь вы можете тестировать всё: отправку файлов, кнопки, инлайн-режим, обработку ошибок - без риска для основного бота.

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

Что ещё можно тестировать?

Тестирование не ограничивается только ответами на команды. Вот что ещё важно проверять:

  • Обработка файлов: Если бот принимает PDF, фото или аудио - проверьте, что он корректно обрабатывает большие файлы, повреждённые файлы, файлы с русскими именами.
  • Таймауты: Что произойдёт, если внешний API не отвечает 10 секунд? Бот зависнет? Или выдаст ошибку?
  • Клавиатуры: Кнопки должны работать. Проверьте, что не слетает структура, если пользователь нажимает быстро или в неправильном порядке.
  • Логирование: Убедитесь, что ошибки записываются. Без логов вы не узнаете, почему бот перестал работать в 3 утра.
  • Перезагрузки: Если сервер перезагружается - бот должен восстановить состояние. Тестируйте это.
Комикс-стиль: Telegram-бот защищается от сбоев с помощью мок-объектов и песочницы, в окружении предупреждений и поврежденных элементов.

Частые ошибки, которые ломают ботов

Вот что чаще всего ломает Telegram-ботов в тестах:

  • Использование одного и того же токена для тестов и продакшена
  • Нет обработки ошибок Telegram API (например, «Too Many Requests»)
  • Тесты зависят от реальной базы данных
  • Нет проверки на пустые или некорректные сообщения
  • Игнорирование ограничений Telegram: 30 сообщений в секунду на одного бота

Простой пример: пользователь отправляет сообщение с 500 символами. Ваш бот ожидает 100. Что происходит? Он падает? Или отправляет обрезанный ответ? Тест должен это выявить.

Совет: начните с одного теста

Не пытайтесь сразу покрыть всё тестами. Начните с одного простого сценария: например, команда /help. Напишите для неё автотест. Запустите его. Убедитесь, что он работает. Потом добавьте ещё один. Через неделю у вас будет 5 тестов. Через месяц - 20. И вы перестанете бояться обновлений.

Тестирование - это не про идеальность. Это про уверенность. Когда вы знаете, что ваш бот не сломается, вы можете работать быстрее, экспериментировать и улучшать его.

Можно ли тестировать Telegram-бота без кода?

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

Как часто нужно запускать тесты?

Каждый раз, когда вы вносите изменения в код. Лучше всего - автоматически перед каждым коммитом в Git. Это называется CI (Continuous Integration). Многие разработчики используют GitHub Actions или GitLab CI, чтобы запускать тесты на сервере без ручного вмешательства. Если тест падает - коммит не принимается.

Что делать, если Telegram API меняет формат ответа?

Это случается редко, но бывает. Лучший способ - не полагаться на точный формат ответа. Вместо этого проверяйте ключевые поля: например, «сообщение содержит текст», «клавиатура не пуста». Используйте мок-объекты, которые имитируют как старый, так и новый формат. Так вы сможете обнаружить проблему до того, как она повлияет на пользователей.

Нужно ли тестировать бота на разных устройствах?

Не обязательно. Telegram API одинаково работает на всех устройствах - iOS, Android, Windows, веб. Проблемы возникают не из-за устройства, а из-за того, как пользователь вводит данные. Поэтому тестируйте разные типы сообщений: текст, фото, голосовые, стикеры, кнопки. Это важнее, чем тестирование на разных телефонах.

Как проверить, что бот не отправляет спам?

Включите лимиты в коде. Например, не отправлять больше одного сообщения в секунду одному пользователю. Тестируйте это: отправьте 10 сообщений подряд и проверьте, что бот не превышает лимит. Также используйте песочницу - если бот начинает слать сообщения в массовом порядке, вы сразу это увидите, не причинив вреда реальным пользователям.