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