iT邦幫忙

DAY 21
5

Javascript面面觀系列 第 21

Javascript面面觀:應用篇《測試》

測試在開發中是非常重要的一環,對Javascript來說也不例外。下面就來介紹幾種工具。
單元測試
單元測試的元老還是jsunit。
http://www.jsunit.net/

使用xUnit工具做單元測試的概念我就不多說了。在測試組織上,通常會把一組單元測試放在一個testPage裡面,然後提供testPage的url給testRunner.html,它就會偵測裡面的單元測試函數,然後調用這些函數來做單元測試。單元測試函數必須以test開頭,所以非單元測試的函數命名時要避開以test開頭的名稱。

jsunit支援TestSuite以及setUp/tearDown,它另外支援setUpPage,這個函數只會在每個testPage中執行一次。另外它支援幾種assertion:

* assert([comment], booleanValue)
* assertTrue([comment], booleanValue)
* assertFalse([comment], booleanValue)
* assertEquals([comment], value1, value2)
* assertNotEquals([comment], value1, value2)
* assertNull([comment], value)
* assertNotNull([comment], value)
* assertUndefined([comment], value)
* assertNotUndefined([comment], value)
* assertNaN([comment], value)
* assertNotNaN([comment], value)
* fail(comment)

jsunit的testRunner.html可以用網址的query string傳入參數,使用testPage=url可以指定要測試的testPage,另外指定autoRun=true的話,它就會自動執行。利用這個方式,可以用比較自動化的方法來驅動它做測試。

jsunit還內建一個簡單的伺服器,可以用ant來驅動測試。這樣用testRunner.html做出的測試結果,就可以submit到這個伺服器並記錄下來。testRunner.html也可以用query string額外指定submit的伺服器,這樣除了local伺服器外,也可以指定遠端的伺服器來接收測試結果。


另外一個有趣的單元測試工具是fireunit,他是一個firebug的外掛:
http://fireunit.org/

這個工具應該還沒有穩定版,不過很有趣,因為他可以讓測試程式與正常的程式並存,只有打開firebug並且安裝了fireunit時才做測試。

網路上還有非常多的Javascript的單元測試工具,例如(這個列表是從John Resig的文章中擷取的http://ejohn.org/blog/which-unit-testing-framework/):

* JSSpec (MooTools) http://jania.pe.kr/aw/moin.cgi/JSSpec
* UnitTestJS (Prototype) http://github.com/tobie/unittest_js/tree/master
* QUnit (jQuery) http://docs.jquery.com/QUnit
* DOH Unit Testing (Dojo) http://docs.dojocampus.org/quickstart/doh
* YUITest 2 http://developer.yahoo.com/yui/yuitest/
* YUITest 3 http://developer.yahoo.com/yui/3/test/
* Mochitest https://developer.mozilla.org/En/Mochitest
* ScrewUnit http://github.com/nkallen/screw-unit/tree/master
* JsUnitTest http://jsunittest.com/
* jsUnity http://jsunity.com/
* JsTestDriver http://code.google.com/p/js-test-driver/
* Crosscheck http://www.thefrontside.net/crosscheck
* Env.js http://groups.google.com/group/envjs

仔細一瞧,有許多單元測試框架都是相關的framework所開發出來的。另外,我還找到一篇在Javascript中使用Mock Object技術的文章,可以參考一下:
* http://thinkpond.org/articles/2008/mock-jstest-1.shtml

至於什麼是Mock Object...熟悉Java單元測試的人應該都知道,不然可以到:http://www.mockobjects.com看一看。

驗收、整合測試
成品驗收是個大工程,而且用單元測試工具很難做到...這時就要用selenium了。selenium提供了一個firefox extension的ide工具,可以用這個工具來錄製測試腳本,然後用這個腳本來做測試。

http://seleniumhq.org/

下載了selenium-ide-版本號.xpi以後,用firefox開啟就可以安裝,安裝完畢重啟firefox就可以使用。錄製過程很簡單,打開要測試的網頁,然後到「工具」->「Selenium IDE」把它打開(打開時就開始錄製),然後對網頁做一些操作,做完以後停止錄製。它提供非常豐富的assert/verify/wait等命令來檢查網頁上的元素,可以利用IDE在適當的地方插入這些命令來做檢查。這些命令還有線上手冊直接在console panel中顯示,使用起來應該很容易,而且這些命令基本上都可以「望文生義」的。

做完檢查後,就可以把testcase存檔。還可以輸出成java(junit)、php、c#、groovy、python、perl等等的程式,配合Selenium RC及不同的測試工具來驅動。透過這樣的方法,就可以做到測試自動化。舉例來說,我可以使用Selenium RC裡面for Java/jUnit的驅動程式,設定好jUnit的測試環境,然後把testcase存成jUnit的testcase,用ant來驅動測試。

概念驗證
最近看到(從jaceju的plurk)一個有趣的工具,可以做一些協同的概念驗證測試:

http://jsbin.com/

你可以用它編輯一個網頁,網頁裡面做好要用的javascript framework/library連結以及需要的頁面元素,然後另外編輯要測試的程式碼,然後它會幫你把兩者整合,輸出結果。輸出的結果還可以產生分享的link,讓同事及朋友驗證。我在之前幾篇分享也有用到。

小結
總之,有蠻多好用的工具,可以做Javascript及網頁的測試,而且利用這些工具,還可以讓測試過程自動化。最近還看到John Resig開發了另一種概念的分散式測試工具,可以利用他來支援持續整合。下一篇再來介紹吧。


上一篇
Javascript面面觀:網頁篇《Frameworks/Libraries》
下一篇
Javascript面面觀:應用篇《分散式應用》
系列文
Javascript面面觀30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言