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