t.me/atinfo_chat Telegram группа по автоматизации тестирования

Какой инструмент выбрать для нагрузочного тестирования Socket.IO

Теги: #<Tag:0x00007f7489c288a0> #<Tag:0x00007f7489c28710> #<Tag:0x00007f7489c28558>

Всем привет! Дошли наконец-то до нагрузочных тестов нашего сервера, нагружать хотим Socket.IO. Нашёл два инструмента, наверное самые популярные и распространённые.

  1. Artillery.IO
  2. Gatling

Я не знаком ни с JS, ни со Scala. Есть опыт в Java. Подскажите какой из этих инструментов лучше выбрать? Или может ещё какой вариант предложите. Спасибо.

jmeter же

Здесь пишут, что JMeter не очень хорошо тестирует сокеты

А с чего вы взяли, что там на сокетах? Из названия фрейморка?

Все 3 поддерживают работу с сокетами

Выбрал artillery.io, написал сценарий:

config:
  #target: "wss://testing2.ros.chat:8080/socket.io/?EIO=3&transport=websocket&sid=gOrWuD9oxZpMBrULAADL"
  target: "https://testing.ros.chat:8080"
  #processor: "./loginonserver.js"
  ensure:
    p95: 200
    maxErrorRate: 1
  socketio:
    transports: ["websocket"]
  phases:
    - duration: 1  # Test for 60 seconds
      arrivalRate: 1 # Every second, add 10 users
      maxVusers: 1
      #rampTo: 10 # And ramp it up to 100 users in total over the 60s period
      name: "Ramping up the load"
    #- duration: 20 # Then resume the load test for 120s
    #  arrivalRate: 1 # With those 100 users we ramped up to in the first phase
    #  maxVusers: 1
    #  rampTo: 1 # And keep it steady at 100 users
    #  name: "Pushing a constant load"
  ws:
      # Ignore SSL certificate errors
      # - useful in *development* with self-signed certs
      rejectUnauthorized: false
  payload:
    path: "./users0.csv"
    fields:
      - "login"
      - "password"
      - "level"
    skipHeader: true
    order: sequence
scenarios:
  - name: "Scenario login user and get user params"
    engine: socketio
    flow:
      - log: "Login users {{ login }} on server"
      - emit:
          channel: "login"
          data: {"login":"{{ login }}","password":"{{ password }}","APILevel":"{{ level }}"}
          acknowledge:
            match:
              json: "$.0.status"
              value: "ok"
      - emit:
          channel: "get-user-params"
          data: null
          acknowledge:
            match:
              json: "$.0.httpServer"
              value: "testing.ros.chat:80"
      - think: 2
      - emit:
          channel: "logout"

Запускаю тест

sudo artillery run getUserParams.yml --output result.json

В результате получаю всегда ошибку

Started phase 0 (Ramping up the load), duration: 1s @ 12:37:05(+0300) 2020-08-17
    Login users 9000 on server
Report @ 12:37:09(+0300) 2020-08-17
Elapsed time: 4 seconds
  Scenarios launched:  1
  Scenarios completed: 1
  Requests completed:  3
  Mean response/sec: 0.86
  Response time (msec):
    min: 0.7
    max: 1420.6
    median: 2.6
    p95: 1420.6
    p99: 1420.6
  Codes:
    0: 3

All virtual users finished
Summary report @ 12:37:09(+0300) 2020-08-17
  Scenarios launched:  1
  Scenarios completed: 1
  Requests completed:  3
  Mean response/sec: 0.85
  Response time (msec):
    min: 0.7
    max: 1420.6
    median: 2.6
    p95: 1420.6
    p99: 1420.6
  Scenario counts:
    Scenario login user and get user params: 1 (100%)
  Codes:
    0: 3

Log file: result.json
ensure condition failed: ensure.p95 < 200

Ставил разные значение p95 (0,10,100), но результат всегда один и тот же. Подскажите, в чём может быть проблема?

Разобрался)

ensure:
    maxErrorRate: 1
    p95: 1450