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:
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 ());
});
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' );
});
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:
setInterval
setTimeout
Close after duration
// 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.