本文来自作者 勇气 在 GitChat 上分享 「Jmeter 对 Java 请求的测试实施」,「阅读原文」查看交流实录。
「文末高能」
编辑 | 哈比
本篇文章主要介绍以下三个方面的内容。
准备工作;
用 Jmeter 测试 JAVA 工程;
总结。
主要包括以下方面:
JDK 的注意事项;
Jmeter 的配置;
Eclipse 工具的注意事项。
Jmeter 是依赖 JDK 的,目前从官网下载下来的 Jmeter 支持 JDK1.7 和 1.8;这里推荐大家自行安装 JDK1.8 的版本。如果 JDK 版本过低,启动 Jmeter 时会报错,报错信息如下:
1)自行下载 Jmeter(从官网上下载最新版本即可),下载到本地进行解压缩。解压后的目录结构如下图所示:
2)配置环境变量
新建系统变量为:JMETER_HOME;
变量值为:D:\TestTool\Jmeter\apache-jmeter-3.1
配置 CLASSPATH(没有的话也新建),变量值为:
%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;
%JMETER_HOME%\lib\jorphan.jar;
%JMETER_HOME%\lib\logkit-2.0.jar;如果没有其他值,那么前面应该加 .;这个三个 jar 必须配置在 CLASSPATH 中。
1)自行下载 Eclipse, 请注意下载的 Eclipse 版本要和 JDK 的版本保持一致,即 64 位的 JDK 对应的 Eclipse 应该是 64 位,32 位 JDK 对应的 Eclipse 版本应该是 32 位。
2)将 apache-jmeter-3.1\lib\ext 目录下的 ApacheJMeter_core.jar 和 ApacheJMeter_java.jar 导入到 JAVA 工程中;
这一步是关键,反编译 ApacheJMeter_java.jar,可以看到 JavaSampler 类,这即是 Jmeter 可以测试 JAVA 请求的关键所在。
在 Eclipse 里新建一个 JAVA 工程。
定义一个类为 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); } }
向工程里导入 ApacheJMeter_core.jar 和 ApacheJMeter_java.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 的实例对象;
为了实现 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(" 执行完毕 "); } }
选中此时的 Java 工程;将 jar 命名为 com.demo.jmeterTest。
右键->Export,选择导出 jar;
点击 next,选择 JAR file,并将 jar 命名为:sum.demo.jmeter.sampler.jar(名字任取)
点击 finish,此时 jar 就成功导出了。
将 sum.demo.jmeter.sampler.jar 复制到\apache-jmeter-3.1\lib\ext 目录下,如果 JAVA 工程还依赖有其他的 jar 包,我们就将其全部复制到\apache-jmeter-3.1\lib 目录下。
以管理员身份打开 Jmeter 后,
1)测试计划-> 添加->Threads(Users)-> 线程组
2)线程组-> 添加->Sampler->Java 请求
3)选择我们测试的类名称并且给参数 numa 和 numb 分别复制为 8 和 6;
4)线程组-> 添加-> 监听器-> 查看结果树
5)运行
6)查看结果树
此时可以看到 JAVA 工程已经被成功调用,并且在 “ 查看结果树 “ 中成功打印了请求和响应信息。响应结果也与预期相符。
通过本次实践过程,总体说明如下:
当测试过程中出现性能问题时,可以继续拆分事务,以便更好的定位性能瓶颈。
Jmeter 要想加载出我们的测试类,必须满足以下条件:
Jmeter 运行所依赖的 JDK 版本>JAVA 工程编译所使用的 JDK 版本;
必须在 JAVA 工程里编写继承自 AbstractJavaSamplerClient 的测试类;
JavaSampler 的编写是有先后顺序的,方法也是固定统一的,一定要认真掌握。
近期热文
《从零开始,搭建 AI 音箱 Alexa 语音服务》
《修改订单金额!?0.01 元购买 iPhoneX?| Web谈逻辑漏洞》
《让你一场 Chat 学会 Git》
《接口测试工具 Postman 使用实践》
《如何基于 Redis 构建应用程序组件》
《深度学习在摄影技术中的应用与发展》
「阅读原文」看交流实录,你想知道的都在这里