【JMeter】 二次开发插件开发 Dubbo 接口测试插件浅析

news2024/12/23 19:44:52

概述
在一些企业中,各类业务系统非常丰富,相互之间或对外提供很多的服务或接口
这些服务或接口中,有很多是需要强契约约束的,服务的提供方、服务的使用方必须遵守相同契约
这类服务最典型的就是RPC,其中应用广泛的有Dubbo、gRPC等
使用JMeter对这些RPC接口的测试,可以自定义插件来实现
由于Dubbo应用相对广泛,本文主要针对Dubbo的接口测试插件开发与实现进行介绍
需要掌握的基础知识
Java基础技术,像Java基础知识、面向对象、Maven等
Swing,Java基础的图形化技术,就要用于JMeter组件的界面元件绘制
JMeter常用组件,包括使用和对应的类、方法,比较典型的配置元件、取样器
Dubbo,要掌握Dubbo的原理、开发、部署及调用规则,才能较好的进行JMeter插件的开发;尤其是要了解****Dubbo泛化调用的编程。
开发步骤
1、开发配置元件(Config Element)
主要配置Dubbo注册服务地址(一般是Zookepper、Nacos等),超时时间等一些通用配置

继承AbstractConfigGui类,在此类中实现一系列方法,使用Swing绘制界面、并将界面输入框内容保存到JMeter全局数据,具体如下:

getStaticLabel方法,用于返回配置元件名称,示例代码如下:

@Override
public String getStaticLabel() {
    return "Dubbo基础配置";
}

getLabelResource方法,获取组件资源名称,用于多语言,可忽略,示例代码如下:

@Override
public String getLabelResource() {
    return this.getClass().getSimpleName();
}

configure方法,将测试元件属性值设置回图形化组件,示例代码如下:

@Override
public void configure(TestElement element) {
super.configure(element);
//将配置值设置回当前Swing组件
if (element instanceof ConfigTestElement) {
ConfigTestElement configTestElement = (ConfigTestElement) element;
this.txtDubboAddress.setText(configTestElement.getPropertyAsString(DUBBO_ADDRESS_KEY));
this.txtNamespace.setText(configTestElement.getPropertyAsString(NAMESPACE_KEY));
this.txtGroup.setText(configTestElement.getPropertyAsString(GROUP_KEY));
this.txtProtocol.setText(configTestElement.getPropertyAsString(PROTOCOL_KEY));
this.txtTimeout.setText(configTestElement.getPropertyAsString(TIMEOUT_KEY));
}
}
 

createTestElement方法,创建测试元件对象,该对象属性值会在测试计划或线程组内共享,示例代码如下:

@Override
public TestElement createTestElement() {
//创建测试元件对象,该对象的属性值会在测试计划或线程组内共享
ConfigTestElement configTestElement = new ConfigTestElement();
//修改测试元件对象
modifyTestElement(configTestElement);
return configTestElement;
}
 

modifyTestElement方法,修改测试元件对象,主要是将Swing组件输入的值保存到测试元件对象,示例代码如下:

@Override
public void modifyTestElement(TestElement testElement) {
super.configureTestElement(testElement);
//将Swing组件输入的值保存到测试元件
testElement.setProperty(DUBBO_ADDRESS_KEY,this.txtDubboAddress.getText());
testElement.setProperty(NAMESPACE_KEY,this.txtNamespace.getText());
testElement.setProperty(GROUP_KEY,this.txtGroup.getText());
testElement.setProperty(PROTOCOL_KEY,this.txtProtocol.getText());
testElement.setProperty(TIMEOUT_KEY,this.txtTimeout.getText());
}
 

clearGui方法,清理图形化界面,示例代码如下:

@Override
public void clearGui() {
super.clearGui();
//设置图形化界面组件初始值
this.initGuiValues();
}

2、开发取样器(Sampler)
主要配置单个Dubbo接口测试用例的独特配置,包括接口地址、请求参数、响应数据处理等

分别继承自AbstractSampler、AbstractSamplerGui抽象类,使用Swing绘制界面、并将界面输入框内容保存到JMeter全局数据

重写父类AbstractSampler逻辑和方法

定义与界面相关的取样器数据缓存Key,示例代码如下:

/**
* 服务接口属性Key,用于与DubboSamplerGui共享输入的文本值
*/
public static final String INTERFACE_KEY = "interface_key";

sample方法,执行取样器,示例代码如下

public class DubboSampler extends AbstractSampler{    
//1、定义取样器返回对象
    SampleResult sampleResult = new SampleResult();
 
    //2、设置取样器标题
    sampleResult.setSampleLabel(this.getPropertyAsString("TestElement.name"));
 
    //3、开始取样
    sampleResult.sampleStart();
 
    //4、从GUI获取输入值,获取从DubboSamplerGui传递过来的输入值
    String inf = this.getPropertyAsString(INTERFACE_KEY);
    //...
 
    //5、加工输入数据,使用输入数据构造业务数据
    DubboInvokeEntity dubboInvokeEntity = new DubboInvokeEntity();
    //...
 
    //6、执行或调用自定义的业务逻辑
    Object result = DubboInvokeUtil.invoke(dubboInvokeEntity);
 
    //7、将业务逻辑返回值设置到返回对象
    sampleResult.setResponseData(JSON.toJSONString(result), StandardCharsets.UTF_8.name());
 
    //8、结束并返回
    sampleResult.setDataType(SampleResult.TEXT);
    //结束取样器
    sampleResult.sampleEnd();
    //标识为成功
    sampleResult.setSuccessful(true);
 
    return sampleResult;
}

重写父类AbstractSamplerGui逻辑与方法

定义Swing组件引用,定义与界面相关的Swing组件,可选,示例代码如下:

/**
* 接口名称文本框
*/
private JTextField txtInterface;
 
//...,多个Swing组件,可进行类似定义

构造方法,进行界面和默认值的初始化,示例代码如下:

public DubboSamplerGui(){
    super();
    //初始化图形化界面
    this.initGui();
    //初始化图形化界面默认值
    this.initGuiValues();
}

getStaticLabel方法,定义取样器名称,示例代码如下:

@Override
public String getStaticLabel() {
    return "Dubbo请求";
}

getLabelResource方法,定义组件资源名称,一般用于多语言资源,使用默认实现,示例代码如下:

@Override
public String getLabelResource() {
    return this.getClass().getSimpleName();
}

configure方法,配置方法,将测试元件取样器缓存的属性值设置回图形化组件,示例代码如下:

@Override
public void configure(TestElement element) {
super.configure(element);
 
if (element instanceof DubboSampler) {
//将Sampler的数据回写GUI,因为一个测试任务下有多个GUI,使用不同的Sampler
DubboSampler sampler = (DubboSampler) element;
this.txtInterface.setText(sampler.getPropertyAsString(DubboSampler.INTERFACE_KEY));
//...
}
}
 

createTestElement方法,创建测试元件对象,该对象的属性值会在测试计划或线程组内共享,示例代码如下:

@Override
public TestElement createTestElement() {
//创建测试元件对象,该对象的属性值会在测试计划或线程组内共享
DubboSampler dubboSampler = new DubboSampler();
//修改测试元件对象
this.modifyTestElement(dubboSampler);
 
return dubboSampler;
}

modifyTestElement方法,修改测试元件对象,主要是将Swing组件输入的值保存到测试对象,示例代码如下:

@Override
public void modifyTestElement(TestElement testElement) {
//配置取样器对象
super.configureTestElement(testElement);
 
if (testElement instanceof DubboSampler) {
DubboSampler dubboSampler = (DubboSampler) testElement;
//将Swing组件输入的值保存到测试元件
dubboSampler.setProperty(DubboSampler.INTERFACE_KEY,this.txtInterface.getText());
//...
}
}
 

clearGui方法,清理图形化界面,示例代码如下:

@Override
public void clearGui() {
super.clearGui();
//设置图形化界面组件初始值
this.initGuiValues();
}

initGui方法,自定义方法,主要是使用Swing组织取样器的界面元素,示例代码如下:

private void initGui(){
//使用面板等对构造第1步定义的Swing组件,进行合理布局
//...
}

initGuiValues方法,初始化图形化界面Swing输入组件默认值,示例代码如下:

private void initGuiValues() {
this.txtInterface.setText("com.lemon.demo.dubbo.inf.service.IUserService");
//...
}

3、在JMeter中使用

将开发项目打包的.jar包拷贝到JMeter的lib/ext目录

重新启动JMeter

在配置元件、取样器中将会发现Dubb基础配置、Dubbo请求两个插件

效果

总体效果

 配置元件效果

 取样器效果

【2023性能测试完整版】这可能是B站讲得最好的软件测试课程(Jmeter 接口测试实战 Loadrunner Tomcat综合教程)软件测试面试、自动化测试。_哔哩哔哩_bilibili【2023性能测试完整版】这可能是B站讲得最好的软件测试课程(Jmeter 接口测试实战 Loadrunner Tomcat综合教程)软件测试面试、自动化测试。共计173条视频,包括:1.性能场景收集与分析、2.压测脚本编写及调试、3.脚本执行等,UP主更多精彩视频,请关注UP账号。http://

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/638490.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文读懂,WAF阻止恶意攻击的8种方法

WAF(Web 应用程序防火墙)是应用程序和互联网流量之间的第一道防线,它监视和过滤 Internet 流量以阻止不良流量和恶意请求,WAF 是确保 Web 服务的可用性和完整性的重要安全解决方案。 它通过充当保护 Web 应用程序服务器免受恶意客…

属性和方法

类的属性 变量:1,按照数据类型来分基本数据类型,引用数据类型 2,按照变量在类中声明的位置不同:成员变量(属性)、局部属性(方法内,构造器内,代码块内等&…

android 如何分析应用的内存(六)

android 如何分析应用的内存(六) 接上文,本系列文章,最重要的部分——————对native堆内存的分析,即将上演 分成六大板块: 手动实现,new和delete,以及malloc和freee&#xff0…

LVS+Keepalived负载均衡高可用群集(往事清零,万事顺意)

一、Keepalived高可用详解 1.应用场景 在企业应用中,单台服务器承担应用存在单点故障的危险。单点故障一旦发生,企业服务将发生中断,造成极大的危害。所以需要群集实现高可用性,保证服务稳定。 2.介绍和原理简介 Keepalived是…

【JAVA开发环境配置】 卸载JDK很简单, 一分钟帮你搞定!

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享博主 🐋 希望大家多多支持一下, 我们一起进步!😄 🏅 如果文章对你有帮助的话,欢迎评论 💬点赞&#x1…

中科三方:DNS云解析技术浅析

智能DNS云解析通过其智能解析,健康监测,负载均衡,宕机切换等高可用性的功能特性,给客户带来快捷,安全,流畅的上网体验。传统的DNS因为其解析时间冗长,易被劫持,无法精准调配用户的流…

【jupyter notebook】Anaconda prompt查询版本包(已安装的包列表、可以安装的包列表)

目录 0.环境介绍 1.查询当前已安装的某包信息 2.查询某包的所有版本 3.查看已安装的各个包的版本 0.环境介绍 windows Anaconda 1.查询当前已安装的某包信息 信息包含包名和版本,以包【matplotlib】为例 conda list matplotlib 2.查询某包的所有版本 conda s…

playwright-自动化测试

这里写目录标题 安装运行记录操作执行脚本 安装 (1)安装Playwright依赖库(Playwright支持Async\Await语法,故需要Python3.7) pip install playwright (2)安装Chromium、Firefox、WebKit等浏览…

【Unity Shader】平面投影实现阴影

介绍 球体和立方体挂载下面这个shader,就是多渲染一个阴影投影到y0的平面上 // shader,放在需要显示阴影的对象上 Shader "Custom/PlanarShadow1" {Properties{_Instensity("Shininess", Range(2, 4)) 2.0 //光照强度_Diffuse(&…

Mac下自定义快捷键

1、系统偏好设置-键盘-快捷键-App快捷键 2、确定要对什么进行自定义 比如 我要对DBeaver的运行自定义,我个人喜欢用cmd r 3、添加App快捷键 注意,菜单标题就是应用里的,必须要一模一样,哪怕是空格都不能少。也不能多。 4、对…

在Excel中如何筛选五笔码表?

你可以按照以下步骤筛选五笔码表中的简词: 1. 在 Excel 中打开五笔码表,选中需要筛选的数据列。 2. 点击“数据”选项卡中的“筛选”按钮,在下拉菜单中选择“高级筛选”。 3. 在弹出的“高级筛选”对话框中,选择“复制到其他位置…

什么是MBR/UEFI/GPT?MBR与UEFI具体区别是什么?

一、什么是MBR MBR是Master Boot Record(主引导记录)的缩写,是存储在计算机硬盘的第一个扇区(通常是第0个扇区)中的一个特殊的引导扇区。 MBR包含了启动计算机所需的信息,例如分区表、引导程序等。当计算机…

Python的接口自动化-unittest测试框架和ddt数据驱动

目录 引言 一、unittest测试框架 二、ddt数据驱动 引言 在编写接口自动化用例时,我们一般针对一个接口建立一个.py文件,一条接口测试用例封装为一个函数(方法),但是在批量执行的过程中,如果其中一条出错…

#include < > 和#include ” ”有什么区别?

C语言头文件 C语言中头文件的扩展名为 .h的头文件,头文件中包含了函数的声明和宏定义,头文件可以被多个源文件引用。在C语言中有两种类型的头文件,一种是编译器自带的头文件,另一种就是程序员自己编写的头文件。 在C程序中如果要使…

package和import关键字的使用

package(包) package,称为包,用于指明该文件中定义的类、接口等结构所在的包。 8.1.1 语法格式 package 顶层包名.子包名 ; 包的作用 • 包可以包含类和子包,划分项目层次,便于管理 • 控制访问权限 import(导入) 为了使用定…

python基础知识(十三):numpy库的基本用法

目录 1. numpy的介绍2. numpy库产生矩阵2.1 numpy将列表转换成矩阵2.2 numpy创建矩阵 3. numpy的基础运算4. numpy的基础运算25. 索引 1. numpy的介绍 numpy库是numpy是python中基于数组对象的科学计算库。 2. numpy库产生矩阵 2.1 numpy将列表转换成矩阵 import numpy as …

中国人民大学与加拿大女王大学金融硕士——不断充实自己的知识库

在职场我们总是悄无声息的崩溃又悄无声息的自愈。别人拥有的,只要努力,你也会拥有。真正的成功源于生命里的学习,成长和热爱,以及不停步。一直前向走就是巅峰,中国人民大学与加拿大女王大学金融硕士助力我们在职提升。…

锂电池移动电源等电信终端产品配套用电源适配器/充电器产品纳入CCC范围

2023年8月1日起,以下三类产品纳入CCC认证范围: 1、便携式产品用锂离子电池和电池组(0915) 2、移动电源(0914) 3、电信终端产品配套用电源适配器/充电器(0807, 0907) 以上文章来源网络,如有涉及侵权,请联系删除!我们一直…

部署Alertmanager对prometheus监控检测飞书报警通知

告警效果 一、编写alertmanager.yml 创建个目录存放alertmanager.yml文件 mkdir -p /data/alertmanager vi alertmanager.ymlroute:group_by: [alertname]group_wait: 30sgroup_interval: 30srepeat_interval: 1mreceiver: web.hook receivers:- name: web.hookwebhook_confi…

独立站买家必知的支付方式优缺点_FP独立站卖家必知的安全收款方式

做独立站该怎么收款是卖家首要考虑,除去衡量费用是否有潜在费用,更重要的能否符合消费者的付款习惯,销售的产品不同市场不同,所用到的收款方式也不相同。那么独立站的支付方式都有哪些呢?他们各有什么优缺点&#xff1…