如今,各種測試框架層出不窮,每一種框架都有其獨(dú)特性以及各自的優(yōu)勢。由于工作的原因,分別先后接觸了JUnit以及Respec兩套測試框架,雖然研究的不深,但也這兩套框架談一談自己的理解。重點(diǎn)主要針對于Rspec框架。
JUnit介紹
眾所周知,JUnit是一個用Java編寫而成的單元測試框架。利用JUnit,我們可以通過編寫簡單的測試代碼,方便的進(jìn)行白盒測試,也可以說:在了解了被測代碼如何工作的前提下,對其內(nèi)部結(jié)構(gòu)的正確性進(jìn)行自動化的測試。在JUnit的官網(wǎng)上,我們可以看到有關(guān)JUnit更為正統(tǒng)的釋義——JUnit是一個開放源代碼的簡單框架,用來編寫和運(yùn)行可重復(fù)的測試(也被稱為回歸測試)。它是致力于單元測試框架的XUnit架構(gòu)的一種實(shí)現(xiàn)。其中包含了:
1.用于檢測預(yù)期結(jié)果的Assertions
2.用于共享測試數(shù)據(jù)的Test Fixtures
3.用于運(yùn)行測試的Test Runners
在使用JUnit時,其主要投放場景是:a.與開發(fā)人員約定好要測的內(nèi)部方法、或是對外接口(方法名稱、參數(shù)個數(shù)、參數(shù)類型等),兩邊同時開工,開發(fā)提測,運(yùn)行JUnit測試代碼。b.根據(jù)開發(fā)已寫好的代碼,編寫測試代碼,校驗(yàn)其正確性。這兩種情景都很常見,具體采用哪種,視時間寬松程度而定。
由于JUnit在很多平臺工具上的集成(ANT,Maven,Eclipse,IntelliJ IDEA等),以及配有大量的插件(dbUnit,xmlUnit等),以及其易用性,使其仍是當(dāng)今單元測試框架的。
Rspec介紹
前不久,由于需要對Kelude平臺建立起一套測試體系,于是便研究起來Respec這一BDD測試框架。說起B(yǎng)DD,我想大家都不陌生,其英文全稱為Behaviour Driven Development,即行為驅(qū)動開發(fā)。Respec是Ruby社區(qū)中為流行的行為驅(qū)動測試框架。關(guān)于BDD更詳細(xì)的介紹,大家可以參考http://qa.taobao.com/?p=11630這篇文章,這里不再過多介紹。
要想真正用好Respec,要遵循其背后的測試思想——測試先行。這也是與JUnit等單元測試框架大的不同之處。所謂測試先行,是要求我們,在開發(fā)人員編碼工作之前,先寫好測試用例,然后由測試來推動開發(fā)工作。通俗解釋為:在設(shè)計實(shí)現(xiàn)一個功能之前,先考慮好如何來測試這個功能,測試的代碼完成后,再編寫功能實(shí)現(xiàn)代碼,并且使得該測試用例運(yùn)行通過,即完成了系統(tǒng)的一個功能模塊。這與通常的JUnit使用場景背道而馳。
如果在接觸Respec的初期,要求編寫Respec測試用例,和編寫功能代碼的人員角色分開,我想這對于開發(fā)人員來說,應(yīng)該是非常被動和痛苦的,同時也會很大程度上限制開發(fā)人員的創(chuàng)造性。因?yàn)楣δ艽a的編寫目的由原來的實(shí)現(xiàn)功能,變?yōu)榱巳缃竦耐ㄟ^測試用例,無論如何對于開發(fā)人員都是一種挑戰(zhàn)。因此,初期嘗試Respec階段,我建議測試用例和功能代碼的編寫都由一個人來承擔(dān)。也是說,自己根據(jù)業(yè)務(wù)需求,先寫好Respec測試用例,然后再編寫功能代碼,而編寫功能代碼的目的是為了通過測試。這樣做的好處,不僅可以大程度的理解Resepc背后的思想,同時也會逼迫開發(fā)人員為了滿足易測性,從而寫出簡潔、高質(zhì)量的代碼。這些優(yōu)點(diǎn),只有真正嘗試過Respec后,才會深有感觸。
Respec在Rails框架中,不僅能針對MVC的Controller層、Model層、View層,進(jìn)行分層測試,同時也可以針對例如路由等其它層面進(jìn)行測試,可以說是功能非常全面。
Rspec初體驗(yàn)
后,針對于Rails應(yīng)用搭建Respec環(huán)境、以及一些常用的插件做一下簡短介紹:
1.假設(shè)Ruby、Rails環(huán)境均已安裝完成,安裝Rspec插件
gem install rspec
2. 安裝測試數(shù)據(jù)準(zhǔn)備工具Factory Girl
gem install factory_girl_rails
3. 安裝測試腳本對代碼覆蓋率的檢測工具RCov
gem install rcov
以上三步安裝了進(jìn)行Respec測試常用的幾個工具。
所有測試代碼放在spec目錄下,并且與功能代碼的目錄結(jié)構(gòu)相對應(yīng)。
下面附上一個Rspec代碼文件:
如上圖:
let 方法主要針對數(shù)據(jù)準(zhǔn)備聲明
Factory :XXX 從FactoryGirl 插件中取出預(yù)先準(zhǔn)備好的數(shù)據(jù)
describe 對應(yīng)于一個測試集
it 對應(yīng)于一個測試用例
每個測試集和測試用例都配有各自的描述信息(測試集名、用例名),這些都是寫進(jìn)測試代碼中的,這樣做,不僅增加了代碼的可讀性,同時在執(zhí)行用例時,一旦用例報錯,可以很方便的查看到是對應(yīng)于哪一部分業(yè)務(wù)規(guī)則的代碼出了問題。在測試用例中用通用語言把系統(tǒng)的行為描述出來,把測試代碼作為系統(tǒng)的定義文檔,將系統(tǒng)的設(shè)計和測試用例結(jié)合起來,這即是BDD所倡導(dǎo)的。
當(dāng)想查看測試用例腳本對于功能代碼的覆蓋情況時,我們可以使用RCov這個工具,通過它,不僅可以通過命令行的形式查看到覆蓋率數(shù)據(jù),也可以以HTML網(wǎng)頁形式查看,非常清晰、具體。