基于JMeter的Dubbo API自动化测试实战(三)

一、DubboTelnet插件介绍

由于JMeter并不支持Dubbo协议的接口调用,因此需要开发支持Dubbo协议的插件才能使用JMeter进行Dubbo接口的测试。DubboTelnet插件就是用于调用Dubbo接口的JMeter插件,调用的原理是通过telnet服务器invoke暴露的接口名称进行调用。

 

二、Dubbo接口的调用方式

目前调用Dubbo接口有以下三种方式:

1)通过telnet服务器invoke暴露的接口名称进行调用;

2)通过代码rpc进行调用;

3)Dubbo自2.6.0版本后,新增http服务,可通过http方式进行调用。

该系列实战针对第一种调用方式进行讲解。

 

三、DubboTelnet插件使用说明

请确保插件的jar包已放至JmeterHome/lib/ext目录下。

1. 添加插件

1)打开JMeter,在线程组(ThreadGroup)下右键添加Sampler - Java Sample;

2)在 Java Sample中类名称选择 org.apache.jmeter.samplers.DubboTelnet;

 

2. 插件参数说明

1)address为服务器telnet地址,格式为: ip:port,例如127.0.0.1:20880;

2)interface为接口名,一般为:className.methodName;

3)params为请求报文,一般为json格式的报文;

4)expection为预期结果,断言逻辑是根据接口响应报文是否包含 expection的值来设置该 sample成功或失败。

基于JMeter的Dubbo API自动化测试实战(三)

 

3. expection预期结果多条件断言

直接举个例子,例如响应报文为:

{"result":false,"success":true,"errorCode":null,"errorMsg":null}

此时我们想同时断言"result"和"success"的值,那么expection预期结果的值应为:

"result":false && "success":true

4. “与或非”表达式

1)“与”表达式:

"result":false && "success":true

2)“或”表达式:

"result":false || "success":true

3)“非”表达式:

! "success":true

以上三个表达式和“与或非”逻辑运算大同小异。

 

四、DubboTelnet插件源码分析

DubboTelnet插件需要利用JMeter的Java Sampler组件,只要继承AbstractJavaSamplerClient抽象类并实现以下四个方法:

1. getDefaultParameters()

/**
 * 设置需传参数名和默认值
 */
@Override
public Arguments getDefaultParameters() {
    Arguments params = new Arguments();
    params.addArgument("address", "");
    params.addArgument("interface", "");
    params.addArgument("params", "");
    params.addArgument("expection", "");
    return params;
}

 

2. setupTest(JavaSamplerContext ctx)

/**
 * 执行测试前的初始化操作
 */
@Override
public void setupTest(JavaSamplerContext ctx) {
    String[] address = ctx.getParameter("address").split(":");
    String ip = address[0];
    String port = address.length == 1 ? "0" : address[1];
    inf = ctx.getParameter("interface", "");
    initTelnet(ip, port);
}

 

3. runTest(JavaSamplerContext ctx)

/**
 * 测试方法主体
 */
@Override
public SampleResult runTest(JavaSamplerContext ctx) {
    String params = ctx.getParameter("params", "");
    String expection = ctx.getParameter("expection", "");
    String dubboResponse = "";


    boolean isSuccess = false;
    SampleResult result = new SampleResult();
    result.setEncodingAndType("UTF-8");
    result.setSamplerData(params);


    // 记录sample开始时间
    result.sampleStart();
    if (telnet != null) {
        // telnet连接成功则invoke报文
        dubboResponse = telnet.invokeDubbo(inf, params);
        // 预期结果判断
        isSuccess = getSuccessful(dubboResponse, expection);
    } else {
        // telnet连接失败输出报错信息
        dubboResponse = connectErrorMessage;
    }

    // 记录sample结束时间
    result.sampleEnd();
    result.setSuccessful(isSuccess);
    result.setResponseData(dubboResponse, "UTF-8");
    return result;
}

4. teardownTest(JavaSamplerContext ctx)

/**
 * 执行测试后的释放资源工作
 */
@Override
public void teardownTest(JavaSamplerContext ctx) {
    if (telnet != null) {
        telnet.disconnect();
    }
}

 

完整代码可到Github上查看:https://github.com/YeKelvin/jmeter-plugins/tree/master/samplers