基于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成功或失败。
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。