Jmeter 对 Java 请求的测试实施


本文来自作者 勇气  GitChat 上分享 「Jmeter 对 Java 请求的测试实施」,阅读原文查看交流实录。

文末高能

编辑 | 哈比

概要

本篇文章主要介绍以下三个方面的内容。

  1. 准备工作;

  2. 用 Jmeter 测试 JAVA 工程;

  3. 总结。

准备工作

主要包括以下方面:

  1. JDK 的注意事项;

  2. Jmeter 的配置;

  3. Eclipse 工具的注意事项。

JDK 的注意事项

Jmeter 是依赖 JDK 的,目前从官网下载下来的 Jmeter 支持 JDK1.7 和 1.8;这里推荐大家自行安装 JDK1.8 的版本。如果 JDK 版本过低,启动 Jmeter 时会报错,报错信息如下:

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 中。

Eclipse 工具的注意事项

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 请求的关键所在。

用 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);    } }

导入 jar

向工程里导入 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 的基本结构,缺一不可。

除了上述四个主要方法外,还有如下方法:

  1. sampleStart() 用来定义一个事务的开始;

  2. sampleEnd() 用来定义一个事务的结束;

  3. addArgument(“ 参数名称 “,” 参数值 “),定义参数;

  4. 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(" 执行完毕 "); } }

导出 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 工程已经被成功调用,并且在 “ 查看结果树 “ 中成功打印了请求和响应信息。响应结果也与预期相符。

总结

通过本次实践过程,总体说明如下:

  1. 当测试过程中出现性能问题时,可以继续拆分事务,以便更好的定位性能瓶颈。

  2. Jmeter 要想加载出我们的测试类,必须满足以下条件:

    Jmeter 运行所依赖的 JDK 版本>JAVA 工程编译所使用的 JDK 版本;

    必须在 JAVA 工程里编写继承自 AbstractJavaSamplerClient 的测试类;

  3. JavaSampler 的编写是有先后顺序的,方法也是固定统一的,一定要认真掌握。

近期热文

从零开始,搭建 AI 音箱 Alexa 语音服务

修改订单金额!?0.01 元购买 iPhoneX?| Web谈逻辑漏洞

让你一场 Chat 学会 Git

接口测试工具 Postman 使用实践

如何基于 Redis 构建应用程序组件

深度学习在摄影技术中的应用与发展


「阅读原文」看交流实录,你想知道的都在这里

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值