Перейти к содержанию

Система Тестирования Saga

Полное руководство по тестированию DeFi-платформы Saga: от smoke тестов до Quality Gates

📖 Оглавление

  1. Обзор системы
  2. Команды тестирования
  3. Архитектура тестирования
  4. Quality Gates
  5. CI/CD интеграция
  6. Best Practices
  7. Troubleshooting

Обзор системы

Saga использует многоуровневую систему тестирования, основанную на принципе "Zero Tolerance for Errors":

Архитектурные принципы

  • Пирамида тестирования: Integration (основа) → Unit (утилиты) → E2E (критические пути)
  • Реальные тесты: Минимум моков, максимум реальных API вызовов
  • Test-First Development: Тесты пишутся ДО реализации функциональности
  • Silent is Golden: Тесты работают без лишнего шума в консоли

Уровни проверок

Quality Gates ← Полная блокировка при падениях
Core тесты ← Обязательно для важных изменений  
Smoke тесты ← Обязательно для каждого коммита
Unit тесты ← Покрытие сервисного слоя

Команды тестирования

Обязательные команды

Команда Время Когда использовать
make test-smoke (=make smoke) ~8 сек ПЕРЕД КАЖДЫМ КОММИТОМ
make test-core (=make core) ~1-2 мин ПЕРЕД ВАЖНЫМИ ИЗМЕНЕНИЯМИ
make quality-gates ~5-8 мин ПЕРЕД MERGE В MASTER

Быстрые тесты

# Критические smoke тесты (8 секунд)
make test-smoke   # alias
# или
make smoke        # основная цель

# Unit тесты только backend (30 секунд)  
make test-unit

# Тесты Makefile (2 секунды)
make test-makefile

Comprehensive тесты

# Core тесты: smoke + unit + frontend integration
make test-core    # alias
# или
make core         # основная цель

# E2E тесты - параллельные быстрые группы
make test-e2e-parallel-quick

# E2E тесты - параллельные тяжелые группы
make test-e2e-parallel-heavy

# Интеграционные тесты - все основные группы 
make test-integration-groups

# Интеграционные тесты - быстрые без race detector
make test-integration-fast

# Интеграционные тесты с race detector
make test-integration-race

Полное тестирование

# Все доступные тесты (перед релизом)
make test-all

# Продвинутые методики тестирования
make test-advanced

💎 Продвинутые тесты

# Property-based тесты (математические инварианты)
make test-property

# Contract тесты (API совместимость)
make test-contracts

# Regression тесты (защита от повторения багов)
make test-regression

# Performance benchmarks
make test-performance

# Visual regression тесты
make test-visual

# Chaos engineering
make test-chaos

# Security scanning
make test-security

# Load testing
make test-load

Архитектура тестирования

Frontend тестирование

Технологический стек:

  • Jest - unit и integration тесты
  • React Testing Library - компонентное тестирование
  • Playwright - E2E тестирование

Структура:

frontend/user-app/src/__tests__/
├── components/         # Компонентные тесты
├── integration/        # Integration тесты (приоритет)
├── real-components/    # Тесты с реальными API
├── property-based/     # Property-based тесты
├── performance/        # Performance benchmarks
├── security/           # Security сканирование
└── regression/         # Regression тесты

Backend тестирование

Технологический стек:

  • Go testing - unit тесты
  • testify - assertions и mock framework
  • HTTPtest - HTTP тестирование

Структура:

backend/
├── tests/integration/  # Integration тесты (приоритет)
├── tests/e2e/         # E2E тесты
├── admin_api/*_test.go # Unit тесты admin API
├── auth/*_test.go     # Unit тесты аутентификации
├── blockchain/*_test.go # Unit тесты блокчейн логики
└── storage/*_test.go  # Unit тесты хранилища

E2E тестирование

Playwright E2E:

frontend/e2e/tests/
├── smoke/             # Smoke тесты (foundation)
├── e2e/
│   ├── user/         # Пользовательские сценарии
│   └── admin/        # Административные сценарии
├── testnet/          # Web3 testnet интеграция
└── visual/           # Visual regression

Поддомены локально (admin.saga.local / app.saga.local): - По умолчанию тесты используют http://localhost:8080. - Для проверки поддоменов выставляйте PLAYWRIGHT_BASE_URL: - PLAYWRIGHT_BASE_URL=https://app.saga.local npm run test:e2e - PLAYWRIGHT_BASE_URL=https://admin.saga.local npm run test:e2e - Либо используйте путь /admin для админки при базовом URL http://localhost:8080.

Quality Gates

🚪 Что такое Quality Gates

Quality Gates - это автоматическая система блокировки кода при обнаружении проблем качества.

Принцип работы:

  1. Запускаются критические тесты
  2. При падении ЛЮБОГО теста → БЛОКИРОВКА
  3. Merge/Deploy возможен только при 100% прохождении

Команды Quality Gates

# Полные Quality Gates (5-8 минут)
make quality-gates

# Quality Gates для CI/CD (silent режим)
make quality-gates-ci

# Быстрые Quality Gates (только smoke)
make quality-gates-fast

Этапы проверки

  1. Critical Path Check - проверка покрытия критических путей
  2. Flaky Test Detection - обнаружение нестабильных тестов
  3. Smoke Tests - проверка базовой функциональности (90 сек timeout)
  4. Core Tests - проверка основных компонентов (180 сек timeout)

Git Hooks интеграция

# Настройка автоматических проверок
make setup-git-hooks

Что настраивается:

  • Pre-commit: Быстрые качественные проверки (~30-60 сек)
  • Pre-push: Полные проверки для master, smoke для features
  • Commit-msg: Валидация формата сообщений коммитов

CI/CD интеграция

🔇 Silent режимы для CI

# CI-версии команд (без цветного вывода, с JSON отчетами)
make test-smoke-ci    # Smoke тесты для CI
make test-unit-ci     # Unit тесты для CI  
make test-core-ci     # Core тесты для CI
make test-all-ci      # Все тесты для CI

JSON отчеты

Локация отчетов: logs/reports/

logs/reports/
├── smoke-summary.json      # Smoke тесты результат
├── unit-summary.json       # Unit тесты результат
├── core-summary.json       # Core тесты результат
└── quality-gates/
    └── summary.json        # Quality Gates результат

Пример JSON отчета:

{
  "exit_code": 0,
  "smoke": 0,
  "unit": 0, 
  "core": 0,
  "details": "smoke:0 unit:0 core:0",
  "timestamp": "2025-07-03T11:37:05+03:00"
}

🚦 Exit codes

  • 0 - Все тесты прошли ✅
  • 1 - Найдены предупреждения ⚠️
  • 2+ - Критические ошибки ❌

Best Practices

Написание тестов

ПРАВИЛЬНО

// Comprehensive тест с реальными API
test('User investment flow - полная интеграция', async () => {
  const user = await createRealUser()
  const investment = await createInvestment(user, '1000.0')
  const result = await processInvestment(investment.id)

  expect(result.status).toBe('active')
  expect(result.amount).toBe('1000.0')
})

НЕПРАВИЛЬНО

// Shallow тест без реальной проверки
test('Component renders', () => {
  const component = render(<Investment />)
  expect(component).toBeTruthy() // Бесполезно!
})

Test-First Development

  1. Сначала пишем ПАДАЮЩИЙ тест
  2. Проверяем что тест падает с правильной ошибкой
  3. Пишем минимальный код для прохождения
  4. Рефакторим при прохождении тестов

Структура тестов

describe('InvestmentService', () => {
  describe('createInvestment', () => {
    it('should create investment with valid data', async () => {
      // Arrange - подготовка данных
      const userData = createTestUser()

      // Act - выполнение действия
      const result = await investmentService.create(userData)

      // Assert - проверка результата
      expect(result.status).toBe('pending')
    })
  })
})

🚫 Что НЕ тестировать

  • Библиотечные функции - expect(2+2).toBe(4)
  • Trivial геттеры/сеттеры
  • Mock-heavy тесты - где все dependencies замокированы
  • Duplicate функциональность - одно и то же в разных тестах

Troubleshooting

Частые проблемы

Frontend тесты падают с module errors

# Проверить, что пути к shared modules правильные
ls -la frontend/shared/lib/

# Обновить типы
make generate-types

# Очистить кеш Jest
cd frontend/user-app && npm test -- --clearCache

Backend тесты падают с DB errors

# Проверить подключение к базе
make migration-up

# Сбросить состояние системы
make test-integration

E2E тесты timeout

# Проверить что система запущена
make status

# Перезапустить систему
make restart

# Запустить параллельные E2E тесты (быстрые)
make test-e2e-parallel-quick

Debugging команды

# Проверка состояния системы
make status

# Перезапуск системы
make restart

# Проверка логов
tail -f logs/reports/core-frontend-user.log

# Запуск E2E тестов для отладки (используйте make команды)
make test-e2e-parallel-all  # Полный E2E suite

Мониторинг качества

# Автоматический мониторинг качества
make test-quality-monitor

# Обнаружение нестабильных тестов
make test-flaky-detection

# Полный отчет по качеству
make test-quality-report

🚫 Что делать при падающих тестах

  1. НЕ УДАЛЯТЬ падающие тесты
  2. НЕ УПРОЩАТЬ до бессмысленности
  3. ИСПРАВИТЬ первопричину в коде
  4. Если не получается быстро - ОТКЛЮЧИТЬ временно через test.skip()
  5. ОБЯЗАТЕЛЬНО исправить перед коммитом

Метрики и мониторинг

Целевые показатели

  • Smoke тесты: < 10 секунд
  • Core тесты: < 2 минут
  • Quality Gates: < 8 минут
  • Unit test coverage: > 70% для service слоя
  • E2E test coverage: 100% критических путей

Текущие результаты

После выполнения фаз очистки (июль 2025):

✅ Достигнуто:

  • Smoke тесты: 8 секунд (цель: 10 сек) ✅
  • Backend unit coverage:
  • storage/service: 0.9%
  • auth/service: 10.7%
  • blockchain/service: 7.8%
  • Zero console errors в production коде ✅
  • Zero ESLint warnings в критических компонентах ✅
  • Quality Gates полностью функциональны ✅

🔄 В процессе:

  • Frontend integration тесты: некоторые падают из-за logger paths
  • Core тесты: нужно исправить синтаксические ошибки

Дополнительная документация

Задачи и улучшения: - Wallet Compatibility Test System (2025-10-13) - Автоматизированная система тестирования совместимости с MetaMask и другими кошельками




📋 Метаданные

Версия: 2.4.82

Обновлено: 2025-10-21

Статус: Published