Skip to main content

Basic WebSocket Test

k6 provides a dedicated k6/ws module for WebSocket testing:
import ws from "k6/ws";
import { check } from "k6";

export default function () {
    var url = "ws://echo.websocket.org";
    var params = { "tags": { "my_tag": "hello" } };

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

            socket.setInterval(function timeout() {
                socket.ping();
                console.log("Pinging every 1sec (setInterval test)");
            }, 1000);
        });

        socket.on('ping', function () {
            console.log("PING!");
        });

        socket.on('pong', function () {
            console.log("PONG!");
        });

        socket.on('pong', function () {
            // Multiple event handlers on the same event
            console.log("OTHER PONG!");
        });

        socket.on('message', function incoming(data) {
            console.log(`Roundtrip time: ${Date.now() - data} ms`);
            socket.setTimeout(function timeout() {
                socket.send(Date.now());
            }, 500);
        });

        socket.on('close', function close() {
            console.log('disconnected');
        });

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

        socket.setTimeout(function () {
            console.log('2 seconds passed, closing the socket');
            socket.close();
        }, 2000);
    });

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

WebSocket Event Handlers

The WebSocket socket supports several event handlers:
1

Connection events

Handle connection lifecycle:
socket.on('open', function() {
    console.log('WebSocket connection established');
    socket.send('Hello Server!');
});

socket.on('close', function() {
    console.log('WebSocket connection closed');
});

socket.on('error', function(e) {
    console.log('WebSocket error:', e.error());
});
2

Message events

Handle incoming messages:
socket.on('message', function(data) {
    console.log('Received message:', data);
    // Process the message and optionally send a response
    socket.send('Acknowledged');
});
3

Ping/Pong events

Handle WebSocket ping/pong frames:
socket.on('ping', function() {
    console.log('Received ping from server');
});

socket.on('pong', function() {
    console.log('Received pong from server');
});

Timing Functions

k6 WebSockets support timing functions to control message flow:
// Send periodic messages
socket.setInterval(function() {
    socket.ping();
    console.log('Sending periodic ping');
}, 1000); // Every 1 second

Measuring Latency

Measure round-trip time for WebSocket messages:
import ws from "k6/ws";
import { check } from "k6";

export default function() {
    let url = "ws://echo.websocket.org";
    
    ws.connect(url, function(socket) {
        socket.on('open', function() {
            // Send timestamp
            socket.send(Date.now().toString());
        });
        
        socket.on('message', function(data) {
            // Calculate roundtrip time
            let latency = Date.now() - parseInt(data);
            console.log(`Roundtrip time: ${latency} ms`);
            
            // Send next message after delay
            socket.setTimeout(function() {
                socket.send(Date.now().toString());
            }, 500);
        });
        
        socket.setTimeout(function() {
            socket.close();
        }, 10000);
    });
}
WebSocket connections remain open during the test iteration, making them ideal for testing real-time applications.

Build docs developers (and LLMs) love