讓我們看看Javascript單元測試的現狀和測試載入器。
1.JsUnit
我們已經在使用它來作為我們的單元測試工具了。
優勢:
●可以被ant構建檔案調用;
●啟動瀏覽器來運行測試案例;
●Eclipse外掛程式支援;
缺點:
●需要啟動瀏覽器來運行測試案例;
●不支援用js檔案來寫單元測試代碼:它必須嵌入在html檔案中;
●它已經好幾年沒更新了;
注意:
●有一個測試載入器叫JsUnit(2);
●“ant”是一個開源構建工具;之所以叫“Ant”因為它很小,但是可以用來構建大型項目;
2.RhinoUnit
優勢
●ant驅動
●支援js檔案
●很容易使用
缺點
●類比的Javascript引擎不夠優秀來支援我們的代碼。我嘗試過用它來運行“在JsUnit上運行正常”的測試代碼,但是在載入我們的通用Javascript檔案時遇到了問題
3.crosscheck
優勢
●可以被ant構建檔案調用
●類比了真實瀏覽器行為
缺點
●類比的Javascript引擎僅有少有的幾個瀏覽器版本
●兩年沒有更新了:不支援Firefox 2.x 或 3.x
4.jsspec
優勢
●運行在真實的瀏覽器上
缺點
●Javascript只有架構,無法被ant構建檔案調用
5. jspec
優勢
●運行在真實的瀏覽器上
缺點
●貌似不支援我們的代碼,我嘗試運行了”在JsUnit上運行正常“的測試代碼,但是在載入我們的通用Javascript檔案時遇到問題
●Javascript只有架構,無法被ant構建檔案調用
6. Screw.unit
優勢
●運行在真正的瀏覽器中
缺點
●Javascript只有架構,無法被ant構建檔案調用
注意:我們使用過它,但是它比jsspec和jspec還要小。
這麼看來JsUnit是我們唯一的選擇。注意它已經在其他組件中被使用了。它不是完美的,它沒有提供一個方便的實現測試驅動開發(TDD)的方法:
●它沒有提供一個簡單、整合的方法來運行單元測試
●它強制你在html檔案中寫單元測試,而不是js檔案
●它強制你安裝一個本地JsUnit架構,來避免寫入程式碼js的單元測試檔案的路徑
其結果是,當你在”測試驅動開發“Javascript的時候,不得不在你的IDE和你要測試的瀏覽器之間來回切換。這是可行的,但是我不認為這是高效的(這裡我可能錯了)。
當然我還在尋找一個更好的Javascript編輯器或者是能夠很容易實現引用和重構的Eclipse外掛程式。WTP項目中有一部分叫JSTD的外掛程式,然而我沒有足夠的使用經驗來評論它。
總結,我不認為我們有工具可以完全實現”TDD“。我們可以 TOD(面向測試的開發),但是我還沒有找到任何能夠讓我們像寫Java一樣高效地寫Javascript的工具。再次聲明,理想的解決方案會和JUnit類似。
你在使用什麼單元測試工具?
得票最高的答案,來自gregers
1. Buster.js
與JsTestDriver(之後會談到)的server/client概念類似。除了server是使用Node.js實現的,而不是Java。並且API遵循了JS的最佳實務。
一個瀏覽器Javascript測試載入器庫。自動化瀏覽器測試(想下JsTestDriver吧),qunit風格的靜態HTML頁面測試,可以在無介面的瀏覽器(phantomjs,jsdom…)和其他瀏覽器中測試。看看它的概覽吧!
一個Node.js測試載入器庫。你有相同的測試案例庫,斷言庫等等。這對同時支援瀏覽器和Node.js的代碼來說很好。使用Buster.JS寫你的測試案例,然後在Node.js和真實瀏覽器中運行。
截圖:Buster.js入門 (2:45)
優勢:
●使用Node.js,相容Win/OS X/Linux
●可以在普通瀏覽器或無介面瀏覽器PhantomJS(快了)中運行
●一次運行多個用戶端
●支援Nodejs測試
●不需要在開發機器上運行 server/clients(不需要安裝IE)
●在命令列中運行測試(可以被ant/maven整合)寫xUnit或BDD風格的測試
●支援多個Javascript測試架構
●支援延緩測試而不是把代碼注釋掉
●內建SinonJS
●在儲存的時候自動運行測試
●代理跨域的請求:
●可以擴充包含其他測試架構(內建JsTestDriver)
●加上你自己的斷言/拒絕
●報表(xunit XML, traditional dots, specification, tap, teamcity和更多內建的)
●自訂或替換在瀏覽器測試中啟動並執行HTML
●TextMate和Emacs整合
缺點:
●還在beta中,有很多bug
●還沒有Eclipse或IntelliJ的外掛程式
●不像TestSwarm那樣以os/browser/version方式組織結果。 註:它會,但是只在測試結果中列印瀏覽器名字和版本
●沒有像TestSwarm那樣的曆史支援,看不到之前的測試結果
註:當你需要為Buster.js提供一個獨立的CI服務,TestSwarm也可以作為持續整合(CI)服務。不過Buster.js可以輸出xUnit XML報表,所以它可以很容易的被整合到Hudson,Bamboo等CI服務中。
2. TestSwarm
TestSwarm是John Resig(jQuery作者)建立的分布式Javascript測試載入器。主要用於開源Javascript項目的測試,但是TestSwarm也是開 源的,所以你可以為自己配置一台TestSwarm伺服器用於企業測試。不過這可能需要你做不少的修改。
優勢
●Javascript的持續整合服務
●支援所有的主要瀏覽器和作業系統
●一次運行多個用戶端
●不需要在開發機器上運行server/client (不需要安裝IE)
●當你提交東西(或修改指令碼)的時候,在所有用戶端上自動運行測試
●顯示每次提交的測試曆史結果
●支援多種Javascript測試架構
●有針對作業系統和瀏覽器版本的結果
●Crowdsource to test in a multitude of browsers
缺點:
●無法通過ant/maven來打斷測試
●在提交之前無法知道測試案例失敗
●沒有IDE外掛程式支援
http://ejohn.org/blog/javascript-testing-does-not-scale/
TestSwarm的架構:
3. JsTestDriver
一些google的工程師也開始了一個分布式Javascript工具的開發,JsTestDriver。它和TestSwarm類似,它有一個伺服器,並且用戶端是與伺服器保持串連。但是它也支援從命令列運行,並且有Eclipse和IntelliJ的外掛程式!
優勢:
●支援所有主要的瀏覽器和作業系統
●一次運行多個用戶端
●不需要在開發機器上運行server/client (不需要安裝IE)
●可以在命令列(jar)運行測試(可以被ant/maven整合)
●Eclipse外掛程式
●IntelliJ外掛程式
●支援多種Javascript測試架構
缺點:
●不顯示作業系統或瀏覽器版本。只有瀏覽器名字,不過它在測試結果中會列印版本
●不支援測試曆史結果
●項目不是很活躍,更新慢
JsTestDriver的運行概覽如下: JsTestDriver
Eclipse外掛程式截圖: JsTestDriver for Eclipse
簡單的介紹視頻:http://www.youtube.com/watch?v=V4wYrR6t5gE
4. YUI Yeti
Yahoo現在已經在自己的服務上運行測試Javascript,Yeti。基於Node.js構建。它可以運行你現有的YUI-test,並且支援多種瀏覽器。既然它可以通過命令列運行,所以我猜測它和JsTestDriver類似。
發佈於2010年8月25日:
如果你對它很熟悉,請提供給我更多的資訊:
項目地址:http://yuilibrary.com/projects/yeti/
5. Jasmine
這個測試載入器可能會引起”對Ruby/Ruby on Rails熟悉“的開發人員的注意。它的文法是基於RSpec,RSpec被用於Rails項目的測試。
Jasmine是一個行為驅動開發(BDD)的Javascript測試架構。它不依賴任何其他的Javascript架構。它也不依賴DOM。
如果你對它很熟悉,請提供給我更多的資訊:)
項目首頁:https://github.com/pivotal/jasmine/
6. QUnit
QUnit專註於瀏覽器上的Javascript測試,故而提供了儘可能多的方便。來自官方網站的簡介:
QUnit是一個強大的、便於使用的Javascript單元測試庫。jQuery、jQuery UI和jQuery Mobile項目都使用了它。它也完全可以用來測試通用的Javascript代碼
QUnit與TestSwarm有些相同的曆史:
QUnit是jQuery的一部分,也由John Resig開發。在2008年,它有了自己的個人首頁、名字和API文檔,允許其他人使用它用作單元測試。當時它還是基於jQuery的。2009年時一 次重構解決了這個問題,如今QUnit完全獨立於jQuery。QUnit的斷言方法遵循了CommonJS單元測試標準,此標準也一定程度受到了 QUnit的影響。
項目首頁:http://qunitjs.com/
7. Sinon
Sinon.js是另一個很棒的測試載入器。它由《Test-Driven JavaScript Development》一書的作者Christian Johansen開發。他認為這是最棒的。
為Javascript提供獨立的spies,stubs和mocks。沒有任何依賴,可以與任何單元測試架構協同工作。
http://tddjs.com/
註:本文由周敏明編譯自Stack Overflow同名問答貼,其他回複可參見 StackOverflow 原帖
文章來源:伯樂線上