JavaScript 單元測試現狀
不管使用什么編程語言和平臺,編寫單元測試都是被廣為接受的技術實踐,以便交付易于維護的代碼。這對于JavaScript這樣的動態語言尤為重要,目前已經有一些針對JavaScript的單元測試框架和庫供大家選擇。
InfoQ與目前流行的一些JavaScript單元測試框架的作者進行了問答,問題主要針對他們的項目以及開發人員可以從中獲得哪些好處。
參與者包括:
- QUnit的作者Jörn Zaefferer
- Jasmine的作者Davis Frank
- Jarvis的作者Tommy Montgomery
- jfUnit的作者Felipe Nascimento de Moura
InfoQ: 你的項目是做什么的,和其他JavaScript測試框架有什么不同?
Jörn Zaefferer : QUnit是一個JavaScript單元測試框架,主要用于在瀏覽器中運行單元測試。雖然這個項目從屬于jQuery,但卻不依賴于jQuery,也不依賴于瀏覽器DOM。因此你也可以在node.js或Rhino上使用。QUnit很容易學習,你只需在html頁面中包含兩個文件,不需要安裝或者構建任何其他東西。最短的測試集只需要一個11行的html文件。
Davis Frank: Jasmine是一個 JavaScript測試框架,目的是將BDD風格引入JavaScript測試之中。至于區別嘛,我們的目標是BDD(相比標準的TDD),因此我們盡 力幫助開發人員編寫比一般xUnit框架表達性更強,組織更好的代碼。此外我們還力圖減少依賴,這樣你可以在node.js上使用Jasmine,也可以在瀏覽器或移動程序中使用。
Tommy Montgomery: Jarvis是一個JavaScript單元測試框架,API風格基于.NET平臺上的NUnit。與其他測試框架的區別包括堆棧打印,帶顏色的字符串比較,以及可讀性更好的API。
Felipe Nascimento: jfUnit的主要特點是它的加載方式和編寫方式。它需要更少的輸入,這讓你編寫單元測試更容易,而且可以在開發環境、控制臺或任何你需要的地方運行。
InfoQ: 能大概說一下項目的架構么?主要的組件有哪些?
Jörn Zaefferer: QUnit的API非常直觀: 調用test方法,傳入測試的名字和回調函數,在回調函數中編寫測試代碼,其中包含一些斷言。QUnit還提供一些選項來組織測試,例如含有setup和teardown的模塊。在內部這些調用被映射為隊列。根據執行環境的不同,QUnit會在window.load或其他事件發生時(或者由用戶觸發)開始執行測試。當某個測試需要異步執行時,會等到測試執行結束后再執行下一條。測試的執行順序是變化的: 這是一個可選的功能,默認會根據上一次執行的結果重新排列執行順序,但結果還是按照之前的順序顯示。如果你選擇隱藏已經通過的測試,就可以重新運行所有失敗的測試,無需等待將全部測試都運行一遍的時間,可以更快知道這些測試是否被修復。
Davis Frank: 我們盡量保持簡潔,Jasmine的核心只有一個JavaScript文件,它提供了一種領域專用語言來編寫測試。這種領域專用語言將測試組織為樹狀結構并執行。這個部分非常的簡單。
在核心部分之上,還有一些用于在不同環境中顯示測試報告的功能,以及方便管理源文件和測試文件的功能。Jasmine可以在Ruby on Rails或任何Web框架中使用。還有些人用它在node.js環境中做開發,任何使用JavaScript的地方,Jasmine都應該能夠使用, 如果不能我們就要讓它變成可能。
Tommy Montgomery: 和其他xUnit框架一樣,Jarvis也是基于約束的。每個斷言其實都在背后創建了一個約束對象,用來比較期待值和實際值。例如,當運行Assert.that("foo", Is.equalTo("bar")); 時,會對左邊的“foo”和右邊的“bar”做等值比較。這個API(從NUnit借鑒而來)非常簡單易讀,我認為這在單元測試中是非常重要的。在使用方面,主要的組件是Assert對象、Is對象和執行器。Assert暴露一組函數用于對值進行斷言,Is則體現了Jarvis基于約束的架構。你可以通過調用Jarvis.run()并傳入測試函數來運行測試。Jarvis的測試報表是可配置的,內置兩種報表方式:一種針對控制臺(比如FireFox中的Firebug),另一種則生成HTML。
Felipe Nascimento: jfUnit是一個全局對象,你可以通過它來添加或刪除測試。寫好測試以后,這些測試并不會自動執行,你需要顯式調用jfUnit的執行方法,在控制臺或地址欄里都可以。我建議你在開發環境和測試環境中自動加載(測試庫本身和測試腳本),在生產環境中則要刪除。這么做可以讓你在任何地方執行測試,并馬上在屏幕上得到結果。
InfoQ: 開發人員剛開始使用你的框架時,怎么使用最好,典型的流程是怎樣的?
Jörn Zaefferer: 網上有一篇很棒的文章introducing QUnit on Script Junkie - 覆蓋了對QUnit的基本介紹、大多數的API,以及一些讓你可以更高效的進行TDD的高級特性。
Davis Frank: 有很多截屏視頻和教程。這個Railscasts的非常棒,PeepCode的CoffeeScript cast也不錯,雖然是關于CoffeeScript的,但Geoffrey同時也展示了如果使用Jasmine來做TDD。
Tommy Montgomery: 最好的辦法是瀏覽Jarvis的網站,看看示例代碼,在網站上直接執行一些測試,搞明白測試的寫法以及測試報告的樣式。Jarvis 本身的測試也是用Jarvis編寫的,你可以在這里查看測試結果。之后,你就可以下載整個框架,然后在項目中使用了。編寫測試的具體流程取決于開發人員,Jarvis對此沒有任何假設和約束。由于主要的測試運行器是基于HTML的,因此打開瀏覽器是必須的。我個人的工作流程是編寫代碼,然后編寫測試,刷新瀏覽器,查看測試結果,如此往復。
Felipe Nascimento: 你可以在這里找到一些詳細的信息。基本上,開發人員需要加載這個庫,然后使用jfUnit對象來編寫測試。測試編寫完畢后,執行jfUnit.run()來查看測試結果。你還可以用jfUnit.config({...})來設置一些參數或者環境變量。唯一我覺得需要特別提出的是,測試框架使用body元素來構建測試報表,因此在頁面上必須要有body元素。
InfoQ: 哪些特性是你希望將來能夠實現的?對于JavaScript測試框架,未來的發展方向是怎么樣的?
Jörn Zaefferer: 目前最重要的是能與命令行做更好的集成,比如在node.js里,你需要一個qunit.js之外的腳本,我們會通過npm發布。除此之外我們會集中精力改進現有的功能。可能最后會有一個BDD風格的包裝,比如Pavlov。那時想用QUnit但是又喜歡BDD的人可以聯合使用Pavlov與QUnit。最后,不算是代碼上的功能,qunitjs.com會在年內上線。
Davis Frank: 在Pivotal Tracker上我們有一個公開的特性計劃表,你可以看到我們接下來的發布會包含哪些內容。我們歡迎來自社區的任何貢獻者,但同時我們也很挑剔。我們希望能夠保持Jasmine精煉和緊湊。讓你的補丁和特性足夠簡潔,而且要包含相應的測試。畢竟,Jasmine是一個測試框架,所以你最好用TDD的方式。
Tommy Montgomery: 目前我在努力支持nodejs以便可以在服務器端編程中使用。以后可能會有一個ant task和一個控制臺的執行程序。JavaScript測試框架對瀏覽器的依賴阻礙了自身(大多數情況下)。因此擺脫瀏覽器單獨使用對所有JavaScript單元測試框架都是必須的。JavaScript測試框架會更好的填補服務器端與客戶端測試之間空白。
Felipe Nascimento:我非常喜歡JavaScript,我認為這種語言將會被大多數開發人員所使用。我喜歡JavaScript的表達方式,新工具以及新技術。我是BrazilJS(巴西JavaScript協會)的一員,我希望JavaScript擁有美好的前景。我很期待開發新功能,使這個測試工具將來可以讓測試Ajax更簡單,讓用戶編寫測試更簡單,讓測試圖形界面比如填寫表單、提交表單、點擊按鈕(目前已經可以實現,但是比較難寫)等更簡單。我還想說,如果你是一個開發人員,想要貢獻你的一分力量,請告訴我。請將你的批評、建議、想法、缺陷報告或者代碼通過我的github帳戶告訴我。
座談嘉賓
Jörn Zaefferer 居住在德國科隆,是一個自由職業的Web開發人員、咨詢師和培訓師。他將 jQuery的測試套件演化為JavaScript測試框架QUnit,并且一直維護。他還創建并維護著大量流行的jQuery插件,作為jQuery UI開發組長,他關注最多的是新插件、新部件和新工具的開發。
Davis Frank 生活在北加利福尼亞,他是一位軟件工程師、父親和棒球愛好者。目前他是Pivotal Labs的軟件工程師和經理。業余時間,他喜歡和家人在一起,并確保家里的網絡保持99.9%暢通。
Tommy Montgomery 擁有數學及計算機學士學位。早期工作于LAMP項目中,去年開始將主要精力放在.NET項目上。PHP、C#和JavaScript是他最感興趣的編程語言。近期參與的項目包括Sunlight - 客戶端語法高亮程序、Jarvis和Butterfly - 用.NET和JavaScript編寫的markup到html的轉換程序。
Felipe Nascimento de Moura 生活在巴西,是一位資深開發人員與系統分析師。他擁有7年Web開發經驗,是很多開源項目的發起者,例如theWebMind.org、PHPDevBar,以及jfUnit,還是巴西JavaScript協會BrazilJS的組織者之一。
查看英文原文: Virtual Panel: State of the Art in JavaScript Unit Testing