Jmeter测试Java接口

一、背景

        现在有一个java的sdk,我想测试sdk接口的性能,因为这不是一个http请求,我无法直接使用jmeter的http请求取样器去进行测试,这时就需要使用jmeter的java请求取样器,他需要我们编写java代码来实现调用逻辑,jmeter来帮助我们去实际调用,我们依然可以使用其汇总结果或其他取样器来测试接口的性能指标,类似的需求还有当接口是自定义的tcp接口时也可以采用此种方式。

二、使用步骤

1.导入依赖(Maven项目)

        在pom文件中添加如下依赖

        <dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>ApacheJMeter_java</artifactId>
            <version>5.5</version>
        </dependency>

2.编写代码

        创建一个测试类,继承抽象类AbstractJavaSamplerClient类,实现抽象方法runTest,该方法即为jmeter实际调用的功能测试方法,该抽象类还有其他默认实现的方法,在下方示例代码中做了简单的解释供参考。

package com.fkp.jmeter.test;

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;

import java.nio.charset.StandardCharsets;

public class TestDemo extends AbstractJavaSamplerClient {

    private String name;
    private int age;

    /**
     * 定义默认的参数,在jmeter中会自动显示在这里定义的默认参数
     * @return Arguments对象
     */
    @Override
    public Arguments getDefaultParameters() {
        Arguments arguments = new Arguments();
        arguments.addArgument("name", "zhangsan");
        arguments.addArgument("age", "24");
        return arguments;
    }

    /**
     * 在执行测试之前执行,只执行一次,可以获取传递过来的参数,一般用来做初始化操作
     * @param context 可以获取jmeter传递过来的参数
     */
    @Override
    public void setupTest(JavaSamplerContext context) {
        //对成员变量初始化
        name = context.getParameter("name");
        age = context.getIntParameter("age");
    }

    /**
     * 真正的测试代码块,jmeter按照配置的逻辑执行该方法
     * @param javaSamplerContext 上下文对象,可以获取jmeter传递的参数
     * @return SampleResult对象用于封装结果
     */
    @Override
    public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
        SampleResult sr = new SampleResult();
        //设置标签
        sr.setSampleLabel("testDemo");
        //设置开始标志,否则无法统计tps等
        sr.sampleStart();
        try {
            //执行业务逻辑
            String data = "name: " + name + ", age: " + age;
            sr.setResponseCodeOK();
            sr.setResponseData(data, StandardCharsets.UTF_8.displayName());
            sr.setSuccessful(true);
        }catch (Throwable e){
            e.printStackTrace();
            sr.setResponseCode("500");
            sr.setResponseData(e.getMessage(), StandardCharsets.UTF_8.displayName());
            sr.setSuccessful(false);
        }finally {
            sr.sampleEnd();
        }
        return sr;
    }

    /**
     * 测试完成后执行,一般用于关闭资源
     * @param context 上下文对象,可用于获取jmeter传递的参数
     */
    @Override
    public void teardownTest(JavaSamplerContext context) {
        System.runFinalization();
    }
}

3.打包

        可以是普通的JavaSE项目、Maven项目、SpringBoot项目,重点在于需要将项目打成jar包且满足以下结构。

xxx.jar

        META-INF  #元数据信息

                MANIFEST.MF  #记录打包的环境

        com  #完整的包目录结构,编译后的class文件

                fkp

                        xxx.class  #测试类

                        xxx.class  #测试类

注意:xxx.jar包中不要存在依赖的jar包,如果打包后结构不是这样可以手动调整为这个结构

 4.上传到jmeter中

将打包后的程序jar包(这里成为demo.jar)上传到jmeter根目录下的lib/ext目录下

将demo.jar依赖的jar包放到jmeter根目录下的lib目录下

5.使用jmeter进行测试

打开jmeter -> 添加线程组 -> 添加java请求取样器  ->  添加结果树(汇总报告等)

在java请求取样器中可以选择demo.jar中继承了AbstractJavaSamplerClient的测试类,选中后即可看到请求的默认参数(如果有的话),之后就和测试http接口相同了。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值