Jmeter基于Java请求的二次开发(结合java代码测Dubbo接口)
本文具体可参考另一篇:Dubbon接口测试
主要功能:提供一个Java代码的执行sampler,可以通过编写javaSampler在执行jmeter本身不支持协议的性能测试
步骤一:编写工程时,引入jmeter的lib\ext目录下的jar包:
ApacheJMeter_components.jar
ApacheJMeter_core.jar
ApacheJMeter_java.jar
jorphan.jar
logkit.jar
avalon-framework-4.1.4.jar
以及引入服务提供者的代码jar包和依赖,没有的话让开发提供,如:user-service-provider-1.0-SNAPSHOT.jar (可参考dubbo环境搭建中的代码部分)
步骤二:二次开发代码
目录
模拟消费端,初始化数据,连接zookeeper
src/main/java/InitData.java
import com.alibaba.dubbo.config.*;
import com.alibaba.dubbo.config.utils.ReferenceConfigCache;
import gmall.bean.UserService;
public class InitData {
public static UserService getUserService(){
ApplicationConfig application = new ApplicationConfig();
application.setName("order-service-consumer");
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setAddress("127.0.0.1:2181");
//如果服务端没有设置分组参数,调用的时候也不需要设置分组
// registryConfig.setGroup("dubbo_test");
//指定dubbo使用的注册中心版本
registryConfig.setProtocol("zookeeper");
// 设置连接zookeeper的客户端
registryConfig.setClient("zkclient");
ReferenceConfig<UserService> referenceConfig = new ReferenceConfig<UserService>();
referenceConfig.setInterface(UserService.class);
referenceConfig.setTimeout(5000);
referenceConfig.setRetries(3);
referenceConfig.setVersion("*");
referenceConfig.setStub("gmall.bean.UserServiceStub");
ConsumerConfig consumerConfig = new ConsumerConfig();
consumerConfig.setCheck(false);
consumerConfig.setTimeout(5000);
MonitorConfig monitorConfig = new MonitorConfig();
monitorConfig.setProtocol("registry");
referenceConfig.setApplication(application);
referenceConfig.setRegistry(registryConfig);
referenceConfig.setConsumer(consumerConfig);
referenceConfig.setMonitor(monitorConfig);
//缓存referenceConfig,防止出现多个连接
ReferenceConfigCache cache = ReferenceConfigCache.getCache();
UserService userService = referenceConfig.get();
return userService;
}
}
调用服务端,运行相关测试用例
src/main/java/TestDubboSampler.java
import com.alibaba.dubbo.common.json.JSON;
import gmall.bean.UserAddress;
import gmall.bean.UserService;
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;
public class TestDubboSampler extends AbstractJavaSamplerClient {
UserService userService;
//初始化数据
@Override
public void setupTest(JavaSamplerContext context) {
userService = InitData.getUserService();
super.setupTest(context);
}
//设置入参
@Override
public Arguments getDefaultParameters() {
Arguments args = new Arguments();
args.addArgument("userId","2");
return args;
}
//执行用例
@Override
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
//获取入参
String user_id = javaSamplerContext.getParameter("userId");
UserAddress userAddress = userService.getUserAddressList(user_id).get(0);
//可查得出start_time至end_time的时间
long start = System.currentTimeMillis();
SampleResult result = SampleResult.createTestSample(start,System.currentTimeMillis());
//等同于
/*
SampleResult result = new SampleResult();
//开始统计响应时间
result.sampleStart();
//结束统计响应时间
result.sampleEnd();
*/
result.setSampleLabel("Dubbo-test");
result.setDataEncoding("utf-8");
result.setResponseCodeOK();;
//查看结果树的响应数据
result.setResponseData(userAddress.toString(),"utf-8");
//响应成功
result.setSuccessful(true);
return result;
}
//调试
public static void main(String[] args) {
TestDubboSampler tds = new TestDubboSampler();
Arguments argument = new Arguments();
argument.addArgument("userId", "2");
JavaSamplerContext jsc = new JavaSamplerContext(argument);
tds.setupTest(jsc);
tds.runTest(jsc);
}
}
步骤三:编辑相关测试代码,完成后,将编译好的代码打成jar包,放置在 /jmeter的lib/ext下
由于JmeterDubboTest中使用到了自己编写的gmall-interface,所以在打包前需要将gmall-interface-1.0-SNAPSHOT.jar上传到私有库中(JmeterDubboTest中依赖得下载地址),或者安装到自己的本地依赖下载仓库
1、将gmall-interface依赖下载到自己本地:
在控制台中运行以下语句
mvn install:install-file -Dfile="D:/Workspace/MyIdeaProjects/Dubbo-example-test/gmall-interface/target/gmall-interface-1.0-SNAPSHOT.jar" '-DgroupId=org.example' '-DartifactId=gmall-interface' '-Dversion=2.0-SNAPSHOT' '-Dpackaging=jar'
运行后可在本地仓库查看到gmall-interface,证明本地上传成功:
2、对JmeterDubboTest进行打包:mvn clean package
3、将JmeterDubboTest-1.0-SNAPSHOT.jar、gmall-interface-1.0-SNAPSHOT.jar 放置在 /jmeter的lib/ext下
步骤四:打开Jmeter,选择 TestDubboSampler,填写相关参数:userId 2 ,运行并查看结果树(注:服务端必须是可以调用成功的,意味着zookeeper、服务提供端都需要可连通)