Тестирование
Relevant source files
The following files were used as context for generating this wiki page:
- internal/features/auth/service/auth_service_test.go
- internal/features/tracks/service/track_service_test.go
- internal/features/playlists/service/playlist_service_test.go
- internal/features/users/repository/postgres/user_repository_test.go
- internal/features/favorites/service/favorites_service_test.go
- README.md
Тестирование в проекте Music Subscription Service организовано с использованием стандартного инструментария Go и разделено на две основные категории: модульные (unit) тесты и интеграционные тесты. Модульные тесты проверяют бизнес-логику сервисов в изоляции с использованием моков для зависимостей, в то время как интеграционные тесты проверяют взаимодействие с реальными базами данных с применением Docker-контейнеров.
Система тестирования охватывает критические компоненты системы, включая аутентификацию, управление треками, плейлистами, избранным и профилями пользователей. Особое внимание уделяется проверке ограничений для бесплатных учетных записей (FREE) и прав доступа для премиум-пользователей.
Sources: README.md:148-150, internal/features/auth/service/auth_service_test.go:17-68
Типы тестов и инструментарий
В проекте используются следующие подходы и библиотеки для обеспечения качества кода:
- Go Testing Package: Стандартный пакет
testingдля запуска тестов. - Testify: Библиотеки
assertиrequireдля удобных и читаемых проверок результатов. - Mocking: Создание структур-заглушек (mocks) для имитации поведения репозиториев (например,
mockUserRepo,mockTrackRepository). - Testcontainers: Использование
testcontainers-goдля автоматического запуска PostgreSQL в Docker-контейнерах во время интеграционных тестов. - Miniredis: Эмуляция Redis в памяти для тестирования логики лимитов и кэширования.
Сводная таблица инструментов тестирования
| Категория | Инструмент | Применение |
|---|---|---|
| Assertions | testify/assert, testify/require | Проверка условий и обязательных значений |
| Database | testcontainers/postgres | Интеграционные тесты репозиториев |
| Cache | miniredis | Тестирование лимитов прослушивания |
| Mocks | Custom implementations | Изоляция сервисного слоя от БД |
Sources: internal/features/auth/service/auth_service_test.go:10-14, internal/features/tracks/service/track_service_test.go:11-15, internal/features/users/repository/postgres/user_repository_test.go:16-20
Модульное тестирование (Unit Testing)
Модульные тесты направлены на проверку логики в internal/features/*/service. Они используют легковесные моки для обхода обращения к реальной базе данных.
Тестирование аутентификации
Тесты проверяют сценарии регистрации, логина и обновления токенов. Особое внимание уделяется безопасности: проверяется корректность хэширования паролей через bcrypt и механизм ротации Refresh-токенов.
Sources: internal/features/auth/service/auth_service_test.go:76-150
Диаграмма показывает процесс проверки логина в модульном тесте.
Тестирование бизнес-ограничений (Limits)
Важной частью тестирования является проверка лимитов для пользователей с типом подписки FREE.
- Лимит прослушиваний: Проверяется через
miniredis. Тест имитирует 10 прослушиваний и подтверждает, что 11-е возвращает ошибкуErrDailyLimitExceeded.
Sources: internal/features/tracks/service/track_service_test.go:39-66 - Лимит плейлистов: Проверяется количество созданных плейлистов для бесплатного аккаунта.
Sources: internal/features/playlists/service/playlist_service_test.go:27-40 - Лимит избранного: Проверяется ограничение на добавление треков в избранное (лимит — 20 треков).
Sources: internal/features/favorites/service/favorites_service_test.go:24-34
Интеграционное тестирование
Интеграционные тесты проверяют корректность SQL-запросов и миграций в internal/features/users/repository/postgres.
Окружение Testcontainers
Для запуска тестов используется функция setupTestDB, которая поднимает контейнер с PostgreSQL версии 16-alpine и применяет начальные миграции из файла 001_init.up.sql.
Sources: internal/features/users/repository/postgres/user_repository_test.go:22-68
Жизненный цикл интеграционного теста базы данных.
Тестовые сценарии репозиториев
- Создание и поиск: Проверка
CreateиGetByID/GetByEmail. - Контроль уникальности: Проверка возникновения ошибок
ErrEmailAlreadyTakenпри попытке регистрации дубликата. - Обновление профиля: Проверка работы
COALESCEв SQL-запросах при частичном обновлении данных пользователя.
Sources: internal/features/users/repository/postgres/user_repository_test.go:88-150
Команды запуска
Для удобства запуска тестов в Makefile и CI/CD предусмотрены следующие команды:
- Все тесты:
go test ./... -v - Быстрые тесты:
go test -short ./...(пропускает интеграционные тесты, требующие Docker). - CI/CD: Пайплайн GitLab автоматически запускает этап
testперед деплоем.
Sources: README.md:120-130, README.md:204-206, internal/features/users/repository/postgres/user_repository_test.go:71-73
Тестирование обеспечивает стабильность системы при внесении изменений в критические модули, такие как биллинг (подписки) и безопасность (auth). Использование моков позволяет проводить тесты быстро, а интеграционные тесты гарантируют целостность данных в PostgreSQL.