Найти в Дзене
Анастасия Софт

🧪 Нагрузочное тестирование с K6: с чего начать

Оглавление
Нагрузочное тестирование с K6: с чего начать
Нагрузочное тестирование с K6: с чего начать

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.

Помни: нагрузочное тестирование — это не про «сломать», а про «понять, когда сломается».