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

 1.JMeter介绍

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

  2.启动JMeter

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

  sudo ./jmeter.sh

  3.原始的测试方法

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


public class RpcHessianClient {

public static void main(String[] args) {

String url = "http://localhost:8081/apis/hello";

HessianProxyFactory factory = new HessianProxyFactory();

ExecutorService es = Executors.newFixedThreadPool(10);

int size = 1000000;

final CountDownLatch cdl = new CountDownLatch(size);

try {

long start = System.currentTimeMillis();

factory.setUser("client1");

factory.setPassword("client1");

factory.setOverloadEnabled(true);

final Hello basic = (Hello) factory.create(Hello.class,

url);

for (int i = 0; i < size; i++) {

es.submit(new Runnable() {

@Override

public void run() {

String u=basic.hello("guolei");

//System.out.println(u);

cdl.countDown();

}

});

}

cdl.await();

long time = System.currentTimeMillis() - start;

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

System.out.println("耗时:" + (double) time / 1000 + " s");

System.out.println("平均:" + ((double) time) / size +" ms");

System.out.println("TPS:" + (double) size / ((double) time / 1000));

// System.out.println("Hello, " + s.getMail());

} catch (MalformedURLException e) {

e.printStackTrace();

} catch (InterruptedException e) {

e.printStackTrace();

}finally{

es.shutdown();

}

}

 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类开始编写主业务。如下:


public class HettyTest extends AbstractJavaSamplerClient {

private static String label = "hettyTest";

/**

* 执行runTest()方法前会调用此方法,可放一些初始化代码

*/

public void setupTest(JavaSamplerContext arg0) {

}

/**

* JMeter测试用例入口

*/

public SampleResult runTest(JavaSamplerContext arg0) {

SampleResult sr = new SampleResult();

sr.setSampleLabel(label);

try { // 这里调用我们要测试的java类,这里我调用的是一个Test类

Map<String,String> map = getDefaultParameters().getArgumentsAsMap();

sr.sampleStart(); // 记录程序执行时间,以及执行结果

Test.execute(map.get("ip"),map.get("port"));

sr.sampleEnd();

sr.setSuccessful(true);

} catch (Throwable e) {

sr.setSamplerData(e.getMessage());

e.printStackTrace();

sr.setSuccessful(false); // 用于设置运行结果的成功或失败,如果是"false"则表示结果失败,否则则表示成功

}

return sr;

}

/**

* JMeter界面中可手工输入参数,代码里面通过此方法获取

*/

public Arguments getDefaultParameters() {

Arguments args = new Arguments();

args.addArgument("ip", "localhost");

args.addArgument("port", "8081");

return args;

}

/**

* 执行runTest()方法后会调用此方法.

*/

public void teardownTest(JavaSamplerContext arg0) {

}

}

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


public class Test {

public static void execute(String ip,String port) throws MalformedURLException {

String url = "http://"+ip+":"+port+"/apis/hello";

HessianProxyFactory factory = new HessianProxyFactory();

factory.setUser("client1");

factory.setPassword("client1");

factory.setOverloadEnabled(true);

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

//System.out.println("SayHello:" + basic.hello("guolei"));

}

}

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

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

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-31 14:44:12

使用JMeter的Java请求功能测试Hetty性能的相关文章

redis-关于Redis数据库的java代码多线程读写性能问题,希望可以帮忙看看、、、

问题描述 关于Redis数据库的java代码多线程读写性能问题,希望可以帮忙看看... 渣渣一枚..由于项目关系,需要用到内存数据库来存key-value所以就开始研究redis这个数据库.现在已经把redis放在了CentOS的测试服务器上,然后通过网上的资料写了链接代码! 测试用了100个线程,每个线程插入10000条数据,结果竟然花了**200s**, 同事用memcached测试同样的数据只要了**20s** 而在linux中用redis自带的redis-benchmark查询性能 结果

使用jmeter测试java程序

最近在用jmeter进行性能测试,防止被忘记,把步骤写下. 场景:测试java程序 1.右击测试计划-> 添加 -> Threads(Users) -> 线程组 2.设置线程属性,用于并发请求. 介绍: 线程数: 5 Ramp-Up Period(in seconds) : 1 循环次数: 2 含义:1秒种起动5个线程,每个线程循环调用2次java请求 3.线程组右击 -> 添加 -> Sampler -> Java请求 之前建立测试类: Java代码 package

使用Jmeter测试java requst

个人一直认为使用Loadrunner或者Jmeter来测试java 方法都是费力不讨好的事情.java本身就有多线程机制,直接写个测试类弄弄不就好了嘛.但是还是架不住很多人的需求,简单来讲一下如果使用Jmeter测试java request吧. 首先本人准备测试的jar包已经准备好了叫Hello.jar,源代码如下: package com.test.webservice; public class Hello { public String sayHello() { return "Hello

JMeter测试有无数据库连接池的性能

使用JMeter测试一下有无数据库连接池的性能: 1.下载JMeter 2.无连接池的servlet Java代码 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWrit

Java Web服务: WS-SecureConversation性能

看看 Web 服务栈 WS-SecureConversation 性能相比较有何不同 简介:WS-SecureConversation 能让您保证正在进行的 Web 服务消息交换的安全,同时花费比普通 WS-Security 更少的处理开销.在本文中,您将学习如何配置 WS-SecureConversation 并将其用于三个 主要的开源 Java Web 服务栈:Apache Axis2.Metro 和 Apache CXF.还将看到这三个栈的 WS -SecureConversation 性

Java Web服务: CXF性能比较

简介:Apache CXF 与 Apache Axis2 及 Metro 共享一些底层组件,但在完全不同的架构中结合了这 些组合.Dennis Sosnoski 将继续他的 Java Web 服务 专栏,比较 CXF.Metro 和 Axis2 栈在有无 WS -Security 的情况下的性能表现. Apache CXF Web 服务栈建立在与本系列早期文章讨论的 Apache Axis2 及 Metro 栈相同的一些技术 的基础之上.与 Axis2 类似,它使用 Apache WSS4J W

Java并发编程之性能、扩展性和响应_java

本文讨论的重点在于多线程应用程序的性能问题.我们会先给性能和扩展性下一个定义,然后再仔细学习一下Amdahl法则.下面的内容我们会考察一下如何用不同的技术方法来减少锁竞争,以及如何用代码来实现. 1.性能 我们都知道,多线程可以用来提高程序的性能,背后的原因在于我们有多核的CPU或多个CPU.每个CPU的内核都可以自己完成任务,因此把一个大的任务分解成一系列的可彼此独立运行的小任务就可以提高程序的整体性能了.可以举个例子,比如有个程序用来将硬盘上某个文件夹下的所有图片的尺寸进行修改,应用多线程技

借助 AOP 为 Java Web 应用记录性能数据

作为开发者,应用的性能始终是我们最感兴趣的话题之一.然而,不是所有的开发者都对自己维护的应用的性能有所了解,更别说快速定位性能瓶颈并实施解决方案了. 2015 年北京 Velocity 的赞助商大多从事 APM 领域,提供性能剖析.可视化甚至优化的解决方案.这些厂商的产品看起来能够很好地帮助中小企业的开发者解决应用性能上的缺陷,但是这些产品几乎都有着一个致命的缺陷:极强的侵入性. 开发者需要在业务生产代码中嵌入 APM 厂商提供的埋点代码,才能够使用 APM 厂商提供的 SaaS 服务.在瞬息万

Java JVM设置对性能的影响

一台后端server,OS为Slackware 8.1,装了tomcat 4.1.30,近期在繁忙时期经常会死机,死状就是"java.lang.OutOfMemoryError: unable to create new native thread".是tomcat创建不了新的线程来应答请求了.于是我搭了一个环境专门来测试这个问题.内存为2G,CPU为四颗2.8G,tomcat 4.1.30,写一个最简单的JSP页面,如下: 代码 <% try { Thread.sleep(30