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

420 篇文章 2 订阅
146 篇文章 0 订阅
概述
  • 在一些企业中,各类业务系统非常丰富,相互之间或对外提供很多的服务或接口
  • 这些服务或接口中,有很多是需要强契约约束的,服务的提供方、服务的使用方必须遵守相同契约
  • 这类服务最典型的就是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方法,将测试元件属性值设置回图形化组件,示例代码如下:

  1. @Override

  2. public void configure(TestElement element) {

  3. super.configure(element);

  4. //将配置值设置回当前Swing组件

  5. if (element instanceof ConfigTestElement) {

  6. ConfigTestElement configTestElement = (ConfigTestElement) element;

  7. this.txtDubboAddress.setText(configTestElement.getPropertyAsString(DUBBO_ADDRESS_KEY));

  8. this.txtNamespace.setText(configTestElement.getPropertyAsString(NAMESPACE_KEY));

  9. this.txtGroup.setText(configTestElement.getPropertyAsString(GROUP_KEY));

  10. this.txtProtocol.setText(configTestElement.getPropertyAsString(PROTOCOL_KEY));

  11. this.txtTimeout.setText(configTestElement.getPropertyAsString(TIMEOUT_KEY));

  12. }

  13. }

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

  1. @Override

  2. public TestElement createTestElement() {

  3. //创建测试元件对象,该对象的属性值会在测试计划或线程组内共享

  4. ConfigTestElement configTestElement = new ConfigTestElement();

  5. //修改测试元件对象

  6. modifyTestElement(configTestElement);

  7. return configTestElement;

  8. }

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

  1. @Override

  2. public void modifyTestElement(TestElement testElement) {

  3. super.configureTestElement(testElement);

  4. //将Swing组件输入的值保存到测试元件

  5. testElement.setProperty(DUBBO_ADDRESS_KEY,this.txtDubboAddress.getText());

  6. testElement.setProperty(NAMESPACE_KEY,this.txtNamespace.getText());

  7. testElement.setProperty(GROUP_KEY,this.txtGroup.getText());

  8. testElement.setProperty(PROTOCOL_KEY,this.txtProtocol.getText());

  9. testElement.setProperty(TIMEOUT_KEY,this.txtTimeout.getText());

  10. }

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

  1. @Override

  2. public void clearGui() {

  3. super.clearGui();

  4. //设置图形化界面组件初始值

  5. this.initGuiValues();

  6. }

2、开发取样器(Sampler)

主要配置单个Dubbo接口测试用例的独特配置,包括接口地址、请求参数、响应数据处理等

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

重写父类AbstractSampler逻辑和方法

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

  1. /**

  2. * 服务接口属性Key,用于与DubboSamplerGui共享输入的文本值

  3. */

  4. public static final String INTERFACE_KEY = "interface_key";

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

  1. public class DubboSampler extends AbstractSampler{

  2. //1、定义取样器返回对象

  3. SampleResult sampleResult = new SampleResult();

  4. //2、设置取样器标题

  5. sampleResult.setSampleLabel(this.getPropertyAsString("TestElement.name"));

  6. //3、开始取样

  7. sampleResult.sampleStart();

  8. //4、从GUI获取输入值,获取从DubboSamplerGui传递过来的输入值

  9. String inf = this.getPropertyAsString(INTERFACE_KEY);

  10. //...

  11. //5、加工输入数据,使用输入数据构造业务数据

  12. DubboInvokeEntity dubboInvokeEntity = new DubboInvokeEntity();

  13. //...

  14. //6、执行或调用自定义的业务逻辑

  15. Object result = DubboInvokeUtil.invoke(dubboInvokeEntity);

  16. //7、将业务逻辑返回值设置到返回对象

  17. sampleResult.setResponseData(JSON.toJSONString(result), StandardCharsets.UTF_8.name());

  18. //8、结束并返回

  19. sampleResult.setDataType(SampleResult.TEXT);

  20. //结束取样器

  21. sampleResult.sampleEnd();

  22. //标识为成功

  23. sampleResult.setSuccessful(true);

  24. return sampleResult;

  25. }

重写父类AbstractSamplerGui逻辑与方法

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

  1. /**

  2. * 接口名称文本框

  3. */

  4. private JTextField txtInterface;

  5. //...,多个Swing组件,可进行类似定义

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

  1. public DubboSamplerGui(){

  2. super();

  3. //初始化图形化界面

  4. this.initGui();

  5. //初始化图形化界面默认值

  6. this.initGuiValues();

  7. }

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方法,配置方法,将测试元件取样器缓存的属性值设置回图形化组件,示例代码如下:

 
  1. @Override

  2. public void configure(TestElement element) {

  3. super.configure(element);

  4. if (element instanceof DubboSampler) {

  5. //将Sampler的数据回写GUI,因为一个测试任务下有多个GUI,使用不同的Sampler

  6. DubboSampler sampler = (DubboSampler) element;

  7. this.txtInterface.setText(sampler.getPropertyAsString(DubboSampler.INTERFACE_KEY));

  8. //...

  9. }

  10. }

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

  1. @Override

  2. public TestElement createTestElement() {

  3. //创建测试元件对象,该对象的属性值会在测试计划或线程组内共享

  4. DubboSampler dubboSampler = new DubboSampler();

  5. //修改测试元件对象

  6. this.modifyTestElement(dubboSampler);

  7. return dubboSampler;

  8. }

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

  1. @Override

  2. public void modifyTestElement(TestElement testElement) {

  3. //配置取样器对象

  4. super.configureTestElement(testElement);

  5. if (testElement instanceof DubboSampler) {

  6. DubboSampler dubboSampler = (DubboSampler) testElement;

  7. //将Swing组件输入的值保存到测试元件

  8. dubboSampler.setProperty(DubboSampler.INTERFACE_KEY,this.txtInterface.getText());

  9. //...

  10. }

  11. }

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

  1. @Override

  2. public void clearGui() {

  3. super.clearGui();

  4. //设置图形化界面组件初始值

  5. this.initGuiValues();

  6. }

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

  1. private void initGui(){

  2. //使用面板等对构造第1步定义的Swing组件,进行合理布局

  3. //...

  4. }

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

  1. private void initGuiValues() {

  2. this.txtInterface.setText("com.lemon.demo.dubbo.inf.service.IUserService");

  3. //...

  4. }

3、在JMeter中使用

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

重新启动JMeter

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

效果

总体效果

配置元件效果

取样器效果

 总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

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

  • 23
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值