JMeterWebSocketSampler-1.0.2-SNAPSHOT.jar下載
公司使用websocket比較奇怪,需要帶認(rèn)證信息進(jìn)行長連接,通過websocket插件是請(qǐng)求失敗,如下圖,后面通過代碼實(shí)現(xiàn)隨再打包jar包完成websocket測(cè)試
本地實(shí)現(xiàn)代碼如下:
package com.fangdd.socket;
import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;
import java.net.URI;
import java.net.URISyntaxException;
import java.io.IOException;
public class SocketIOExample {
public static void main(String[] args) throws URISyntaxException, IOException {
IO.Options options = new IO.Options();
options.query="tid=wwwww1231&uid=12352547&ticket=mxLqAgCaq7R";
Socket socket = IO.socket(URI.create("http://localhost:9092"), options);
socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
@Override
public void call(Object... args) {
System.out.println("connect");
// 如果需要發(fā)消息參考此代碼 連接成功后發(fā)送具有body的自定義事件,公司暫不需要注釋此代碼
// JSONObject body = new JSONObject();
// try {
// body.put("message", "Hello, Server!");
// } catch (JSONException e) {
// e.printStackTrace();
// }
//
// // 發(fā)送事件到服務(wù)器--需要與開發(fā)確認(rèn)事件(customEvent)
// socket.emit("customEvent", body);
}
});
socket.on(Socket.EVENT_CONNECT_ERROR, new Emitter.Listener() {
@Override
public void call(Object... args) {
System.out.println("connect_error: " + args[0]);
}
});
socket.on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {
@Override
public void call(Object... args) {
System.out.println("disconnect due to: " + args[0]);
}
});
socket.connect();
// 監(jiān)聽服務(wù)器返回的自定義事件----需要與開發(fā)確認(rèn)監(jiān)聽事件(messageEvent)
socket.on("messageEvent", new Emitter.Listener() {
@Override
public void call(Object... args) {
// 處理服務(wù)器返回的數(shù)據(jù),如果是json需要數(shù)據(jù)處理
//JSONObject response = (JSONObject) args[0];
System.out.println("Server response: " + args[0].toString());
}
});
}
}
顯示如下:
?開發(fā)代碼打包到lib/ext目錄,通過Jmeter對(duì)本地方法進(jìn)行測(cè)試,具體實(shí)現(xiàn)代碼如下:
底層實(shí)現(xiàn)代碼:
import java.net.URI;
import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;
public class NomalTools {
public static void IOsocket(String url,String tid) {
IO.Options options = new IO.Options();
options.query="tid="+tid+"&uid=12352547&ticket=mxLqA";
Socket socket = IO.socket(URI.create(url), options);
socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
@Override
public void call(Object... args) {
System.out.println("connect");
}
});
socket.on(Socket.EVENT_CONNECT_ERROR, new Emitter.Listener() {
@Override
public void call(Object... args) {
System.out.println("connect_error: " + args[0]);
}
});
socket.on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {
@Override
public void call(Object... args) {
System.out.println("disconnect due to: " + args[0]);
}
});
socket.connect();
// 監(jiān)聽服務(wù)器返回的自定義事件
socket.on("messageEvent", new Emitter.Listener() {
@Override
public void call(Object... args) {
// 處理服務(wù)器返回的數(shù)據(jù)
// JSONObject response = (JSONObject) args[0];
System.out.println("Server response: " + args[0].toString());
}
});
//10秒后自動(dòng)關(guān)閉連接
// try {
// Thread.sleep(10000);
// System.out.println("10秒自動(dòng)關(guān)閉連接");
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// socket.close();
}
}
Jmeter封裝代碼:
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import Common.NomalTools;
public class socketTest extends AbstractJavaSamplerClient{
private NomalTools nomalTools;
private String url;
private String tid;
private static long start = 0;
private static long end = 0;
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
params.addArgument("url", "");
params.addArgument("tid", "");
return params;
}
//每個(gè)線程測(cè)試前執(zhí)行一次,做一些初始化工作;
public void setupTest(JavaSamplerContext arg0) {
nomalTools=new NomalTools();
url = arg0.getParameter("url");
tid = arg0.getParameter("tid");
start = System.currentTimeMillis();
}
public SampleResult runTest(JavaSamplerContext arg0) {
SampleResult sr = new SampleResult();
sr.setSamplerData("請(qǐng)求參數(shù)num1:"+url+"\n請(qǐng)求參數(shù)num2:"+tid);
try {
sr.sampleStart();// jmeter 開始統(tǒng)計(jì)響應(yīng)時(shí)間標(biāo)記
// 通過下面的操作就可以將被測(cè)方法的響應(yīng)輸出到Jmeter的察看結(jié)果樹中的響應(yīng)數(shù)據(jù)里面了。
nomalTools.IOsocket(url, tid);
// System.out.println(resultData);
sr.setSuccessful(true);
} catch (Throwable e) {
sr.setSuccessful(false);
e.printStackTrace();
} finally {
sr.sampleEnd();// jmeter 結(jié)束統(tǒng)計(jì)響應(yīng)時(shí)間標(biāo)記
}
return sr;
}
//測(cè)試結(jié)束時(shí)調(diào)用;
public void teardownTest(JavaSamplerContext arg0) {
end = System.currentTimeMillis();
// 總體耗時(shí)
System.err.println("cost time:" + (end - start) + "毫秒");
}
public static void main(String[] args) {
Arguments params = new Arguments();
params.addArgument("url", "http://localhost:9092");//設(shè)置參數(shù),并賦予默認(rèn)值1
params.addArgument("tid", "qwe123");//設(shè)置參數(shù),并賦予默認(rèn)值2
JavaSamplerContext arg0 = new JavaSamplerContext(params);
socketTest test = new socketTest();
test.setupTest(arg0);
test.runTest(arg0);
test.teardownTest(arg0);
}
}
集成到Jmeter的效果:
?
?參考文獻(xiàn):
【JMeter】Jmeter進(jìn)行webSocket接口測(cè)試_千重萌的博客-CSDN博客文章來源:http://www.zghlxwxcb.cn/news/detail-664283.html
https://github.com/socketio/socket.io-client-java/blob/main/src/test/java/io/socket/Fiddle.java文章來源地址http://www.zghlxwxcb.cn/news/detail-664283.html
到了這里,關(guān)于Jmeter對(duì)websocket進(jìn)行測(cè)試的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!