Skip to content

Latest commit

 

History

History
210 lines (168 loc) · 8.15 KB

File metadata and controls

210 lines (168 loc) · 8.15 KB

🧪 Тестирование

📋 Оглавление

🎯 Стратегия тестирования

Система тестирования обеспечивает качество продукта на всех уровнях.

📊 Уровни тестирования

Уровень Инструмент Цель Покрытие
E2E Playwright Пользовательские сценарии Критические пути
Интеграционные Vitest Взаимодействие компонентов Бизнес-логика
Модульные Vitest Отдельные функции Утилиты
Типы TypeScript Корректность типов 100%

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

Критические сценарии

  • Аутентификация — вход/выход, сессии
  • Создание контента — публикации, черновики
  • Социальные функции — комментарии, подписки
  • Навигация — поиск, фильтры

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

tests/e2e/
├── auth/                 # Аутентификация
├── feed/                # Лента публикаций
├── editor/              # Редактирование
├── comments/            # Комментарии
└── subscriptions/       # Подписки

Пример теста

test('авторизованный пользователь может создать публикацию', async () => {
  // Arrange
  await login('test@example.com', 'password')

  // Act
  await page.goto('/edit')
  await page.fill('[data-testid=title]', 'Тестовая статья')
  await page.click('[data-testid=publish]')

  // Assert
  await expect(page.locator('[data-testid=success]')).toBeVisible()
})

🔧 Интеграционные тесты

Тестирование контекстов

describe('FeedContext', () => {
  it('должен загружать статьи при инициализации', async () => {
    render(<FeedProvider><TestComponent /></FeedProvider>)

    await waitFor(() => {
      expect(getArticles()).toHaveLength(10)
    })
  })
})

Тестирование API

describe('GraphQL API', () => {
  it('должен возвращать статьи с пагинацией', async () => {
    const result = await client.query(GET_ARTICLES, {
      first: 10,
      after: 'cursor'
    })

    expect(result.data.articles).toHaveLength(10)
  })
})

🎨 Компонентное тестирование

Тестирование UI компонентов

describe('ArticleCard', () => {
  it('должен отображать заголовок и автора', () => {
    const article = {
      id: '1',
      title: 'Тест',
      author: { name: 'Автор' }
    }

    render(<ArticleCard article={article} />)

    expect(screen.getByText('Тест')).toBeInTheDocument()
    expect(screen.getByText('Автор')).toBeInTheDocument()
  })
})

📈 Метрики качества

Тестовое покрытие

  • E2E сценарии — 80% критических путей
  • Компоненты — 90% переиспользуемых компонентов
  • Утилиты — 95% вспомогательных функций
  • Типы — 100% типизация

Производительность тестов

  • Время выполнения — < 5 минут для полного набора
  • Параллельное выполнение — максимальное использование ресурсов
  • Стабильность — < 1% flaky тестов

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

Автоматическое тестирование

# .github/workflows/tests.yml
name: Tests
on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: '18'

      - name: Install dependencies
        run: npm ci

      - name: Run tests
        run: npm run e2e:tests:ci

      - name: Upload coverage
        uses: codecov/codecov-action@v3

Предотвращение регрессий

  • Автоматический запуск при каждом PR
  • Обязательные тесты для критических функций
  • Блокировка мержа при неудачных тестах

🛠️ Инструменты

Playwright (E2E)

npm run e2e:install     # Установка браузеров
npm run e2e:tests       # Запуск всех тестов
npm run e2e:debug       # Отладка с UI
npm run e2e:headed      # Тесты с видимым браузером

Vitest (Интеграционные/Модульные)

npm run test            # Запуск всех тестов
npm run test:watch      # Режим наблюдения
npm run test:coverage   # Покрытие кода

Дополнительные инструменты

npm run typecheck       # Проверка TypeScript
npm run lint           # Линтинг кода
npm run build          # Проверка сборки

🚨 Обработка ошибок

Стратегии тестирования ошибок

  • Негативные сценарии — проверка обработки ошибок
  • Граничные значения — минимальные/максимальные значения
  • Сетевые ошибки — таймауты и отсутствие соединения
  • Недостаток прав — проверка авторизации

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

  • Трекинг багов — отслеживание найденных проблем
  • Анализ покрытия — выявление непротестированных областей
  • Производительность — контроль времени выполнения тестов

📋 Лучшие практики

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

  • Один тест — один сценарий — фокус на конкретном поведении
  • AAA паттерн — Arrange, Act, Assert
  • Описательные названия — понятные без контекста
  • Независимость — тесты не зависят друг от друга

Структура тестовой среды

  • Чистое состояние — каждый тест начинается заново
  • Моки и стабы — контроль внешних зависимостей
  • Реалистичность — приближение к production условиям

Поддержка тестов

  • Регулярный рефакторинг — обновление устаревших тестов
  • Документирование — описание сложных сценариев
  • Обратная связь — улучшение на основе результатов