Начал писать тесты для бота. Оказалось не так страшно как думал
Долго откладывал тесты для своих ботов. Казалось что это боль: нужно мокать API, имитировать апдейты, непонятно с чего начать.
Начал с малого. Вынес всю бизнес-логику в отдельные функции которые не знают ничего про Telegram. Просто принимают данные, возвращают результат.
python
# Не так
async def handle_payment(message: types.Message):
amount = int(message.text)
if amount > 10000:
await message.answer("Сумма слишком большая")
# А так
def validate_amount(amount: int) -> tuple[bool, str]:
if amount > 10000:
return False, "Сумма слишком большая"
return True, ""
async def handle_payment(message: types.Message):
is_valid, error = validate_amount(int(message.text))
if not is_valid:
await message.answer(error)
Теперь validate_amount тестируется обычным pytest без всяких моков. Вызываешь функцию, проверяешь результат.
Звучит очевидно. Но я долго писал всю логику прямо в хендлерах и потом удивлялся почему тестировать неудобно. Оказывается проблема была не в тестах, а в архитектуре.
Покрытие пока небольшое, но уже несколько раз тесты поймали регрессию которую я бы заметил только в продакшене.
Кто тестирует ботов, как организуете?