• 【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方法,将测试元件属性值设置回图形化组件,示例代码如下:

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

    效果

    总体效果

    配置元件效果

    取样器效果

    最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

    在这里插入图片描述

    软件测试面试小程序

    被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

    涵盖以下这些面试题板块:

    1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux

    6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础

    这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

  • 相关阅读:
    按关键字搜索淘宝/天猫商品
    springboot+教学工作量管理系统 毕业设计-附源码221541
    JDK1.8中的Stream流源码中的常用方法全面解析附代码演示及源码展示
    下列软件包有未满足的依赖关系: libqt5svg5-dev : 依赖: libqt5svg5 (= 5.12.8-0ubuntu1) 但是它将不会被安装
    07MCM一位评委老师的意见及MIT取得特等奖的历程描述
    CTAmap 1.12版本2013年-2023年省市县矢量数据更新
    Java多线程-线程关键字(二)
    LIMIT和OFFSET分页性能差!今天来介绍如何高性能分页
    【java、微服务】MQ
    jmeter-11-Ant接口自动化及持续集成整合
  • 原文地址:https://blog.csdn.net/NHB456789/article/details/132668813