JMeter 测试 Java 请求
在上一篇文章中,我们测试 dubbo 接口的时候,引入了编写 JmeterSampler,但是没有介绍具体如何书写,其实编写完 JmeterSampler,将其映射到 JMeter 中,即是完成了 Java 请求脚本的编写。下面展开具体介绍。
用 JMeter 测试 Java 工程
新建工程
在 Eclipse 里新建一个 Java 工程(如果看懂了在上一篇介绍的 Maven 工程,我鼓励大家使用 Maven 工程)。

定义一个类为 SumDemo:实现两个数的求和,代码如下:
package com.sum.demo;
class Math{
private int a;
private int b;
//定义一个方法实现a+b的和
public int sumTest(int a,int b){
return a+b;
}
}
public class SumDemo {
public static void main(String[] args) {
Math m = new Math();
int c = m.sumTest(10, 20);
System.out.println("两数相加之和:"+c);
}
}
导入 Jar
还是我们上一篇用到的两个 Jar,ApacheJMetercore.jar和ApacheJMeterjava.jar。

编写辅助函数
要想将 Java 的 jar 导入到 JMeter 的 Java 请求中,需要编写 JMeter 的辅助方法,常用的方法如下:
(1)public Arguments getDefaultParameters(),用于获取 JMeter 界面上的参数,如下所示:

(2)public void setupTest(JavaSamplerContext context),每个线程只执行一次,编写一些初始化数据,类似于 LoadRunner 中的 Java Vuser 中的 Init() 函数和 Junit 的 setUp();
(3)public SampleResult runTest(JavaSamplerContext context) ,JmeterSampler 的主方法,类似于 LoadRunner 中的 Java Vuser 中的 Action() 函数;
(4)public void teardownTest(JavaSamplerContext context),每个线程执行一次,类似于LoadRunner 中的 Java Vuser 中的 end() 函数和 Junit 的 tearDown();测试结束时调用,常用来编写关闭流资源,关闭数据库连接,没有的话,就什么都不要写。
上述方法在执行的时候是有先后顺序的,类似于 Testng,执行的先后顺序为:
getDefaultParameters()→setupTest(JavaSamplerContext context)→runTest(JavaSamplerContext context)→teardownTest(JavaSamplerContext context) 以上的四个方法组成了 JavaSampler 的基本结构,缺一不可。
除了上述四个主要方法外,还有如下方法:
- sampleStart() 用来定义一个事务的开始;
- sampleEnd() 用来定义一个事务的结束;
- addArgument("参数名称","参数值"),定义参数;
- setSuccessful("true/false"),设置运行结果的成功和失败,用来帮助 JMeter 统计成功、失败的次数,并在聚合报告中给与体现。
查看结果树的显示方法
须在程序中编写如下代码,才能将运行结果输出在“查看结果树”中,代码如下:
if (resultData != null && resultData.length() > 0) {
sr.setResponseData(resultData, null);
//请求头中会多个类型输出 Data type ("text"|"bin"|""): text
sr.setDataType(SampleResult.TEXT);
}
代码中的 resultData 为 String 的实例对象,sr 为 SampleResult 的实例对象。
JmeterSampler 的编写
在充分理解上述内容后,为了实现 SumDemo 类中的求和功能,编写的 JmeterSampler 的代码如下所示:
package com.sum.demo;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
public class JmeterSampler extends AbstractJavaSamplerClient{
private Math ma=null;
private String a;
private String b;
private String resultData;
/**通过SumDemo我们知道我们需要传入参数a,b,
* 所以使用这个方法来定义方法的入参*/
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
params.addArgument("numa", "");
params.addArgument("numb", "");
return params;
}
//做一些初始化操作,每个线程执行一次
public void setupTest(JavaSamplerContext context) {
System.out.println("执行开始");
ma= new Math();
a = context.getParameter("numa");
b = context.getParameter("numb");
}
@Override
public SampleResult runTest(JavaSamplerContext context) {
SampleResult sr = new SampleResult();
sr.setSamplerData("请求参数numa:"+a+"\t"+"请求参数numb:"+b);
try{
sr.sampleStart();//事务开始
resultData = String.valueOf(ma.sumTest(Integer.parseInt(a), Integer.parseInt(b)));
if (resultData != null && resultData.length() > 0) {
sr.setResponseData("结果是:"+resultData, null);
sr.setDataType(SampleResult.TEXT);
sr.setSuccessful(true);
}} catch(Throwable e) {
sr.setSuccessful(false);
e.printStackTrace();
} finally {
sr.sampleEnd();//事务结束
}
return sr;
}
public void teardownTest(JavaSamplerContext context) {
System.out.println("执行完毕");
}
}
上面操作完成,那么就已经完成了 JmeterSampler 的编写,下面介绍下如何将 Java 工程与 JMeter 进行整合,有了第05课内容的基础,这一课也不难。
Java 工程与 JMeter 的整合
导出 Jar
选中此时的 Java 工程,将 jar 命名为 com.demo.jmeterTest。

右键→Export,选择导出 jar:

单击 Next 按钮,选择 JAR file,并将 jar 命名为:sum.demo.jmeter.sampler.jar(名字任取):

单击 Finish 按钮,此时 jar 就成功导出了。
将 jar 导入到 JMeter
将 sum.demo.jmeter.sampler.jar 复制到 \apache-jmeter-3.1\lib\ext 目录下,如果 Java 工程还依赖有其他的 jar 包,我们就将其全部复制到 \apache-jmeter-3.1\lib 目录下。

JMeter 运行 Java 工程
以管理员身份打开 JMeter 后:
(1)测试计划→添加→Threads(Users)→线程组:

(2)线程组→添加→Sampler→Java 请求:

(3)选择我们测试的类名称并且给参数 numa 和 numb 分别复制为8和6:

(4)线程组→添加→监听器→查看结果树:

(5)单击“运行”按钮:

(6)查看结果树:

此时可以看到 Java 工程已经被成功调用,并且在“查看结果树”中成功打印了请求和响应信息,响应结果也与预期相符。
总结
通过本次实践过程,总体说明如下。
当测试过程中出现性能问题时,可以继续拆分事务,以便更好的定位性能瓶颈。JMeter 要想加载出我们的测试类,必须满足以下条件:
- JMeter 运行所依赖的 JDK 版本>Java 工程编译所使用的 JDK 版本;
- 必须在 Java 工程里编写继承自 AbstractJavaSamplerClient 的测试类;
- JavaSampler 的编写是有先后顺序的,方法也是固定统一的,一定要认真掌握;
- 无论是测试 dubbo 接口还是普通的 Java 工程,最后 JMeter 的测试思路都是按照 JmeterSampler 进行处理。

浙公网安备 33010602011771号