JMeter压力测试总结

论坛 期权论坛 脚本     
匿名网站用户   2020-12-21 04:41   11   0

ApacheJMeterApache组织开发的基于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设为3000RampUpPeriod设为300,则jmeter每隔0.1秒启动1个线程。

循环次数:单用户任务重复执行的次数。可以设为永远,这样jmeter就不会自动停止,需要强制终止。

线程组->添加->sampler->Java请求


把我们基于Jmeter 的JAVA请求选中,ShootRequest,向鱼群发射炮弹的业务逻辑.

其中界面上的参数为程序中指定的,比如服务器IP端口之类的。

4.实现Java Request

建立JAVA工程,引入库ApacheJMeter_core.jar,ApacheJMeter_java.jar,实现个抽象类,AbstractJmeterClient,所有的请求必须在玩家登陆的前提下,所以登陆逻辑放到了公共的抽象类:

  1. packagecom.u9.jrobot;
  2. publicabstractclassAbstractJmeterClientextendsAbstractJavaSamplerClient{
  3. privatestaticfinalLoggerlogger=LogManager
  4. .getLogger(AbstractJmeterClient.class);
  5. privateStringtableIp="172.16.1.37";
  6. privateintport=1470;
  7. privatePlayerplayer;
  8. privateStringlobbyIp="172.16.1.34";
  9. privateSampleResultresult;
  10. protectedstaticintrobotId=0;
  11. //privateStringpath;
  12. //private
  13. //设置传入的参数,可以设置多个,已设置的参数会显示到Jmeter的参数列表中
  14. publicArgumentsgetDefaultParameters(){
  15. Argumentsargs=newArguments();
  16. args.addArgument("lobbyIp",lobbyIp);
  17. args.addArgument("tableIp",tableIp);
  18. args.addArgument("port",""+port);
  19. args.addArgument("startId",""+robotId);
  20. returnargs;
  21. }
  22. //初始化方法,实际运行时每个线程仅执行一次,在测试方法运行前执行
  23. publicvoidsetupTest(JavaSamplerContextcontext){
  24. //加载当前目录下的logback配置文件
  25. result=newSampleResult();
  26. result.sampleStart();//事务的起点
  27. tableIp=context.getParameter("tableIp");
  28. port=context.getIntParameter("port");
  29. lobbyIp=context.getParameter("lobbyIp");
  30. if(robotId==0){
  31. robotId=context.getIntParameter("startId");
  32. }
  33. Stringname="robot"+robotId++;
  34. Map<String,Object>map=HttpManager.getInstance().login(lobbyIp,
  35. name,"qqqqqq");
  36. intretcode=(Integer)map.get("s");
  37. if(retcode==1){
  38. //玩家登陆游戏的逻辑
  39. }
  40. //JobManager.getInstance().start();
  41. }
  42. @Override
  43. //测试执行的循环体,根据线程数和循环次数的不同可执行多次
  44. publicSampleResultrunTest(JavaSamplerContextarg){
  45. booleansuccess=true;
  46. //result.sampleStart();//事务的起点
  47. try{
  48. result.setSuccessful(this.runTest(player));
  49. }catch(Exceptione){
  50. success=false;
  51. }finally{
  52. //result.sampleEnd();//事务的终点
  53. result.setSuccessful(success);//设置本次事务成功或失败
  54. }
  55. returnresult;
  56. }
  57. publicabstractbooleanrunTest(Playerplayer)throwsException;
  58. //结束方法,实际运行时每个线程仅执行一次,在测试方法运行结束后执行
  59. publicvoidteardownTest(JavaSamplerContextcontext){
  60. result.sampleEnd();//事务的终点
  61. robotId=context.getIntParameter("startId");
  62. GameClientgameClient=player.getGameClient();
  63. try{
  64. PlayerManager.getInstance().remove(gameClient.getChannelId());
  65. gameClient.disconnect();
  66. }catch(ServiceExceptione){
  67. }
  68. }
  69. }

实现具体的压力测试类:

  1. publicclassShootRequestextendsAbstractJmeterClient{
  2. privatestaticfinalLoggerlogger=LogManager
  3. .getLogger(ShootRequest.class);
  4. privateint[]array={1,5,10,20,30,40,50,100};
  5. privatestaticinttoken=0;
  6. @Override
  7. publicbooleanrunTest(Playerplayer)throwsException{
  8. //KeepAlive_S2C_Msgret=client.keepAlive(msg.build());
  9. <spanstyle="white-space:pre"></span>//具体射击逻辑实现
  10. returntrue;
  11. }
  12. }

用ant打包成jrobot.jar,不要设主类,jrobot.jar和lib文件放到\apache-jmeter-2.9\lib\ext\下,然后启动,选择相应的压力测试类,设置参数,启动JMeter

5.添加Listener

//TODO

ps:每个玩家都要单独启动个线程,如果3000玩家就要启动3000个线程组,感觉这设计有点郁闷,程序的很多消耗都在切换线程了。是不是我理解或者用错了?

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP