public class TestYuan extends AbstractJavaSamplerClient { private static String label = "CBCTest"; private String ip; private String port; private String INSTYPE; private SampleResult sr; public void setupTest(JavaSamplerContext arg0) { System.out.println("setupTest"); } public SampleResult runTest(JavaSamplerContext arg0) { ip = arg0.getParameter("ip"); port = arg0.getParameter("port"); INSTYPE = arg0.getParameter("INSTYPE"); sr = new SampleResult(); sr.setSampleLabel(label); try{ sr.sampleStart(); //记录程序执行时间,以及执行结果 //发送数据 String s=getInsData(INSTYPE); System.out.println("send begin!"); sendMsg(ip,Integer.parseInt(port),s); sr.setSuccessful(true); System.out.println("send over!"); }catch(Throwable e){ sr.setSuccessful(false); }finally{ sr.sampleEnd(); } return sr; } private String getInsData(String instype2) throws Exception { String retstr; try { retstr = redInput(instype2); } catch (Exception e) { System.out.println("instype:"+instype2+" file not exist!"); throw e; } return retstr; } public void teardownTest(JavaSamplerContext arg0) { } public Arguments getDefaultParameters() { Arguments params = new Arguments(); params.addArgument("ip", "99.6.150.31"); params.addArgument("port", "8016"); params.addArgument("INSTYPE", "1"); return params; } private void sendMsg(String ip,int port,String data) throws Exception{ ClientSocket clientSocket = new ClientSocket(null, ip, port); XmlIniPlus ini = null; try { ini = clientSocket.clientConnect("DCINSFRM","10041004",data/*, tmsListener*/); } catch (Exception e) { //支付设置为可疑 电子指令设置为失败 查支付设置为可疑 System.out.println("Exception:"+e.getMessage()); throw e; } System.out.println("success return!"); } public static String redInput(String insType) throws Exception { char data[] = new char[1024]; // 建立可容纳1024个字符的数组 FileReader fr = null; try { //fr = new FileReader("c:\\DCQRYBKP.xml"); fr = new FileReader("c:\\DCINSFRM_"+insType+".xml"); } catch (Exception e) { e.printStackTrace(); throw e; } // 建立对象fr int num = 0; String str = null; try { num = fr.read(data); str = new String(data, 0, num); // 将字符列表转换成字符串 fr.close(); } catch (Exception e) { e.printStackTrace(); throw e; } return str; } }
项目用mina做socket底层通信,需要做性能测试,loadrunner太难,还是jemeter小,功能全。自己实现了jemete的TCPsampler。
大致总结如下:
1.线程组:代表一定数量的并发用户,它可以用来模拟并发用户发送请求。实际的请求内容在Sampler中定义,它被线程组包含。可以在“测试计划->添加->线程组”来建立它,然后在线程组面板里有几个输入栏:线程数、Ramp-Up Period(in seconds)、循环次数,其中Ramp-Up Period(in seconds)表示在这时间内创建完所有的线程。如有8个线程,Ramp-Up = 200秒,那么线程的启动时间间隔为200/8=25秒,这样的好处是:一开始不会对服务器有太大的负载。线程组是为模拟并发负载而设计。
2、sampler
java请求:是自己写的一个sampler
3、聚合报告
Label:取样器名称
Samples:运行过程中一共发出了多少个请求,一般来说是其值=线程数*循环次数(前提:测试按计划跑完,其中没有异常结束的线程),如5个线程,每个线程循环10次,那么对应行的Samples数是:5*10=50,总体Samples是各请求Samples之和。
Average:平均响应时间
Median:响应时间中间值
90%Line:响应时间90%线
Min:最小响应时间
Max:最大响应时间
Error%:出错率(出错的Request数/所有的request数)
Throughput:吞吐量,每秒/每分钟(具体看“/”后面的单位)处理的Request数
KB/sec:每秒从服务器端接收到的数据量,相当于LoadRunner中的Throughput/Sec
【注意】关于总体值并不是各列的累加。是以所有Samples为样本的统计值,如:总体Min=min{各个Samples的Min},总体Max=max{各个Samples的Max}