Ответ вслух Junior Тестирование и pytest обновлено

Как протестировать код с внешним API

Вопрос

Функция обращается к внешнему API курсов валют. Как вы её протестируете?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Образцовый ответ: «Сначала сделаю код тестируемым: HTTP-клиент передаётся в функцию или сервис как зависимость, а не создаётся внутри. Тогда в юнит-тесте я подставлю фейковый клиент, который возвращает заготовленный JSON, и проверю расчёт.

Что должно прозвучать в ответе

  • Вынести HTTP-клиент в зависимость, передавать его в функцию

  • В юнит-тесте подставить фейк или мок клиента с заготовленным ответом

  • Проверить обработку ошибок: таймаут, 500, неверный JSON

  • Не ходить в настоящую сеть в тестах

  • Патчить там, где имя используется

  • Отдельно контрактный или интеграционный тест на реальный формат ответа

Что могут спросить следом

  • Что такое create_autospec и зачем он?
  • Как проверить, что функция делает ретрай?

Разбор

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

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме