Dubbo 接口自动化测试技能-高阶自动化测试

一、前言

微服务架构全面流行背景下, Dubbo 接口测试是大型互联网公司测试开发工程师必备技能

二、Dubbo 是什么?

Dubbo 是阿里巴巴开源的一套 RPC 方案,因为理念很契合微服务,这几年很火,用户里面不乏京东、当当、去哪儿等大公司
RPC 场景

 

Dubbo 架构 

 

官网也提供了一个很简单实用的 Demo 来演示 Dubbo 协议的使用,用起来的确很简单强大

Dubbo Demo
官网首页的例子已经很好了,可参考:dubbo.io/

三、基于 telnet 的简单调试接口
任何一个 Dubbo 服务都支持一个简单的 telent 交互

比如:

telnet localhost 20880
>ls -l
> ls -l DemoService
> invoke DemoSerivce.sayHello("seveniruby") 

这种方式只能用来简单验证接口的可用

四、传统的基于 XML 配置的 Dubbo 的测试方法

首先创建一个 XML 文件放到 resources 下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:Dubbo="http://code.alibabatech.com/schema/Dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/Dubbo http://code.alibabatech.com/schema/Dubbo/Dubbo.xsd">
    <Dubbo:application name="demo-consumer"/>
    <Dubbo:registry address="Dubbo://127.0.0.1:9090"/>
    <Dubbo:reference id="demoService" interface="com.testerhome.tapi.Dubbo.DemoService"/>
</beans> 

通过使用一份 XML 配置文件进行测试:

test("Dubbo use registy xml"){
    val context = new ClassPathXmlApplicationContext("Dubbo/consumer.xml")
    context.start()
    val demoService = context.getBean("demoService").asInstanceOf[DemoService]
    println(demoService.sayHello("seveniruby"))

    val req=new RequestModel()
    req.setName("james")
    req.getChild.setName("lily")
    println(TData.toJson(demoService.reqModel(req)))
  } 

五、基于 API 的 Dubbo 测试方法

其实除了 XML 配置之外,官方也提供了一份直接通过 XML 进行配置的方式,这个方式无疑是可编程、比较灵活的

test("Dubbo use registry"){
    // 当前应用配置
    val application = new ApplicationConfig
    application.setName("yyy")

    // 注意:ReferenceConfig 为重对象,内部封装了与注册中心的连接,以及与服务提供方的连接

    // 引用远程服务
    val reference = new ReferenceConfig[DemoService] // 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏
    reference.setApplication(application)
    reference.setRegistry(registry); // 多个注册中心可以用 setRegistries()
    reference.setInterface(classOf[DemoService])
    //reference.setUrl("Dubbo://127.0.0.1:20881")
    reference.setTimeout(5000)

    // 和本地 bean 一样使用 DemoService
    val DemoService = reference.get // 注意:此代理对象内部封装了所有通讯细节,对象较重,请缓存复用
    System.out.println(DemoService.sayHello("seveniruby"))

    val req=new RequestModel()
    req.setName("james")
    req.getChild.setName("lily")
    System.out.println(TData.toJson(DemoService.reqModel(req)))
  } 

六、泛化调用

官方原话是:

泛化接口调用方式主要用于客户端没有 API 接口及模型类元的情况,参数及返回值中的所有 POJO 均用 Map 表示,通常用于框架集成,比如:实现一个通用的服务测试框架,可通过 GenericService 调用所有服务实现

这种情况适合自己打造接口测试框架使用。以上 2 个方式都需要依赖研发提供的 Dubbo 接口的 jar 包,这无疑会增加项目的负担

使用泛化可以不依赖任何研发提供的 jar 包,不过缺点也明显,仍然需要 jar 包或者其他的文档去分析 Dubbo 接口的调用参数信息

举个例子:

test(" 泛化调用 by provider conf use map"){

    var reference = new ReferenceConfig[GenericService]() // 该实例很重量,里面封装了所有与注册中心及服务提供方连接,请缓存
    reference.setGeneric(true) // 声明为泛化接口
    reference.setApplication(new ApplicationConfig("generic-provider"))
    //reference.setRegistry(registry)
    reference.setInterface("com.testerhome.tapi.Dubbo.DemoService") // 弱类型接口名
    reference.setTimeout(5000)
    reference.setUrl(s"Dubbo://127.0.0.1:20881")

    val genericService = reference.get
    val result = genericService.$invoke("sayHello", Array("java.lang.String"), Array("xxxx".asInstanceOf[AnyRef]))
    log.info(result)

    val childMap= mutable.Map[String, AnyRef]()
    childMap.put("name", "children")
    val map= mutable.Map[String, AnyRef]()
    map.put("name", "aaa")
    map.put("id", "11")
    map.put("child", childMap.asJava)

    val resModel=genericService.$invoke(
      "reqModel",
      Array("com.testerhome.tapi.Dubbo.RequestModel"),
      Array(map.asJava.asInstanceOf[AnyRef]))
    log.info(resModel)
    log.info(TData.toJson(resModel))
  } 

虽然看起来还是依赖 jar 包,不过这个依赖就挺小了。如果你技术稍微 “猥琐” 点,就应该可以想到,只需要借助 asm 之类的字节码分析框架即可自动生成接口测试用例模板了

七、Dubbo 测试的技术关注点

Dubbo 支持很多的协议,如果用的是 http 或者 hessian 协议,他们本身是文本的,可以直接使用 restassured 框架进行接口测试

Dubbo 的 registry 保存了 Dubbo 各种服务的注册信息,测试的时候可以直接用 registry,而不是直接连接到提供服务的 provider 上

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

 

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取   

Doe 发布 [V1.0.0] 前段时间排查某问题的时候,想要快速知道某些dubbo接口(三无)的响应结果,但不想启动项目(因为这些项目不是你负责的,不会部署而且超级笨重),也不想新建一个dubbo客户端项目(占地方),也不想开telnet客户端连接口(麻烦而且有限制)。所以扣了dubbo的netty模块源码,封装了个收发客户端集成一个工具,可以快速调试dubbo接口。源码地址:https://github.com/VIPJoey/doe 极简模式 普通模式 目录结构 mmc-dubbo-api 接口项目,主要用于测试。 mmc-dubbo-provider dubbo提供者项目,主要用于测试。 mmc-dubbo-doe 主项目,实现dubbo接口调试。 deploy 部署文档 功能特性 极简模式:通过dubbo提供的telnet协议收发数据。 普通模式:通过封装netty客户端收发数据。 用例模式:通过缓存数据,方便下一次操作,依赖普通模式。 增加依赖:通过调用maven命令,下载jar包和热加载到系统,主要用来分析接口方法参数,主要作用在普通模式。 依赖列表:通过分析pom文件,展示已经加载的jar包。 其它特性 springboot 整合 redis,支持spring el 表达式。 springboot 整合 thymeleaf。 springboot 整合 logback。 netty rpc 实现原理。 开发环境 jdk 1.8 maven 3.5.3 dubbo 2.6.1 lombok 1.16.20 idea 2018 windows 7 安装步骤 安装jdk 安装maven,并设置好环境变量,仓库目录。 进入mmc-dubbo-api目录,执行mvn clean install命令,省api的jar包。 进入mmc-dubbo-doe目录,执行mvn clean install 命令,在target目录生成dubbo-doe-1.0.0-RELEASE.jar 在F盘(可以任意盘)创建目录F:\app\doe 把dubbo-doe-1.0.0-RELEASE.jar拷贝到F:\app\doe 把deploy目录中的所有文件拷贝到F:\app\doe 如果您电脑安装了git bash,可以在bash窗口运行 ./deploy.sh start,否则如果没有安装git bash,只能打开cmd切换到F:\app\doe目录,然后执行java -jar dubbo-doe-1.0.0-RELEASE.jar --spring.profiles.active=prd 打开浏览器,访问地址:http://localhost:9876/doe/home/index 全剧终
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值