做性能测试,接口测试,非常好

转自  http://www.iteye.com/topic/1123432

以前碰到更多的是WEB APP的性能测试,也许用得最多的是Loadrunner, Web Stress tool之类的常态化工具,从没考虑过对于后端引擎类的测试是怎样的。

现在有幸主导了一个企业引擎的研发,其最关健的不是其功能如何,而是性能如何。故benchmark就显得尤为重要。

既然是benchmark,一系列的性能监测、度量工具使用在所难免:

1. nmon。首选的AIX/Linux性能监测工具。很多年前简单总结过,可参考:http://www.blogjava.net/itstarting/archive/2009/02/19/255638.html.

2. jconsole。这个jdk自带的工具,监控JVM Heap size及回收、线程数量、CPU使用之类的,简单好用

3. JMeter。这个Apache的老字号,不得不搬出来(公司没有Loadrunner,也不能盗版)

4. Jamon。这个是方法级性能监控工具,完全无侵入性,如果框架用Spring,加上一小段AOP的配置即可

没想到的是,最给我带来惊喜,还是JMeter.

严格意义上上,JMeter我还是第一次在正式场合搬出来深度使用,以前简单的加压http,顶多算是个hello world.

JMeter有很多的插件式的扩展,因为本引擎使用的Netty + Protobuf,所以自然想到的还是JUnit Sampler和Java Sample。其中JUnit Sample个人觉得没有Java Sampler好,姑且按下不表。

Java Sampler,顾名思义,就是一个Java的采样器,扩展AbstractJavaSamplerClient即可轻松实现。

1 public class Benchmark extends AbstractJavaSamplerClient {
2 ...
3 } 

Benchmark有很多的场景,可以写很多个Benchmark类,比如Benchmark_A, Benchmark_B,我偷懒,四大场景我就写了一个。

好了,下面重点说说需要实现的部分,及其作用。

1. 重载getDefaultParameters方法。

1 @Override
2 public Arguments getDefaultParameters(){
3         Arguments params = new Arguments();
4
5         //TODO: Right here to define/set parameters from GUI.
6
7         return params;
8 }  

在这个方法里,可以设置各种参数,这些参数可以从GUI处获取,也可以设置合适的默认值。有意思的是,这些默认值在GUI扫描的时候,会自动出现在界面上,以供必要的调整和优化。

2. 重载setupTest方法。

1 @Override
2 public void setupTest(JavaSamplerContext arg0) {
3    //TODO: to init the test case, something like JUnit's setUp
4 }  

为了达到真正的性能测试目的,所有的数据准备工作,应在这里完成。 需要注意的是,这个方法在JMeter初始化的每个线程都会执行一遍,而不是全局仅一遍。

3. 重载并重点编写runTest方法。

1 @Override
2 public SampleResult runTest(JavaSamplerContext arg0) {
3     //TODO: The load testing client side logic acting as the emulators puts here
4 }  

这是我们重点要做编写的客户端代码,为Java Sampler实现的重点。

在这里,你可以尽情的调用客户端的API,完成所需要与服务器端交互的一切,包括交易成功与否的判断。

所谓代码胜千言,下面看看代码好了,加上了注释,就不用废话了:

 1 @Override
 2 public SampleResult runTest(JavaSamplerContext arg0) {
 3     SampleResult sp = new SampleResult(); //采样结果
 4         MatchResponse matchResponse;
 5         UUID uuid = UUID.randomUUID();
 6         String key = uuid.toString();
 7         sp.sampleStart();                                    //采用开始时间
 8
 9         //下面是客户端逻辑
10         try {
11             if("PC2-ID".equalsIgnoreCase(benchmark_mode)){
12                 matchResponse = client.sendMatchRequest(
13                             key,
14                             ENGINE.code(),
15                             pc2Image,
16                             sourcePositions,
17                             targetIdentifiers,
18                             ImageType.PC2.imageCode());
19             }else if("WSQ-ID".equalsIgnoreCase(benchmark_mode)){
20                 matchResponse = client.sendMatchRequest(
21                             key,
22                             ENGINE.code(),
23                             wsqImage,
24                             sourcePositions,
25                             targetIdentifiers,
26                             ImageType.WSQ.imageCode());
27             }else if("ID-ID".equalsIgnoreCase(benchmark_mode)){
28                 matchResponse = client.sendMatchRequest(
29                             key,
30                             ENGINE.code(),
31                             sourceIdentifier,
32                             sourcePositions,
33                             targetIdentifiers,
34                             ImageType.PC2.imageCode());
35             }else{
36                 print("Not supported benchmark mode found", benchmark_mode);
37                 throw new java.lang.IllegalArgumentException("Not supported benchmark mode found");
38             }
39
40             sp.sampleEnd(); //采用结束
41
42             this.printMatchResponse(matchResponse);
43
44             //set success flag to true but need to verify later
45             sp.setSuccessful(true);
46
47             //下面进一步分析服务器端返回的信息,以判断本次交易是否成功
48             Iterator<MatchResult> matchResults = matchResponse.getMatchResults().iterator();
49             MatchResult matchResult;
50             MatchScore score;
51             while(matchResults.hasNext()){
52                 matchResult = matchResults.next();
53                 Iterator<MatchScore> scores = matchResult.getMatchScores().iterator();
54                 while(scores.hasNext()){
55                     score = scores.next();
56                     if (score.score<9999.0){
57                         sp.setSuccessful(false);
58                         break;
59                     }
60                 }
61             }
62         } catch (Exception e) {
63             sp.sampleEnd();
64             sp.setSuccessful(false);
65             e.printStackTrace();
66             return sp;
67         }
68
69         return sp;  //返回采用结果,这个结果将会被JMeter使用,并反馈到GUI/报告中,方便明了
70 }  

4. 重载并编写teardownTest方法。

1 @Override
2 public void teardownTest(JavaSamplerContext context) {
3     //TODO: clean up
4 }  

天下没有不散的筵席,落幕时分跟JUnit的tearDown一样,但据我测试的效果来看,这玩意全局只调用一次,而非跟setupTest那样每个线程都来一次。

下面谈谈怎么配置JMeter,并真正跑起来。

有几个步骤:

1. 安装JMeter...咳废话

2. 打包Benchmark为jar并拷贝所有的依赖到 %apache-jmeter%\lib\ext下。

我用maven,就更简单了,配上下面那段:

 1 <plugin>
 2     <groupId>org.apache.maven.plugins</groupId>
 3     <artifactId>maven-jar-plugin</artifactId>
 4     <version>2.3.1</version>
 5     <configuration>
 6         <archive>
 7             <manifest>
 8                 <addClasspath>true</addClasspath>
 9                 <classpathPrefix>lib/</classpathPrefix>
10             </manifest>
11             <manifestEntries>
12                 <Class-Path>.</Class-Path>
13             </manifestEntries>
14         </archive>
15     </configuration>
16 </plugin>  

这样拷贝过去的就是:

%apache-jmeter%\lib\ext\我的benchmark.jar

%apache-jmeter%\lib\ext\lib\*——各种杂七杂八的依赖

3. 启动JMeter。

双击%apache-jmeter%\bin\jmeter.bat

4. 新增一个Thread Group.

右键Test Plan->Add->Threads (Users)->Thread Group

改名为Benchmark,并设置几个重量级的参数:

a) Number of Threads (users),并发的线程数
b) Ramp-Up Period (in seconds),预热时间,类似于一般意义上的Think Time
c) Loop Count,每组并发线程循环的次数

d) Scheduler是另外一组用来配置调度的,我没用这个

附上图:

5. 新增Java Request.

右键刚新增的线程组(这里名叫Benchmark了)-> Add -> Sampler -> Java Request

默认情况下,如果你仅放了一个Java Sampler,JMeter即可通过扫他的classpath扫到你的Java Sampler并自动出现在GUI上。如下图:

6. 再放一到若干个Listener,用以观察输出/图形化报表

一般而言,我喜欢放两个,一个是最最朴素的"View Results in Table":

右键刚新增的线程组Benchmark-> Add -> Listener -> View Results in Table

再来一个"Graph Full Results",图形化的

到此为止,基本配置完毕,保存一下。

跑Benchmark其实就很简单了,一般而言三个步骤:

1. 调整Thread Group的参数,一般包括Number of Threads (users)和Loop Count,以配合不同的压力场景

2. 调整必要的参数,通过点击Java Request,即可控制你的Java Sampler的每个参数细节

3. 点击Start,并观察输出,包括View Results in Table或者Graph Full Results。输出主要包括:No of Samples、Latest Sample、Average、Deviation、Throughput、Median等,够用了。如下图:

附:一般而言,如果线程不是太吓人(比如超过1000),一个JMeter实例就够了,如果多了,就要考虑多个JMeter实例并行测试了。

==The End==

转载于:https://www.cnblogs.com/wangxiaoqun/p/7372430.html

使用JMeter的Java Sampler轻松定制自己的benchmark相关推荐

  1. jmeter重写java请求_jmeter之编写java请求-扩展Java Sampler

     分类: JMeter实践(19) 版权声明:本文为博主原创文章,未经博主允许不得转载. 新浪围脖>79642549 有以下优势 脚本易维护 易调试 开发脚本周期短 不过网上扩展java请求文章 ...

  2. jmeter测试java接口测试_简单易学的测试攻略:JMeter测试Java请求示例

    JMeter是Apache组织的开放源代码项目,它是功能和性能测试的工具,100%的用java实现,大家可以到官网下载源代码和查看相关文档. 关于使用JMeter进行JDBC数据库测试.HTTP请求接 ...

  3. 使用jmeter测试java程序

    最近在用jmeter进行性能测试,防止被忘记,把步骤写下. 场景:测试java程序 1.右击测试计划-> 添加 -> Threads(Users) -> 线程组 2.设置线程属性,用 ...

  4. jmeter测试java代码

    有时候总是要写代码的,不得不说你也得会,这不往下看 java请求了,就的写代码,那么先来实现一个类, package com.company.jemeters;public class Hello { ...

  5. apachejmeter_java源码_自定义编写jmeter的Java测试代码

    我们在做性能测试时,有时需要自己编写测试脚本,很多测试工具都支持自定义编写测试脚本,比如LoadRunner就有很多自定义脚本的协议,比如"C Vuser","JavaV ...

  6. 【转】JMeter学习(十七)JMeter测试Java

    目的:对Java程序进行测试 目录 一.核心步骤 二.实例 三.JMeter Java Sampler介绍 四.自带java Request Sampler 一.核心步骤 1.创建一个Java工程: ...

  7. jmeter里看java的log,jmeter中java协议请求

    5.Export为Runnable Jar File:hello.jar 注意:不需要将整个工程导出,只需要选中包名(test)在file菜单中点击export->选java项的jar file ...

  8. Jmeter的Java脚本往Kafka里传数据(SASL认证)——记第一次写JAVA的Jmeter脚本,超详细。

    需求:需要使用jmeter往Kafka里压大量的数据. 这里使用java写一个工具也可以实现,但是之前没自己写过Jmeter脚本.整体的思路就是继承AbstractJavaSamplerClient类 ...

  9. Jmeter自定义Java请求

    一.需求背景 在日常压测过程中,有些请求逻辑比较复杂的时候,Jmeter 中自带的sample取样器不够灵活,或者性能就会比较低了,这个时候就可以自己写java代码实现自己的请求. 二.准备工作 1. ...

最新文章

  1. 定制Eclipse IDE之界面篇
  2. 概率论与数理统计常用英文词汇对照
  3. ipadpro+打开html文件,iPadPro日常基本功能的使用技巧汇总
  4. 最简单java设计模式:抽象工厂模式
  5. JavaScript + Tampermonkey——易班优课YOOC课群在线测试自动答题解决方案(十七)复合型解决方案油猴脚本
  6. boost::callable_traits的is_invocable的测试程序
  7. 架构师2月刊发布:解读Android、高效运维、API设计方法论
  8. 下一个主要AI平台是什么?苹果说:手机
  9. 小D课堂 - 零基础入门SpringBoot2.X到实战_第2节 SpringBoot接口Http协议开发实战_12、SpringBoot2.x文件上传实战...
  10. Linux USB驱动开发
  11. java 正则表达式 tab_JAVA 正则表达式 (超详细)
  12. luajit lua文件加密工具
  13. system.Exception:端口已被占用1080
  14. mysql两张大表关联查询_关于mysql当中给数据量特别大的两个表做关联查询的时候解决查询速度很慢的解决方法...
  15. Java导出word模板
  16. Excel筛选后无法复制粘贴成数值解决办法
  17. wine - qq无法显示图片头像
  18. 思维导图(自我介绍)
  19. linux下top指令参数详解及用法
  20. php对接百度网盘开发平台API开发高级实战案例解析:(环境部署、php封装类、Access Token获取、预上传、分片上传)

热门文章

  1. 用户模块--------用户登录
  2. 如何设计一个权限管理模块?
  3. JS判断字符是否为数字类型
  4. 从抄书到开源之巅:章亦春的程序人生(转载自微信公众号 -- 码农翻身)
  5. 三星SM411性能参数!
  6. LC 电路串联谐振与并联谐振
  7. 分布式系统设计模式,你用过哪些?
  8. 希腊字母的读法[转]
  9. [网络安全]实操DVWS靶场复现CSRF漏洞
  10. 跟我学c++高级篇——模板元编程之十一鸭子类型