文/張圓冰
隨著軟件技術(shù)架構(gòu)發(fā)展,軟件系統(tǒng)的復(fù)雜程度也越來(lái)越高。傳統(tǒng)的單體應(yīng)用架構(gòu)耦合度高,設(shè)計(jì)、開發(fā)、部署為一個(gè)整體的單元,部分更新都需要重新部署整個(gè)應(yīng)用。隨著應(yīng)用功能升級(jí),維護(hù)、升級(jí)、新增功能都會(huì)變得越來(lái)越困難,很難以敏捷研發(fā)模式進(jìn)行開發(fā)和發(fā)布,進(jìn)而導(dǎo)致軟件功能升級(jí)效率低下。所以微服務(wù)架構(gòu)應(yīng)運(yùn)而生。微服務(wù)的顆粒比較小,一個(gè)大型復(fù)雜軟件應(yīng)用由多個(gè)微服務(wù)組成,每種服務(wù)只做一件事,是一種松耦合的能夠被獨(dú)立開發(fā)和部署的無(wú)狀態(tài)化服務(wù)(獨(dú)立擴(kuò)展、升級(jí)和可替換),不同服務(wù)通過(guò)一些輕量級(jí)交互機(jī)制來(lái)通信,最終構(gòu)建出實(shí)現(xiàn)完整功能的軟件系統(tǒng)。
微服務(wù)這種細(xì)粒度的特性,為功能升級(jí)帶來(lái)便利的同時(shí),給軟件測(cè)試提出了較大的挑戰(zhàn)。主要體現(xiàn)在兩方面:
(1)微服務(wù)架構(gòu)將服務(wù)拆分成數(shù)量眾多的接口,大量接口的快速迭代需要良好的自動(dòng)化測(cè)試體系予以支撐;
(2)不同服務(wù)接口之間開發(fā)獨(dú)立,但又需要彼此通信,因此單接口的測(cè)試,如何避開外部接口變動(dòng)的影響,也是需要思考的。本文主要就這兩方面問(wèn)題進(jìn)行了探索和實(shí)踐。
圖1:整體應(yīng)用架構(gòu)示意圖
圖2:微服務(wù)架構(gòu)示意圖
微服務(wù)架構(gòu)是相對(duì)傳統(tǒng)軟件架構(gòu)而言的。傳統(tǒng)軟件架構(gòu)可以看成一個(gè)完整的單元。一般由用戶界面,后臺(tái)服務(wù)端應(yīng)用和數(shù)據(jù)庫(kù)三層結(jié)構(gòu)組成。服務(wù)端應(yīng)用是完整的,是一個(gè)單獨(dú)的的邏輯執(zhí)行;數(shù)據(jù)庫(kù)是由許多表構(gòu)成一個(gè)通用的、相互關(guān)聯(lián)的數(shù)據(jù)管理系統(tǒng)。應(yīng)用服務(wù)程序接收客戶端輸入,計(jì)算處理后檢索并更新數(shù)據(jù)庫(kù)中數(shù)據(jù)。這是一種自然而然的構(gòu)建系統(tǒng)的思路,所有的功能實(shí)現(xiàn)模塊都集合在一起,通過(guò)負(fù)載均衡將多個(gè)應(yīng)用部署到多臺(tái)服務(wù)器上。傳統(tǒng)架構(gòu)在長(zhǎng)期以來(lái)的軟件架構(gòu)設(shè)計(jì)中被廣泛使用,并獲得成功。整體應(yīng)用架構(gòu)示意圖如圖1所示。
但是,隨著軟件快速迭代要求提升,以及云部署技術(shù)的廣泛使用,整體應(yīng)用程序面臨著變更應(yīng)用程序的一小部分,卻要求整個(gè)應(yīng)用重新構(gòu)建和部署的問(wèn)題。隨著時(shí)間的推移,很難再保持一個(gè)好的模塊化結(jié)構(gòu),使得一個(gè)模塊的變更很難不影響到其它模塊。所以,以服務(wù)為單元拆分整體架構(gòu),形成一個(gè)個(gè)單獨(dú)功能模塊,可以獨(dú)立部署與修改,即我們通常說(shuō)的微服務(wù)架構(gòu)逐漸出現(xiàn)并為一些行業(yè)先行者應(yīng)用到軟件系統(tǒng)設(shè)計(jì)中來(lái)。微服務(wù)架構(gòu)傾向圍繞業(yè)務(wù)功能的組織來(lái)分割服務(wù),在這個(gè)功能模塊中涉及到的技術(shù)、數(shù)據(jù)存儲(chǔ)、用戶體驗(yàn)等都劃歸到該微服務(wù)設(shè)計(jì)者需要考慮的范圍內(nèi)。如圖2所示。
目前常見的微服務(wù)設(shè)計(jì)都是會(huì)采用一些分布式服務(wù)框架,這些框架從通信協(xié)議上分為兩種:公共標(biāo)準(zhǔn)的HTTP協(xié)議和基于私有的RPC調(diào)用協(xié)議。公共標(biāo)準(zhǔn)的HTTP協(xié)議有一些成熟的自動(dòng)化測(cè)試工具可以使用,本文主要介紹使用RobotFramework工具設(shè)計(jì)實(shí)現(xiàn)的基于HTTP接口的微服務(wù)自動(dòng)化測(cè)試框架。
Robot Framework(以下簡(jiǎn)稱RF)最初是由 Nokia Networks 公司開發(fā)的一個(gè)開源自動(dòng)化測(cè)試框架,框架基于 Python語(yǔ)言實(shí)現(xiàn),包含豐富的測(cè)試工具及測(cè)試庫(kù),同時(shí)具有很強(qiáng)的擴(kuò)展性。RF框架通過(guò)集成不同的測(cè)試工具,可以進(jìn)行各種自動(dòng)化測(cè)試。微服務(wù)HTTP接口的測(cè)試,就是采用了RF內(nèi)置的RequestsLibrary庫(kù)中,Post Request、Get Request等方法進(jìn)行進(jìn)一步設(shè)計(jì)和封裝。封裝時(shí),為了適用于普遍的HTTP接口,將微服務(wù)接口IP,URL地址,POST方法傳遞的報(bào)文,HTTP報(bào)文header,以及身份驗(yàn)證等信息作為參數(shù)開放。POST類型接口封裝的關(guān)鍵字示例如圖3所示。
圖3:POST類型的HTTP接口調(diào)用封裝
圖4:用例中使用此關(guān)鍵字
在組織自動(dòng)化用例時(shí),采用數(shù)據(jù)與關(guān)鍵字分離的策略。將使用到的參數(shù)和報(bào)文體放在參數(shù)文件中,在用例中引用此參數(shù)文件獲取參數(shù)值,用例中不展示參數(shù)正文,只見參數(shù)名稱。這樣組織用例的好處在于,只需要維護(hù)一份參數(shù)文件,如果接口定義或報(bào)文正文有變化,可以在文件中直接修改即可,無(wú)需大量修改用例?!?{params}”“&{interface}”都是字典類型的數(shù)據(jù)存儲(chǔ)方式,可存儲(chǔ)多個(gè)IP、URL鏈接等;${data}是定義在參數(shù)文件中的報(bào)文正文。按照這種思路封裝關(guān)鍵字和組織自動(dòng)化用例,用例步驟基本都固定,便于測(cè)試人員大規(guī)模構(gòu)建用例。用例如圖4所示。
由于微服務(wù)架構(gòu)中彼此服務(wù)之間是獨(dú)立的,可自行組織開發(fā)、測(cè)試、上線等活動(dòng),但是彼此之間又存在通信調(diào)用關(guān)系。一個(gè)微服務(wù)接口開發(fā)過(guò)程中,某些功能的測(cè)試可能需要與其他服務(wù)通信,但其他服務(wù)可能不具備測(cè)試條件,所以微服務(wù)測(cè)試中需要用到Mock的思想。Mock是指在測(cè)試中,測(cè)試系統(tǒng)通過(guò)構(gòu)造一系列符合預(yù)定義規(guī)則的模擬對(duì)象(Mock Object)來(lái)與被測(cè)試單元進(jìn)行交互,從而判斷被測(cè)試單元在正常邏輯,異常邏輯或壓力情況下能夠正常工作,返回預(yù)期的輸出結(jié)果。Mock的使用需要配合一些已有工具,定義被調(diào)用方的模擬服務(wù)名、URL等,再配置相應(yīng)的匹配規(guī)則和返回?cái)?shù)據(jù)即可。Mock規(guī)則定義需要注意的是,不同規(guī)則需要設(shè)計(jì)唯一的關(guān)鍵字,當(dāng)報(bào)文中具有這一關(guān)鍵字時(shí)會(huì)匹配到這個(gè)規(guī)則對(duì)應(yīng)的返回?cái)?shù)據(jù),如關(guān)鍵字不唯一則會(huì)出現(xiàn)不同報(bào)文都返回同一數(shù)據(jù)的情況,造成測(cè)試結(jié)果的失真。Mock使用時(shí)需要在被測(cè)服務(wù)內(nèi)部,配置模擬對(duì)象信息,在調(diào)用時(shí),只要發(fā)送報(bào)文匹配到了Mock中的規(guī)則,即可獲取到返回報(bào)文,達(dá)到忽略其他服務(wù)真實(shí)情況即可完成測(cè)試的目的,便于自動(dòng)化測(cè)試用例的順利執(zhí)行。
本文在對(duì)現(xiàn)行通用的軟件系統(tǒng)微服務(wù)架構(gòu)學(xué)習(xí)的基礎(chǔ)上,基于RobotFramework工具設(shè)計(jì)了用于微服務(wù)測(cè)試的自動(dòng)化測(cè)試框架,并結(jié)合Mock測(cè)試思想,在微服務(wù)互相調(diào)用時(shí)采用了模擬報(bào)文返回的方式,使得自動(dòng)化測(cè)試能獨(dú)立執(zhí)行,不受外部服務(wù)干擾,提高了測(cè)試效率。目前此自動(dòng)化框架已經(jīng)用于基于HTTP接口的微服務(wù)測(cè)試中,為功能的快速迭代起到了保障作用。