Как ты тестируешь свой код?

«Как ты тестируешь свой код?» — вопрос из категории Софт-скиллы, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый пример ответа, который можно адаптировать под свой опыт.

Ответ

В своей работе я применяю многоуровневый подход к тестированию, адаптированный под проект.

Unit-тесты — это основа. Я пишу их для критически важной бизнес-логики, используя фреймворки вроде pytest или JUnit. Цель — проверить изолированно каждый метод или функцию. Например, для функции форматирования данных тест проверяет различные граничные случаи входных параметров.

Интеграционные тесты нужны для проверки взаимодействия компонентов — работы с базой данных, вызова внешних API или корректности цепочки сервисов. Здесь я часто использую тестовые контейнеры (Testcontainers) или моки (Mockito, unittest.mock), чтобы изолировать тестируемый модуль от нестабильных внешних зависимостей.

End-to-end (E2E) тесты запускаются реже, обычно в CI/CD-пайплайне, чтобы проверить ключевые пользовательские сценарии от начала до конца. Для их стабильности важно управлять состоянием тестового окружения (сбрасывать базу данных, очищать кеш).

Принципы, которых я придерживаюсь:

  • Изоляция: Тесты не должны зависеть друг от друга или от внешнего состояния.
  • Скорость: Юнит-тесты должны выполняться быстро, чтобы их можно было запускать постоянно.
  • Читаемость: Название теста (test_calculate_discount_for_premium_user) должно четко указывать, что тестируется и при каких условиях.
  • Покрытие: Стремлюсь к высокому покрытию критических путей, но не гонюсь за 100% — это часто неэффективно. Фокус на код, содержащий сложную логику или часто изменяющийся.