TL;DR: Если тебе нужно проверить, выдержит ли твой сервис толпу пользователей с "горячим" трафиком, и ты не хочешь потерять здравый смысл — добро пожаловать в мир k6. Мы пройдёмся от самых простых скриптов до более суровых сценариев, чтобы было понятно и новичкам, и интересно матерым боевым тестерам.
🚀 Что такое K6 и зачем он вообще нужен?
K6 — это современный инструмент для нагрузочного тестирования, написанный на Go, но скрипты для него пишутся на JavaScript. Он лёгкий, быстрый, кроссплатформенный и не требует десятка зависимостей. Очень удобен как для ручного запуска, так и для CI/CD.
Простой пример: хочешь узнать, выдержит ли твой сайт наплыв 500 пользователей, если ты вдруг попал в «Топ Хабра» — используй k6.
🧰 Установка
Установка тривиальна:
brew install k6 # для macOS
choco install k6 # для Windows
sudo apt install k6 # для Ubuntu/Debian
Проверим, что всё ок:
k6 version
🏁 Первый скрипт — Hello, Load Test!
Создаём файл script.js:
import http from 'k6/http'; // Импортируем модуль для HTTP-запросов
import { check } from 'k6'; // Модуль для валидации ответов
export const options = {
vus: 10, // Кол-во одновременных виртуальных пользователей
duration: '10s', // Длительность теста
};
export default function () {
const res = http.get('https://test.k6.io'); // Отправляем GET-запрос
check(res, { // Проверяем, что ответ успешен
'status is 200': (r) => r.status === 200,
});
}
Запуск:
k6 run script.js
🎉 И вот ты уже симулировал нагрузку в 10 виртуальных юзеров на 10 секунд.
📊 Аналитика, которая идёт из коробки
После выполнения ты получишь:
- http_req_duration — время отклика
- vus — количество активных пользователей
- http_reqs — общее количество запросов
- checks — процент успешных проверок
Для CI/CD или визуализации можно интегрироваться с:
- Grafana + k6 Cloud
- InfluxDB + Telegraf
- JSON/CSV-логгерами
🎯 10 ЗАДАЧ (с примерами) — от новичка до профи
1. ✅ Проверка простого REST API
import http from 'k6/http';
import { check } from 'k6';
export const options = {
vus: 5,
duration: '5s',
};
export default function () {
const res = http.get('https://jsonplaceholder.typicode.com/posts/1');
check(res, {
'получили 200': (r) => r.status === 200,
'есть заголовок content-type': (r) => r.headers['Content-Type'] === 'application/json; charset=utf-8',
});
}
2. ⏳ Параллельные запросы (batch)
import http from 'k6/http';
export default function () {
const responses = http.batch([
['GET', 'https://test.k6.io'],
['GET', 'https://test.k6.io/news.php'],
]);
}
Полезно, если пользователь открывает несколько компонентов страницы одновременно.
3. 🔁 Циклическая нагрузка (Loop)
export const options = {
vus: 1,
iterations: 5, // Выполнить по 5 итераций
};
export default function () {
console.log('Итерация выполнена');
}
4. 🔐 Тест с авторизацией (Bearer Token)
export default function () {
const headers = {
headers: {
Authorization: `Bearer my_secret_token`,
},
};
const res = http.get('https://api.example.com/protected', headers);
}
5. 🧪 POST-запрос с телом
export default function () {
const url = 'https://api.example.com/login';
const payload = JSON.stringify({
username: 'user',
password: 'pass',
});
const params = {
headers: { 'Content-Type': 'application/json' },
};
const res = http.post(url, payload, params);
}
6. 📂 Передача параметров из CLI
k6 run --env BASE_URL=https://api.myapp.com script.js
const BASE_URL = __ENV.BASE_URL;
Полезно, когда скрипт используется в разных средах.
7. ⏱ Замер времени ответа вручную
const start = Date.now();
http.get('https://test.k6.io');
const duration = Date.now() - start;
console.log(`Ответ за ${duration} мс`);
8. 📈 Интеграция с Prometheus + Grafana
k6 run --out prometheus script.js
K6 будет публиковать метрики в формате, совместимом с Prometheus.
9. 🧠 Сценарии с разными профилями нагрузки
export const options = {
scenarios: {
ramping_test: {
executor: 'ramping-vus',
startVUs: 0,
stages: [
{ duration: '10s', target: 20 }, // поднимаем
{ duration: '20s', target: 20 }, // держим
{ duration: '10s', target: 0 }, // снижаем
],
},
},
};
10. 📦 Модульная структура тестов (для больших проектов)
utils.js:
export function authHeader() {
return {
headers: { Authorization: 'Bearer token' },
};
}
main.js:
import http from 'k6/http';
import { authHeader } from './utils.js';
export default function () {
http.get('https://api.example.com/protected', authHeader());
}
🤯 Заключение: не бойся нагрузок!
k6 — это мощный, но при этом простой инструмент. Он не заставляет тебя страдать с настройками, и при этом позволяет расти от простых тестов до сложных сценариев со сценариями, аналитикой и CI/CD.
Помни: нагрузочное тестирование — это не про «сломать», а про «понять, когда сломается».