一、引言
JMeter是Apache基金会开发的一款开源性能测试工具,广泛应用于软件性能测试领域。它能够模拟多线程并发用户对应用程序进行压力测试,以评估应用程序的性能和稳定性。然而,在实际使用过程中,用户可能会遇到需要发送Java请求的场景,例如测试Java Web应用程序或其他支持Java RESTful API的服务。本文将介绍如何在JMeter中发送Java请求,并给出一些实用的技巧和注意事项。
二、java请求简介
查阅以往资料,现探究出两种jmater发送Java请求的方式,第一种通过将自己打包的jar通过jmeter函数助手的方式引用到java请求中,第二种是通过java请求直接引入jar包的方式,通过添加Beanshell取样器打印日志的方式,查看返回的结果。现将两种方式分别介绍。
三、实操
3.1jmeter函数二次开发
3.1.1思路
- JMeter提供了接口给用户进行二次开发,其中接口可通过引入ApacheJMeter_components.jar、ApacheJMeter_core.jar两个包获取。(或许你看到别人介绍所要用的jar包会更多,其实正常开发就这两个,所以至少保证有这两个包即可)
- 开发的代码需要符合JMeter的规范:第一,新建的包名称必须是以 functions 结尾;第二,方法类需要继承AbstractFunction类,而AbstractFunction类中有四个要实现的函数,其中我们要实现的功能需要结合这四个函数实现。
3.2.2环境准备
3.2.2.1添加依赖包
- 依赖的业务相关jar放到lib目录下
- jmeter相关jar放到ext目录下 
  - 两个jar包在JMeter安装目录下的\lib\ext 文件夹,在工程里新建一个lib目录,把jar包放进去,然后添加到项目工程里 
    - ApacheJMeter_components.jar
- ApacheJMeter_core.jar
 
 
- 两个jar包在JMeter安装目录下的\lib\ext 文件夹,在工程里新建一个lib目录,把jar包放进去,然后添加到项目工程里 
    
3.2.2.2重写AbstractFunction类中的方法
创建的包以functions结尾,同时创建的类继承AbstractFunction类,并重写类中的方法;
3.2.2.3AbstractFunction类四个方法的简单介绍
函数概要说明:

3.2.3案例分享
新建java代码后,将java代码打包传入jmeterext目录下
package com.functions;
import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.functions.AbstractFunction;
import org.apache.jmeter.functions.InvalidVariableException;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
public class HelloFunction extends AbstractFunction {
    //在jmeter中,约定俗成要求函数的名称必须是以"__"开头。
    private final static String key = "__hello";
    private static List<String> params = new LinkedList<String>();
    static {
        params.add("请输入用户名");
        params.add("请输入性别: 男or女");
    }
    public String username = "";
    public String sex = "";
    //用来定义函数的主体,即函数的结果由该方法来返回
    @Override
    public String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {
        String result = "";
        if(sex.equals("男")){
            result = username+",先生你好。";
        } else if (sex.equals("女")) {
            result = username+",女士你好。";
        }else {
            result = "无名氏你好,请问你是男是女?";
        }
        return result;
    }
    //用来接收和处理用户调用函数时所传入的参数值
    @Override
    public void setParameters(Collection<CompoundVariable> arg0) throws InvalidVariableException {
        checkParameterCount(arg0,2);
        Object[] data = arg0.toArray();
        username = ((CompoundVariable)data[0]).execute();
        sex = ((CompoundVariable)data[1]).execute();
    }
    //用来定义函数的名称
    @Override
    public String getReferenceKey() {
        return key;
    }
    //用来定义函数的参数列表
    @Override
    public List<String> getArgumentDesc() {
        return params;
    }
}重启jmeter,在函数助手中即可看到此java请求,示例如下

结果返回

3.2java请求二次开发
3.2.1实现目的
- java方法打成jar包
- jmeter二次开发调用该jar包方法
- 响应结果保存为jmeter参数,供别的请求使用
3.2.2案例分享
3.2.2.1 java方法示例, 将以下方法打包
package com.gmrz.test;
public class TestAdd {
    public int add(int a,int b){
        return a+b;
    }
    public static void main(String[] args) {
        TestAdd testAdd = new TestAdd();
        System.out.println(testAdd.add(1,7));
    }
}3.2.2.2 新建一个maven,用于二次开发
导入jmeter二次开发核心jar包和加法jar包

3.2.2.3写个简单类,调用加法方法
package com.gmrz.jmeter;
import com.gmrz.TestAdd;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.threads.JMeterContextService;
import org.apache.jmeter.threads.JMeterVariables;
public class JmeterSend1 extends AbstractJavaSamplerClient{
    public void setupTest(JavaSamplerContext context){
        System.out.println("start");
    }
    public void teardownTest(JavaSamplerContext context) {
        System.out.println("end");
    }
    public SampleResult runTest(JavaSamplerContext context) {
        TestAdd t = new TestAdd();
        SampleResult s = new SampleResult();
        s.sampleStart(); // 开始统计响应时间,取样器开始运行
        s.setSampleLabel("client"); //聚合报告里的lable名称
        JMeterVariables vars = JMeterContextService.getContext().getVariables();
        String first = context.getParameter("a"); //获取jmeter传递的参数
        String second = context.getParameter("b");
        Integer a = Integer.parseInt(first);
        Integer b = Integer.parseInt(second);
        try {
            vars.put("result", String.valueOf(t.add(a,b))); //jmeter参数变量名称
            s.setSamplerData("参数a:"+first+"\t参数b:"+second); //设置请求的数据,在查看结果树中可以看到
            s.setResponseCode("200");
            s.setResponseMessage("Success"); //没这个请求会变红
            s.setSuccessful(true);
            s.sampleEnd();
            return s;
        }catch (Exception e){
            e.printStackTrace();
        }
        s.setResponseCode("500");
        s.setResponseMessage("fail");
        return s;
    }
    public Arguments getDefaultParameters() {
        //提取jmeter传递的参数
        Arguments args = new Arguments();
        args.addArgument("a", "");
        args.addArgument("b", "");
        System.out.println("get Arguments");
        return args;
    }
}3.2.2.4打好的jar包放入jmeter:/lib/ext 下
打开jmeter,此方法即为新加的java请求

返回此java请求的结果

四、总结
在本文中,我们详细介绍了如何在JMeter中发送Java请求,包括使用JMeter内置的Java请求处理器和编写自定义的Java代码来实现复杂的请求。
通过本文的教程,读者应该能够掌握JMeter发送Java请求的基本步骤和技巧。为了更好地理解和应用这些知识,建议读者在实际项目中尝试使用JMeter进行Java请求的发送,并根据实际情况进行调整和优化。
总而言之,JMeter是一款强大的性能测试工具,能够帮助开发人员和测试人员模拟真实用户的行为,对应用程序进行全面的性能测试。掌握JMeter发送Java请求的方法和技巧,将有助于提高软件质量和用户体验。希望本文能够为您提供有益的指导,祝您在性能测试领域取得更好的成果!


















