Разработка нагрузочных тестов для сайта (Artillery)

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.
Разработка и обслуживание любых видов сайтов:
Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Разработка нагрузочных тестов для сайта (Artillery)
Средняя
~2-3 рабочих дня
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1214
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    852
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1041
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    823
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    815

Разработка нагрузочных тестов для сайта (Artillery)

Artillery — Node.js-инструмент нагрузочного тестирования с YAML/JSON-конфигурацией. Поддерживает HTTP и WebSocket, легко интегрируется в CI/CD, имеет расширения для кастомных сценариев на JS.

Установка

npm install -g artillery

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

# tests/load/basic.yml
config:
  target: "https://staging.example.com"
  phases:
    - duration: 60
      arrivalRate: 5     # 5 новых пользователей в секунду
      name: Warm up
    - duration: 120
      arrivalRate: 20
      name: Ramp up load
    - duration: 300
      arrivalRate: 50
      name: Sustained load
    - duration: 60
      arrivalRate: 100
      name: Stress test

  defaults:
    headers:
      Accept: "application/json"
      Content-Type: "application/json"

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

scenarios:
  - name: Browse catalog
    weight: 60      # 60% трафика
    flow:
      - get:
          url: "/api/products"
          expect:
            - statusCode: 200
            - hasProperty: "data"
      - think: 2
      - get:
          url: "/api/products/{{ $randomNumber(1, 100) }}"

  - name: Search
    weight: 30
    flow:
      - get:
          url: "/api/search?q={{ $randomString() }}"
          expect:
            - statusCode: [200, 404]

  - name: Contact form
    weight: 10
    flow:
      - post:
          url: "/api/contact"
          json:
            name: "Test User"
            email: "[email protected]"
            message: "Load test message"
          expect:
            - statusCode: 201

Сценарий с авторизацией

# tests/load/authenticated.yml
config:
  target: "https://staging.example.com"
  phases:
    - duration: 300
      arrivalRate: 20
  variables:
    users:
      - email: "[email protected]"
        password: "pass123"
      - email: "[email protected]"
        password: "pass456"

scenarios:
  - name: Authenticated user flow
    flow:
      - post:
          url: "/api/auth/login"
          json:
            email: "{{ users[0].email }}"
            password: "{{ users[0].password }}"
          capture:
            - json: "$.access_token"
              as: "token"
          expect:
            - statusCode: 200

      - get:
          url: "/api/user/profile"
          headers:
            Authorization: "Bearer {{ token }}"
          expect:
            - statusCode: 200

      - post:
          url: "/api/orders"
          headers:
            Authorization: "Bearer {{ token }}"
          json:
            product_id: 1
            quantity: 1
          expect:
            - statusCode: 201
          capture:
            - json: "$.id"
              as: "orderId"

      - get:
          url: "/api/orders/{{ orderId }}"
          headers:
            Authorization: "Bearer {{ token }}"
          expect:
            - statusCode: 200

Кастомный JS-процессор

# tests/load/custom.yml
config:
  processor: "./processor.js"

scenarios:
  - name: Dynamic flow
    flow:
      - function: "generateDynamicPayload"
      - post:
          url: "/api/data"
          json: "{{ payload }}"
// processor.js
module.exports = { generateDynamicPayload };

function generateDynamicPayload(context, events, done) {
    context.vars.payload = {
        id: Math.floor(Math.random() * 10000),
        timestamp: new Date().toISOString(),
        data: Array.from({ length: 10 }, (_, i) => ({ key: `item_${i}`, value: Math.random() })),
    };
    return done();
}

Запуск и отчёты

# Базовый запуск
artillery run tests/load/basic.yml

# JSON-отчёт
artillery run --output report.json tests/load/basic.yml
artillery report report.json  # генерирует HTML

# Запуск с переменными окружения
artillery run \
    --target https://staging.example.com \
    --overrides '{"config": {"phases": [{"duration": 60, "arrivalRate": 10}]}}' \
    tests/load/basic.yml

GitHub Actions

- name: Load Test
  run: |
    artillery run --output results.json tests/load/basic.yml
    artillery report --output load-report.html results.json

- name: Check SLA
  run: |
    ERRORS=$(cat results.json | jq '.aggregate.counters["http.codes.5xx"] // 0')
    P99=$(cat results.json | jq '.aggregate.latency.p99')
    if [ "$ERRORS" -gt "10" ] || [ "$(echo "$P99 > 2000" | bc)" = "1" ]; then
      echo "Load test failed: too many errors or high latency"
      exit 1
    fi

Срок реализации

Написание 3–5 нагрузочных сценариев с Artillery: 2–3 дня.