news 2026/2/7 15:14:03

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【JMeter】 二次开发插件开发 Dubbo 接口测试插件浅析

概述

  • 在一些企业中,各类业务系统非常丰富,相互之间或对外提供很多的服务或接口
  • 这些服务或接口中,有很多是需要强契约约束的,服务的提供方、服务的使用方必须遵守相同契约
  • 这类服务最典型的就是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方法,用于返回配置元件名称,示例代码如下:

  1. @Override

  2. public String getStaticLabel() {

  3. return "Dubbo基础配置";

  4. }

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

  1. @Override

  2. public String getLabelResource() {

  3. return this.getClass().getSimpleName();

  4. }

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请求两个插件

效果

总体效果

配置元件效果

取样器效果

最后作为一位过来人也是希望大家少走一些弯路,在这里我给大家分享一些软件测试的学习资料和我花了3个月整理的软件测试自学全栈,这些资料希望能给你前进的路上带来帮助。

视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/7 23:28:52

vue3中使用echarts实现3D饼图(组件封装)

前言 之前那篇文章已经实现3D饼图效果&#xff0c;这次只是在其基础上进行了简单的组件封装。详情请看vue3中用echarts达到3D饼图的实现 效果演示 添加无数据时占位盒子。&#xff08;自行根据ui设计更换样式&#xff09; 封装组件 Pie3D.vue组件 <template><divv-i…

作者头像 李华
网站建设 2026/2/4 9:45:45

基于单片机粮仓温湿度检测控制系统设计

一、系统总体设计方案 本粮仓温湿度检测控制系统以单片机为核心&#xff0c;搭配温湿度传感器、数据存储模块、报警模块及通风除湿执行模块&#xff0c;构建 “检测 - 分析 - 控制 - 反馈” 的闭环系统&#xff0c;旨在实时监控粮仓内温湿度变化&#xff0c;预防粮食霉变、虫害…

作者头像 李华
网站建设 2026/2/5 13:48:45

在学习SQL注入或XSS这类具体漏洞时,如何设计一个高效的“理论+实践”学习循环?

建立高效的“理论实践”循环&#xff0c;正是能否真正掌握SQL注入或XSS这类Web安全核心漏洞的分水岭。下面这个框架&#xff0c;希望能帮助您将知识转化为真实的攻防能力。学习阶段核心目标关键任务/方法推荐工具/环境① 靶场环境搭建​准备好一个安全、隔离的实验平台配置集成…

作者头像 李华
网站建设 2026/2/7 3:14:53

GPT-SoVITS模型灰盒测试方法:介于黑盒与白盒之间的验证策略

GPT-SoVITS模型灰盒测试方法&#xff1a;介于黑盒与白盒之间的验证策略 在智能语音技术飞速发展的今天&#xff0c;个性化语音合成已不再是实验室里的“未来构想”&#xff0c;而是逐步渗透进教育、媒体、无障碍服务等实际场景。然而&#xff0c;当一个模型仅用一分钟语音就能克…

作者头像 李华
网站建设 2026/2/6 12:47:56

15、WPF 控件换肤与主题开发指南

WPF 控件换肤与主题开发指南 在软件开发中,用户界面的美观性和可定制性越来越受到重视。Windows Presentation Foundation (WPF) 为开发者提供了强大的功能,使得创建高级控件和实现视觉效果变得更加容易。本文将深入探讨 WPF 中的控件换肤与主题相关知识。 1. 皮肤与主题概…

作者头像 李华
网站建设 2026/2/6 7:44:07

27、WPF性能优化与UI自动化指南

WPF性能优化与UI自动化指南 1. WPF性能优化 在WPF应用开发中,性能优化至关重要。以下是一些性能优化的关键要点: - 硬件命中测试 :硬件中的命中测试功能基于软件实现,当大量可点击模型可见时,CPU使用率常常会飙升。 - MeshGeometry3D优化 :MeshGeometry3D使用Poin…

作者头像 李华