TL;DR

  • k6 — современный, дружественный к разработчикам инструмент для нагрузочного тестирования — пишешь тесты на JavaScript
  • Установка через brew/apt/docker, пишешь скрипты, запускаешь из CLI
  • Определяй thresholds для критериев pass/fail: время ответа, процент ошибок
  • Встроенные метрики: http_req_duration, http_reqs, iterations, vus
  • Интеграция с CI/CD, Grafana Cloud, InfluxDB для дашбордов

Идеально для: Разработчиков, DevOps, команд, которые хотят performance-тесты как код Пропусти, если: Нужен GUI для дизайна тестов или экзотические протоколы (используй JMeter) Время чтения: 15 минут

Твоя команда хочет performance-тесты в CI/CD. XML-файлы JMeter сложно ревьюить в PR. Тесты должны запускаться headless в контейнерах.

k6 решает эту проблему. Тесты — это JavaScript-код — читаемый, версионируемый, ревьюируемый. Запускается из CLI, интегрируется со всем, отчёты в реальном времени.

Что такое k6?

k6 — это open-source инструмент для нагрузочного тестирования, созданный для современных рабочих процессов разработки. Тесты на JavaScript, выполнение на Go (быстро), результаты интегрируются с инструментами наблюдаемости.

Почему k6:

  • JavaScript-тесты — используй настоящий язык, не XML
  • Developer experience — отличный CLI, понятный вывод
  • Высокая производительность — одна машина обрабатывает тысячи VUs
  • Нативная CI/CD интеграция — запускается в контейнерах
  • Расширяемый — JavaScript APIs, расширения, протоколы

Установка

# macOS
brew install k6

# Ubuntu/Debian
sudo apt update && sudo apt install k6

# Docker
docker run --rm -i grafana/k6 run - <script.js

# Windows
choco install k6

Твой первый k6-тест

Создай script.js:

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

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

export default function () {
  const res = http.get('https://test.k6.io');

  check(res, {
    'status is 200': (r) => r.status === 200,
    'response time < 500ms': (r) => r.timings.duration < 500,
  });

  sleep(1);
}

Запуск:

k6 run script.js

Концепции k6

Virtual Users (VUs)

VUs — это параллельные исполнители, запускающие твою тестовую функцию.

export const options = {
  vus: 100,        // одновременные пользователи
  duration: '5m',  // продолжительность теста
};

Stages (Ramp-up/down)

Постепенное увеличение и уменьшение нагрузки.

export const options = {
  stages: [
    { duration: '2m', target: 100 },  // ramp до 100 пользователей
    { duration: '5m', target: 100 },  // держим 100
    { duration: '2m', target: 200 },  // ramp до 200
    { duration: '5m', target: 200 },  // держим 200
    { duration: '2m', target: 0 },    // ramp down
  ],
};

Thresholds

Определяй критерии pass/fail.

export const options = {
  thresholds: {
    http_req_duration: ['p(95)<500'],     // 95% запросов < 500ms
    http_req_failed: ['rate<0.01'],       // процент ошибок < 1%
    checks: ['rate>0.99'],                // 99% проверок проходят
    http_reqs: ['rate>100'],              // минимум 100 RPS
  },
};

HTTP-запросы

GET-запрос

import http from 'k6/http';

export default function () {
  // Простой GET
  const res = http.get('https://api.example.com/users');

  // GET с headers
  const res2 = http.get('https://api.example.com/users', {
    headers: {
      'Authorization': 'Bearer token123',
      'Accept': 'application/json',
    },
  });
}

POST-запрос

import http from 'k6/http';

export default function () {
  const payload = JSON.stringify({
    name: 'John Doe',
    email: 'john@example.com',
  });

  const params = {
    headers: {
      'Content-Type': 'application/json',
    },
  };

  const res = http.post('https://api.example.com/users', payload, params);
}

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

GitHub Actions

name: Load Test

on:
  push:
    branches: [main]

jobs:
  k6-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Run k6 test
        uses: grafana/k6-action@v0.3.1
        with:
          filename: tests/load-test.js

k6 с помощью ИИ

ИИ-инструменты могут помочь писать и оптимизировать k6-тесты.

Что ИИ делает хорошо:

  • Генерация тестовых скриптов из API-спецификаций
  • Создание реалистичных тестовых данных
  • Предложение значений thresholds
  • Объяснение метрик и результатов

Что всё ещё требует людей:

  • Понимание архитектуры системы
  • Установка реалистичных целей нагрузки
  • Интерпретация результатов в контексте

FAQ

Что такое k6?

k6 — это современный open-source инструмент для нагрузочного тестирования, созданный для разработчиков. Ты пишешь тесты на JavaScript, запускаешь их из командной строки и получаешь детальные метрики производительности. Созданный Grafana Labs, k6 фокусируется на developer experience, интеграции с CI/CD и высокой производительности.

k6 бесплатный?

Да, k6 open-source (k6 OSS) полностью бесплатен. Grafana Cloud k6 предлагает облачное выполнение тестов, облачное хранилище и дополнительные функции с бесплатным и платными тарифами. Для большинства случаев open-source версия предоставляет всё необходимое.

k6 или JMeter — что лучше?

k6 лучше для разработчиков и CI/CD — тесты как код (JavaScript), быстрое выполнение, хорошая интеграция с современными инструментами. JMeter лучше для GUI-дизайна тестов и поддерживает больше протоколов из коробки. k6 обычно легче изучить и поддерживать командам, знакомым с JavaScript.

Может ли k6 тестировать браузерные взаимодействия?

Да, у k6 есть экспериментальный browser module, который позволяет тестировать в реальном браузере с Chromium. Однако сила k6 — в протокольном тестировании (HTTP, WebSocket, gRPC), которое намного эффективнее для нагрузочного тестирования.

Официальные ресурсы

Смотрите также

  • JMeter Tutorial - Традиционное GUI-based нагрузочное тестирование
  • Gatling Tutorial - Высокопроизводительное тестирование на Scala
  • API Testing Guide - Основы API-тестирования