1.JMeter介绍

JMeter是Apache组织的开放源代码项目,它是功能和性能测试的工具,100%的用java实现。JMeter可以用于测试静态或者动态资源的性能(文件、Servlets、Perl脚本、java对象、数据库和查询、ftp服务器或者其他的资源)。JMeter用于模拟在服务器、网络或者其他对象上附加高负载以测试他们提供服务的受压能力,或者分析他们提供的服务在不同负载条件下的总性能情况。

2.启动JMeter

进入JMeter的bin目录,然后执行:

1 sudo ./jmeter.sh

3.原始的测试方法

在没有使用JMeter前,我对hetty的性能测试,都是通过自己写多线程代码去完成的,相当苦逼,相当麻烦,不过也能锻炼自己的编码能力,我先贴出比较原始的测试方法,如下:

01 public class RpcHessianClient {
02      
03         public static void main(String[] args) {
04      
05                 String url = "http://localhost:8081/apis/hello";
06      
07                 HessianProxyFactory factory = new HessianProxyFactory();
08      
09                 ExecutorService es = Executors.newFixedThreadPool(10);
10      
11                 int size = 1000000;
12      
13                 final CountDownLatch cdl = new CountDownLatch(size);
14      
15                 try {
16      
17                         long start = System.currentTimeMillis();
18      
19                         factory.setUser("client1");
20      
21                         factory.setPassword("client1");
22      
23                         factory.setOverloadEnabled(true);
24      
25                         final Hello basic = (Hello) factory.create(Hello.class,
26  
27                                         url);
28      
29                         for (int i = 0; i < size; i++) {
30  
31                                 es.submit(new Runnable() {
32      
33                                         @Override
34  
35                                         public void run() {
36  
37                                                 String u=basic.hello("guolei");
38      
39                                                 //System.out.println(u);
40      
41                                                 cdl.countDown();
42      
43                                         }
44      
45                                 });
46  
47                         }
48                         cdl.await();
49                         long time = System.currentTimeMillis() - start;
50  
51                         System.out.println("SayHello:");
52  
53                         System.out.println("耗时:" + (double) time / 1000 " s");
54      
55                         System.out.println("平均:" + ((double) time) / size +" ms");
56  
57                         System.out.println("TPS:" + (double) size / ((double) time / 1000));
58      
59                         // System.out.println("Hello, " + s.getMail());
60  
61                 catch (MalformedURLException e) {
62      
63                         e.printStackTrace();
64      
65                 catch (InterruptedException e) {
66  
67                         e.printStackTrace();
68      
69                 }finally{
70  
71                         es.shutdown();
72                 }
73         }
74 }

4.使用JMeter来进行现代化测试

我们要使用JMeter来测试hetty,由于hetty是一款基于hessian和netty的RPC产品,我们必须使用JMeter的JAVA请求功能来进行测试,Java请求是指JMeter对Java Class进行性能测试。首先我们需要编写测试用例:

1)新建JAVA工程。

2)引入ApacheJMeter_java.jar 、ApacheJMeter_core.jar以及测试所需要的jar(jar包在JMeter目录的lib/ext目录中)。

3)继承AbstractJavaSamplerClient类开始编写主业务。如下:

01 public class HettyTest extends AbstractJavaSamplerClient {
02  
03     private static String label = "hettyTest";
04  
05     /**
06      * 执行runTest()方法前会调用此方法,可放一些初始化代码
07      */
08     public void setupTest(JavaSamplerContext arg0) {
09     }
10  
11     /**
12      * JMeter测试用例入口
13      */
14     public SampleResult runTest(JavaSamplerContext arg0) {
15         SampleResult sr = new SampleResult();
16         sr.setSampleLabel(label);
17         try // 这里调用我们要测试的java类,这里我调用的是一个Test类
18             Map<String,String> map = getDefaultParameters().getArgumentsAsMap();
19             sr.sampleStart(); // 记录程序执行时间,以及执行结果
20             Test.execute(map.get("ip"),map.get("port"));
21             sr.sampleEnd();
22             sr.setSuccessful(true);
23         catch (Throwable e) {
24             sr.setSamplerData(e.getMessage());
25             e.printStackTrace();
26             sr.setSuccessful(false); // 用于设置运行结果的成功或失败,如果是"false"则表示结果失败,否则则表示成功
27         }
28         return sr;
29     }
30  
31     /**
32      * JMeter界面中可手工输入参数,代码里面通过此方法获取
33      */
34     public Arguments getDefaultParameters() {
35  
36         Arguments args = new Arguments();
37         args.addArgument("ip""localhost");
38         args.addArgument("port""8081");
39         return args;
40     }
41  
42     /**
43      * 执行runTest()方法后会调用此方法.
44      */
45     public void teardownTest(JavaSamplerContext arg0) {
46     }
47  
48 }
Test类是我测试逻辑,如下:
01 public class Test {
02  
03     public static void execute(String ip,String port) throws MalformedURLException {
04          
05          
06         String url = "http://"+ip+":"+port+"/apis/hello";
07  
08         HessianProxyFactory factory = new HessianProxyFactory();
09  
10         factory.setUser("client1");
11  
12         factory.setPassword("client1");
13  
14         factory.setOverloadEnabled(true);
15  
16         final Hello basic = (Hello) factory.create(Hello.class, url);
17  
18         //System.out.println("SayHello:" + basic.hello("guolei"));
19     }
20 }

代码中都有注释,按照注释实际操作去理解。  System.out等的输出会显示在启动JMeter时的命令窗口内,但过多的输出会影响性能的准确性。


4)将项目打为jar包,放到JMeter目录下的lib/ext下(将项目依赖的jar也放到此目录)。

5)重启JMeter。

5.JMeter使用

1)选中主界面左侧的“测试计划”,右键菜单->添加->Threads(Users)->线程组。

2)再选中刚才新增的"线程组",右键菜单->添加->Sampler->Java请求。

3)再选中刚才新增的"Java请求",右键菜单->添加->监视器->聚合报告。

4)Ctrl + R,开始运行, Ctrl + E,清除历史结果。

6.查看测试结果


聚合报告中基本已经包含我们所关心的几个数据了:

Samples -- 本次场景中一共完成了多少个Transaction

Average -- 平均响应时间

Median -- 统计意义上面的响应时间的中值

90% Line -- 所有transaction中90%的transaction的响应时间都小于xx

Min -- 最小响应时间

Max -- 最大响应时间

PS: 以上时间的单位均为ms

Error -- 出错率

Troughput -- 吞吐量,单位:transaction/sec

KB/sec -- 以流量做衡量的吞吐量

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐