蔡昱星
(南京郵電大學(xué) 南京 210003)
隨著我國信息化建設(shè)的不斷推進和整個軟件產(chǎn)業(yè)的不斷發(fā)展,國內(nèi)的軟件行業(yè)也從最初的簡單模仿到現(xiàn)在的自主創(chuàng)新以及核心技術(shù)的研究,從最初的簡簡單單的幾千行代碼的小項目到現(xiàn)在幾十萬甚至幾百萬行代碼的產(chǎn)品級軟件項目,如基礎(chǔ)軟件、高端產(chǎn)品等,而這一級別的軟件產(chǎn)品從其前期的設(shè)計到中間的開發(fā)、測試到最后的推向市場都要經(jīng)歷一系列嚴格的制作工序才能保證其產(chǎn)品的穩(wěn)定性,以及可擴展性。而測試作為保證軟件可靠性的重要環(huán)節(jié)正在得到越來越多的重視。所以提高測試效率,優(yōu)化測試效果就成了當務(wù)之急。
圖1 自動化測試系統(tǒng)整體結(jié)構(gòu)
自動化測試系統(tǒng)主要由資源層,執(zhí)行引擎層和數(shù)據(jù)庫層3層構(gòu)成,如圖1所示,可以看出該自動化測試框架的核心也就是其開發(fā)語言、庫程序、驅(qū)動程序等一系列技術(shù)及工具,同時這些資源也處于MVC架構(gòu)中最核心的控制層,而無論是對測試環(huán)境的自動安裝與配置,測試用例的管理,以及測試結(jié)果的自動化分析與存儲,這些都是由這一處于控制層的核心對它們進行調(diào)用和處理,而框架的展現(xiàn)層則負責展現(xiàn)諸如測試用例,以及測試分析的結(jié)果,而其實體層則負責對該框架所涉及到的一系列有用的數(shù)據(jù)進行存儲,同時方便核心控制層對它的調(diào)用。
圖2 原有自動化測試系統(tǒng)詳細架構(gòu)體系
沒有應(yīng)用Spring技術(shù)的自動化測試框架詳細實現(xiàn)如圖2所示,可以看到該自動化測試框架主要是的設(shè)計也體現(xiàn)了MVC的架構(gòu)思想,由jsp和servlet去實現(xiàn)view層,TestcaseManager去實現(xiàn)control層,而由TestcaseResource去實現(xiàn)數(shù)據(jù)持久層使用,MVC架構(gòu)的優(yōu)點是顯而易見的,首先,最重要的是應(yīng)該有多個視圖對應(yīng)一個模型的能力。在目前用戶需求的快速變化下,可能有多種方式訪問應(yīng)用的要求。其次,由于模型返回的數(shù)據(jù)不帶任何顯示格式,因而這些模型也可直接應(yīng)用于接口的使用。再次,由于一個應(yīng)用被分離為3層,因此有時改變其中的一層就能滿足應(yīng)用的改變。一個應(yīng)用的業(yè)務(wù)流程或者業(yè)務(wù)規(guī)則的改變只需改動MVC的模型層。 控制層的概念也很有效,由于它把不同的模型和不同的視圖組合在一起完成不同的請求,因此,控制層可以說是包含了用戶請求權(quán)限的概念。 最后,它還有利于軟件工程化管理。由于不同的層各司其職,每一層不同的應(yīng)用具有某些相同的特征,有利于通過工程化、工具化產(chǎn)生管理程序代碼。
但是,眾所周知,雖然自動化測試確實是好處有很多,但是在很多項目中或者很多公司中卻還是得不到廣泛的應(yīng)用,其中的主要原因就是因為測試框架本身的可復(fù)用性,可擴展性得不到充分的保障,那么如何解決這個框架的脆弱性呢,如何使其變得更加健壯,使其在面對目標項目的功能變更的時候能夠以極小的框架變更高效率的與目標項目實現(xiàn)功能映射,如何在目標項目如支持多平臺的情況下不至于需要重新再編一套自動化測試框架,而運用原有的測試框架就能應(yīng)對自如呢?
Spring框架是一個分層架構(gòu),由7個定義良好的模塊組成。Spring模塊構(gòu)建在核心容器上,核心容器定義了創(chuàng)建,配置和管理bean的方式,同時Spring框架是一個輕量級的Jave EE框架。它主要有以下幾個特點:
(1) 非侵入式:所謂非侵入式是指Spring框架的API不會在業(yè)務(wù)邏輯上出現(xiàn),也就是說我們的業(yè)務(wù)邏輯應(yīng)該是純凈的,不能出現(xiàn)與業(yè)務(wù)邏輯無關(guān)的代碼。首先針對應(yīng)用而言,這樣我們才能將業(yè)務(wù)邏輯從當前應(yīng)用中剝離出來,從而在其他的應(yīng)用中實現(xiàn)復(fù)用;其次針對框架而言,由于業(yè)務(wù)邏輯中沒有Spring的API,所以業(yè)務(wù)邏輯也可以從Spring框架快速的移植到其他框架。
(2)容器:Spring提供容器功能,容器可以管理對象的生命周期,對象與對象之間的依賴關(guān)系。用戶可以寫一個配置文件(通常是XML文件),在上面定義對象的名字,是否是單例,以及配置與其他對象的依賴關(guān)系。那么在容器啟動之后,這些對象就像被實力化好了,直接去用就好了,而且依賴關(guān)系也建立好了。
(3)IOC:控制反轉(zhuǎn),它的核心思想就是要面向接口編程,即極大地降低了對象之間的耦合度。
(4)依賴注入:建立對象與對象之間依賴關(guān)系的實現(xiàn),包括接口注入、構(gòu)造注入、set注入,在Spring中只支持后兩種。
(5)AOP:面向方面編程,可以把日志、安全、事務(wù)管理等服務(wù)(或功能)理解成一個“方面”,那么以前這些服務(wù)一直是直接寫在業(yè)務(wù)邏輯的代碼當中的,這有兩個缺點:首先業(yè)務(wù)邏輯不純凈,其次這些服務(wù)被很多業(yè)務(wù)邏輯反復(fù)使用,完全可以剝離出來做到復(fù)用。那么AOP就是這些問題的解決方案,可以把這些服務(wù)剝離出來形成一個“方面”,以期做到復(fù)用;然后將“方面”動態(tài)的插入到業(yè)務(wù)邏輯中讓業(yè)務(wù)邏輯能夠享受到此“方面”的服務(wù)。
在測試框架中運用Spring其實主要是為了保持代碼良好的封裝性,層次的清晰性,以及對未來需求變更的良好復(fù)用性,這些都能夠通過Spring來達到,就像前面看到的MVC架構(gòu),其實僅僅靠servlet,jsp,hibernate等自身其實很難達到真正的MVC結(jié)構(gòu),比如在展現(xiàn)層也需要處理一些業(yè)務(wù)邏輯以決定各種不同的展現(xiàn),數(shù)據(jù)庫持久層其實也擔任了具體持久類如結(jié)果日志等的存儲工作,這些設(shè)計使得整體的架構(gòu)不是那么的清晰,現(xiàn)在引入Spring就能解決這些問題:
(a)在持久層中再抽象出一個DAO層專門作為持久化的邏輯設(shè)計,Spring的applicationContext.xml文件配置如下:
在這里可以看到如何與數(shù)據(jù)庫連接,和哪個數(shù)據(jù)庫連接,都交由Spring幫你實現(xiàn),最重要的,可以看到這里面有個負責存儲的storeDaoImpl類,它負責所有的數(shù)據(jù)存儲工作,將model層解放出來只需要處理如何設(shè)計持久化類,分層的思想得到了很好的體現(xiàn)。
(b)在核心控制層加入Spring的AOP機制,使得代碼的封裝性和可擴展性得到很大的提升,眾所周知,在自動化測試里面最重要的就是測試場景的模擬,而這些也是最耗費測試人員體力和機器資源的,如有些場景很多測試case都要用到,有些只有一部分才會用到,而有些只有個別的case才會用到,且每個case必然也會需要自己獨特的測試場景。如果逐一對待的話不但工作量極大,容易出錯,而且代碼很容易寫死,這樣如果以后某部分功能有變更的話那么對測試框架的更改的工作量是驚人的,但是如果我們用Spring對這些場景的創(chuàng)建過程進行管理,那么上面的諸多問題便迎刃而解:
在實際的BPS(business process suite)項目中的試驗發(fā)現(xiàn),通過在測試框架中引入Spring特性,使得整個測試系統(tǒng)的代碼很輕易的就實現(xiàn)了代碼的復(fù)用,同時由于Spring的原則是非侵入式的,就是實際業(yè)務(wù)邏輯代碼中感覺不到Spring框架的存在,通過Spring本身的IOC功能,Spring只是起到了一個實例產(chǎn)生的作用,然后把實例分配給需要的對象,這樣更容易實現(xiàn)松耦合和良好的封裝性,為系統(tǒng)提供了更好的層次性和代碼的可讀性,而且也符合Java一貫提倡的面向接口編程。然后通過在框架中利用Spring動態(tài)的生成一個DAO層,使得將于數(shù)據(jù)庫的交互邏輯得以動態(tài)進行控制,而不至于將其存儲邏輯僵化的封裝于model層,這為以后項目功能的更改而導(dǎo)致的測試業(yè)務(wù)邏輯的更改提供了極大的便利。同時通過應(yīng)用Spring的AOP功能,將可能需要進行頻繁更改的測試業(yè)務(wù)通過AOP機制單獨提取出來,這樣就可以在測試系統(tǒng)需要重用的時候輕輕松松的把業(yè)務(wù)邏輯從整個系統(tǒng)中抽象出來再無需任何修改的情況下用到其他系統(tǒng)中去,如測試環(huán)境的配置,測試數(shù)據(jù)的清理,測試日志以及測試細節(jié)的記錄等。加入Spring后的架構(gòu)體系如圖3所示。
可以看到,現(xiàn)在的自動化測試框架分層更加清楚,這使得框架的健壯性得到了很好的保證,而由于AOP和DAO的應(yīng)用使得框架能共輕松地應(yīng)對來自目標項目上功能的變更,如無論自己現(xiàn)在想加入何種功能都可以通過OwnLogic層進行更改,同時由于Spring本身對降低代碼耦合度這方面的卓越表現(xiàn),使得不會出現(xiàn)牽一發(fā)而動全身這一災(zāi)難性后果,而這一特性對于一個需要不停應(yīng)對功能變更的自動化測試框架來說尤為重要,最后,通過DAO層的引入,使得框架在面對多平臺測試的時候也游刃有余,因為重新抽象出來的DAO層專職負責與數(shù)據(jù)庫的交互邏輯,這使得其他架構(gòu)層不需要關(guān)心現(xiàn)在是在什么平臺上做的測試,這樣就解決了測試框架在多平臺上的應(yīng)用。具體性能比較如表1所示。
圖3 運用spring技術(shù)后的自動化測試架構(gòu)體系
表1 改進后的自動化測試框架與原有的測試框架比較
改進后的測試框架運行結(jié)果截圖:如圖4所示。
通過測試結(jié)果可以看到我可以很簡單對某一模塊進行自己想要的測試,如圖4結(jié)果顯示的junit單元測試,即我們現(xiàn)在可以很輕松地對框架實現(xiàn)功能的變更。
隨著軟件行業(yè)的發(fā)展,軟件測試技術(shù),特別是自動化測試技術(shù)越來越受到業(yè)內(nèi)人士的重視,而如何有效地開展自動化測試也成了個軟件企業(yè)探索的一個總要方向,本文通過在自動化測試系統(tǒng)中引入Spring框架技術(shù),使得系統(tǒng)的開發(fā)效率和質(zhì)量都大大得到提升,通過在對實際項目的實驗可以發(fā)現(xiàn),由于Spring本身對代碼良好的封裝性,在以后產(chǎn)品功能變更的時候極大的降低了框架的修改復(fù)雜度,使得自動化測試系統(tǒng)的壽命得以延長,且Spring不但應(yīng)用于普通軟件產(chǎn)品的開發(fā),其通過對測試的輔助也可以達到增強整個軟件產(chǎn)品穩(wěn)定性和高效性的作用。最重要的是引入了Spring的自動化測試框架其本身也達到了軟件系統(tǒng)所要求的代碼的良好的封裝以及松耦合等特性,這使得系統(tǒng)在應(yīng)對未來的功能上的更改甚至于其他項目上都能發(fā)揮其作用,這能大大降低公司的人力資源成本和無用的功能重復(fù)開發(fā)。
[1] 計文柯.Spring技術(shù)內(nèi)幕-深入解析Spring結(jié)構(gòu)與設(shè)計原理[M].北京:機械工業(yè)出版社,2010.
[2] 劉京華.java web整合開發(fā)王者歸來[M].北京:清華大學(xué)出版社,2010.
[3] 陳能技. 軟件自動化測試成功之道:典型工具、腳本開發(fā)、測試框架和項目實戰(zhàn)[M].北京:人民郵電出版社,2010.
[4] 王東剛.軟件測試與junit實踐[M].北京:人民郵電出版社,2004.
[5] 劉雙悅.王培東.一種基于改進遺傳算法的面向路徑測試用例自動生成方法[J]. 自動化技術(shù)與應(yīng)用, 2010(03).
[6] 王小銀. 軟件自動化測試的研究與實現(xiàn)[J]. 電腦知識與技術(shù), 2010(25).
[7] 謝經(jīng)緯. 吳昊. 探索性方法在面向故障軟件測試中的應(yīng)用[J]. 微計算機信息, 2010(25).
[8] Seth Ladd .深入解析Spring MVC與Web Flow [M].北京:人民郵電出版社, 2008.