乾貨 | Dubbo 介面測試技術,測試開發進階必備
Dubbo 介面測試為霍格沃茲測試學院特色課程,全網深度領先,想一起系統進階的同學文末加群交流。
Dubbo 是什麼?
Dubbo 是阿里巴巴開源的一套 RPC 方案,因為理念很契合微服務,這幾年很火,使用者裡面不凡京東,噹噹,去哪兒等大公司。
RPC 場景
Dubbo 架構
官網也提供了一個很簡單實用的 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"?>
<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 之類的位元組碼分析框架即可自動生成介面測試用例模板了。
Tips | Dubbo 測試的技術關注點
Dubbo 支援很多的協議,如果用的是 HTTP 或者 Hessian 協議,他們本身是文字的,可以直接使用 RESTAssured 框架進行介面測試;
Dubbo 的 Registry 儲存了 Dubbo 各種服務的註冊資訊,測試的時候可以直接用 registry,而不是直接連線到提供服務的 provider 上;
更多技術文章分享及測試資料點此獲取
相關文章
- 軟體測試技術乾貨丨舉個例子告訴你,未開發完成的介面該如何測試
- 介面測試進階篇
- 使用 MeterSphere 進行 Dubbo 介面測試
- 服務端測試開發必備技能:Mock測試服務端Mock
- 開發必備之單元測試
- 面向開發的測試技術(二):效能測試
- 高階測試工程師必備技術:用Git版本控制自動化測試程式碼工程師Git
- 專案必備技術之單元測試
- 測試開發必備技能:安全測試漏洞靶場實戰
- 初步瞭解URL(介面測試必備)
- 技術乾貨:關於效能測試面試題及答案面試題
- 【編測編學】介面測試必備面試題必背(下)面試題
- 【編測編學】介面測試必備面試題(上)面試題
- Jmeter實現 Dubbo介面測試JMeter
- 推薦一款技術人必備的介面測試神器:ApifoxAPI
- 如何編寫介面測試用例?測試工程師必備技能!工程師
- 測試開發之效能篇-JMeter介面測試JMeter
- 測試進階高薪人才必備,分享Selenium自動化測試課程影片(23集)高薪
- Web測試乾貨總結Web
- 面向開發的測試技術(三):Web自動化測試Web
- 【Bugly 技術乾貨】Android開發必備知識:為什麼說Kotlin值得一試AndroidKotlin
- 技術乾貨 | AB測試和灰度釋出探索及實踐
- 軟體測試工程師必備技工程師
- 開發人員必備的技能——單元測試
- 軟體測試技術-黑盒測試
- 測試人必須瞭解的軟體測試流程及5大測試過程模型,經典乾貨分享!模型
- Apifox 6.7.4 中文版 一款技術人必備的介面測試神器API
- 介面測試怎麼進行,如何做好介面測試
- 乾貨分享▏軟體效能測試包括哪些測試內容?
- 面向開發的測試技術(一):MockMock
- 介面測試,負載測試,併發測試,壓力測試區別負載
- 軟體測試必備 - 14個介面與自動化測試練習網站網站
- 介面測試測試流程
- 測試開發工程必備技能之一:Mock的使用Mock
- 技術必備:推薦一款介面自動化測試資料校驗神器
- 介面測試--獲取動態引數進階
- 乾貨分享丨3種SQL語句最佳化方法,軟體測試必備!SQL
- 《QTP自動化測試進階》準備加印!QT