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