Добавить в корзинуПозвонить
Найти в Дзене
Анастасия Софт

🔥 K6 vs Locust vs Artillery: что выбрать для своего проекта?

Вопрос века: какой инструмент для нагрузочного тестирования выбрать, чтобы было быстро, понятно, масштабируемо и не вызывало головной боли? Мы сравним три популярных инструмента: K6, Locust, и Artillery. Покажем реальные сценарии, разберем плюсы и минусы, и даже пошутим (немного). Представьте, вы только что выкатили API или лендинг под горячую рекламную кампанию. Вопрос: выдержит ли ваш сервис 1000 пользователей за 10 секунд? И как это узнать до того, как это узнают реальные пользователи? Для этого и нужны инструменты нагрузочного тестирования. Но какой выбрать? Давайте разбираться. Язык: JavaScript
Установка: brew install k6 или choco install k6 import http from 'k6/http';
import { check } from 'k6';
export const options = {
vus: 10, // 10 виртуальных пользователей
duration: '5s', // В течение 5 секунд
};
export default function () {
const res = http.get('https://test.k6.io');
check(res, { 'status 200': (r) => r.status === 200 });
} 🎯 Плюсы: 💣 Минусы: Я
Оглавление
K6 vs Locust vs Artillery: что выбрать для своего проекта?
K6 vs Locust vs Artillery: что выбрать для своего проекта?

Вопрос века: какой инструмент для нагрузочного тестирования выбрать, чтобы было быстро, понятно, масштабируемо и не вызывало головной боли? Мы сравним три популярных инструмента: K6, Locust, и Artillery. Покажем реальные сценарии, разберем плюсы и минусы, и даже пошутим (немного).

🧠 Зачем вообще всё это?

Представьте, вы только что выкатили API или лендинг под горячую рекламную кампанию. Вопрос: выдержит ли ваш сервис 1000 пользователей за 10 секунд? И как это узнать до того, как это узнают реальные пользователи?

Для этого и нужны инструменты нагрузочного тестирования. Но какой выбрать? Давайте разбираться.

📋 Быстрая сводка

-2

🎮 K6: быстрый, как гоночный болид

Язык: JavaScript

Установка: brew install k6 или choco install k6

Простой тест K6

import http from 'k6/http';
import { check } from 'k6';

export const options = {
vus: 10, // 10 виртуальных пользователей
duration: '5s', // В течение 5 секунд
};

export default function () {
const res = http.get('https://test.k6.io');
check(res, { 'status 200': (r) => r.status === 200 });
}

🎯 Плюсы:

  • Высокая производительность
  • Легко интегрируется в CI/CD
  • Удобен для DevOps

💣 Минусы:

  • Нет визуального редактора
  • Сложнее писать нестандартные сценарии (например, с WebSocket, без облака)

🐍 Locust: Python для тестеров и автоматизаторов

Язык: Python

Установка: pip install locust

Простой тест Locust

from locust import HttpUser, task, between

class MyUser(HttpUser):
wait_time = between(1, 5)

@task
def index(self):
response = self.client.get("/")
assert response.status_code == 200

🎯 Плюсы:

  • Сила Python: легко писать сложную логику
  • Отлично подходит для сценариев с авторизацией и очередями

💣 Минусы:

  • Локально может быть медленнее
  • UI устаревший, но рабочий
  • Масштабировать сложнее, чем K6

🎯 Artillery: YAML-магия и немножко JS

Язык: YAML + JavaScript

Установка: npm install -g artillery

Простой тест Artillery

config:
target: "https://test.k6.io"
phases:
- duration: 10
arrivalRate: 5
scenarios:
- flow:
- get:
url: "/"

🎯 Плюсы:

  • Порог входа — почти нулевой
  • Удобно писать простые тесты
  • Можно расширять JS-хендлерами

💣 Минусы:

  • Ограничена производительность
  • Менее гибкий масштаб
  • Отчеты — минималистичные

⚔️ Реальные задачи: как решают их разные инструменты

1. Проверка главной страницы

K6

http.get('https://example.com');

Locust

self.client.get("/")

Artillery

- get:
url: "/"

2. Тест с POST и JSON

K6

http.post('https://api.com/login', JSON.stringify({ user: 'admin' }));

Locust

self.client.post("/login", json={"user": "admin"})

Artillery

- post:
url: "/login"
json:
user: "admin"

3. Авторизация через токен

K6

http.get('https://api.com/data', { headers: { Authorization: `Bearer ${token}` } });

Locust

self.client.get("/data", headers={"Authorization": f"Bearer {token}"})

Artillery

headers:
Authorization: "Bearer {{ token }}"

4. Параллельные запросы

K6

http.batch([
['GET', 'https://a.com'],
['GET', 'https://b.com'],
]);

Locust

— нужно вручную обернуть в Python-многопоточность (не так просто)

Artillery

— не поддерживает явную параллельность в одном сценарии

5. Разные профили нагрузки

K6

scenarios: {
ramping: {
executor: 'ramping-vus',
stages: [
{ duration: '30s', target: 50 },
{ duration: '1m', target: 50 },
{ duration: '10s', target: 0 }
]
}
}

Locust

— через параметры CLI --users, --spawn-rate

Artillery

phases:
- duration: 60
arrivalRate: 10
- duration: 60
arrivalRate: 50

6. Интеграция с CI/CD

K6 — отлично через CLI + JSON

Locust — Python-скрипты можно запускать где угодно

Artillery — легко запускается через npx artillery run

7. Графики и метрики

  • K6 — экспорт в InfluxDB, Prometheus, k6 Cloud
  • Locust — встроенный веб-интерфейс, экспорт через CSV
  • Artillery — генерация HTML-отчетов

8. Работа с CSV-данными

K6 — через papaparse и open()

import { parse } from 'https://jslib.k6.io/papaparse/5.1.1/index.js'
const data = parse(open('./users.csv'), { header: true }).data;

Locust — стандартный csv.reader из Python

Artillery — встроенная поддержка через payload

9. Проверка GraphQL

K6

const query = `query { user(id: 1) { name } }`;
http.post('https://api.com/graphql', JSON.stringify({ query }));

Locust

self.client.post("/graphql", json={"query": "{ user(id: 1) { name } }"})

Artillery

- post:
url: "/graphql"
json:
query: "{ user(id: 1) { name } }"

10. WebSocket тест

K6 — только в облаке

Locust — плохо поддерживается

Artillery — хорошо!

scenarios:
- engine: "ws"
flow:
- send: { text: "hello" }
- think: 5

🏁 Выводы: что выбрать?

-3

🧩 Комбо-хинт

Хочешь всё и сразу? Используй:

  • Artillery для первых smoke-тестов
  • Locust — для сложных кейсов (auth, очереди, цепочки)
  • K6 — для CI/CD, метрик и прод-уровня