孟 燕
(杭州科技職業(yè)技術(shù)學(xué)院 信息工程學(xué)院,浙江 杭州 311402)
?
自動(dòng)化測(cè)試技術(shù)中Mock框架的建設(shè)與應(yīng)用
孟 燕
(杭州科技職業(yè)技術(shù)學(xué)院 信息工程學(xué)院,浙江 杭州 311402)
隨著商業(yè)應(yīng)用系統(tǒng)的增多,為了快速響應(yīng)用戶需求、加快版本交付、提高版本交付質(zhì)量,有必要采用自動(dòng)化測(cè)試來代替部分手工測(cè)試進(jìn)行項(xiàng)目質(zhì)量守護(hù)。自動(dòng)化測(cè)試分為面向界面的Watchman自動(dòng)化測(cè)試、面向后臺(tái)處理過程的Utplugin自動(dòng)化測(cè)試和面向單元測(cè)試的Junit自動(dòng)化測(cè)試,但缺乏面向接口的自動(dòng)化測(cè)試。聯(lián)機(jī)接口的存在,使得應(yīng)用系統(tǒng)可以實(shí)時(shí)訪問,快速對(duì)外提供業(yè)務(wù)反饋,但也加大了應(yīng)用耦合度,給自動(dòng)化測(cè)試帶來不便。為此,開展面向接口的Mock框架自動(dòng)化測(cè)試建設(shè),可以在測(cè)試中為應(yīng)用解耦、接口測(cè)試提供必要條件,從而豐富自動(dòng)化測(cè)試分層的框架,提高接口程序自動(dòng)化守護(hù)的質(zhì)量。
Mock;自動(dòng)化測(cè)試;應(yīng)用解耦
隨著商業(yè)應(yīng)用系統(tǒng)信息化水平的提高,為了滿足業(yè)務(wù)發(fā)展的需要,客戶對(duì)軟件產(chǎn)品研發(fā)規(guī)模和頻度的要求也越來越高。而傳統(tǒng)的測(cè)試方法只會(huì)在整個(gè)軟件開發(fā)完畢且代碼“凍結(jié)”后才進(jìn)行,加之耗時(shí)較長(zhǎng),不利于敏捷和迭代,約束了對(duì)業(yè)務(wù)需求的快速響應(yīng)。為此,筆者開展自動(dòng)化測(cè)試框架研發(fā)活動(dòng),旨在通過自動(dòng)化測(cè)試工具加快應(yīng)用開發(fā)成果集成,提高產(chǎn)品開發(fā)、測(cè)試的效率和質(zhì)量,形成有效質(zhì)量守護(hù)。在自動(dòng)化測(cè)試框架研發(fā)過程中發(fā)現(xiàn),隨著商業(yè)應(yīng)用系統(tǒng)復(fù)雜度和廣度不斷深入,為了支持各應(yīng)用系統(tǒng)的聯(lián)動(dòng),衍生了上下游接口的相互訪問,并形成了功能強(qiáng)大的全功能系統(tǒng)。在項(xiàng)目開發(fā)過程中,存在各種應(yīng)用內(nèi)部或外部的調(diào)用關(guān)系,甚至與第三方系統(tǒng)建設(shè)存在依賴關(guān)系,而本系統(tǒng)極其缺乏這類自動(dòng)化測(cè)試接口工具,為了降低日常研發(fā)測(cè)試的外部依賴程度,需要梳理接口自動(dòng)化測(cè)試工具M(jìn)ock的定義,明確Mock的建設(shè)目標(biāo)[1-3]。
通過Mock自動(dòng)化技術(shù)中使用虛擬對(duì)象來替代真實(shí)的對(duì)象,可以消除測(cè)試案例中對(duì)主機(jī)接口、第三方應(yīng)用和數(shù)據(jù)庫(kù)依賴等單節(jié)點(diǎn)的測(cè)試障礙,使開發(fā)人員或測(cè)試人員將精力集中在業(yè)務(wù)流程測(cè)試方面,從而更好地提高應(yīng)用系統(tǒng)測(cè)試質(zhì)量。
近年來,國(guó)內(nèi)外大型IT企業(yè)在Mock自動(dòng)化研究中取得了一系列快速突破,如2013年開源社區(qū)GITHUB推出了基于MIT協(xié)議的開源Java測(cè)試框架Mockito[4],Mockito試圖通過移除“期望規(guī)范”來去除期望-運(yùn)行-驗(yàn)證模式,因此使接口耦合度降到最低,這樣的突出特性簡(jiǎn)化了接口測(cè)試代碼,使其更容易閱讀和修改。 2014年6月,F(xiàn)acebook發(fā)布了一個(gè)Mock的開源工具Jest[5],用于快速、可靠地測(cè)試Web聊天應(yīng)用,對(duì)于每一個(gè)需要測(cè)試的功能,Jest基于所模擬的功能創(chuàng)建一個(gè)與真實(shí)模塊具有相同形狀的對(duì)象,并給出測(cè)試返回值。
Mock是指在測(cè)試一個(gè)對(duì)象A時(shí),系統(tǒng)構(gòu)造一些假的對(duì)象來模擬與A之間的交互,而這些Mock對(duì)象的行為是該系統(tǒng)事先設(shè)定且符合預(yù)期的。通過這些Mock對(duì)象來測(cè)試A在正常邏輯、異常邏輯或壓力情況下工作是否正常。引入Mock最大的優(yōu)勢(shì)在于:Mock的行為固定,其能確保當(dāng)訪問該Mock的某個(gè)方法時(shí)總是能夠獲得一個(gè)沒有任何邏輯直接返回的預(yù)期結(jié)果。Mock對(duì)象的優(yōu)點(diǎn)在于隔絕其他模塊出錯(cuò)引起本模塊的測(cè)試錯(cuò)誤,隔絕其他模塊的開發(fā)狀態(tài),只要定義好接口,不用管其開發(fā)是否完成。
本系統(tǒng)Mock建設(shè)的目標(biāo),首先必須是一個(gè)輕量的Web系統(tǒng),其不僅能支持應(yīng)答而且至少需要支持4個(gè)層次的服務(wù)提供與用戶擴(kuò)展,即協(xié)議層、解析層、匹配層和執(zhí)行引擎。其中,解析層提供常用的XML解析,用于解析接口報(bào)文交互用的XML報(bào)文;匹配層和執(zhí)行引擎能滿足個(gè)性化接口測(cè)試需求。當(dāng)某層能力不足時(shí),用戶可結(jié)合需求擴(kuò)展,并繼續(xù)復(fù)用其他層次的現(xiàn)有能力,降低模擬器建設(shè)工作量。通過這4個(gè)層次的服務(wù)化,使得Mock取代第三方完成接口應(yīng)答或響應(yīng),返回預(yù)期結(jié)果,從而實(shí)現(xiàn)接口程序測(cè)試的無人值守。
Mock框架主要解決的測(cè)試場(chǎng)景有:①真實(shí)對(duì)象具有不可確定的行為,可能會(huì)產(chǎn)生不可預(yù)測(cè)的結(jié)果(如股票的行情) ;②真實(shí)對(duì)象很難被創(chuàng)建(如具體的Web容器);③真實(shí)對(duì)象的某些行為很難觸發(fā)(如網(wǎng)絡(luò)錯(cuò)誤) ;④測(cè)試需要詢問真實(shí)對(duì)象的被調(diào)用方式(如測(cè)試可能需要驗(yàn)證某個(gè)回調(diào)函數(shù)是否被調(diào)用了);⑤有些對(duì)象操作耗時(shí)較多,而被測(cè)系統(tǒng)依賴于這類操作較多(如大文件讀寫操作);⑥一些異常邏輯在正常測(cè)試中是很難觸發(fā)的,通過Mock可以人為地控制觸發(fā)異常邏輯。
假定被測(cè)系統(tǒng)的應(yīng)用系統(tǒng)依賴于第三方應(yīng)用提供的接口。當(dāng)?shù)谌綉?yīng)用不可用時(shí),系統(tǒng)會(huì)將其替換為Mock,可提供各類接口模擬服務(wù)。Mock框架架構(gòu)如圖1所示。
圖1 Mock框架架構(gòu)
3.1 Mock應(yīng)用系統(tǒng)的設(shè)計(jì)思想
Mock的設(shè)計(jì)思想是將接口的操作與數(shù)據(jù)的操作相分離,在實(shí)現(xiàn)樁程序時(shí),只考慮對(duì)各種通信接口的包裝,而將條件和結(jié)果數(shù)據(jù)的構(gòu)造交給使用者。這樣,同樣一個(gè)樁程序,只要是基于相同的通信協(xié)議,就可以模擬出任意行為,如①模擬一個(gè)HTTP或TCP接口,提供HTTP或TCP服務(wù)與應(yīng)答;②根據(jù)不同上送的服務(wù)請(qǐng)求,返回不同的應(yīng)答報(bào)文,如XML應(yīng)答或JSON應(yīng)答[6];③對(duì)各類網(wǎng)絡(luò)異常、交易異常提供用戶級(jí)、系統(tǒng)級(jí)的返回?cái)嘌孕畔⑦M(jìn)行容錯(cuò)處理。
3.2 Mock各分層具體實(shí)現(xiàn)邏輯
Mock分層系統(tǒng)實(shí)現(xiàn)如圖2所示,協(xié)議層、解析層、匹配層和執(zhí)行引擎進(jìn)行報(bào)文解析、格式化、規(guī)則匹配和應(yīng)答功能,具體描述如下:①協(xié)議層主要處理接口協(xié)議的技術(shù)細(xì)節(jié),屏蔽各種協(xié)議的技術(shù)差異,讓解析層專注于業(yè)務(wù)數(shù)據(jù)的解析,將接口中業(yè)務(wù)數(shù)據(jù)根據(jù)不同的協(xié)議類型提取出來,再由解析器采用不同規(guī)則解析出具體的字段;②解析層提供各類解析器,用于解析不同格式的業(yè)務(wù)報(bào)文,解析后形成一系列鍵值,可為后續(xù)處理提供統(tǒng)一的數(shù)據(jù)格式;③匹配層[7]允許用戶指定不同的匹配方式和條件,例如當(dāng)收到http接口請(qǐng)求時(shí),預(yù)先使用固定的規(guī)則解析上送報(bào)文,形成一系列鍵值對(duì),為匹配器的使用奠定基礎(chǔ),然后用戶可以根據(jù)鍵值對(duì)的情況,選擇不同匹配方式和條件,指定不同的返回報(bào)文;④執(zhí)行引擎將一系列接口和執(zhí)行命令組合形成一系列原子命令,從而仿真各種測(cè)試場(chǎng)景[8-9]。
圖2 Mock分層系統(tǒng)實(shí)現(xiàn)
4.1 Mock系統(tǒng)原型
現(xiàn)通過IE或其他途徑發(fā)起以下http請(qǐng)求來簡(jiǎn)述其原型實(shí)現(xiàn)過程。http://192.168.0.1:8080/TPS/udx/dpy?app=ndis&month=201408Mock在8080端口將收到接口請(qǐng)求,會(huì)這樣響應(yīng)(其他協(xié)議類型的接口處理流程類似):
(1)協(xié)議處理。按http協(xié)議處理請(qǐng)求數(shù)據(jù),解析到具體訪問的服務(wù)和業(yè)務(wù)數(shù)據(jù),端口:8080,服務(wù):/TPS/udx/dpy,業(yè)務(wù)數(shù)據(jù):app=ndis&month=201408(實(shí)際上業(yè)務(wù)數(shù)據(jù)并非這樣一個(gè)字符串,但業(yè)務(wù)數(shù)據(jù)的含義與該字符串是等價(jià)的,在這里業(yè)務(wù)數(shù)據(jù)并沒有鍵值對(duì)的概念,其還是一個(gè)整體)。根據(jù)端口和請(qǐng)求的服務(wù)(/TPS/udx/dpy),Mock在現(xiàn)有Mock設(shè)置中尋找匹配的設(shè)置,若尋找不到則考慮是否轉(zhuǎn)發(fā)。而當(dāng)前接口請(qǐng)求與上面的Mock設(shè)置可以相匹配時(shí),則將基于該Mock設(shè)置進(jìn)入下一響應(yīng)步驟。
(2)解析業(yè)務(wù)數(shù)據(jù)。使用當(dāng)前Mock設(shè)置指定的解析器對(duì)業(yè)務(wù)數(shù)據(jù)進(jìn)行解析,得到兩個(gè)鍵值對(duì),業(yè)務(wù)數(shù)據(jù)app和month在這里被解析和細(xì)化為ndis和201408。
(3)依次匹配并執(zhí)行原子命令。由于當(dāng)前Mock設(shè)置了兩個(gè)匹配器(兩個(gè)匹配條件),將按順序逐一進(jìn)行驗(yàn)證。第一個(gè)匹配器為字段匹配器,要求存在字段app且值為ndis,從上一響應(yīng)步驟的鍵值對(duì)可知,該要求是滿足的。此時(shí)匹配器匹配通過,將按順序執(zhí)行該匹配器下掛的所有原子命令:當(dāng)前僅配置了一個(gè)Uri資源返回命令,Mock會(huì)從Uri(dpy_ndis.json)指定的資源文件以UTF-8編碼獲取文本,并作為應(yīng)答報(bào)文返回給調(diào)用方。由于第一個(gè)匹配器匹配通過,將不再進(jìn)行第二個(gè)匹配器的匹配工作。盡量找到一個(gè)能響應(yīng)接口的Mock設(shè)置:若當(dāng)前Mock設(shè)置的所有匹配器均未能匹配通過,Mock會(huì)根據(jù)IP和請(qǐng)求的服務(wù),尋找下一個(gè)合適的Mock設(shè)置,并使用其嘗試去作響應(yīng),再回到第2個(gè)響應(yīng)步驟匹配均失敗時(shí),再次考慮轉(zhuǎn)發(fā)。若所有合適的Mock設(shè)置中所有匹配器均不通過,Mock將再次考慮是否轉(zhuǎn)發(fā)接口。Mock處理流程圖如圖3所示。
4.2 Mock接口測(cè)試評(píng)價(jià)指標(biāo)
采用傳統(tǒng)接口測(cè)試與采用Mock接口測(cè)試的各個(gè)測(cè)試指標(biāo)對(duì)比,如表1所示,可看出Mock接口自動(dòng)化測(cè)試無論是對(duì)減少測(cè)試人力投入、提高測(cè)試質(zhì)量還是減少環(huán)境依賴,都具有重要的研究意義[10]。
圖3 Mock處理流程圖
測(cè)試衡量指標(biāo)傳統(tǒng)接口測(cè)試Mock接口測(cè)試測(cè)試投入開發(fā)與測(cè)試投入占比2∶1無人值守,報(bào)表系統(tǒng)支撐自動(dòng)發(fā)郵件報(bào)告案例執(zhí)行情況測(cè)試路徑覆蓋率測(cè)試路徑覆蓋不全,且異常場(chǎng)景測(cè)試需要消耗更昂貴的投入所有if...else路徑覆蓋并生成程序覆蓋率進(jìn)度和分支覆蓋率進(jìn)度報(bào)告測(cè)試依賴搭建測(cè)試環(huán)境、準(zhǔn)備測(cè)試數(shù)據(jù)常常需要一周時(shí)間且上下游溝通成本高自動(dòng)化生成測(cè)試數(shù)據(jù),不依賴測(cè)試環(huán)境準(zhǔn)備測(cè)試容錯(cuò)性測(cè)試環(huán)境一旦出現(xiàn)問題或者受第三方接口開發(fā)進(jìn)度影響,測(cè)試將受阻模擬第三方接口提供服務(wù)與應(yīng)答測(cè)試案例復(fù)用性、測(cè)試質(zhì)量測(cè)試案例復(fù)用率低、系統(tǒng)上線后暴露出很多問題通過可度量、可預(yù)測(cè)、可重復(fù)的自動(dòng)化流程系統(tǒng)地提高軟件的質(zhì)量和安全性
通過上述實(shí)踐說明,在測(cè)試過程中如果存在第三方未完成開發(fā)或存在缺陷依賴的情況下,會(huì)導(dǎo)致自動(dòng)化測(cè)試作業(yè)中斷[11],減弱自動(dòng)化測(cè)試的效果,這時(shí)Mock能成功地與第三方系統(tǒng)開發(fā)進(jìn)度解耦,減少各種環(huán)境依賴,取代第三方完成接口應(yīng)答或響應(yīng),返回預(yù)期結(jié)果,提高自動(dòng)化測(cè)試的穩(wěn)定性與通過率,從而提高自動(dòng)化測(cè)試守護(hù)的質(zhì)量。
筆者通過Mock框架的建設(shè)與實(shí)施,闡述了Mock在模擬下游接口的響應(yīng)和應(yīng)答上的可替代性和穩(wěn)定性[12],Mock通過支持多種協(xié)議的解析和匹配,可為測(cè)試過程中的關(guān)鍵節(jié)點(diǎn)解耦,提高合作方測(cè)試的獨(dú)立性,從而較大地提高測(cè)試效率,最大程度地完成測(cè)試路徑覆蓋。與此同時(shí),通過對(duì)Mock原型的研發(fā)和不斷升級(jí),發(fā)現(xiàn)需要從應(yīng)用研發(fā)場(chǎng)景、測(cè)試案例設(shè)計(jì)、代碼重構(gòu)來對(duì)接口功能進(jìn)行全流程和持久的質(zhì)量守護(hù),并最終實(shí)現(xiàn)接口自動(dòng)化測(cè)試的無人值守,提高產(chǎn)品的質(zhì)量,從而有效減少人工測(cè)試的壓力。
[1] GRAHAM D,FEWSTER M.自動(dòng)化測(cè)試最佳實(shí)踐[M].朱少民,張秋華,趙亞男,譯.北京:機(jī)械工業(yè)出版社,2013:15-18 .
[2] KOSKELA L.測(cè)試驅(qū)動(dòng)開發(fā)的藝術(shù)[M].李貝,譯.北京:人民郵電出版社,2011:21-24.
[3] 朱菊,王志堅(jiān),楊雪,等.基于數(shù)據(jù)驅(qū)動(dòng)的軟件自動(dòng)化測(cè)試框架[J].計(jì)算機(jī)技術(shù)與發(fā)展,2006,16(5):18-23.
[4] KOSKELA L.代碼覆蓋率簡(jiǎn)介[EB/OL].(2004-01-01).http://www.javaranch.com/ newsletter/200401.
[5] 南柯.Pageobject模式實(shí)現(xiàn)頁(yè)面元素分離[EB/OL].(2013-01-05) .http://www.51testing.com/html/87/300987-831789.html.
[6] FOWLER M.Continuous integration[EB/OL]. (2010-03-01).http://www.martinfowler.com/articles/continuousIntegration.html.
[7] 李首文,何貴兵.自動(dòng)技術(shù)在軟件測(cè)試過程中的研究與實(shí)施[J].科技信息,2011(15):113-114.
[8] 吳瑩.基于Selenium的Web自動(dòng)化測(cè)試框架[J].科技傳播,2011(18):223-224.
[9] 張永梅,陳立潮,馬禮,等.軟件測(cè)試技術(shù)研究[J].測(cè)試技術(shù)學(xué)報(bào),2002(2):75-76.
[10] 姚礪,束永安.軟件測(cè)試自動(dòng)化關(guān)鍵技術(shù)的研究[J].安徽大學(xué)學(xué)報(bào)(自然科學(xué)版),2003,27(4):27-33.
[11] 劉騰.軟件測(cè)試技術(shù)與自動(dòng)化測(cè)試框架模型的研究與應(yīng)用[J].電腦知識(shí)與技術(shù),2009(26):28-31.
[12] 呂誠(chéng)昭,孟洛明.一個(gè)軟件測(cè)試自動(dòng)化系統(tǒng):TSBAG[J].北京郵電學(xué)院學(xué)報(bào),1993,16(1):8-14.
MENG Yan:Lect.; College of Information Engineering, Hangzhou Vocational College of Science and Technology, Hangzhou 311402, China.
Test Automation Technology in the Construction and Application of Mock Framework
MENG Yan
With the increasing of business system, in order to react to demand of users quickly, improve the quality and speed of project, it’s necessary to adopt auto-test to substitute manual test. Auto-test includes many types, such as interface-orient watchman test, process-orient utplugin test and java-orient test,but lack of interface-orient auto-test. The existence of online interface makes the application system can be real-time access, and provide business feedback quickly, but also increased the application of coupling.For the inconvenience of automated testing, this article hopes to interface-based Mock framework for automated testing and construction. For the application of decoupling, as soon as possible to carry out the interface test to carry out the necessary conditions to enrich the automation test layered framework to improve the quality of interface program automation daemon.
Mock; auto-test; application of decoupling
2095-3852(2017)03-0364-04
A
2017-01-07.
孟燕(1981-),女,浙江杭州人,杭州科技職業(yè)技術(shù)學(xué)院信息工程學(xué)院講師,主要研究方向?yàn)檐浖こ?
TP311.51
10.3963/j.issn.2095-3852.2017.03.024
武漢理工大學(xué)學(xué)報(bào)(信息與管理工程版)2017年3期