使用JMeter的Java请求功能测试Hetty性能
1.JMeter介绍JMeter是Apache组织的开放源代码项目,它是功能和性能测试的工具,100%的用java实现。JMeter可以用于测试静态或者动态资源的性能(文件、Servlets、Perl脚本、java对象、数据库和查询、ftp服务器或者其他的资源)。JMeter用于模拟在服务器、网络或者其他对象上附加高负载以测试他们提供服务的受压能力,或者分析他们提供的服务在不同负载条件下的
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 | } |
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 -- 以流量做衡量的吞吐量
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)