TL;DR

  • Artillery = Node.js нагрузочное тестирование с YAML сценариями
  • Определяй виртуальных пользователей, фазы (ramp-up, sustained load), think time
  • Встроенные: HTTP, WebSocket, Socket.io поддержка
  • Плагины: кастомные протоколы, метрики, репортеры
  • CLI-first дизайн, идеален для CI/CD пайплайнов

Идеально для: Node.js команд, современных веб-приложений, разработчиков, предпочитающих code-as-config Пропусти, если: Нужно GUI построение тестов или широкая поддержка протоколов (используй JMeter) Время чтения: 12 минут

Твоему API нужно нагрузочное тестирование перед релизом. Ты в Node.js команде — XML JMeter’а чуждый. Ты хочешь тесты в Git, запускающиеся в CI/CD вместе с кодом.

Artillery говорит на твоём языке. YAML конфиги, npm установка, CLI выполнение. Тесты, которые читаются как документация, запускаются как код.

Что такое Artillery?

Artillery — современный инструментарий для нагрузочного тестирования для разработчиков. Использует YAML для определения сценариев и работает на Node.js, что естественно для JavaScript/TypeScript команд.

Почему Artillery:

  • YAML-based — читаемые, версионируемые сценарии
  • Developer-friendly — npm install, CLI выполнение
  • Поддержка протоколов — HTTP, WebSocket, Socket.io из коробки
  • Расширяемый — JavaScript функции, кастомные плагины
  • CI/CD native — JSON output, exit codes, GitHub Actions ready

Установка

npm install -g artillery

Проверка установки:

artillery version

Первый нагрузочный тест

Базовый YAML сценарий

# load-test.yml
config:
  target: "https://api.example.com"
  phases:
    - duration: 60
      arrivalRate: 10
      name: "Warm up"

scenarios:
  - name: "Get users"
    flow:
      - get:
          url: "/users"

Запуск теста

artillery run load-test.yml

Фазы нагрузки

Паттерн Ramp-Up

config:
  target: "https://api.example.com"
  phases:
    # Начало медленно
    - duration: 30
      arrivalRate: 5
      name: "Warm up"

    # Рост до пика
    - duration: 60
      arrivalRate: 5
      rampTo: 50
      name: "Ramp up"

    # Устойчивая нагрузка
    - duration: 120
      arrivalRate: 50
      name: "Sustained load"

    # Охлаждение
    - duration: 30
      arrivalRate: 50
      rampTo: 5
      name: "Cool down"

Пользовательские сценарии

Последовательные запросы

scenarios:
  - name: "User journey"
    flow:
      - get:
          url: "/products"
      - think: 2  # Ожидание 2 секунды
      - get:
          url: "/products/1"
      - post:
          url: "/cart"
          json:
            productId: 1
            quantity: 2

Захват и переиспользование данных

scenarios:
  - name: "Login and use token"
    flow:
      - post:
          url: "/auth/login"
          json:
            username: "test"
            password: "secret"
          capture:
            - json: "$.token"
              as: "authToken"

      - get:
          url: "/profile"
          headers:
            Authorization: "Bearer {{ authToken }}"

Assertions

Валидация ответа

scenarios:
  - name: "API health check"
    flow:
      - get:
          url: "/health"
          expect:
            - statusCode: 200
            - contentType: application/json
            - hasProperty: status
            - equals:
                - "{{ status }}"
                - "healthy"

Конфигурация окружений

Использование переменных

config:
  target: "{{ $processEnvironment.API_URL }}"
  variables:
    apiKey: "{{ $processEnvironment.API_KEY }}"

scenarios:
  - flow:
      - get:
          url: "/data"
          headers:
            X-API-Key: "{{ apiKey }}"

Несколько окружений

config:
  environments:
    dev:
      target: "https://dev.api.example.com"
    staging:
      target: "https://staging.api.example.com"
    prod:
      target: "https://api.example.com"
artillery run test.yml -e staging

Отчёты

JSON отчёт

artillery run load-test.yml --output results.json

HTML отчёт

artillery run load-test.yml --output results.json
artillery report results.json --output report.html

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

GitHub Actions

name: Load Tests

on:
  schedule:
    - cron: '0 2 * * *'  # Ежедневно в 2:00

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

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install Artillery
        run: npm install -g artillery

      - name: Run load test
        run: artillery run tests/load-test.yml --output results.json
        env:
          API_URL: ${{ secrets.API_URL }}

      - name: Generate report
        run: artillery report results.json --output report.html

      - name: Upload results
        uses: actions/upload-artifact@v4
        with:
          name: load-test-results
          path: |
            results.json
            report.html

Exit Codes для CI

config:
  ensure:
    p95: 500      # 95-й перцентиль < 500мс
    maxErrorRate: 1  # < 1% ошибок

Artillery возвращает код 1 если пороги превышены — фейля CI джобу.

Artillery с помощью ИИ

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

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

  • Генерировать YAML сценарии из API спецификаций
  • Создавать реалистичные пользовательские пути
  • Предлагать конфигурации фаз нагрузки
  • Конвертировать другие форматы в Artillery YAML

Что требует людей:

  • Определение реалистичных уровней нагрузки
  • Интерпретация результатов в бизнес-контексте
  • Решения по инфраструктурной мощности
  • Различия production vs test окружений

FAQ

Что такое Artillery?

Artillery — современный Node.js инструмент для нагрузочного тестирования. Ты пишешь тестовые сценарии на YAML, определяя виртуальных пользователей и их поведение. Поддерживает HTTP, WebSocket и Socket.io из коробки, с плагинами для кастомных протоколов. Тесты запускаются из CLI, выводят JSON и легко интегрируются с CI/CD пайплайнами.

Artillery vs JMeter — что лучше?

Artillery использует YAML конфигурацию (удобно для разработчиков, версионируется). JMeter использует GUI (проще для не-программистов). Artillery легче, быстрее настраивается и естественен для Node.js команд. JMeter имеет больше поддержки протоколов, enterprise функций и большую экосистему. Выбирай Artillery для современных веб-приложений, JMeter для сложных enterprise нужд.

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

Artillery Core (CLI инструмент) бесплатный и open-source под лицензией MPL-2.0. Он покрывает большинство потребностей нагрузочного тестирования. Artillery Pro — платный сервис, добавляющий облачное выполнение, продвинутую аналитику, командную работу и поддержку. Большинство команд начинают с Core и апгрейдятся если нужен облачный масштаб.

Может ли Artillery тестировать WebSockets?

Да, поддержка WebSocket встроена. Определяй connection, emit и expect шаги в YAML как HTTP запросы. Тестируй real-time приложения, чат системы, мультиплеерные игры и Socket.io бэкенды. Один сценарий может смешивать HTTP и WebSocket шаги для реалистичных пользовательских путей.

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

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