- 🎯 Стратегия тестирования
- 📊 Уровни тестирования
- 🧪 E2E тестирование
- 🔧 Интеграционные тесты
- 🎨 Компонентное тестирование
- 📈 Метрики качества
- 🔧 CI/CD интеграция
- 🛠️ Инструменты
- 🚨 Обработка ошибок
- 📋 Лучшие практики
Система тестирования обеспечивает качество продукта на всех уровнях.
| Уровень | Инструмент | Цель | Покрытие |
|---|---|---|---|
| E2E | Playwright | Пользовательские сценарии | Критические пути |
| Интеграционные | Vitest | Взаимодействие компонентов | Бизнес-логика |
| Модульные | Vitest | Отдельные функции | Утилиты |
| Типы | TypeScript | Корректность типов | 100% |
- Аутентификация — вход/выход, сессии
- Создание контента — публикации, черновики
- Социальные функции — комментарии, подписки
- Навигация — поиск, фильтры
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)
})
})
})describe('GraphQL API', () => {
it('должен возвращать статьи с пагинацией', async () => {
const result = await client.query(GET_ARTICLES, {
first: 10,
after: 'cursor'
})
expect(result.data.articles).toHaveLength(10)
})
})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 тестов
# .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
- Обязательные тесты для критических функций
- Блокировка мержа при неудачных тестах
npm run e2e:install # Установка браузеров
npm run e2e:tests # Запуск всех тестов
npm run e2e:debug # Отладка с UI
npm run e2e:headed # Тесты с видимым браузером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 условиям
- Регулярный рефакторинг — обновление устаревших тестов
- Документирование — описание сложных сценариев
- Обратная связь — улучшение на основе результатов