蔡昱星
(南京郵電大學 南京 210003)
隨著我國信息化建設的不斷推進和整個軟件產業的不斷發展,國內的軟件行業也從最初的簡單模仿到現在的自主創新以及核心技術的研究,從最初的簡簡單單的幾千行代碼的小項目到現在幾十萬甚至幾百萬行代碼的產品級軟件項目,如基礎軟件、高端產品等,而這一級別的軟件產品從其前期的設計到中間的開發、測試到最后的推向市場都要經歷一系列嚴格的制作工序才能保證其產品的穩定性,以及可擴展性。而測試作為保證軟件可靠性的重要環節正在得到越來越多的重視。所以提高測試效率,優化測試效果就成了當務之急。

圖1 自動化測試系統整體結構
自動化測試系統主要由資源層,執行引擎層和數據庫層3層構成,如圖1所示,可以看出該自動化測試框架的核心也就是其開發語言、庫程序、驅動程序等一系列技術及工具,同時這些資源也處于MVC架構中最核心的控制層,而無論是對測試環境的自動安裝與配置,測試用例的管理,以及測試結果的自動化分析與存儲,這些都是由這一處于控制層的核心對它們進行調用和處理,而框架的展現層則負責展現諸如測試用例,以及測試分析的結果,而其實體層則負責對該框架所涉及到的一系列有用的數據進行存儲,同時方便核心控制層對它的調用。

圖2 原有自動化測試系統詳細架構體系
沒有應用Spring技術的自動化測試框架詳細實現如圖2所示,可以看到該自動化測試框架主要是的設計也體現了MVC的架構思想,由jsp和servlet去實現view層,TestcaseManager去實現control層,而由TestcaseResource去實現數據持久層使用,MVC架構的優點是顯而易見的,首先,最重要的是應該有多個視圖對應一個模型的能力。在目前用戶需求的快速變化下,可能有多種方式訪問應用的要求。其次,由于模型返回的數據不帶任何顯示格式,因而這些模型也可直接應用于接口的使用。再次,由于一個應用被分離為3層,因此有時改變其中的一層就能滿足應用的改變。一個應用的業務流程或者業務規則的改變只需改動MVC的模型層。 控制層的概念也很有效,由于它把不同的模型和不同的視圖組合在一起完成不同的請求,因此,控制層可以說是包含了用戶請求權限的概念。 最后,它還有利于軟件工程化管理。由于不同的層各司其職,每一層不同的應用具有某些相同的特征,有利于通過工程化、工具化產生管理程序代碼。
但是,眾所周知,雖然自動化測試確實是好處有很多,但是在很多項目中或者很多公司中卻還是得不到廣泛的應用,其中的主要原因就是因為測試框架本身的可復用性,可擴展性得不到充分的保障,那么如何解決這個框架的脆弱性呢,如何使其變得更加健壯,使其在面對目標項目的功能變更的時候能夠以極小的框架變更高效率的與目標項目實現功能映射,如何在目標項目如支持多平臺的情況下不至于需要重新再編一套自動化測試框架,而運用原有的測試框架就能應對自如呢?
Spring框架是一個分層架構,由7個定義良好的模塊組成。Spring模塊構建在核心容器上,核心容器定義了創建,配置和管理bean的方式,同時Spring框架是一個輕量級的Jave EE框架。它主要有以下幾個特點:
(1) 非侵入式:所謂非侵入式是指Spring框架的API不會在業務邏輯上出現,也就是說我們的業務邏輯應該是純凈的,不能出現與業務邏輯無關的代碼。首先針對應用而言,這樣我們才能將業務邏輯從當前應用中剝離出來,從而在其他的應用中實現復用;其次針對框架而言,由于業務邏輯中沒有Spring的API,所以業務邏輯也可以從Spring框架快速的移植到其他框架。
(2)容器:Spring提供容器功能,容器可以管理對象的生命周期,對象與對象之間的依賴關系。用戶可以寫一個配置文件(通常是XML文件),在上面定義對象的名字,是否是單例,以及配置與其他對象的依賴關系。那么在容器啟動之后,這些對象就像被實力化好了,直接去用就好了,而且依賴關系也建立好了。
(3)IOC:控制反轉,它的核心思想就是要面向接口編程,即極大地降低了對象之間的耦合度。
(4)依賴注入:建立對象與對象之間依賴關系的實現,包括接口注入、構造注入、set注入,在Spring中只支持后兩種。
(5)AOP:面向方面編程,可以把日志、安全、事務管理等服務(或功能)理解成一個“方面”,那么以前這些服務一直是直接寫在業務邏輯的代碼當中的,這有兩個缺點:首先業務邏輯不純凈,其次這些服務被很多業務邏輯反復使用,完全可以剝離出來做到復用。那么AOP就是這些問題的解決方案,可以把這些服務剝離出來形成一個“方面”,以期做到復用;然后將“方面”動態的插入到業務邏輯中讓業務邏輯能夠享受到此“方面”的服務。
在測試框架中運用Spring其實主要是為了保持代碼良好的封裝性,層次的清晰性,以及對未來需求變更的良好復用性,這些都能夠通過Spring來達到,就像前面看到的MVC架構,其實僅僅靠servlet,jsp,hibernate等自身其實很難達到真正的MVC結構,比如在展現層也需要處理一些業務邏輯以決定各種不同的展現,數據庫持久層其實也擔任了具體持久類如結果日志等的存儲工作,這些設計使得整體的架構不是那么的清晰,現在引入Spring就能解決這些問題:
(a)在持久層中再抽象出一個DAO層專門作為持久化的邏輯設計,Spring的applicationContext.xml文件配置如下:


在這里可以看到如何與數據庫連接,和哪個數據庫連接,都交由Spring幫你實現,最重要的,可以看到這里面有個負責存儲的storeDaoImpl類,它負責所有的數據存儲工作,將model層解放出來只需要處理如何設計持久化類,分層的思想得到了很好的體現。
(b)在核心控制層加入Spring的AOP機制,使得代碼的封裝性和可擴展性得到很大的提升,眾所周知,在自動化測試里面最重要的就是測試場景的模擬,而這些也是最耗費測試人員體力和機器資源的,如有些場景很多測試case都要用到,有些只有一部分才會用到,而有些只有個別的case才會用到,且每個case必然也會需要自己獨特的測試場景。如果逐一對待的話不但工作量極大,容易出錯,而且代碼很容易寫死,這樣如果以后某部分功能有變更的話那么對測試框架的更改的工作量是驚人的,但是如果我們用Spring對這些場景的創建過程進行管理,那么上面的諸多問題便迎刃而解:


在實際的BPS(business process suite)項目中的試驗發現,通過在測試框架中引入Spring特性,使得整個測試系統的代碼很輕易的就實現了代碼的復用,同時由于Spring的原則是非侵入式的,就是實際業務邏輯代碼中感覺不到Spring框架的存在,通過Spring本身的IOC功能,Spring只是起到了一個實例產生的作用,然后把實例分配給需要的對象,這樣更容易實現松耦合和良好的封裝性,為系統提供了更好的層次性和代碼的可讀性,而且也符合Java一貫提倡的面向接口編程。然后通過在框架中利用Spring動態的生成一個DAO層,使得將于數據庫的交互邏輯得以動態進行控制,而不至于將其存儲邏輯僵化的封裝于model層,這為以后項目功能的更改而導致的測試業務邏輯的更改提供了極大的便利。同時通過應用Spring的AOP功能,將可能需要進行頻繁更改的測試業務通過AOP機制單獨提取出來,這樣就可以在測試系統需要重用的時候輕輕松松的把業務邏輯從整個系統中抽象出來再無需任何修改的情況下用到其他系統中去,如測試環境的配置,測試數據的清理,測試日志以及測試細節的記錄等。加入Spring后的架構體系如圖3所示。
可以看到,現在的自動化測試框架分層更加清楚,這使得框架的健壯性得到了很好的保證,而由于AOP和DAO的應用使得框架能共輕松地應對來自目標項目上功能的變更,如無論自己現在想加入何種功能都可以通過OwnLogic層進行更改,同時由于Spring本身對降低代碼耦合度這方面的卓越表現,使得不會出現牽一發而動全身這一災難性后果,而這一特性對于一個需要不停應對功能變更的自動化測試框架來說尤為重要,最后,通過DAO層的引入,使得框架在面對多平臺測試的時候也游刃有余,因為重新抽象出來的DAO層專職負責與數據庫的交互邏輯,這使得其他架構層不需要關心現在是在什么平臺上做的測試,這樣就解決了測試框架在多平臺上的應用。具體性能比較如表1所示。

圖3 運用spring技術后的自動化測試架構體系


表1 改進后的自動化測試框架與原有的測試框架比較
改進后的測試框架運行結果截圖:如圖4所示。
通過測試結果可以看到我可以很簡單對某一模塊進行自己想要的測試,如圖4結果顯示的junit單元測試,即我們現在可以很輕松地對框架實現功能的變更。
隨著軟件行業的發展,軟件測試技術,特別是自動化測試技術越來越受到業內人士的重視,而如何有效地開展自動化測試也成了個軟件企業探索的一個總要方向,本文通過在自動化測試系統中引入Spring框架技術,使得系統的開發效率和質量都大大得到提升,通過在對實際項目的實驗可以發現,由于Spring本身對代碼良好的封裝性,在以后產品功能變更的時候極大的降低了框架的修改復雜度,使得自動化測試系統的壽命得以延長,且Spring不但應用于普通軟件產品的開發,其通過對測試的輔助也可以達到增強整個軟件產品穩定性和高效性的作用。最重要的是引入了Spring的自動化測試框架其本身也達到了軟件系統所要求的代碼的良好的封裝以及松耦合等特性,這使得系統在應對未來的功能上的更改甚至于其他項目上都能發揮其作用,這能大大降低公司的人力資源成本和無用的功能重復開發。
[1] 計文柯.Spring技術內幕-深入解析Spring結構與設計原理[M].北京:機械工業出版社,2010.
[2] 劉京華.java web整合開發王者歸來[M].北京:清華大學出版社,2010.
[3] 陳能技. 軟件自動化測試成功之道:典型工具、腳本開發、測試框架和項目實戰[M].北京:人民郵電出版社,2010.
[4] 王東剛.軟件測試與junit實踐[M].北京:人民郵電出版社,2004.
[5] 劉雙悅.王培東.一種基于改進遺傳算法的面向路徑測試用例自動生成方法[J]. 自動化技術與應用, 2010(03).
[6] 王小銀. 軟件自動化測試的研究與實現[J]. 電腦知識與技術, 2010(25).
[7] 謝經緯. 吳昊. 探索性方法在面向故障軟件測試中的應用[J]. 微計算機信息, 2010(25).
[8] Seth Ladd .深入解析Spring MVC與Web Flow [M].北京:人民郵電出版社, 2008.