How to stop k6 websocket test

import http from 'k6/http';
import { check, sleep } from 'k6';
import ws from 'k6/ws';
import { MessageEncoderDecoder } from './messageEncoderDecoder.js';
import { WebSocket } from 'k6/experimental/websockets';


export const options = {
    vus: 1,  // 只使用一个虚拟用户
    iterations: 1,  // 只迭代一次
    duration: '10s',
};

let usernames = JSON.parse(open('./test.json'));
let user = null
let base_url = "http://192.168.0.127:5000/";
let auction_data_socket_url = "ws://192.168.0.125:8023/data-service/ws?token={token}&viewType={viewType}&pid={pid}&env={env}";
let bid_ws
let ds_ws
let env = "AUTOMATIC"
let ds_ping_cout = 0
let bid_ping_cout = 0
let max_ping_cout = 5
String.prototype.formatUnicorn = String.prototype.formatUnicorn ||
    function () {
        "use strict";
        var str = this.toString();
        if (arguments.length) {
            var t = typeof arguments[0];
            var key;
            var args = ("string" === t || "number" === t) ?
                Array.prototype.slice.call(arguments)
                : arguments[0];

            for (key in args) {
                str = str.replace(new RegExp("\\{" + key + "\\}", "gi"), args[key]);
            }
        }

        return str;
    };

function login(user) {
    let payload = JSON.stringify({
        Username: user.username,
        Password: user.password,
        VeryCode: '',
        Guid: '',
    });
    let params = {
        headers: {
            'Content-Type': 'application/json',
        },
    };
    let res = http.post(base_url + 'PortalAuth/Login', payload, params);
    let token = JSON.parse(res.body).data.token;
    console.log(`user: ${user.username} login success` + token);
    return token;
}


async function connection_bid_ws(url) {
    let ws = new WebSocket(url);
    ws.binaryType = "arraybuffer";
    bid_ws = ws
    ws.onopen = () => {
        ws.send(MessageEncoderDecoder.encodeJsonMessage('getClockStatus', 1));
        ws.send(MessageEncoderDecoder.encodeJsonMessage('getClockStatus', 2));
        console.log(`连接竞价服务 => ${user.username}`);
    };
    ws.onclose = () => {
        console.log(`竞价服务连接关闭 => ${user.username}` + url);
    }

    ws.onmessage = (message) => {

        let decodedJsonMessage = MessageEncoderDecoder.decodeMessageFromString(message.data);
        let messageContent = decodedJsonMessage.messageContent;
        if (decodedJsonMessage.command === '6' && decodedJsonMessage.messageContent === 2) {
            ws.send(MessageEncoderDecoder.encodeMessage(6, 1));
            bid_ping_cout++
            console.log(`BID PING <<  ${user.username}`);
            if (bid_ping_cout > max_ping_cout && ds_ping_cout > max_ping_cout) {
                console.log('All WebSocket connections closed. Ending test.');
                ws.close();
            }
        }
        if (decodedJsonMessage.command === 'networkLatencyRequest') {
            ws.send(MessageEncoderDecoder.encodeJsonMessage('networkLatency', messageContent));
        }
        console.log(`BID REV <<  ${decodedJsonMessage.command}`);
    };

}



async function connection_ds_websocket(token) {
    let url = auction_data_socket_url.formatUnicorn({ token: token, viewType: 1, pid: 1, env: env });

    let ws = new WebSocket(url);
    ds_ws = ws
    ws.binaryType = "arraybuffer";

    ws.onopen = () => {
        console.log(`连接数据服务 => ${user.username}` + url);
    };
    ws.onclose = () => {
        console.log(`数据服务连接关闭 => ${user.username}` + url);
    }
    ws.onmessage = async (message) => {
        let decodedJsonMessage = MessageEncoderDecoder.decodeMessageFromString(message.data);
        let messageContent = decodedJsonMessage.messageContent;

        if (decodedJsonMessage.command === '6' && decodedJsonMessage.messageContent === 2) {
            ws.send(MessageEncoderDecoder.encodeMessage(6, 1));
            console.log(`DS PING <<  ${user.username}`);
            ds_ping_cout++
            if (ds_ping_cout > max_ping_cout) {
                ws.close()
            }
        }
        if (decodedJsonMessage.command === 'DataServerInitializationCompleted') {
            console.log(`DS INIT <<  ${messageContent}`);
            // 获取 bid_ws 的 URL,并启动 connection_bid_ws
            const bidWsUrl = messageContent; // 假设 `messageContent` 中包含 `bidWsUrl`
            await connection_bid_ws(bidWsUrl)
            ws.send(MessageEncoderDecoder.encodeJsonMessage('clientClockLoadDone', 1));
            ws.send(MessageEncoderDecoder.encodeJsonMessage('clientClockLoadDone', 2));
            ws.send(MessageEncoderDecoder.encodeJsonMessage('getCurrentLot', '1'));
            ws.send(MessageEncoderDecoder.encodeJsonMessage('getCurrentLot', '2'));
            // 模拟获取批次
            ws.send(MessageEncoderDecoder.encodeJsonMessage('clientRequestSupplyData', 1));
            ws.send(MessageEncoderDecoder.encodeJsonMessage('clientRequestSupplyData', 2));
            // 获取成交记录
            ws.send(MessageEncoderDecoder.encodeJsonMessage('ClientRequestTransaction', 1));
            ws.send(MessageEncoderDecoder.encodeJsonMessage('ClientRequestTransaction', 2));
        }
        console.log(`DS REV <<  ${decodedJsonMessage.command}`);
    }

}

export default async function () {
    user = usernames[__VU % usernames.length];

    let token = login(user);
    await connection_ds_websocket(token);
    sleep(1);  // 等待1秒

}

output:
running (26.9s), 0/1 VUs, 1 complete and 0 interrupted iterations
default ✓ [ 100% ] 1 VUs 26.9s/10s 1/1 shared iters

running (26.9s), 0/1 VUs, 1 complete and 0 interrupted iterations
default ✓ [ 100% ] 1 VUs 26.9s/10s 1/1 shared iters

running (26.9s), 0/1 VUs, 1 complete and 0 interrupted iterations
default ✓ [ 100% ] 1 VUs 26.9s/10s 1/1 shared iters
test never stop. when all websocket close keep out. I can only kill the thread
running (26.9s), 0/1 VUs, 1 complete and 0 interrupted iterations
default ✓ [ 100% ] 1 VUs 26.9s/10s 1/1 shared iters

Hi @chaojie149

Welcome to the community forums!

To close websocket connection you have to use WebSocket.close([code]) | Grafana k6 documentation, but from what I see your script has it.

Do you say that it doesn’t work? Can you confirm that conditions under what the close should be perfom are met?

@olegbespalov
thank you reply
I already know the problem. I turned on the dashboard report in the Windows system environment variables. When I turned it off, the test could end normally.
In fact, when the test keeps outputting

running (26.9s), 0/1 VUs, 1 complete and 0 interrupted iterations

default ✓ [ 100% ] 1 VUs 26.9s/10s 1/1 shared iters

, ctrl + c can end it.
sorry bad english Please forgive me

No worries, glad that it sorted!