Jmeter技巧 - Java请求实战

通过Jmeter进行Java接口压测往往需要对ApacheJMeter_java进行二次开发,对ApacheJMeter_java进行扩展。此篇内容适合于RPC接口测试等。

1、JAVA测试代码编写

1.1、创建测试项目

此章节自行实践

1.2、引入相关依赖包

1.2.1、引入jmeter依赖包

<dependency>
<groupId>org.apache.jmetergroupId>
<artifactId>ApacheJMeter_coreartifactId>
<version>3.3version>
dependency>
<dependency>
<groupId>org.apache.jmetergroupId>
<artifactId>ApacheJMeter_javaartifactId>
<version>3.3version>
dependency>

1.2.2、引入hsf依赖包

<dependency>
    <groupId>com.taobao.hsfgroupId>
    <artifactId>hsf-app-springartifactId>
    <version>2.2.4.9version>
dependency>

<dependency>
    <groupId>com.taobao.hsfgroupId>
    <artifactId>hsf-registry-configserverartifactId>
    <version>2.2.4.9version>
dependency>

1.2.3、引入被测试hsf接口依赖包

<dependency>
    <groupId>com.alibaba.gdsgroupId>
    <artifactId>gds-sparta-modelartifactId>
    <version>1.6.20-SNAPSHOTversion>
dependency>
<dependency>
    <groupId>com.autonavi.frameworkgroupId>
    <artifactId>amap-data-framework-logs-slf4jartifactId>
    <version>2.1-SNAPSHOTversion>
dependency>

1.3、编写测试代码

新建测试类,该类必须继承AbstractJavaSamplerClient类或实现JavaSamplerClient接口,需要重写以下方法:

//设置入参,已设置的参数会显示在jmeter GUI的参数列表中
public Arguments getDefaultParameters();

//初始化方法,用于初始化性能测试的每个线程,每个线程前都会执行一次。
public void setupTest(JavaSamplerContext context);

//性能测试的线程运行体,测试执行主体,从arg0中获取参数,并调用被测方法,完成与服务器的交互。
//该方法是java Sampler实现的重点,执行次数取决于线程数和循环次数。
public SampleResult runTest(JavaSamplerContext arg0);

//测试结束时调用,每个线程执行一次。setupTest和teardownTest方法不需要时可以不写。
public void teardownTest(JavaSamplerContext arg0);

以上4个方法中只有runTest是必须实现的,其他3个可根据需求去覆盖。如果需要对多个方法进行性能测试,则需要建多个测试类。

sampleResult的sampleStart和sampleEnd方法调用时会分别生成一个时间戳,两个时间戳之差就是一次java请求的响应时间,单位是ms。

代码编写完成后,可以写一个main方法对整个过程进行测试。

mport com.alibaba.rpc.api.TransactionWebApiService;
import com.alibaba.rpc.api.args.TransQueryReqArgs;
import com.autonavi.framework.hsf.response.Result;
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.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * 数据获取接口性能测试,jmeter
 */
public class GetDataPerformersTest extends AbstractJavaSamplerClient {

    private TransactionWebApiService transactionWebApiService;

    /**
     * JMeter界面中展示出此方法所设置的默认参数
     * @return 返回默认参数
     */
    @Override
    public Arguments getDefaultParameters(){
        Arguments args = new Arguments();

        args.addArgument("hsfServer", "com.alibaba.rpc.api.TransactionWebApiService");
        args.addArgument("hsfGroup", "HSFQA3");
        args.addArgument("hsfVersion", "1.0.0.DAILY");

        args.addArgument("taskId", "");
        args.addArgument("queryType", "1");

        return args;
    }

    @Override
    public void setupTest(JavaSamplerContext context){
        // 获取JMeter中输入的用户参数
        String hsfServer = context.getParameter("hsfServer");
        String hsfGroup = context.getParameter("hsfGroup");
        String hsfVersion = context.getParameter("hsfVersion");
        transactionWebApiService = TransactionWebApi.getServerAPI(hsfServer,hsfGroup,hsfVersion);
    }

    @Override
    public void teardownTest(JavaSamplerContext context){
        System.exit(0);
    }

    @Override
    public SampleResult runTest(JavaSamplerContext context) {
        // 创建SampleResult对象,用于记录执行结果的状态,并返回
        SampleResult sampleResult = new SampleResult();

        // 获取JMeter中输入的用户参数
        String taskId = context.getParameter("taskId");
        String queryType = context.getParameter("queryType");

        // 开始
        sampleResult.sampleStart();

        //调用被测试的接口
        List layerList = new ArrayList<>();
        layerList.addAll(Arrays.asList(layers.split(",")));

        TransQueryReqArgs transQueryReqArgs = new TransQueryReqArgs();
        transQueryReqArgs.setTransId(Long.parseLong(taskId));
        transQueryReqArgs.setQueryType(Integer.parseInt(queryType));

        Result> result=transactionWebApiService.getData(transQueryReqArgs);

        // 结束
        sampleResult.sampleEnd();

        sampleResult.setSuccessful(result.isSuccess());
        sampleResult.setResponseCode(String.valueOf(result.getCode()));
        sampleResult.setResponseData(result.toString(),null);

        // 返回
        return sampleResult;
    }

    public static void main(String[] args) {
        Arguments params = new Arguments();
        params.addArgument("hsfServer", "com.alibaba.rpc.api.TransactionWebApiService");
        params.addArgument("hsfGroup", "HSFQA2");
        params.addArgument("hsfVersion", "1.0.0.DAILY");
        params.addArgument("queryType", "1");
        params.addArgument("taskId", "994588036");
        params.addArgument("tileId", "");
        params.addArgument("recoverId", "");

        JavaSamplerContext arg0 = new JavaSamplerContext(params);
        GetDataPerformersTest test = new GetDataPerformersTest();
        test.setupTest(arg0);
        test.runTest(arg0);
        test.teardownTest(arg0);
    }

1.4、代码调试及结果展示的一些有用信息

1.4.1、日志

代码中的log.info,将在jmeter的日志信息中进行展示,但要注意日志输出不要放在sampleStart和sampleEnd之间,以免影响性能结果的正确性,示例代码中未实现,大家可以自行实现。

1.4.2、测试结果树中信息输出

sampleResult.setResponseCode(“200”); 
sampleResult.setResponseMessage(“成功测试”); 
sampleResult.setSampleLabel(“样式1”); //示例中并没有实现,大家可以自行实现。

results.setSamplerData(“请求参数”+str1) //示例中并没有实现,大家可以自行实现。 

results.setResponseData(“响应结果”, null); 

1.5、完成编译打包

1.5.1、打包时不要把依赖包一起打入Jar包,否则jmeter不能识别被测试的方法。
1.5.2、idea打包配置如下(这里使用idea本身的编译工具进行编译打包,需要使用其他方式的可以自行研究)
第一步:选择File -> project structure…

第二步:选择Artifacts 点击 + 选择 JAR -> From modules with dependencies…

第三步:选择要打包的Module,选择 Jarfiles from libraries 为第二项 copy to the output directory and link via manifest,并选择存MANIFEST.MF文件的位置(建议放在resources下),不用选Main Class。

第四步:在Output Layout 选项卡下 建立一个文件夹,将所有的依赖文件拖放到文件夹中。

第五步:在Output Layout 选项卡下选择将要打包的JAR包的名字,并在弹出的配置中,配置Class path,修改所有依赖包的相对路径。

第六步:确认或者修改编译输出目录(建议使用默认目录)并勾选 include in project build。

第七步:代码调试并测试通过代码, 点击Idea 的build菜单,完成代码编译。

2、jmeter性能测试脚本编写

1.1、jmeter版本确认

1.2、将编译的jar包及依赖包放在jmeter的 lib/ext 目录下(不同版本略有区别,笔者的目录为libexec\lib\ext)。

1.3、运行jmeter,建立一个的测试。

1.4、添加线程组,并设定好线程组参数

1.5、在线程组下添加Java请求,选择要测试的接口,并配置好参数。

1.6、在线程组下添加语料文件,并配置好语料文件参数。

1.7、在线程组下添加响应断言,根据返回的的结果进行断言。

1.8、调试脚本,调试时可增加查看结果树,正式压测时,请删除此组件。

3、使用施压机进行性能测试

3.1 关于施压机1

很多时候我们本地的机器的配置(cpu, 内存, 带宽等)都不足以进行灰度环境的压测,又或者本地机器无法连接灰度环境的原因,在实际压测过程中都要有施压机。

3.2 施压机扩展

更进一步,可以做一个工具对Jmeter进行封装。该工具能够根据需求来分配施压机,同时又可以直接运行jmeter脚本进行压测。

你可能感兴趣的:(自动化测试,开发语言-Java,Java)