JMeter压力测试总结

来源:互联网 发布:英文视频软件 编辑:程序博客网 时间:2024/05/21 17:53

Apache JMeterApache组织开发的基于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)->线程组


线程数:要模拟的并发用户量。

Ramp Up Period (in seconds):在多长时间内均匀启动所有的线程。比如Number of Threads设为3000Ramp Up Period设为300,则jmeter每隔0.1秒启动1个线程。

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

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


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

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

4.实现Java Request

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

  1. package com.u9.jrobot;  
  2. public abstract class AbstractJmeterClient extends AbstractJavaSamplerClient {  
  3.     private static final Logger logger = LogManager  
  4.             .getLogger(AbstractJmeterClient.class);  
  5.     private String tableIp = "172.16.1.37";  
  6.     private int port = 1470;  
  7.     private Player player;  
  8.     private String lobbyIp="172.16.1.34";  
  9.     private SampleResult result;  
  10.     protected static int robotId = 0;  
  11.   
  12.     // private String path;  
  13.     // private  
  14.     // 设置传入的参数,可以设置多个,已设置的参数会显示到Jmeter的参数列表中  
  15.     public Arguments getDefaultParameters() {  
  16.         Arguments args = new Arguments();  
  17.         args.addArgument("lobbyIp", lobbyIp);  
  18.         args.addArgument("tableIp", tableIp);  
  19.         args.addArgument("port""" + port);  
  20.         args.addArgument("startId""" + robotId);  
  21.         return args;  
  22.     }  
  23.   
  24.     // 初始化方法,实际运行时每个线程仅执行一次,在测试方法运行前执行  
  25.     public void setupTest(JavaSamplerContext context) {  
  26.         // 加载当前目录下的logback配置文件  
  27.         result = new SampleResult();  
  28.         result.sampleStart(); // 事务的起点  
  29.         tableIp = context.getParameter("tableIp");  
  30.         port = context.getIntParameter("port");  
  31.         lobbyIp = context.getParameter("lobbyIp");  
  32.   
  33.         if (robotId == 0) {  
  34.             robotId = context.getIntParameter("startId");  
  35.         }  
  36.         String name = "robot" + robotId++;  
  37.         Map<String, Object> map = HttpManager.getInstance().login(lobbyIp,  
  38.                 name, "qqqqqq");  
  39.         int retcode = (Integer) map.get("s");  
  40.         if (retcode == 1) {  
  41.     //玩家登陆游戏的逻辑  
  42.         }  
  43.     //  JobManager.getInstance().start();  
  44.     }  
  45.   
  46.     @Override  
  47.     // 测试执行的循环体,根据线程数和循环次数的不同可执行多次  
  48.     public SampleResult runTest(JavaSamplerContext arg) {  
  49.         boolean success = true;  
  50.         // result.sampleStart(); // 事务的起点  
  51.         try {  
  52.             result.setSuccessful(this.runTest(player));  
  53.         } catch (Exception e) {  
  54.             success = false;  
  55.         } finally {  
  56.             // result.sampleEnd(); // 事务的终点  
  57.             result.setSuccessful(success); // 设置本次事务成功或失败  
  58.         }  
  59.         return result;  
  60.     }  
  61.   
  62.     public abstract boolean runTest(Player player) throws Exception;  
  63.   
  64.     // 结束方法,实际运行时每个线程仅执行一次,在测试方法运行结束后执行  
  65.     public void teardownTest(JavaSamplerContext context) {  
  66.         result.sampleEnd(); // 事务的终点  
  67.         robotId = context.getIntParameter("startId");  
  68.         GameClient gameClient = player.getGameClient();  
  69.         try {  
  70.             PlayerManager.getInstance().remove(gameClient.getChannelId());  
  71.             gameClient.disconnect();  
  72.         } catch (ServiceException e) {  
  73.         }  
  74.     }  
  75. }  

实现具体的压力测试类:

  1. public class ShootRequest extends AbstractJmeterClient {  
  2.   
  3.     private static final Logger logger = LogManager  
  4.             .getLogger(ShootRequest.class);  
  5.     private int[] array = { 151020304050100 };  
  6.     private static int token = 0;  
  7.   
  8.     @Override  
  9.     public boolean runTest(Player player) throws Exception {  
  10.   
  11.         // KeepAlive_S2C_Msg ret=client.keepAlive(msg.build());  
  12. <span style="white-space:pre">      </span>//具体射击逻辑实现  
  13.         return true;  
  14.     }  
  15. }  

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

5.添加Listener

//TODO

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

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

0 0