Как протестировать код с внешним API
Вопрос
Функция обращается к внешнему API курсов валют. Как вы её протестируете?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Вынести HTTP-клиент в зависимость, передавать его в функцию
В юнит-тесте подставить фейк или мок клиента с заготовленным ответом
Проверить обработку ошибок: таймаут, 500, неверный JSON
Не ходить в настоящую сеть в тестах
Патчить там, где имя используется
Отдельно контрактный или интеграционный тест на реальный формат ответа
Что могут спросить следом
- Что такое
create_autospecи зачем он? - Как проверить, что функция делает ретрай?
Разбор
Образцовый ответ: «Сначала сделаю код тестируемым: HTTP-клиент передаётся в функцию или сервис как зависимость, а не создаётся внутри. Тогда в юнит-тесте я подставлю фейковый клиент, который возвращает заготовленный JSON, и проверю расчёт. Отдельными тестами проверю ошибки: таймаут, ответ 500, битый JSON, и что функция в этих случаях делает ретрай или возвращает понятную ошибку. В настоящую сеть тесты не ходят: это медленно и нестабильно. Если код менять нельзя, использую monkeypatch или unittest.mock.patch, помня, что патчить нужно имя в модуле, где оно используется, а для httpx есть удобная библиотека respx. Чтобы моки не разошлись с реальностью, использую create_autospec и держу отдельный интеграционный или контрактный тест, который проверяет формат настоящего ответа, например по расписанию».
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.