diff --git a/.DS_Store b/.DS_Store index 174c38f..c6a2dc2 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.vitepress/config.mts b/.vitepress/config.mts index 81cee65..19d6c83 100644 --- a/.vitepress/config.mts +++ b/.vitepress/config.mts @@ -93,6 +93,7 @@ export default defineConfig({ items: [ { text: 'Docker Compose', link: '/infrastructure/docker' }, { text: 'K8s + Terraform + ArgoCD + Gitea', link: '/infrastructure/k8s-cicd-platform-plan' }, + { text: 'Автотестирование (issues/27-test)', link: '/infrastructure/autotesting' }, { text: 'Backend: внешние сервисы (test/stage/prod)', link: '/infrastructure/backend-external-services' }, { text: 'Локальная ферма k8s (Multipass)', diff --git a/infrastructure/autotesting.md b/infrastructure/autotesting.md new file mode 100644 index 0000000..72b370f --- /dev/null +++ b/infrastructure/autotesting.md @@ -0,0 +1,93 @@ +# Автотестирование Sova + +Ветка внедрения: **`issues/27-test`** в репозиториях `k8s/sova-*`. + +## Правило по контурам + +| Контур (тег) | Тесты в CI | E2E | +|--------------|------------|-----| +| **`*-test`** | Unit + integration (backend), Jest (adminpanel), PHPUnit (cabinet) | Smoke + full (Playwright, mocks) | +| **`*-stage`** | То же pre-deploy | Только smoke read-only | +| **`*-prod`** | **Нет** автотестов | **Нет** | + +Тесты **никогда** не гоняются на production-окружении. Запуск привязан к git-тегам `backend-v*`, `adminpanel-v*`, … в Gitea Actions. + +## Пирамида + +### 1. Backend (`sova-backend`) + +- **Инструменты:** PHPUnit 12, Zenstruck Foundry (далее). +- **Unit:** `tests/Unit`, `tests/Service` — без БД. +- **Integration:** `tests/Controller`, `tests/Integration` — с PostgreSQL в CI (только тег `*-test`, `continue-on-error` на старте). +- **Логи E2E:** `App\Log\TestTraceProcessor` — заголовки `X-Is-Auto-Test`, `X-Test-Trace-Id` → `extra.is_test`, `extra.test_trace_id` в Loki. + +```bash +composer phpunit:unit +composer phpunit:coverage # var/coverage/clover.xml +``` + +**CI:** `.gitea/workflows/build.yml` — job `test` на `test|stage`, артефакт `backend-coverage-*` (14 дней). + +### 2. adminPanel (`sova-adminpanel`) + +- **Инструменты:** Jest + React Testing Library (миграция на Vitest — в roadmap). +- **CI:** `npm run test:ci` (coverage lcov), lint, build до образа. + +### 3. E2E (`sova-e2e`) + +- **Инструменты:** Playwright. +- **Проекты:** `smoke-readonly` (stage), `full-e2e` (test, сценарии в `tests/e2e/`). +- **CI:** `.gitea/workflows/e2e-tests.yml` — `workflow_dispatch` или тег `e2e-v*-*`. + +Локально: + +```bash +cd k8s/sova-e2e +npm install && npx playwright install chromium +export API_BASE_URL=http://192.168.252.6 API_HOST=api.test.sova.local +npm run test:smoke +``` + +## Loki (Grafana Explore) + +После деплоя с прогоном E2E: + +```logql +{namespace="sova-test"} | json | extra_is_test="true" | extra_test_trace_id="" +``` + +## CI/CD: две фазы + +```mermaid +flowchart LR + tag[Git tag *-test] --> pre[Pre-deploy: unit/coverage] + pre --> build[Build image] + build --> deploy[sova-deploy GitOps] + deploy --> e2e[Post-deploy: sova-e2e] +``` + +1. **Pre-deploy** — в workflow каждого приложения (`build.yml`). +2. **Post-deploy** — репозиторий `sova-e2e`, ожидание Argo CD (`scripts/wait-for-argocd.sh`), отчёт Playwright HTML в artifacts. + +## Покрытие (test contour) + +При теге `backend-v1.0.x-test` / `adminpanel-v1.0.x-test` в Gitea Actions → **Artifacts**: + +- `backend-coverage-/` — Clover + HTML +- `adminpanel-coverage-/` — lcov + +Просмотр: скачать артефакт job `test` или открыть summary в логе (`coverage` text-summary). + +## Дорожная карта + +| Месяц | Задачи | +|-------|--------| +| **1** (текущая ветка) | PHPUnit unit + coverage, Jest CI, TestTraceProcessor, sova-e2e smoke, документация | +| **2** | PG в runner, миграции, SpecialistRepository integration; 3 smoke в пайплайне | +| **3** | Full E2E JWT/CRUD/запись; nightly test; Telegram alerts | + +## Связанные страницы + +- [CI/CD и Loki (local-k8s)](./local-k8s/ci-and-logs) +- [Gitea CI (test-contour)](./test-contour/guides/gitea-ci) +- [Backend content CRUD](../apps/backend-content-crud)