在JavaScript中,單元測試是針對程式模組(軟體設計的最小單位)來進行正確性檢驗的測試工作,其目標是隔離程式模組並證明這些單一模組是正確的。單元測試能確保在開發過程的早期就發現問題,可以讓程式設計師方便檢查程式碼片段是否依然正常運作。
本教學操作環境:windows7系統、javascript1.8.5版、Dell G3電腦。
在電腦程式設計中,單元測試(又稱模組測試)是針對程式模組(軟體設計的最小單位)來進行正確性檢驗的測試工作。程式單元是應用的最小可測試部件。在過程化編程中,一個單元就是單一程式、函數、過程等;對於物件導向編程,最小單元就是方法,包括基底類別(超類別)、抽象類別、或衍生類別(子類別)中的方法。
每個理想的測試案例獨立於其它案例;為測試時隔離模組,經常使用stubs、mock 或fake等測試馬甲程式。單元測試通常由軟體開發人員編寫,用於確保他們所寫的程式碼符合軟體需求並遵循開發目標。
單元測試的目標是隔離程式模組並證明這些單一模組是正確的。單元測試能確保在開發過程的早期就能發現問題,是為了讓程式「死得更早」。我們應該從開發的早期就為所有函數和方法編寫單元測試,可讀性強的單元測試可以使程式設計師方便地檢查程式碼片段是否依然正常運作。良好設計的單元測試案例涵蓋程式單元分支和循環條件的所有路徑。採用這種自底向上的測試路徑,先測試程式模組再測試模組的集合,一旦變更導致錯誤發生,借助單元測試可以快速定位並修復錯誤。
單元測試在背景開發中非常流行且普及,例如JAVA開發者的JUnit等,而在前端開發中則使用的非常少。究其原因,主要是單元測試更適用於邏輯程式碼的測試,這對於JAVA等後台程式語言來說測試起來非常方便,但是前端開發很多時候要要UI打交道,UI相關的程式碼不是不可以進行單元測試,但的確很麻煩,比起邏輯程式碼來說困難多了,這就導致了單元測試在前端開發沒有普及起來。
但隨著單元測試的普及,尤其是敏捷開發的推動,湧現了許多優秀的JavaScript單元測試框架,如QUnit、Jasmine等。所有的這些框架基本上都能對Javascript程式碼進行很好的測試,當然UI部分的程式碼測試一樣比較麻煩,但是我們可以透過精心建構我們的測試程式碼來測試部分UI程式碼。但是每個框架都不是萬能的,它們都有各自擅長的領域,下面選取了幾個代表性的框架來介紹。
l QUnit框架
a) 簡介
QUnit是jQuery團隊開發的JavaScript單元測試工具,功能強大且使用簡單。目前所有的JQuery程式碼都使用QUnit進行測試,原生的JavaScript也可以使用QUnit。
最初,John Resig將QUnit設計為jQuery的一部分。 2008年,QUnit才有了自己的名字、首頁和API文檔,也開始允許其他人用它來做單元測試。但當時QUnit還是基於jQuery的。直到2009年,QUnit才可以完全的獨立運作。
b)優點
使用起來非常方便,有漂亮的外觀和完整的測試功能(包括非同步測試);
#非常簡單,容易上手,目前公開的API只有19個;
不需要依賴其它任何軟體包或框架,只要能運行JS的地方就可以,QUnit本身只有一個JS文件和CSS文件,當然如果需要可以和jQuery等其它框架集成;
不僅支援在瀏覽器中測試,還支援在Rhino和node.js等後端測試。
c) 不足
對自動化支援不好,很難和Ant、Maven或自動建置等工具集成,主要用在瀏覽器中進行測試。
l Jasmine框架
a)簡介
Jasmine是一個有名的JavaScript單元測試框架,它是獨立的行為驅動開發框架,語法清晰易懂。
行為驅動開發(BDD):是一種敏捷軟體開發的技術,它鼓勵軟體專案中的開發者、QA和非技術人員或商業參與者之間的協作。 BDD最初是由Dan North在2003年命名,它包括驗收和客戶測試驅動等的極限編程的實踐,作為對測試驅動開發的回應。在過去的數年裡,得到了極大的發展。
BDD的重點是透過與利害關係人的討論來取得對預期的軟體行為的清醒認識。它透過用自然語言書寫非程式設計師可讀的測試案例擴展了測試驅動開發方法。行為驅動開發人員使用混合了領域中統一的語言的母語語言來描述他們的程式碼的目的。這讓開發者得以把精力集中在程式碼應該怎麼寫,而不是技術細節上,而且也最大程度的減少了將程式碼編寫者的技術語言與商業客戶、使用者、利害關係人、專案管理者等的領域語言之間來回翻譯的代價。
BDD的做法包括:
l 確立不同利害關係人要實現的遠景目標
l 使用特性注入法繪製出達到這些目標所需的特性
l 透過由外及內的軟體開發方法,將涉及的利害關係人融入實現的過程中
l 使用範例來描述應用程式的行為或程式碼的每個單元
l 透過自動執行這些例子,提供快速回饋,進行回歸測試
l 使用「應當(should)」來描述軟體的行為,以幫助闡明程式碼的職責,以及回答對該軟體的功能性的質疑
l 使用「確保(ensure)」來描述軟體的職責,以便將程式碼本身的效用與其他單元(element)程式碼帶來的邊際效用中區分出來。
l 使用mock作為尚未編寫的相關程式碼模組的替身
BDD特性注入:一個公司可能有多個會帶來商業利益的不同願景,通常包括盈利、省錢或保護錢。一旦某個願景被開發小組確定為當前條件下的最佳願景,他們將需要更多的幫助來成功實現這個遠景。
然後確定該願景的主要利害關係人,會帶入其他的利害關係人。每個相關者要定義為了實現該願景他們需要完成的目標。例如,法務部門可能要求某些監管要滿足。行銷負責人可能要參加將使用該軟體的使用者的社群。安全專家需要確保軟體不會受到SQL注入的攻擊。
透過這些目標,會定義出要達成這些目標所需的大概的題目或特性集合。例如,「允許使用者排序貢獻值」或「交易審計」。從這些主題,可以確定使用者功能以及使用者介面的第一批細節。
b) 優點
它是一個基於行為驅動開發實現的測試框架,它的語法非常貼近自然語言,簡單明了,容易理解。
能很方便的和Ant、Maven等進行集成進行自動化測試,也可以方便和Jekins等持續集成工具進行集成,可以產生測試結果的XMl文檔。
它有豐富的API,同時使用者也支援使用者擴充它的API,這一點很少有其它框架能夠做到。
使用方便簡單,只需引入兩個js檔案即可
不僅支援在瀏覽器中測試,還支援在Rhino和node.js等後端測試。
對於Ruby語言有特別的支持,能夠非常方便的整合到Ruby專案中去
#c) 不足
在瀏覽器中的測試介面不如QUnit美觀、詳細。
l JsTestDriver
a) 簡介
#JsTestDriver是一個JavaScript單元測試工具,易於與持續建構系統整合並且能夠在多個瀏覽器上運行測試輕鬆實現TDD風格的開發。當在專案中配置好JsTestDriver以後,如同junit測試java檔案一般,JsTestDriver可以直接透過執行js檔案來進行單元測試。 JsTestDriver框架本身就是JAVA的jar包,需要在本地運行並監聽一個連接埠。
b) 優點
可以一次測試多個瀏覽器,使用方法是在啟動服務時可以將多個瀏覽器的路徑作為參數傳進去。可以在多台機器上的瀏覽器中運行,包括行動裝置。
測試運行得很快,因為不需要將結果添加到DOM中呈現出來,它們能夠同時在任意多的瀏覽器中運行,未修改的文件瀏覽器會從快取提取。
不需要HTML配件文件,只需提供一個或多個腳本和測試腳本,測試執行器運行時就會建立一個空文件。
能很方便的和Ant、Maven等進行集成進行自動化測試,也可以方便和Jekins等持續集成工具進行集成,可以產生測試結果的XML文件。
有Eclipse和IntelliJ插件,可以很方便的在這兩個IDE中進行測試,和JUnit很像。
支援其它測試框架,可以測試其它測試框架寫的測試程式碼,例如有對應的插件可以將QUnit和Jasmine測試程式碼轉換成JsTestDriver的測試程式碼。
c) 不足
#在瀏覽器中無法測試,且只能透過自動化工具或控制台運作。產生的結果不夠直觀。
安裝使用稍微有點麻煩,依賴JAVA環境。
l FireUnit
a) 簡介
FireUnit是基於Firebug的Javascript的單元測試架構。簡單說來,FireUnit為Firebug增加了一個標籤面板,並提供了一些簡單的JavaScript API來記錄和檢視測試。
b) 優點
簡單易用
c) 不足
#功能不多,測試程式碼常寫在原始碼裡,雖然可以即時觀看到效果,但耦合太強,不易清理
只運行在Firefox下
[相關推薦:javascript學習教學】
以上是JavaScript單元測試有什麼用的詳細內容。更多資訊請關注PHP中文網其他相關文章!