Где хранить тесты в Go

2546
10 Сентября 2025

В Go принято хранить тесты рядом с кодом, который они проверяют, с постфиксом _test.go. Такой подход обеспечивает локальную связность и позволяет легко находить, что и как тестируется. Тесты в том же пакете могут обращаться к неэкспортируемым функциям и переменным, что упрощает написание чистых юнит-тестов. Практически все open-source проекты Go используют этот подход.

Почему рядом с кодом (_test.go) — норм

  1. Локальная связность
    • Тесты прямо рядом с кодом, который они проверяют → легко найти, понять, что и как тестируется.
    • Если видишь order_service.go, рядом лежит order_service_test.go → сразу понятно, где его юнит-тесты.
  2. Тесты в том же пакете
    • Тесты могут обращаться к неэкспортируемым функциям и переменным пакета, что невозможно из другого пакета.
    • Позволяет писать чистые юнит-тесты без необходимости экспортировать внутренние функции специально для тестов.
  3. Принято в Go-сообществе
    • Практически все официальные библиотеки и open-source проекты Go делают именно так.
    • Инструменты (go test ./...) сразу видят тесты и правильно их запускают.

Когда делают отдельную папку

  1. Большие интеграционные / E2E тесты
    • Если тесты требуют поднятия Docker, Kafka, Postgres → создают папку test или integration для отделения от обычных юнит-тестов.
    • Это помогает разделить легкие быстрые тесты и тяжелые медленные тесты.
  2. Изоляция от основного пакета
    • Иногда тесты должны использовать только публичный API, чтобы проверить внешний контракт → кладут в отдельный пакет, например package mypkg_test.

Однако для больших интеграционных или E2E тестов, которые требуют поднятия Docker, Kafka или Postgres, имеет смысл создавать отдельные папки /test или /integration, чтобы отделить легкие быстрые тесты от тяжелых медленных. Также иногда тесты помещают в отдельный пакет, чтобы проверять только публичный API.

Разбираем, где правильно хранить тесты в Go: рядом с кодом или в отдельной папке, с советами по юнит и интеграционным тестам.

Итог: юнит-тесты и легкие интеграционные тесты — рядом с кодом. Сложные интеграционные и E2E — в отдельной папке. В вашем проекте Kafka и Postgres integration можно делать через //go:build integration в тех же _test.go файлах, а E2E с Docker-compose вынести в отдельную папку для наглядности.

поделиться в:
ruenkzzh