Руководство по тестированию
RUSEON Core следует строгим стандартам надёжности и качества кода. В репозитории содержится более 35 тестовых наборов, охватывающих модульную логику, многопоточные структуры данных, сквозной медиапайплайн, симуляции аппаратных сбоев и высоконагруженные бенчмарки.
Обзор категорий тестов
| Категория | Тестируемые пакеты / файлы | Назначение |
|---|---|---|
| Unit-тесты | internal/api/*_test.go, internal/db/*_test.go | Проверка хэндлеров API, JWT middleware, транзакций BadgerDB |
| Тесты многопоточности | internal/buffer/*_test.go, internal/stream/*_test.go | Поиск дедлоков и race condition под флагом -race |
| Go Native Fuzzing | internal/buffer/fuzz_test.go | Стресс-тестирование границ кольцевого буфера и переполнения индексов |
| Chaos & Resilience | internal/recorder/chaos_test.go, internal/stream/chaos_test.go | Симуляция внезапных обрывов RTSP, задержек диска и сбоев питания |
| Testcontainers E2E | tests/e2e/ingest_test.go, internal/api/e2e_race_test.go | Сквозная проверка медиапотока в изолированных контейнерах MediaMTX и FFmpeg |
| Бенчмарки нагрузки | internal/stream/hls_bench_test.go, internal/buffer/ring_bench_test.go | Контроль инвариантов Zero-Allocations, задержек и потребления CPU |
1. Запуск модульных тестов с Race Detector
Все тесты Go обязательно запускаются со включенным детектором состояний гонки:
# Запуск всех тестов с -race и генерацией профиля покрытия
go test -v -race -timeout=10m -coverprofile=coverage.out ./...
# Просмотр сводки покрытия по пакетам
go tool cover -func=coverage.outДля визуализации покрытия в браузере:
go tool cover -html=coverage.out -o coverage.html2. Фаззинг нативными средствами Go
Кольцевой буфер (internal/buffer) непрерывно проверяется с помощью фаззинга для выявления пограничных аномалий и защиты от переполнения:
# Запуск фаззинга буфера на 60 секунд
go test -v -fuzz=FuzzRingBuffer -fuzztime=60s ./internal/bufferФаззер гарантирует:
- Корректность закольцовывания
uint64индексов без паник при переполнении. - Неблокирующую доставку кадров быстрым подписчикам при замедлении медленных клиентов.
- Отсутствие неконтролируемых аллокаций памяти в цикле раздачи кадров.
3. Сквозные тесты Testcontainers (E2E)
Тестовый набор E2E (tests/e2e/ingest_test.go) разворачивает изолированную сеть Docker Bridge:
- MediaMTX
1.19.2в качестве RTSP-сервера. - FFmpeg
8-alpine, непрерывно генерирующий синтетический тестовый поток H.264 (10 fps, GOP = 10). - Сервер RUSEON Core, принимающий RTSP-поток, передающий его в RingBuffer и генерирующий HLS и WebRTC.
Запуск сквозного E2E-пайплайна (требуется работающий демон Docker):
go test -v -tags=e2e -timeout=15m ./tests/e2e/...Тест проверяет:
- Успешное TCP-соединение и чтение параметров кодека (SPS/PPS).
- Переход системных проб
/livezи/readyzв статус200 OK. - Генерацию плейлистов
index.m3u8иstream.m3u8. - Скачивание и байтовую валидацию сегментов MPEG-TS (проверка байта синхронизации
0x47).
4. Запуск высоконагруженных бенчмарков
Проверка производительности и аллокаций памяти:
# Запуск всех бенчмарков с метриками памяти
go test -v -bench=. -benchmem -run=^$$ ./...
# Бенчмарк раздачи кадров через RingBuffer
go test -v -bench=BenchmarkRingBuffer_Broadcast -benchmem ./internal/bufferКонтрольные показатели производительности:
- Раздача через RingBuffer:
~55 ns/op,0 B/op,0 allocs/op. - Отдача мастер-плейлиста HLS:
< 0.5 мспри 5,000 параллельных запросов. - fMP4 Архиватор: Константный расход RAM независимо от битрейта камеры.
5. Тестирование веб-интерфейса (React 19)
Фронтенд использует Vitest и React Testing Library:
cd web
# Запуск тестов компонентов
npm run test:unit
# Проверка типов TypeScript и линтинг
npm run typecheck
npm run lint