Skip to content

Руководство по тестированию ​

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 Fuzzinginternal/buffer/fuzz_test.goСтресс-тестирование границ кольцевого буфера и переполнения индексов
Chaos & Resilienceinternal/recorder/chaos_test.go, internal/stream/chaos_test.goСимуляция внезапных обрывов RTSP, задержек диска и сбоев питания
Testcontainers E2Etests/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 обязательно запускаются со включенным детектором состояний гонки:

bash
# Запуск всех тестов с -race и генерацией профиля покрытия
go test -v -race -timeout=10m -coverprofile=coverage.out ./...

# Просмотр сводки покрытия по пакетам
go tool cover -func=coverage.out

Для визуализации покрытия в браузере:

bash
go tool cover -html=coverage.out -o coverage.html

2. Фаззинг нативными средствами Go ​

Кольцевой буфер (internal/buffer) непрерывно проверяется с помощью фаззинга для выявления пограничных аномалий и защиты от переполнения:

bash
# Запуск фаззинга буфера на 60 секунд
go test -v -fuzz=FuzzRingBuffer -fuzztime=60s ./internal/buffer

Фаззер гарантирует:

  • Корректность закольцовывания uint64 индексов без паник при переполнении.
  • Неблокирующую доставку кадров быстрым подписчикам при замедлении медленных клиентов.
  • Отсутствие неконтролируемых аллокаций памяти в цикле раздачи кадров.

3. Сквозные тесты Testcontainers (E2E) ​

Тестовый набор E2E (tests/e2e/ingest_test.go) разворачивает изолированную сеть Docker Bridge:

  1. MediaMTX 1.19.2 в качестве RTSP-сервера.
  2. FFmpeg 8-alpine, непрерывно генерирующий синтетический тестовый поток H.264 (10 fps, GOP = 10).
  3. Сервер RUSEON Core, принимающий RTSP-поток, передающий его в RingBuffer и генерирующий HLS и WebRTC.

Запуск сквозного E2E-пайплайна (требуется работающий демон Docker):

bash
go test -v -tags=e2e -timeout=15m ./tests/e2e/...

Тест проверяет:

  • Успешное TCP-соединение и чтение параметров кодека (SPS/PPS).
  • Переход системных проб /livez и /readyz в статус 200 OK.
  • Генерацию плейлистов index.m3u8 и stream.m3u8.
  • Скачивание и байтовую валидацию сегментов MPEG-TS (проверка байта синхронизации 0x47).

4. Запуск высоконагруженных бенчмарков ​

Проверка производительности и аллокаций памяти:

bash
# Запуск всех бенчмарков с метриками памяти
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:

bash
cd web

# Запуск тестов компонентов
npm run test:unit

# Проверка типов TypeScript и линтинг
npm run typecheck
npm run lint

Связанная документация ​

Released under the MIT License.