51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 1710|回复: 2
打印 上一主题 下一主题

使用JMeter的Java请求功能测试Hetty性能

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-3-6 16:45:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 雨中漫步_012 于 2019-3-6 16:46 编辑

1.JMeter介绍

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

2.启动JMeter

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

  1. sudo ./jmeter.sh
复制代码
3.原始的测试方法

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

  1. public class RpcHessianClient {
  2.         
  3.         public static void main(String[] args) {
  4.         
  5.                 String url = "http://localhost:8081/apis/hello";
  6.         
  7.                 HessianProxyFactory factory = new HessianProxyFactory();
  8.         
  9.                 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.                                         url);
  27.         
  28.                         for (int i = 0; i < size; i++) {

  29.                                 es.submit(new Runnable() {
  30.         
  31.                                         @Override

  32.                                         public void run() {

  33.                                                 String u=basic.hello("guolei");
  34.         
  35.                                                 //System.out.println(u);
  36.         
  37.                                                 cdl.countDown();
  38.         
  39.                                         }
  40.         
  41.                                 });

  42.                         }
  43.                         cdl.await();
  44.                         long time = System.currentTimeMillis() - start;

  45.                         System.out.println("SayHello:");

  46.                         System.out.println("耗时:" + (double) time / 1000 + " s");
  47.         
  48.                         System.out.println("平均:" + ((double) time) / size +" ms");

  49.                         System.out.println("TPS:" + (double) size / ((double) time / 1000));
  50.         
  51.                         // System.out.println("Hello, " + s.getMail());

  52.                 } catch (MalformedURLException e) {
  53.         
  54.                         e.printStackTrace();
  55.         
  56.                 } catch (InterruptedException e) {

  57.                         e.printStackTrace();
  58.         
  59.                 }finally{

  60.                         es.shutdown();
  61.                 }
  62.         }
  63. }
复制代码
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类开始编写主业务。如下:

  1. public class HettyTest extends AbstractJavaSamplerClient {

  2.         private static String label = "hettyTest";

  3.         /**
  4.          * 执行runTest()方法前会调用此方法,可放一些初始化代码
  5.          */
  6.         public void setupTest(JavaSamplerContext arg0) {
  7.         }

  8.         /**
  9.          * JMeter测试用例入口
  10.          */
  11.         public SampleResult runTest(JavaSamplerContext arg0) {
  12.                 SampleResult sr = new SampleResult();
  13.                 sr.setSampleLabel(label);
  14.                 try { // 这里调用我们要测试的java类,这里我调用的是一个Test类
  15.                         Map<String,String> map = getDefaultParameters().getArgumentsAsMap();
  16.                         sr.sampleStart(); // 记录程序执行时间,以及执行结果
  17.                         Test.execute(map.get("ip"),map.get("port"));
  18.                         sr.sampleEnd();
  19.                         sr.setSuccessful(true);
  20.                 } catch (Throwable e) {
  21.                         sr.setSamplerData(e.getMessage());
  22.                         e.printStackTrace();
  23.                         sr.setSuccessful(false); // 用于设置运行结果的成功或失败,如果是"false"则表示结果失败,否则则表示成功
  24.                 }
  25.                 return sr;
  26.         }

  27.         /**
  28.          * JMeter界面中可手工输入参数,代码里面通过此方法获取
  29.          */
  30.         public Arguments getDefaultParameters() {

  31.                 Arguments args = new Arguments();
  32.                 args.addArgument("ip", "localhost");
  33.                 args.addArgument("port", "8081");
  34.                 return args;
  35.         }

  36.         /**
  37.          * 执行runTest()方法后会调用此方法.
  38.          */
  39.         public void teardownTest(JavaSamplerContext arg0) {
  40.         }

  41. }
复制代码

Test类是我测试逻辑,如下:

  1. public class Test {

  2.         public static void execute(String ip,String port) throws MalformedURLException {
  3.                
  4.                
  5.                 String url = "http://"+ip+":"+port+"/apis/hello";

  6.                 HessianProxyFactory factory = new HessianProxyFactory();

  7.                 factory.setUser("client1");

  8.                 factory.setPassword("client1");

  9.                 factory.setOverloadEnabled(true);

  10.                 final Hello basic = (Hello) factory.create(Hello.class, url);

  11.                 //System.out.println("SayHello:" + basic.hello("guolei"));
  12.         }
  13. }
复制代码

代码中都有注释,按照注释实际操作去理解。  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 -- 以流量做衡量的吞吐量




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-4-23 22:43 , Processed in 0.068039 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表