cb80b35ba6
Frontend CI / build-and-check (push) Failing after 19s
🚀 Create and publish a Docker image / Detect changes in backend and frontend (push) Successful in 8s
🚀 Create and publish a Docker image / Build & publish backend image (push) Successful in 10s
🚀 Create and publish a Docker image / Build & publish frontend image (push) Successful in 25s
🚀 Create and publish a Docker image / Update stack on Portainer (push) Successful in 2s
95 lines
3.8 KiB
Markdown
95 lines
3.8 KiB
Markdown
# Базовый нагрузочный тест (k6) для 3 крупных GET endpoint'ов
|
||
|
||
## Цель теста
|
||
|
||
Проверить, что при небольшой параллельной нагрузке API:
|
||
|
||
- отвечает без ошибок;
|
||
- сохраняет приемлемую задержку на «тяжелых» чтениях;
|
||
- не падает на endpoint пользовательской статистики.
|
||
|
||
Тест рассчитан на новичка: один скрипт, простые пороги, быстрый запуск.
|
||
|
||
## Какие endpoint используются
|
||
|
||
В тест включены:
|
||
|
||
1. `GET /api/v1/courses` — крупный список данных.
|
||
2. `GET /api/v1/lectures` — крупный список данных.
|
||
3. `GET /api/v1/users/me/stats` — endpoint с информацией о пользователе.
|
||
|
||
## Файл теста
|
||
|
||
- [loadtest-endpoints.js](../frontend/scripts/loadtest-endpoints.js)
|
||
|
||
## Предусловия перед запуском
|
||
|
||
1. Запущен API (локально или на тестовом стенде).
|
||
2. Если endpoint'ы требуют авторизацию — есть валидный JWT токен.
|
||
3. Установлен k6.
|
||
|
||
## Запуск
|
||
|
||
Без параметров (локальный API по умолчанию `http://localhost:5019`):
|
||
|
||
```bash
|
||
k6 run ./frontend/scripts/loadtest-endpoints.js
|
||
```
|
||
|
||
С параметрами окружения:
|
||
|
||
```bash
|
||
export TOKEN="<jwt>"
|
||
BASE_URL="http://localhost:5019" VUS=15 DURATION="2m" PAUSE_SECONDS=0 k6 run ./frontend/scripts/loadtest-endpoints.js
|
||
```
|
||
|
||
## Что именно делает тест
|
||
|
||
Скрипт запускает **3 параллельных сценария**:
|
||
|
||
- `courses_list`
|
||
- `lectures_list`
|
||
- `user_stats`
|
||
|
||
Параметры каждого сценария:
|
||
|
||
- executor: `constant-vus`
|
||
- нагрузка: `10 VU`
|
||
- длительность: `2m`
|
||
- пауза между итерациями: `sleep(0.5)`
|
||
|
||
Итого базовый запуск создает до `30 VU` одновременно: по `10 VU` на каждый из 3 сценариев.
|
||
|
||
Переменные окружения:
|
||
|
||
- `VUS` — количество VU на каждый сценарий, по умолчанию `10`.
|
||
- `DURATION` — длительность каждого сценария, по умолчанию `2m`.
|
||
- `PAUSE_SECONDS` — пауза между итерациями, по умолчанию `0.5`.
|
||
|
||
На каждом запросе проверяется:
|
||
|
||
- статус ответа `200`;
|
||
- тело ответа не пустое.
|
||
|
||
## Пороговые значения (pass/fail)
|
||
|
||
- `http_req_failed: rate < 0.01` — ошибок менее 1%.
|
||
- `http_req_duration: p(95) < 1500` — 95% запросов быстрее 1.5с.
|
||
- `checks: rate > 0.95` — минимум 95% проверок успешны.
|
||
|
||
Если любой threshold не выполнен, k6 завершит запуск как failed.
|
||
|
||
## Как интерпретировать результат
|
||
|
||
После прогона посмотрите в summary:
|
||
|
||
1. `http_req_failed` — если выше 1%, есть проблема со стабильностью.
|
||
2. `http_req_duration p(95)` — если выше 1500ms, есть деградация по задержке.
|
||
3. `checks` — если ниже 95%, часть ответов не прошла базовую валидацию.
|
||
|
||
Минимальный формальный вывод для отчета:
|
||
|
||
- «Проведен базовый нагрузочный прогон k6 (3 endpoint'а, 10 VU на сценарий, 5 минут).»
|
||
- «Критерии: ошибки < 1%, p95 < 1500ms, checks > 95%.»
|
||
- «Статус: пройдено / не пройдено по итогам summary.»
|