|
ApacheJMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,相比其他HTTP测试工具,JMeter最主要的特点在于扩展性强。JMeter能够自动扫描其lib/ext子目录下.jar文件中的插件,并且将其装载到内存,让用户通过不同的菜单调用。并且能自动生成压力测试报告。
1. 下载JMeter
http://jmeter.apache.org/download_jmeter.cgi
我用的是JMeter 2.9 r1437961,JDK 7u40
2.启动JMeter
运行bin/jmeter.bat
3.添加线程组
测试计划->添加->Threads(users)->线程组

线程数:要模拟的并发用户量。
RampUpPeriod(inseconds):在多长时间内均匀启动所有的线程。比如NumberofThreads设为3000,RampUpPeriod设为300,则jmeter每隔0.1秒启动1个线程。
循环次数:单用户任务重复执行的次数。可以设为永远,这样jmeter就不会自动停止,需要强制终止。
线程组->添加->sampler->Java请求

把我们基于Jmeter 的JAVA请求选中,ShootRequest,向鱼群发射炮弹的业务逻辑.
其中界面上的参数为程序中指定的,比如服务器IP端口之类的。
4.实现Java Request
建立JAVA工程,引入库ApacheJMeter_core.jar,ApacheJMeter_java.jar,实现个抽象类,AbstractJmeterClient,所有的请求必须在玩家登陆的前提下,所以登陆逻辑放到了公共的抽象类:
-
packagecom.u9.jrobot;
-
publicabstractclassAbstractJmeterClientextendsAbstractJavaSamplerClient{
-
privatestaticfinalLoggerlogger=LogManager
-
.getLogger(AbstractJmeterClient.class);
-
privateStringtableIp="172.16.1.37";
-
privateintport=1470;
-
privatePlayerplayer;
-
privateStringlobbyIp="172.16.1.34";
-
privateSampleResultresult;
-
protectedstaticintrobotId=0;
-
-
-
-
-
publicArgumentsgetDefaultParameters(){
-
Argumentsargs=newArguments();
-
args.addArgument("lobbyIp",lobbyIp);
-
args.addArgument("tableIp",tableIp);
-
args.addArgument("port",""+port);
-
args.addArgument("startId",""+robotId);
-
returnargs;
-
}
-
-
-
publicvoidsetupTest(JavaSamplerContextcontext){
-
-
result=newSampleResult();
-
result.sampleStart();
-
tableIp=context.getParameter("tableIp");
-
port=context.getIntParameter("port");
-
lobbyIp=context.getParameter("lobbyIp");
-
-
if(robotId==0){
-
robotId=context.getIntParameter("startId");
-
}
-
Stringname="robot"+robotId++;
-
Map<String,Object>map=HttpManager.getInstance().login(lobbyIp,
-
name,"qqqqqq");
-
intretcode=(Integer)map.get("s");
-
if(retcode==1){
-
-
}
-
-
}
-
-
@Override
-
-
publicSampleResultrunTest(JavaSamplerContextarg){
-
booleansuccess=true;
-
-
try{
-
result.setSuccessful(this.runTest(player));
-
}catch(Exceptione){
-
success=false;
-
}finally{
-
-
result.setSuccessful(success);
-
}
-
returnresult;
-
}
-
-
publicabstractbooleanrunTest(Playerplayer)throwsException;
-
-
-
publicvoidteardownTest(JavaSamplerContextcontext){
-
result.sampleEnd();
-
robotId=context.getIntParameter("startId");
-
GameClientgameClient=player.getGameClient();
-
try{
-
PlayerManager.getInstance().remove(gameClient.getChannelId());
-
gameClient.disconnect();
-
}catch(ServiceExceptione){
-
}
-
}
-
}
实现具体的压力测试类:
-
publicclassShootRequestextendsAbstractJmeterClient{
-
-
privatestaticfinalLoggerlogger=LogManager
-
.getLogger(ShootRequest.class);
-
privateint[]array={1,5,10,20,30,40,50,100};
-
privatestaticinttoken=0;
-
-
@Override
-
publicbooleanrunTest(Playerplayer)throwsException{
-
-
-
<spanstyle="white-space:pre"></span>
-
returntrue;
-
}
-
}
用ant打包成jrobot.jar,不要设主类,jrobot.jar和lib文件放到\apache-jmeter-2.9\lib\ext\下,然后启动,选择相应的压力测试类,设置参数,启动JMeter
5.添加Listener
//TODO
ps:每个玩家都要单独启动个线程,如果3000玩家就要启动3000个线程组,感觉这设计有点郁闷,程序的很多消耗都在切换线程了。是不是我理解或者用错了?
版权声明:本文为博主原创文章,未经博主允许不得转载。
|