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 进行处理。
posted @ 2018-11-22 11:39  长安。  阅读(152)  评论(0)    收藏  举报