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