【Jmeter测试】使用Java请求进行Dubbo接口的测试
如何构建一个Dubbo接口测试的通用框架(https://github.com/nitibu/jmeter-dubbo-test)
从上面的流程我们可以看出,测试类大致的一个结构:
- 使用json文件来构造测试数据
- java程序只对json文件进行解析
- 接口调用成功后,用json文件中的期望数据来对接口返回数据进行比对,判断调用是否成功
json文件的定义
- {
- "Connection": {
- "URL": "101.219.255.73:50883",
- "SERVICE_NAME": "com.company.mdapi.sdk.material.export.MaterialApiService",
- "VERSION": "1.0.0",
- "METHOD": "queryUnboundListByPage",
- "HELPCLASS": "com.utils.common.helper.MaterialApiService.QueryUnboundListByPageHelper"
- },
- "Random": false,
- "Args": {
- "sourceSystem": 2,
- "querySourceSystem": null,
- "materialCode": "MD_S6006",
- "materialName": null,
- "materialType": null,
- "pkId": null,
- "shipperCode": "ZA01",
- "storageCenterCode": "HZA1",
- "pager": {
- "page": 1,
- "rows": 5,
- "totalCount": null,
- "pageOffset": null,
- "sort": "ID",
- "order": "ASC",
- "totalPage": null,
- "pageCode": 7,
- "startPageIndex": null,
- "endPageIndex": null,
- "previewPage": null,
- "nextPage": null
- }
- },
- "Verify": false
- }
参数具体定义:
- Connection:Dubbo服务的地址URL、服务名称SERVICE_NAME、版本号VERSION、远程接口调用的方法METHOD、
数据转化处理的辅助类HELPCLASS。 - Random:用来是能随机数设置,压力测试类似Add数据库操作时可以绕过数据库预设好的唯一性校验。
- Args:调用接口时,传入的参数,这里提供的参数需要在辅助类中转换成接口参数,然后调用接口。
- Verify:保留值,暂无使用
Java程序实现数据转换及接口调用
- 辅助的Help类,需要继承SampleHelper类,同时实现其中的两个抽象方法readJsonFile和callRemoteMethod,
分别用来读取json配置文件和调用远程方法(实际测试人员只需要实现这两个方法就可以进行Dubbo接口测试)。
- public class AddMaterialListHelper extends SampleHelper<Result<List<FailData>>> {
- public static final String[] RANDOM_FIELD = {"materialCode","materialName"};
- @Override
- public Map<String, Object> readJsonFile(String jsonPath) {
- JsonParser parser = new JsonParser();
- try {
- JsonObject json=(JsonObject) parser.parse(new FileReader(jsonPath));
- Map<String, Object> values = new HashMap<String, Object>();
- UtilsHelper.getInstance().getConnectionArgument(values, json);
- JsonObject args=json.get("Args").getAsJsonObject();
- if (!args.get("data").isJsonNull()) {
- String jsonArray = args.get("data").getAsJsonArray().toString();
- //TODO
- Gson gson = new Gson();
- @SuppressWarnings("serial")
- List<MaterialInterfaceDTO> dtoList = gson.fromJson(jsonArray,
- new TypeToken<List<MaterialInterfaceDTO>>() {
- }.getType());
- RandomNum.setRandom(json , RANDOM_FIELD , dtoList);
- values.put("data", dtoList);
- }
- if (!args.get("sourceSystem").isJsonNull()) {
- values.put("sourceSystem", new Integer(args.get("sourceSystem").getAsInt()));
- }
- return values;
- } catch (JsonIOException e) {
- e.printStackTrace();
- } catch (JsonSyntaxException e) {
- e.printStackTrace();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- }
- return null;
- }
- @Override
- public Result<List<FailData>> callRemoteMethod(Object object, Map<String, Object> values) {
- MaterialInterfaceService service = (MaterialInterfaceService) object;
- @SuppressWarnings("unchecked")
- Result<List<FailData>> callResult = service.addMaterialList (
- (int) values.get("sourceSystem"),
- (List<MaterialInterfaceDTO>) values.get("data"));
- return callResult;
- }
- }
- 这里有个注意点,由于个博主所在的团队把接口参数封装成了一个可序列化的class类,所以需要进行数据转化,有些公司的
接口参数直接传json字符串,那么只需要把json转换为字符串进行传参就可以。参数封装为序列化的class类:
- public class MaterialInterfaceDTO implements Serializable {
- private static final long serialVersionUID = -3725469669741557392L;
- private String materialCode;
- private String materialName;
- private Integer materialType;
- private Integer importFlag;
- private String sixNineCode;
- private Long expirationDate;
- private Long packingSpecification;
- private String basicUnit;
- private String minSaleUnit;
- private String basicUnitName;
- private String minSaleUnitName;
- private String materialImageUrl;
- private Integer transportFlag;
- private Integer sourceSystem;
- private String createName;
- private String updaterName;
- public MaterialInterfaceDTO() {
- }
- public String getMaterialCode() {
- return this.materialCode;
- }
- public void setMaterialCode(String materialCode) {
- this.materialCode = materialCode;
- }
- public String getMaterialName() {
- return this.materialName;
- }
- public void setMaterialName(String materialName) {
- this.materialName = materialName;
- }
- public Integer getMaterialType() {
- return this.materialType;
- }
- 在init中通过java反射机制,获取json配置文件中设置好的辅助类的对象,然后在runTest中调用对应辅助类中
callRemoteMethod,返回的结果解析后放到SampleResult的responeData,用来在jmeter中使用后置处理器进行
结果判断。- package com.utils.common;
- import com.alibaba.dubbo.config.ApplicationConfig;
- import com.alibaba.dubbo.config.ReferenceConfig;
- import com.google.gson.JsonObject;
- import com.google.gson.JsonParser;
- 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.Map;
- public class RunMethodTest extends AbstractJavaSamplerClient {
- private static String JMX_PATH = null;
- private static String TAG = Thread.currentThread().getStackTrace()[1].getClassName();
- private SampleHelper helper = null;
- private Map<String, Object> values = null;
- private Map<String, Object> config = UtilsHelper.getInstance().getConfigProperties();
- private String ARGS_FILE;
- private Object object;
- public void setupTest(){
- //定义测试初始值,setupTest只在测试开始前使用
- System.out.println("setupTest");
- }
- public void init() {
- // 当前应用配置
- ApplicationConfig application = new ApplicationConfig();
- application.setName(TAG);
- // 获取具体参数配置路径
- if ("true".equals(config.get("DEBUG").toString())) {
- JMX_PATH = ARGS_FILE;
- } else {
- JMX_PATH = UtilsHelper.getInstance().getScriptPath(config.get("SCRIPT_HOME").toString(), ARGS_FILE);
- }
- Map<String, Object> helpArgs = UtilsHelper.getInstance().getHelpClassAndMethod(JMX_PATH);
- helper = (SampleHelper)UtilsHelper.getInstance().invokeStaticMethodByReflect(
- (String) helpArgs.get("HELPCLASS"),
- (String) helpArgs.get("HELPMETHOD")
- ) ;
- values = helper.readJsonFile(JMX_PATH);
- // 注意:ReferenceConfig为重对象,内部封装了与注册中心的连接,以及与服务提供方的连接
- // 引用远程服务,配置dubbo服务版本、服务名称、url地址
- ReferenceConfig reference = new ReferenceConfig(); // 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏
- reference.setApplication(application);
- reference.setTimeout(20000);
- reference.setVersion(values.get("conn_version").toString());
- reference.setInterface(values.get("conn_service_name").toString());
- reference.setUrl(values.get("conn_url").toString());
- // 和本地bean一样使用xxxService
- object = reference.get(); // 注意:此代理对象内部封装了所有通讯细节,对象较重,请缓存复用\
- }
- public SampleResult runTest(JavaSamplerContext arg0) {
- SampleResult sr = new SampleResult(); ;
- try {
- //获取参数
- ARGS_FILE = arg0.getParameter("ARGS_FILE");
- //dubbo初始化
- init();
- //jmeter结果对象
- // sr.setSampleLabel(TAG);
- sr.sampleStart();
- sr.setSuccessful(true);
- String res = helper.handleResult(helper.callRemoteMethod(object, values));
- sr.sampleEnd(); // jmeter 结束统计响应时间标记
- if (res != null) {
- JsonObject response = new JsonParser().parse(res).getAsJsonObject();
- System.out.println("\n*************测试返回值****************\n");
- System.out.print(response.toString()+"\n");
- if (response.get("code").getAsInt() != 0) {
- sr.setSuccessful(false);
- }
- sr.setResponseData(response.toString(), "UTF-8");
- // if (null != response.get("data")) {
- // sr.setResponseData(response.get("data").toString(), "UTF-8");
- // System.out.print(response.get("data").toString()+"\n");
- // } else if (null != response.get("result")) {
- // sr.setResponseData( response.get("result").toString(), "UTF-8");
- // }
- } else {
- System.out.print("handleResult return null\n");
- }
- } catch (Exception e) {
- e.printStackTrace();
- sr.setResponseCode("999");
- sr.setResponseMessage(e.getMessage());
- sr.setSuccessful(false);
- }
- return sr;
- }
- public Arguments getDefaultParameters(){
- //参数定义,显示在前台,也可以不定义
- Arguments params = new Arguments();
- params.addArgument("ARGS_FILE", "");
- return params;
- }
- public void teardownTest(JavaSamplerContext arg0){
- super.teardownTest(arg0);
- }
- }
【Jmeter测试】使用Java请求进行Dubbo接口的测试的更多相关文章
- jmeter中实现java请求实战日志
view code public class JdbcInsert implements JavaSamplerClient { // 全局变量 PreparedStatement pstmt; Co ...
- 性能测试十一:jmeter进阶之java请求
使用Java编写JDBC脚本对Mysql进行增删改查等操作的性能测试 使用Jmeter提供的脚本框架依赖的jar包(分别在jmeter目录下的lib和ext目录下) ApacheJMeter_core ...
- 想要测试Dubbo接口?测试的关键点在哪里?
Dubbo接口如何测试? 这个dubbo如何测试,dubbo接口测试什么玩意儿? RPC的有一个类型,叫Dubbo接口. 那这个接口如何测试?测试的关键点在哪里? 这个面试问题,我觉得大家可能就有 ...
- Java面向对象作业-用接口方式测试向下转型
Java面向对象作业-用接口方式测试向下转型 根据视频的里实例 我们直接修改Test2测试方法: package com.java1234.chap03.sec13; public class Tes ...
- 【JMeter】JMeter完成一个java请求的压测
先定义一下我说的remoteService:即远程调用服务,没有http的url.不对外提供或者对外提供有限的服务.具体视各公司的代码架构所定,比如有些公司为web工程,scf服务,db.scf即为服 ...
- jmeter之自定义java请求性能测试
一.环境准备 1.新建一个java工程 2.导入jar包:ApacheJMeter_core.jar ApacheJMeter_java.jar ...
- 【转】JMeter完成一个java请求的压测
JMeter完成java请求的压力测试详解以及问题总结 原文地址:http://www.cnblogs.com/zhaoxd07/p/4895224.html 作者:KK_Yolanda 这篇文 ...
- java反射调用dubbo接口
需求:项目增加幂等 场景:1.三个项目:a .b.c2.a项目加幂等3.b项目dubbo调用项目a的时候超时没有获取返回结果,增加重试机制(非立即重试,3min or 5min 后重试)4.c项目是一 ...
- 性能测试十二:jmeter进阶之java请求参数化
如项目中的ip.端口号之类的,都可以在此代码中定义 public Arguments getDefaultParameters() { // TODO Auto-generated method st ...
随机推荐
- leetcode300. Longest Increasing Subsequence 最长递增子序列 、674. Longest Continuous Increasing Subsequence
Longest Increasing Subsequence 最长递增子序列 子序列不是数组中连续的数. dp表达的意思是以i结尾的最长子序列,而不是前i个数字的最长子序列. 初始化是dp所有的都为1 ...
- Basic Classifiers and Loss Functions
Linear Classifier and Hing Loss (or Multiclass SVM Loss) Linear Mapping (Score function) Linear Clas ...
- Git--查看,删除,添加远程分支
1. 查看远程分支: $ git branch -a 2. 删除远程分支: $ git push origin --delete <branch name> 或者 git push --d ...
- ZooKeeper系列(2)--基于ZooKeeper实现简单的配置中心
ZooKeeper节点的类型分为以下几类: 1. 持久节点:节点创建后就一直存在,直到有删除操作来主动删除该节点 2. 临时节点:临时节点的生命周期和创建该节点的客户端会话绑定,即如果客户端会话失效 ...
- 工具 | Axure基础操作 No.6
这个是基础教程最后一篇,但是这仅仅是个开始,需要学的东西还有很多.坚持! 1.生成部分原型页面 不能单独生成子级的页面,会自动的勾选上父级.如果想单独的生成的话,就得把这个页面的级别提高,变成一级页面 ...
- PyCharm 2018最新激活码通用
通用:Window.Mac.Ubantu都稳定有效,关键是这种激活方式不会产生其他影响 缺点:需要修改hosts文件 **1.修改hosts文件**将 0.0.0.0 account.jetbrain ...
- Maven插件的简介,安装及在eclipse中配置
1.Maven简介 1.Maven介绍 Maven是一个基于项目对象模型(POM:project object model)的概念的纯java开发的开源的项目管理工具.Maven把我们的工程抽像一个对 ...
- jquery file upload使用
<!-- jquery file upload相关js --> <script src="/js/jquery-file-upload/js/jquery.ui.widge ...
- 同步工具类-----循环栅栏:CyclicBarrier
import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; impor ...
- 将select的默认小三角替换成别的图片,且实现点击图片出现下拉框选择option
最近做项目,要求修改select下拉框的默认三角样式,因为它在不同浏览器的样式不同且有点丑,找找网上也没什么详细修改方法,我就总结一下自己的吧. 目标是做成下图效果: 图一:将默认小三角换成红圈的三角 ...