Jmeter自定义编写Java代码调用socket通信
一、前言
最近需要测试一款手机游戏的性能,找不到啥录制脚本的工具,然后,另外想办法。性能测试实际上就是对服务器的承载能力的测试,和各种类型的手机客户端没有啥多大关系,手机再好,服务器负载不了,也不能够运行,依照这个思路,测试该手游的性能就化为对服务器的性能测试,也就是服务器和手机客户端所联系的接口的测试。
如果是可以用HTTP调用的,那样很好解决,直接带上地址参数就OK,开始一两个很顺利,设计参数化了一下数据就很顺利的解决,然后,遇到了一个切换场景的接口,用的是socket通信,再用上述方法貌似不可行,然后偶很懒,所以折腾了一天,结果,还是没有找到好的办法,无奈,想到了Jmeter可以调用java请求,只好到开发那边拿到协议,通过自定义编写java代码来实现socket通信,连接成功,返回数据成功。顺便说一句,Jmeter真是居家旅行必备~~~~
首先,Jmeter使用自定义编写代码的步骤:http://www.cnblogs.com/linglingyuese/articles/linglingyuese-two.html
二、代码
SocketClient.java类
package app; import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.Socket; public class SocketClient { public boolean sendMessage(String ipAddress,int port,String data){ try { Socket socket=new Socket(ipAddress,port); DataInputStream input=new DataInputStream(socket.getInputStream()); DataOutputStream output = new DataOutputStream(socket.getOutputStream()); byte[] message=data.getBytes("UTF-8"); //获得长度 int length=message.length; message[0] = (byte) 0x00; message[length-1] = (byte) 0xff; output.write(message); output.flush(); System.out.println(message); Thread.sleep(1000); if (!socket.isClosed() && socket.isConnected()) { byte[] cbuf=new byte[8096]; input.read(cbuf); System.out.println("读取到的是:"+cbuf); String responseLine=new String(cbuf); System.out.println(responseLine+"==========="); } output.close(); input.close(); socket.close(); return true; } catch (Exception e) { return false; } } }
TestScence.java类
package app; 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 TestScence extends AbstractJavaSamplerClient { private SampleResult results; private String ipAddress; private String port; private String data; /** * 初始化方法 */ public void setupTest(JavaSamplerContext jsc) { results = new SampleResult(); ipAddress = jsc.getParameter("ipAddress", ""); port = jsc.getParameter("port", ""); data = jsc.getParameter("data", ""); if (ipAddress != null && ipAddress.length() > 0){ results.setSamplerData(ipAddress); } if (port != null && port.length() > 0){ results.setSamplerData(port); } if (data != null && data.length() > 0){ results.setSamplerData(data); } } /** * 设置传入参数 */ public Arguments getDefaultParameters() { Arguments params = new Arguments(); params.addArgument("ipAddress", ""); params.addArgument("port", ""); params.addArgument("data", ""); return params; } /** * 线程运行体 */ public SampleResult runTest(JavaSamplerContext arg0) { SocketClient sc = new SocketClient(); int port2 = 50001; if (port != null && port.length() > 0){ port2 = Integer.parseInt(port); } results.sampleStart(); boolean flag = sc.sendMessage(ipAddress, port2, data); results.sampleEnd(); if (flag){ results.setSuccessful(true); }else{ results.setSuccessful(false); } return results; } /** * 结束方法 */ public void teardownTest(JavaSamplerContext arg0) { } }
三、导出为可以使Jmeter读取的jar包
在项目的根节点,右击选择【Export】,选择java下面的【JAR file】
然后一直点击下一步即可。
将导出的jar包放到如下目录:\apache-jmeter-2.9\lib\ext,然后重新启动Jmeter啊,新建java请求,就可以看到你刚刚写的java类啦,填写上相关的参数就可以啦。
测试不到一年,对性能啥的理解还不是太深,各位大神不要较真~~~~