康彥
(安徽城市管理職業(yè)學院信息技術(shù)學院,安徽合肥 230011)
當下,隨著互聯(lián)網(wǎng)的蓬勃發(fā)展,應(yīng)用程序正在向著移動設(shè)備方向轉(zhuǎn)變,人們的軟件使用習慣慢慢地從傳統(tǒng)PC軟件遷移到移動APP、微信小程序上,在軟件設(shè)計模式上也在發(fā)生變革,前后端逐漸分離,前端負責用戶界面設(shè)計,并配合后端顯示數(shù)據(jù)和支持交互操作等可視化內(nèi)容。后端主要負責底層業(yè)務(wù)邏輯的實現(xiàn),平臺的穩(wěn)定性與性能,并配合前端進行數(shù)據(jù)交互及數(shù)據(jù)的保存和讀取等。而前后端最好的交互方式莫過于通過WebAPI接口來實現(xiàn)[1]。在這種軟件分層結(jié)構(gòu)中,用戶可以使用不同的前端平臺通過HTTP協(xié)議向后端發(fā)送請求并得到返回結(jié)果。由于軟件業(yè)務(wù)邏輯負責,系統(tǒng)中存在大量的WebAPI,如果完全依靠人工方式對軟件進行測試,顯然無法滿足實際需要。因此,研究如何對WebAPI進行自動化測試,構(gòu)建一套適用于WebAPI自動化測試框架,就顯得尤為重要。
要弄清楚什么是RESTful WebAPI,首先要知道REST是什么。REST(Representational State Transfer)描述了是一組用約束條件和規(guī)則組成的網(wǎng)絡(luò)應(yīng)用系統(tǒng)架構(gòu)。滿足其架構(gòu)規(guī)約的設(shè)計被稱為RESTful[2]。是由Roy Fielding在他的博士論文中提出的,Roy Fielding同時也是HTTP規(guī)范的主要編寫者中的一員。目前主流的Web服務(wù)交互方案主要有REST、SOAP(Simple Object Access protocol,簡單對象訪問協(xié)議)、XML-RPC(remote procedure call,遠程過程調(diào)用協(xié)議)三種,REST相較于其他兩種更加簡潔明了。在對HTTP方法和網(wǎng)絡(luò)資源的獲取方面,REST結(jié)構(gòu)顯得更為輕量,更適用于高效率低安全性的應(yīng)用開發(fā)。
REST在應(yīng)用程序中最重要的原則是,前端和后端之間的交互在請求之間是無狀態(tài)的。從前端到后端的每個請求都必須包含理解請求所必需的信息。如果后端在請求之間的任何時間點重啟,前端不會得到通知。此外,無狀態(tài)請求可以由任何可用后端應(yīng)答,這十分適合基于云平臺的應(yīng)用。前端還可以通過緩存數(shù)據(jù)來改進其性能。
在后端,應(yīng)用程序狀態(tài)和功能等各種資源可以理解為一種概念上的實體,并對前端公開??捎玫馁Y源有:應(yīng)用程序?qū)ο?、?shù)據(jù)庫記錄、算法等[3]。每個資源都使用 URI(Universal Resource Identifier) 得到一個唯一的地址。各種資源通過統(tǒng)一的接口,完成在前端和后端之間狀態(tài)的傳輸。使用的是標準的HTTP方法,比如GET、PUT、POST和DELETE。超媒體是應(yīng)用程序狀態(tài)的引擎,各種資源通過超鏈接實現(xiàn)互聯(lián)。
RESTful架構(gòu)是對MVC架構(gòu)改進后所形成的一種架構(gòu),通過使用事先定義好的接口與不同的服務(wù)聯(lián)系起來。在RESTful架構(gòu)中,瀏覽器使用POST,DELETE,PUT和GET四種請求方式分別對指定的URL資源進行增刪改查操作。因此,RESTful是通過URI實現(xiàn)對資源的管理及訪問,具有擴展性強、結(jié)構(gòu)清晰的特點。
RESTful WebAPI架構(gòu)將服務(wù)器分成前端服務(wù)器和后端服務(wù)器兩部分,前端服務(wù)器為用戶提供無模型的視圖,后端服務(wù)器為前端服務(wù)器提供數(shù)據(jù)訪問接口[4]。瀏覽器向前端服務(wù)器請求視圖,通過視圖中包含的AJAX函數(shù)發(fā)起接口請求獲取模型。RESTful WebAPI架構(gòu)如圖1所示。
圖1 RESTful WebAPI架構(gòu)
表1 RESTLibrary關(guān)鍵字庫
圖2 Robot Framework架構(gòu)
RobotFramework是一個獨立于操作系統(tǒng)和應(yīng)用程序的通用開源自動化框架。核心框架使用python實現(xiàn),也運行在jython(jvm)和ironpython(.net)上[5]。主要用于驗收測試、驗收測試驅(qū)動開發(fā)(ATDD)和機器人過程自動化(RPA)。它具有易于使用的表格測試數(shù)據(jù)語法,并采用關(guān)鍵字驅(qū)動的測試方法。它的測試能力可以通過使用Python或Java實現(xiàn)的測試庫來擴展,用戶可以使用與創(chuàng)建測試用例相同的語法從現(xiàn)有的新的高級關(guān)鍵字創(chuàng)建新的高級關(guān)鍵字[6]。其本身提供了一個基礎(chǔ)的功能。比如自帶的Builtin庫提供的關(guān)鍵字告訴我們?nèi)绾味x變量、數(shù)組、字典、打印信息,分支語句和循環(huán),以及框架本身所提供的自動化功能,如何組織用例,生成測試報告等。其框架結(jié)果如圖2所示。
傳統(tǒng)的接口測試自動化框架不支持數(shù)據(jù)驅(qū)動,沒有將測試代碼與測試數(shù)據(jù)分離,不利于維護,一旦新增測試用例需要重新修改測試代碼,并且一個測試方法只能由一個測試用例實現(xiàn),將會造成編寫測試代碼工作量巨大[7]。本文主要介紹一種基于Robot Framework框架的針對于RESTful WebAPI的自動化測試框架的構(gòu)建。
針對RESTful WebAPI,該庫設(shè)計由客戶端通過HTTP方法,定于自己的測試套件,使用單獨的測試用例測試不同的操作,以便于每個端點都可以擁有自己的專用測試套件[8]。使用JSON模式驗證JSON數(shù)據(jù),使得測試代碼的編寫基于屬性而不是特定值的WebAPI測試(例如:手機號碼必須有效與電子郵件為13012345678)。當WebAPI響應(yīng)的值易于更改時,此方法減少了測試代碼維護。也可以實現(xiàn)JSON數(shù)據(jù)的傳遞測試(例如:從一個端點獲取響應(yīng)正文,然后將其某些值發(fā)布到另一個端點并驗證結(jié)果)。
該庫將自己的狀態(tài)表示為JSON本身,即對象數(shù)組。這些對象在一起通常被稱為實例。一個實例始終具有以下三個屬性:
圖3 REST API測試網(wǎng)站
圖4 測試報告
(1)請求數(shù)據(jù)作為JSON對象;
(2)響應(yīng)數(shù)據(jù)作為JSON對象;
(3)以上兩個屬性的JSON模式。
對于每個請求響應(yīng),一旦獲得響應(yīng)(并且請求未超時),就會使用這些屬性創(chuàng)建一個新實例。如果尚未使用期望關(guān)鍵字來推斷請求和響應(yīng)模式,則可以推斷出它們。庫中定義了類型判斷、期望驗證、HTTP方法、輸入輸出及通用設(shè)置等關(guān)鍵字,關(guān)鍵字庫如表1所示。
為驗證該自動化測試框架,我們使用node.js和lowdb在本地部署了一個REST API網(wǎng)站。其中node.js是一種讓JavaScript運行在服務(wù)器端的開發(fā)平臺,lowdb是一種輕量級本地JSON數(shù)據(jù)庫。該網(wǎng)站可支持常用HTTP方法,如GET、POST、PUT、PATCH、DELETE等方法。網(wǎng)站如圖3所示。
一個測試套件(Test Suite)包含不同類別的多個測試腳本,在使用robot命令執(zhí)行測試時,會依次執(zhí)行測試套件中的各個測試腳本下的每個測試用例,測試執(zhí)行結(jié)束后,框架會自動生成測試報告和測試日志文件,圖4所示的report.html報告文件是本次批量執(zhí)行測試用例的整體情況,記錄了測試結(jié)果、測試用例總數(shù),通過用例總數(shù)和未通過用例總數(shù)以及執(zhí)行全部用例的總耗時等。圖5所示的log.html日志文件是本次批量執(zhí)行測試用例的具體情況,包括每個用例的執(zhí)行結(jié)果的耗時情況和每個用例步驟的執(zhí)行情況等。
圖5 測試日志
目前,大部分軟件的業(yè)務(wù)邏輯都是基于WebAPI實現(xiàn)的,WebAPI測試可以簡化軟件中復雜業(yè)務(wù)邏輯之間的耦合度。接口功能越單一越容易提高測試用例的覆蓋度和實現(xiàn)持續(xù)集成測試。本文所介紹自動化測試框架在Robot Framework基礎(chǔ)上設(shè)計開發(fā)針對于RESTful API測試的關(guān)鍵字庫,使得針對于此類接口的測試語法更為簡練、易于理解。通過應(yīng)用該測試框架,能有效的提高軟件測試覆蓋度,降低回歸測試成本。