Skip to content

Testing Strategy — Partizap Frontend

Дата: 2026-03-12 Контекст: MVP / pre-launch, solo dev + Claude, backend через dev-стенд (dev.partizap.ru)

Подход: Прагматичный гибрид

Три слоя тестирования с разным приоритетом. Компонентные тесты (@vue/test-utils) откладываем до стабилизации UI после MVP.

Фаза 0 — Экстракция логики из компонентов
Фаза 1 — Unit тесты (Vitest)
Фаза 2 — E2E smoke (Playwright)
Фаза 3 — Ручной regression (USER_FLOWS.md)

Порядок строгий: 0 → 1 → 2 → 3. Каждая фаза самодостаточна.


Фаза 0: Экстракция логики из компонентов

Цель: Вынести бизнес-логику из Vue-компонентов в тестируемые единицы.

0.1 — Форматтеры в shared/lib/

ФайлФункцияДублируется вСтатус
shared/lib/format-price.tsformatPrice(value: number): string8+ компонентов✅ done
shared/lib/format-date.tsformatTime(), formatDateShort(), formatDateTime(), formatMonthYear(), formatSmartDate()10+ компонентов✅ done
shared/lib/product-image.tsgetProductImageUrl(images, size): string | null4 компонента✅ done
shared/lib/highlight-text.tshighlightText(text, query): string, escapeHtml()2 компонента✅ done (XSS fix)

35 новых тестов, 9 компонентов рефакторено. План: docs/plans/2026-03-12-extract-formatters.md

0.2 — DRY fix: SearchBar ✅

Вынесено в features/search/composables/useSearchAutocomplete.ts (12 тестов). SearchBar и HeroSearchBar стали тонкими обёртками (-102 строки).

0.3 — Декомпозиция толстых компонентов ✅

КомпонентСтрокЧто вынестиКудаСтатус
ProductFormPage590price input masking, OEM array CRUD, unsaved changes guardcomposables в features/product-form/
Catalog page373URL ↔ filters sync, filter statefeatures/catalog-filters/composables/
PhoneManager276phone masking, modal statecomposables в features/cabinet-settings/
CitySelector229Set-based multi-select + searchcomposable в features/geo-select/

Правило: экстрагируем → пишем тест → заменяем в компоненте → проверяем ручным прокликиванием.


Фаза 1: Unit тесты (Vitest)

Текущее покрытие (433 теста, 48 файлов) ✅

Stores: auth, favorites, geo, geoLookup. Composables: admin-*, cabinet-settings, search (+ searchAutocomplete), geo-select, ymm-select, image-upload, product-form (+ pricing, OEM, guards), catalog-filters, category-select, phone-manager (+ phoneForm), citySelector. Schemas: product, user, car, category, geo. Middleware: admin. Shared: api client, cursor pagination, phone utils, format-price, format-date, product-image, highlight-text. Auth: apiError.

1.1 — Stores (critical path) ✅

useAuthStore — 19 тестов: login, logout, fetchUser, setUser, getters.

1.2 — Непокрытые composables ✅

ComposableСлойТестов
useCursorPaginationshared10
useApiErrorfeatures/auth13
useGeoCascadefeatures/geo-select9
useYmmCascadefeatures/ymm-select12
useProductFormfeatures/product-form23
useImageUploadfeatures/image-upload11

1.3 — Schemas ✅

user (15), car (30), category (10), geo (10) = 65 тестов

expect(schema.parse(valid)).toEqual(...) + expect(() => schema.parse(invalid)).toThrow()

Что НЕ тестируем юнитами

  • Vue-компоненты (рендеринг, DOM) — зона E2E
  • Middleware guest.ts — тривиальный redirect
  • Layouts — чистые шаблоны
  • Плагин auth.ts — покрывается через store тест

Фаза 2: E2E smoke (Playwright) ✅

Принцип

13 smoke тестов + 50 функциональных E2E тестов против dev-стенда. Smoke — "приложение не сломалось", функциональные — проверка user flows.

Smoke тесты

#FlowЧто проверяем
1Каталог → карточка (гость)SSR, SEO, навигация
2РегистрацияВорота в продукт
3Логин → кабинетCritical auth path
4Создание объявления (черновик)Основной бизнес-флоу
5Публикация → модерация (админ)Pipeline продукта
6Поиск по YMMM каскадуУникальная фича

Функциональные E2E тесты

ГруппаФайлыТестовТикет
Auth (login, register, password-reset)313DEV-204
Catalog (list, product-detail, ymm-cascade, search)424DEV-205
Seller (create-product)17DEV-206
Chat (start-conversation, messaging)25DEV-207
Admin (moderation)13DEV-207
Итого1152

Что НЕ автоматизируем

  • Verify email (нужен доступ к почте)
  • Профиль, избранное, сессии (покрыты юнитами composables)
  • Admin CRUD справочников (покрыт юнитами composables)

Работа с dev-стендом

  1. Setup через API, не UI. POST /auth/login → cookie → тестируем UI.
  2. Не assert'им конкретные данные. expect(card).toBeVisible(), не toBe('Колодки').
  3. Retry + soft assertions для flaky элементов.
  4. Отдельный тестовый юзер на стенде.

Структура

tests/e2e/
├── gate.setup.ts            # Проход формы авторизации dev-сервера
├── auth.setup.ts            # Логин ролей через API
├── smoke/                   # 5 smoke-тестов
├── auth/                    # 13 функциональных тестов (DEV-204)
├── catalog/                 # 24 функциональных теста (DEV-205)
├── seller/                  # 7 функциональных тестов (DEV-206)
├── chat/                    # 5 функциональных тестов (DEV-207)
├── admin/                   # 3 функциональных теста (DEV-207)
├── helpers/
│   ├── auth.helper.ts       # loginViaApi(), RateLimitError
│   ├── auth.state.ts        # storageState пути
│   └── api.helper.ts        # Прямые API-вызовы
└── .auth/                   # Автогенерируемые storageState (gitignored)

Подробная структура — см. docs/dev/frontend/e2e-user-flows.md

CI-интеграция

yaml
test:e2e:
  stage: test-e2e
  needs: [deploy:dev]
  allow_failure: true   # не блокирует merge пока стабилизируем
  script:
    - npx playwright test --reporter=list

Запускает все проекты (gate → setup → smoke + functional). allow_failure: true на первое время → blocking после стабилизации.


Фаза 3: Ручной regression

USER_FLOWS.md как structured checklist перед каждым merge в main:

  • Фазы 1-3 из USER_FLOWS.md (базовые + авторизация + продавец) — ~20 мин
  • Фаза 4 (чат) — ~5 мин
  • Фаза 5 (админка) — ~10 мин

Сознательно откладываем

ЧтоПочемуКогда
Component тесты (@vue/test-utils)UI меняется на MVP, тесты будут ломатьсяПосле стабилизации UI
E2E verify email (UF-03)Нужен доступ к почтовому ящику— (не автоматизируется)
Полное покрытие оставшихся flows (UF-13–16, 18–20, 22–25)ROI не оправдан на MVPПосле запуска, при стабилизации
Visual regression (Percy, Chromatic)Overkill для solo devКогда появится команда

Инструменты

КатегорияИнструмент
UnitVitest + @nuxt/test-utils
Mocksvi.mock / msw (для API)
E2EPlaywright
E2E recordingGasoline MCP / Playwright Codegen
CIGitLab CI (существующий pipeline)
RegressionUSER_FLOWS.md (ручной чеклист)