food-market/tests/load
nns e30861fb57
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
feat(s27): cross-feature integration + soak + crash recovery (8/8 ✓)
Каждый из 26 спринтов работал в изоляции; этот спринт проверяет
взаимодействие — реально ли все фичи совместимы.

1. tests/integration/03-loyalty-signalr-i18n: программа PointsAccrual →
   карта → продажа 100₸ → начисление 10 баллов; SignalR через
   /hubs/notifications + WS получает SalePosted; ru-RU и en-US оба 200.
2. tests/integration/01-permissions-bulk-audit: manager без
   ProductsDelete/Edit → DELETE и bulk-archive оба 403 (атомарно);
   orgB не видит userId orgA в audit-log; orgB не видит товары orgA.
3. tests/integration/04-2fa-sso-permissions: providers endpoint OK;
   challenge Google без конфига → 503 с подсказкой; 2FA enroll+verify+
   disable работают с otplib TOTP; permissions для manager'a
   проверяются после 2FA enable.
4. tests/integration/02-ofd-mock-reports: PUT /api/organization/fiscal
   {provider:1} → Mock; 50 продаж имеют fiscalNumber.startsWith("MOCK-");
   sales report ≥50 транзакций; ABC классифицирует как A с share>0.5.
5. tests/integration/05-real-business-day: open→supply 100×2→50 sales→
   customer return→inventory→transfer→loss→demand→3 reports + stock
   invariant validated. Прогон 24.7s.
6. tests/load/soak-4h.js + monitor-soak.sh — k6 constant-arrival-rate
   50 RPS. Soak-lite 16m34s @ 20 RPS: 19863 iterations, 0 failures,
   p95 me=16.9ms / products=29.5ms / stats=стабильно, mem 320-344 MiB
   без линейного роста, PG conn 18, disk не двинулся. Без утечек.
7. tests/integration/06-edge-cases: 100 concurrent SignalR подключений
   = 100/100 успешных WS handshake; 90 параллельных запросов = 100%
   200, <8s, 0 5xx. Hangfire workers=2 не блокирует API.
8. Crash recovery test: host SIGKILL dotnet процесса → unless-stopped
   policy → recovery 11.7s ≤ 30s SLA. Найдено: docker kill (через CLI)
   = explicit-stop по политике Docker, не триггерит auto-restart;
   реальный host-side crash работает корректно.

Cert-прогон: 7 integration specs все зелёные за 1.2 мин.
0 production bugs found.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-09 03:09:17 +05:00
..
monitor-soak.sh feat(s27): cross-feature integration + soak + crash recovery (8/8 ✓) 2026-06-09 03:09:17 +05:00
README.md docs(s12): ARCHITECTURE/MULTI-TENANCY/RUNBOOK/DEVELOPER-GUIDE + k6 baseline + stage-verify CI 2026-06-07 03:19:25 +05:00
retail-sales-parallel.js docs(s12): ARCHITECTURE/MULTI-TENANCY/RUNBOOK/DEVELOPER-GUIDE + k6 baseline + stage-verify CI 2026-06-07 03:19:25 +05:00
sales-report-heavy.js docs(s12): ARCHITECTURE/MULTI-TENANCY/RUNBOOK/DEVELOPER-GUIDE + k6 baseline + stage-verify CI 2026-06-07 03:19:25 +05:00
signup-burst.js docs(s12): ARCHITECTURE/MULTI-TENANCY/RUNBOOK/DEVELOPER-GUIDE + k6 baseline + stage-verify CI 2026-06-07 03:19:25 +05:00
soak-4h.js feat(s27): cross-feature integration + soak + crash recovery (8/8 ✓) 2026-06-09 03:09:17 +05:00

k6 нагрузочные тесты

Сценарии нагрузочного тестирования API food-market через k6.

Подготовка

# k6 standalone (Linux)
wget -O- https://github.com/grafana/k6/releases/download/v0.55.0/k6-v0.55.0-linux-amd64.tar.gz | tar xz
mv k6-*-linux-amd64/k6 ~/bin/

# проверить
k6 version

Сценарии

Файл Что меряет
signup-burst.js 100 signup'ов за минуту — bootstrap новых tenant'ов под нагрузкой
retail-sales-parallel.js 1000 проведённых чеков параллельно за 5 минут (один tenant)
sales-report-heavy.js Чтение отчёта /api/reports/sales при 10 000 уже-существующих продажах

Запуск против stage

BASE_URL=https://test.admin.food-market.kz \
    k6 run signup-burst.js

BASE_URL=https://test.admin.food-market.kz \
    k6 run retail-sales-parallel.js

BASE_URL=https://test.admin.food-market.kz \
    k6 run sales-report-heavy.js

Результаты сводятся в docs/performance-baseline.md.

Что k6 печатает

checks_total....: 100.00% 1000/1000
http_req_duration: p(50)=82ms  p(95)=312ms  p(99)=580ms
http_req_failed.: 0.00%   0/1000
iteration_duration: avg=512ms

Это «человеческие» метрики. Тонкое — через --out json=summary.json или --out csv=... (k6 не имеет своего хранилища, только stdout/file).