1. 程式人生 > >介面測試 dubbo 介面測試技術

介面測試 dubbo 介面測試技術

dubbo是什麼

dubbo是阿里巴巴開源的一套rpc方案,以為理念很契合微服務,這幾年很火,使用者裡面不凡京東,噹噹,去哪兒等大公司。
rpc場景


dubbo架構

官網也提供了一個很簡單實用的demo來演示dubbo協議的使用,用起來的確很簡單強大。

dubbo demo

基於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配置之外,官方也提供了一份直接通過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之類的位元組碼分析框架即可自動生成介面測試用例模板了。

dubbo測試的技術關注點

  • dubbo支援很多的協議,如果用的是http或者hessian協議,他們本身是文字的,可以直接使用restassured框架進行介面測試
  • dubbo的registry儲存了dubbo各種服務的註冊資訊,測試的時候可以直接用registry,而不是直接連線到提供服務的provider上