陳茉莉,張會林,劉 波,張洋洋
(1.上海理工大學 光電信息與計算機工程學院,上海 200093;2.上海市現代光學系統重點實驗室,上海 200093;3.邵陽學院電氣系,湖南 邵陽 422002)
在早期的軟件測試活動中,人們普遍采用手工測試法,從編寫測試用例開始到執行測試,直到比較測試結果得出測試結論,都是由測試人員手動來完成。但是隨著軟件業的發展,測試的需求越來越大,測試所遇到的場景也越來越復雜,加之軟件測試過程越來越智能化、高效化,軟件測試開始由原來的人工測試向自動化測試方向發展。在開發一款軟件時,不可能針對每一個操作系統都開發一個相應的后臺,為了能夠只用一種語言就開發出各種平臺都適用的后臺程序,API就產生了。前端和后臺的開發人員可以通過API來進行交互操作,而并不需要了解對方是如何具體去實現這個功能的,API相當于一個連接前后端的橋梁。既然API占據著一個特殊的地位,那么它的質量也是軟件質量的基礎。API的測試既保證了后臺的質量,也為前端開發人員減輕了負擔。因此,如果提高API測試的自動化程度,就可以輔助測試人員高效完成工作。針對以上的情況,API自動化測試系統的開發刻不容緩。本系統主要針對Android、IOS操作系統,對App的API進行單元測試,保證軟件在編碼階段的質量,為之后的集成測試、系統測試打下堅實的基礎。另一方面,基于API的自動化測試系統可以代替手工進行API的回歸測試,這樣在系統版本升級的時候就不必再浪費人力在回歸測試上,既保證了產品的質量又提高了測試的效率。
本系統由業務處理、測試用例、數據層和Yimin工具四個部分組成。其中,業務處理是系統的核心部分,由它來完成訪問持久性數據庫的操作、根據測試用例執行測試、比較測試結果等一系列業務動作;測試用例是業務處理的基礎部分,也是整個測試的基礎,系統根據測試用例來執行并比較結果得出最終測試結果;數據層主要是數據源提供數據信息,Yimin工具主要是用來和后臺交互,返回響應的API信息。
本系統的主要目的是對API進行自動化測試,最終能夠保證軟件產品的質量。首先來介紹一下API在整個軟件項目中的重要地位。
該項目是針對手機而開發的客戶端應用軟件,主要適用于Android和IOS兩大手機操作系統。為了使得軟件產品具有高質量、高穩定性、高健壯性的特點,開發團隊的前后端分工十分明確。API為客戶端和后臺的交互起到了橋梁的作用。API在項目中的位置如圖1所示。

圖1 API在項目中的位置
API在整個項目中所處的特殊地位,要求它的質量必須夠高,也正因為如此,對API的測試也是整個測試環節中必不可少的。因為Yimin這個工具的局限性,本文提出了針對API測試的自動化測試系統,這個系統的主要作用是省去測試人員對測試結果一一比對的過程,由系統自動去完成獲取接口返回信息和結果比較的工作,也減少了對API進行回歸測試的成本。
本系統主要分為大四個模塊:業務邏輯、數據層、Yimin和測試用例,各個模塊之間相互協作完成測試工作,同時四個模塊又是相互獨立的模塊,每一個模塊內部發生變化,都不會對其他模塊產生影響。模塊之間的關系如圖2所示。

圖2 系統的總體設計
如圖2所示,業務邏輯層是整個系統的核心部分,由它來完成訪問數據層和測試用例的工作,在業務邏輯層中,還會對結果進行處理,它會訪問Yimin工具。數據層主要是為測試提供數據支持,它會提供測試過程中需要用到的存儲在數據庫中的數據。測試用例主要是提供一些訪問Yimin所需要的信息和進行測試的期望結果。Yimin是該系統專門用于API測試的一個工具,當通過拼接接口名加參數連接上Yimin之后,Yimin這個工具會返回相應的接口信息。四個模塊各有所長,它們只要完成各自負責的功能,不需要干預其他的模塊功能的實現,而且其中一個模塊的變化對于其它兩個模塊來說是透明的。
業務邏輯層作為系統的核心模塊,需要和數據層、測試用例進行交互。業務邏輯層在與數據層交互時主要采用了Spring的DAO模式;訪問測試用例時主要是通過測試用例的路徑來獲得,接著解析測試用例獲得名稱、期望結果等信息;最后通過測試用例中解析出來的信息,生成一個URL來訪問Yimin工具。
本項目中使用了一些Spring的注解,使得項目的開發變得簡單高效。Spring利用了DAO模式,將業務邏輯和數據層分離。該系統采用Spring的DAO模式來對數據庫進行訪問,使用MySQL的數據庫。Spring可以通過配置文件實現與數據庫的連接,訪問數據源,本系統采用DAO模式,并用JDBC的方式來實現DAO。為了更好地模塊化JDBC操作,簡化傳統的JDBC操作的復雜和繁瑣過程,使用模板方式封裝JDBC數據庫操作,即JdbcTemplate。用模板封裝數據庫操作的優點在于可以簡化JDBC的操作,開發者只需要提供SQL、設置SQL中的變量,最后提取ResultSet,而JDBC對象的獲取釋放、異常類型轉化的操作都由模板負責。最后通過TestNG的配置文件來達到將測試用例和代碼相分離的目的。只需要將要執行的case放入配置文件中,在執行測試時,選擇Run as TestNG Suite,測試就能按照測試用例一條一條執行下去。該方法使得自動化測試具有了更高的靈活性,不再受到測試用例的約束。在測試執行得到一個結果后,需要對測試結果和期望結果進行比較,其中一種就是得到的測試結果完全等價于期望的結果,這里使用equals()方法來進行兩個結果之間的比較。另一種可能的結果就是測試結果中包含了期望結果的內容,在這種情況下,只要測試所得出的結果集中包含了期望結果中的所有的信息,那么測試也能通過。這種情況可以使用contains()方法來實現。還有一種測試結果就是對數字的比較,有些情況下,系統的邏輯要求是如果某個參數的值不大于某個指定值,就可以認為測試是通過的。
本文介紹了軟件測試在軟件發展過程中所占據的不可替代的位置,并且隨著軟件復雜度的增加,軟件測試的重要性也越發突出。隨著功能的不斷增加,手工測試不再是高效的測試方法。自動化測試的效率很高,減少測試人員的測試時間,能讓測試人員更加專注于測試用例的設計,使得系統的邏輯更加細致和完善。本文介紹了基于Spring的API自動化測試系統中所用到的技術,主要包括Spring框架、DAO模式和TestNG框架。介紹了基于Spring的API自動化測試系統的設計;采用了分層的設計思想,將業務邏輯層和數據層分離;運用Spring的IOC容器實現依賴注入,讓IOC容器來管理對象之間的依賴關系,降低耦合度;采用TestNG測試框架將測試用例和測試代碼分離,由系統自己去讀取測試用例,將執行的結果和測試用例中的期望結果進行比較來得到最終的測試結果。本系統目前的主要作用是用于對API的自動化測試,只要對該系統稍加改進,就能擴展到對UI的自動化測試,具有廣闊的應用前景。
[1] 戴莉萍,杜 瓊.一種軟件測試V模型的改進及其應用[J].計算機與現代化,2004,13(7):29-33.
[2] 柯 玲,徐 京,李 穎.IOC模式及其在設備監控軟件中的應用[J].航天器工程,2009,(18):117-122.
[3] 林 寧,孟慶余.軟件測試實用指南[M].北京:清華大學出版社,2004.
[4] 劉曉丹,武君勝.基于數據驅動的自動化測試平臺設計[J].科學技術與工程,2008,8(3):779-782.
[5] 王 萍.軟件測試的重要性[J].軟件導刊,2009,4(8):20-21.
[6] 王艷秋,燕孝飛.軟件自動化測試初探[J].計算機與網絡,2007,2(5):168-171.
[7] Randell B.System structure for software fault tolerance[J].IEEE Trans.Software Eng,1975,14(6):220-231.
[8] Bill Councill.Third-Party Testing and Stirrings of The New Software Engineering[J].IEEE Software,1999,16(6):76-79.
[9] Edward Kit.軟件測試過程改進[M].北京:機械工業出版社,2003.
[10]GUO PJ,ERNST MD,PERKINGS JH,et al.The Daikon System for dynamic detection of likcly invariants[Z].2006.