Как создать отчима в k6 для websocket

Я пытаюсь сгенерировать ступенчатую нагрузку для теста производительности на k6 для веб-сокета. обычные настройки, такие как

export let options = {
    stages: [
        {
            "duration": "0m30s",
            "target": 10
        },
        {
            "duration": "0m30s",
            "target": 10
        },
        {
            "duration": "0m30s",
            "target": 0
        }
    ],

};

на к6 не работает. Я попробовал --vus 10 --i 10, но он просто проходит сценарий 10 раз и спит до конца 10 минут.

Затем я попробовал k6 run --vus 5 --stage 3m:10,5m:10,10m:35,1m30s:0, но результат почти такой же. Как создать активную нагрузку с пошаговым шаблоном для тестирования веб-сокетов? подключаться каждый раз после завершения потока?

Тестовый поток:

import ws from "k6/ws";
import { check } from "k6";

export default function() {
  const url = "ws://URL:8000/";
  const params = { tags: { my_tag: "hello" } };

  const response = ws.connect(url, params, function(socket) {
    socket.on("open", function open() {
      console.log("connected");
      socket.send(Date.now());


   var url = "ws://URL:8000/";
   var response = ws.connect(url, null, function(socket) {
    socket.on('open', function() {
      socket.send('Hello');
      socket.send('How are you?');
    });



    socket.on("close", () => console.log("disconnected"));

    socket.on("error", (e) => {
      if (e.error() != "websocket: close sent") {
        console.log("An unexpected error occured: ", e.error());
      }
    });

  check(response, { "status is 101": r => r && r.status === 101 });
})
})
})
}

person Liliia    schedule 13.08.2020    source источник


Ответы (1)


Как указано в документации, ws.connect блокирует соединение, пока соединение не будет закрыто либо путем вызова socket.close() или сервер закрывает соединение на другом конце (или из-за ошибки при выполнении чего-то другого).

Поэтому, если вы хотите просто отправить 2 сообщения, вам следует позвонить socket.close(). Вы также можете закрыть после получения чего-либо на другой стороне, используя с помощью

socket.on("message", function(msg) {
 console.log("got: "+ msg);
 socket.close();
}

Но если вам не нужно повторно подключаться, а вместо этого вы хотите просто отправить больше сообщений, вам, вероятно, следует использовать таймер:

      socket.setInterval(function() {
        socket.send('Hello');
        socket.send('How are you?');
      }, 1500);

будет отправлять сообщения каждые 1,5 с

Я не знаю, почему вы открываете другое соединение через веб-сокет внутри другого, но это может быть ошибкой с вашей стороны и, вероятно, затруднит чтение кода, если вы не используете имя переменной, отличное от socket

person Михаил Стойков    schedule 13.08.2020
comment
Я открываю новый сокет как новое пользовательское соединение. Мне нужно эмулировать нагрузку для него. Должен ли я добавить переменную для этого случая? - person Liliia; 13.08.2020
comment
Я полагаю, вы имеете в виду внутренний веб-сокет? Вы не обязаны, но вместо того, чтобы использовать только socket, я бы рекомендовал использовать outerSocket и innerSocket, чтобы это было более понятно в сценарии. - person Михаил Стойков; 14.08.2020
comment
Как ``` const externalResponse = ws.connect(url, params, function(outerSocket) { /// делаем что-то с внешним сокетом const innerResponse = ws.connect(url, params, function(innerSocket) { // здесь вы можете использовать оба innerSocket и externalSocket и это будет понятно }) // используйте externalSocket }) ``` Вы, конечно, можете использовать какое-то другое имя, которое имеет большее значение в вашем контексте и в контексте скрипта - person Михаил Стойков; 14.08.2020
comment
Ты был прав. Я открывал сокет 2 раза. Удален 1-й и теперь работает, как и ожидалось, со стадиями. - person Liliia; 20.08.2020