接口参数为map_干货 | Dubbo 接口测试技术,测试开发进阶必备(附源码)

Dubbo 是什么?

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

RPC 场景

22fe56aa00aca71b0755cdabdbb9e5d5.png

Dubbo 架构

3505e262dea14ead4bd83230fba75292.png

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

Dubbo demo

首页的例子已经很好了。可参考 http://Dubbo.io/

下面介绍几种常用的 Dubbo 接口测试方法。

基于 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"?>

通过使用一份 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 配置之外,官方也提供了一份直接通过 API 进行配置的方式,这个方式无疑是可编程比较灵活的。

  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 之类的字节码分析框架即可自动生成接口测试用例模板了。

Tips | Dubbo 测试的技术关注点

  • Dubbo 支持很多的协议,如果用的是 HTTP 或者 Hessian 协议,他们本身是文本的,可以直接使用 RESTAssured 框架进行接口测试;
  • Dubbo 的 Registry 保存了 Dubbo 各种服务的注册信息,测试的时候可以直接用 registry,而不是直接连接到提供服务的 provider 上;

(文章来源于霍格沃兹测试学院)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值