项目要求测试UDP的性能测试,jmeter的 UDP request好像不能发送字节组,bean shell 好像也不能把byte数组存入变量。
那只能自己写java请求了。
那就开始吧。
在ecplise中新建项目,导入下图两个jmeter包。在两个包在jmeter安装路径/lib/ext/下。

新建一个类,继承AbstractJavaSamplerClient
直接上代码
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.*;
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;
public class perftest extends AbstractJavaSamplerClient {
private String a;
private String[] b;
private String now;
//项目的加解密用到
private String aes_key="O2KCeMuWTsO+KAEI8tl3IA==";
private String iv="k/GKAF24LfiVddp68ceFVA==";
/** Holds the result data (shown as Response Data in the Tree display). */
private String resultData;
// 这个方法是用来自定义java方法入参的。
// params.addArgument("num1","");表示入参名字叫num1,默认值为空。
//设置可用参数及的默认值;
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
params.addArgument("num1", "");
return params;
}
//每个线程测试前执行一次,做一些初始化工作;
public void setupTest(JavaSamplerContext arg0) {
}
//开始测试,从arg0参数可以获得参数值;
public SampleResult runTest(JavaSamplerContext arg0) {
a = arg0.getParameter("num1");
b=a.trim().split(" ");
now=Long.toHexString(Calendar.getInstance().getTimeInMillis()/1000);
SampleResult sr = new SampleResult();
for(int i=0;i<4;i++){
b[i+2]=now.substring(i*2, i*2+2);
b[i+6]="0";
}
byte[] bytes = new byte[b.length];
for(int i = 0; i <b.length; i++) {
bytes[i] = (byte) Integer.parseInt(b[i], 16);
}
try {
byte[] da=AesCBC.encByAes(bytes, aes_key, iv);
sr.sampleStart();// jmeter 开始统计响应时间标记
try (DatagramSocket socket = new DatagramSocket(0)) {
socket.setSoTimeout(10000);
InetAddress host = InetAddress.getByName("172.28.20.97");
//指定包要发送的目的地
DatagramPacket request = new DatagramPacket(da,da.length, host,5683);
//为接受的数据包创建空间
//DatagramPacket response = new DatagramPacket(new byte[1024], 1024);
socket.send(request);
//socket.receive(response);
//String result = new String(response.getData(), 0, response.getLength(), "ASCII");
//System.out.println(result);
} catch (IOException e) {
e.printStackTrace();
}
// 通过下面的操作就可以将被测方法的响应输出到Jmeter的察看结果树中的响应数据里面了。
for(byte e:da){
if(resultData==null||"".equals(resultData)){
resultData=Integer.toHexString(e & 0xff);
}else{
resultData=resultData+" "+Integer.toHexString(e & 0xff);;
}
}
if (resultData != null && resultData.length() > 0) {
sr.setResponseData("结果是:"+resultData, null);
sr.setDataType(SampleResult.TEXT);
}
// System.out.println(resultData);
sr.setSuccessful(true);
} catch (Throwable e) {
sr.setSuccessful(false);
e.printStackTrace();
} finally {
sr.sampleEnd();// jmeter 结束统计响应时间标记
}
return sr;
}
//测试结束时调用;
public void teardownTest(JavaSamplerContext arg0) {
// System.out.println(end);
// System.out.println("The cost is"+(end-start)/1000);
}
// main只是为了调试用,最后打jar包的时候注释掉。
/*
public static void main(String[] args)
{ // TODO Auto-generated method stub
Arguments params = new Arguments();
params.addArgument("num1", "1");//设置参数,并赋予默认值1
params.addArgument("num2", "2");//设置参数,并赋予默认值2
JavaSamplerContext arg0 = new JavaSamplerContext(params);
perftestbbb test = new perftestbbb();
test.setupTest(arg0);
test.runTest(arg0);
test.teardownTest(arg0);
}
*/
}然后导出jar文件,放到jmeter/lib/ext下。重启jmeter,新建java请求,填入参数化的数据num1,就可以啦。
本文介绍如何在面临项目需求进行UDP性能测试时,由于JMeter的UDP Request不支持发送字节组,以及Bean Shell无法将byte数组存入变量的问题,通过自定义Java请求来解决。首先,在Eclipse中新建项目并导入jmeter相关库,创建一个类继承AbstractJavaSamplerClient。编写代码后,将项目导出为jar文件放入jMeter的lib/ext目录,重启jMeter,新建Java请求并设置参数,即可完成UDP字节组的发送。
630

被折叠的 条评论
为什么被折叠?



