Testing WebSockets

Enabling the WebSocket engine

Set the "engine" attribute of a scenario definition to "ws" to use WebSockets (the default engine is HTTP).

WebSocket-specific configuration

Setting Subprotocols

WebSocket subprotocols may be configured with config.ws.subprotocols option:

  config:
    target: "wss://my.websocket.service"
    phases:
      - duration: 20
        arrivalRate: 10
    ws:
      # Set a custom subprotocol:
      subprotocols:
        - json
        - soap
  scenarios:
    - engine: "ws"
      flow:
        - send: "hello"
        - think: 1
        - send: "world"

Specifying Headers

Connection headers may be specified via config.ws object. For example, to set a custom subprotocol via the Sec-WebSocket-Protocol header:

  config:
    target: "wss://echo.websocket.org"
    phases:
      - duration: 20
        arrivalRate: 10
    ws:
      # Set a custom subprotocol:
      headers:
        Sec-WebSocket-Protocol: my-protocol
  scenarios:
    - engine: "ws"
      flow:
        - send: "hello"
        - think: 1
        - send: "world"

Other configuration options

The underlying WebSocket client can be configured with a "ws" section in the "config" section of your test script. For a list of available options, please see WS library docs.

WebSocket Actions

Four types of actions are supported: send, think, loop, and function.

Sending data with send

Use send to send data to the server:

If the argument is an object, it will be converted to a string with JSON.stringify before being sent.

- send: "a string"
# the following will be stringified and sent as '{"x":5,"y":6}'
- send:
    x: 5
    y: 6

Pausing execution with think

To pause the virtual user for N seconds, use a think action:

- send: "hello"
- think: 5 # pause for 5 seconds
- send: "world"

Repeating actions with loop

See HTTP Reference for a detailed description of the loop action.

Running custom code with function

Custom JS code may be run with the function action:

config:
  target: "wss:/my.server"
  processor: "./my-functions.js"
scenarios:
  - engine: ws
    flow:
      - function: "createTimestampedObject"
      - send: "{{ data }}"
// my-functions.js

module.exports = { createTimestampedObject };

function createTimestampedObject(userContext, events, done) {
  const data = { timestamp: Date.now(), hello: "world" };
  // set the "data" variable for the virtual user to use in the subsequent action
  userContext.vars.data = data;
  return done();
}

Example

  config:
    target: "wss://echo.websocket.org"
    phases:
      - duration: 20
        arrivalRate: 10
    ws:
      # Ignore SSL certificate errors
      # - useful in *development* with self-signed certs
      rejectUnauthorized: false
  scenarios:
    - engine: "ws"
      flow:
        - send: "hello"
        - think: 1
        - send: "world"