Архитектура

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

Контекст

Для обеспечения качества frontend-приложений необходима комплексная стратегия тестирования, охватывающая все уровни: от unit-тестов до мониторинга ошибок в production.

Текущая ситуация:

  • Отсутствует единый подход к тестированию
  • Нет автоматического отслеживания регрессий
  • Ошибки в production обнаруживаются пользователями

Требования:

  • Покрытие всех уровней тестирования
  • Автоматизация в CI/CD
  • Мониторинг production-ошибок
  • Визуальное тестирование компонентов
  • Отслеживание производительности

Решение

Внедрить многоуровневую стратегию тестирования на уровне каждого проекта и модуля.

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

УровеньИнструментНазначение
UnitVitestТестирование функций, composables, stores
ComponentStorybook + ChromaticВизуальное тестирование, документация компонентов
E2ECypress StudioEnd-to-end сценарии
LoadArtilleryНагрузочное тестирование
PerformanceUnlighthouseОтслеживание регресса производительности
ErrorsSentryМониторинг ошибок в production

Обоснование

Unit: Vitest

АльтернативаПлюсыМинусы
JestПопулярный, много документацииМедленный, сложная настройка с Vite
VitestНативная интеграция с Vite/Nuxt, быстрый, совместимый APIМенее зрелый

Выбор: Vitest — нативная интеграция с Nuxt, одна конфигурация с проектом.

Документация: https://vitest.dev/

Component: Storybook + Chromatic

АльтернативаПлюсыМинусы
HistoireНативный для VueМенее развитая экосистема
StorybookСтандарт индустрии, богатая экосистемаСложнее настройка
ChromaticАвтоматический visual diff, интеграция со StorybookПлатный для больших команд

Выбор: Storybook для документации + Chromatic для visual regression testing.

Документация:

E2E: Cypress Studio

АльтернативаПлюсыМинусы
PlaywrightБыстрый, multi-browserМеньше визуальных инструментов
CypressОтличный DX, Cypress Studio для записи тестовТолько Chromium по умолчанию

Выбор: Cypress с Cypress Studio — возможность записи тестов без кода, отличный debugging.

Документация: https://docs.cypress.io/

Load: Artillery

АльтернативаПлюсыМинусы
k6Мощный, Go-basedТребует изучения
ArtilleryПростой YAML-конфиг, Node.js экосистемаМенее мощный для сложных сценариев
LocustPython, гибкийДругой стек

Выбор: Artillery — простота конфигурации, интеграция с Node.js проектами.

Документация: https://www.artillery.io/

Performance: Unlighthouse

АльтернативаПлюсыМинусы
Lighthouse CIОфициальный GoogleСложная настройка
UnlighthouseСканирует весь сайт, простой отчётМенее гибкий
SpeedCurveПрофессиональный мониторингПлатный

Выбор: Unlighthouse — автоматическое сканирование всех страниц, интеграция в CI.

Документация: https://unlighthouse.dev/

Errors: Sentry

АльтернативаПлюсыМинусы
SentryСтандарт индустрии, богатый функционалПлатный для больших объёмов
BugsnagХороший UXДороже
LogRocketSession replayОчень дорогой

Выбор: Sentry — стандарт индустрии, отличная интеграция с Vue/Nuxt.

Документация: https://docs.sentry.io/platforms/javascript/guides/vue/

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

Пирамида тестов

        /\
       /  \     E2E (Cypress)
      /----\    Критические user flows
     /      \
    /--------\  Component (Storybook + Chromatic)
   /          \ Визуальные регрессии
  /------------\
 /              \ Unit (Vitest)
/________________\ Логика, utils, composables

Что тестировать на каждом уровне

УровеньЧто тестироватьПример
UnitЧистые функции, composables, store actionsformatCurrency(), useOrders()
ComponentВизуал компонентов, состоянияOrderCard в разных состояниях
E2EКритические user flowsАвторизация, создание заказа
LoadAPI endpoints под нагрузкой100 concurrent users
PerformanceCore Web VitalsLCP, FID, CLS

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

app-name/
├── app/
│   └── components/
│       └── OrderCard/
│           ├── OrderCard.vue
│           ├── OrderCard.stories.ts    # Storybook
│           └── OrderCard.test.ts       # Vitest
├── tests/
│   ├── e2e/                            # Cypress
│   │   ├── auth.cy.ts
│   │   └── orders.cy.ts
│   ├── load/                           # Artillery
│   │   └── api-load.yml
│   └── setup.ts                        # Vitest setup
├── .storybook/                         # Storybook config
├── cypress.config.ts
├── vitest.config.ts
└── unlighthouse.config.ts

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

Pipeline stages

# .gitlab-ci.yml / .github/workflows/ci.yml

stages:
  - lint
  - test
  - visual
  - e2e
  - performance
  - deploy

unit-tests:
  stage: test
  script:
    - pnpm test:unit

storybook-build:
  stage: visual
  script:
    - pnpm storybook:build
    - pnpm chromatic --project-token=$CHROMATIC_TOKEN

e2e-tests:
  stage: e2e
  script:
    - pnpm test:e2e

performance:
  stage: performance
  script:
    - pnpm unlighthouse
  only:
    - main

Когда запускать

ТестPRMainNightly
Unit (Vitest)
Visual (Chromatic)-
E2E (Cypress)
Load (Artillery)--
Performance (Unlighthouse)-

Sentry интеграция

Настройка

// nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@sentry/nuxt/module'],

  sentry: {
    dsn: process.env.SENTRY_DSN,
    environment: process.env.NODE_ENV,
  },
})

Что отслеживать

  • JavaScript errors
  • Unhandled promise rejections
  • API errors (4xx, 5xx)
  • Performance transactions
  • User feedback

Source Maps

// nuxt.config.ts
export default defineNuxtConfig({
  sourcemap: {
    client: true,
  },

  sentry: {
    uploadSourcemaps: true,
  },
})

Последствия

Положительные

  • Раннее обнаружение багов
  • Автоматическое отслеживание визуальных регрессий
  • Мониторинг production-ошибок в реальном времени
  • Контроль производительности
  • Документация компонентов через Storybook
  • Уверенность при рефакторинге

Отрицательные

  • Время на написание и поддержку тестов
  • Дополнительная инфраструктура (Chromatic, Sentry)
  • Увеличение времени CI/CD pipeline
  • Требуется обучение команды

Coverage требования

Минимальные пороги

МетрикаПорог
Unit coverage60%
Component coverage (Storybook)Все shared компоненты
E2E coverageКритические flows
Lighthouse score> 80

Приоритеты покрытия

  1. Обязательно: composables, utils, stores
  2. Обязательно: shared компоненты (UI layer)
  3. Обязательно: критические user flows (auth, core actions)
  4. Желательно: page components
  5. Желательно: edge cases

Связанные решения