天天看點

《JavaScript忍者秘籍》——2.4 測試套件基礎知識

本節書摘來自異步社群《javascript忍者秘籍》一書中的第2章,第2.4節,作者:【美】john resig(萊西格) , bear bibeault(貝比奧特) 譯者: 徐濤 更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

測試套件的主要目的是聚合代碼中的所有單個測試,将其組合成為一個機關,這樣它們可以批量運作,提供一個可以輕松反複運作的單一資源。

為了更好地了解測試套件的工作原理,我們有必要了解如何建構一個測試套件。或許有些出人意料,建構javascript測試套件确實很容易。大約隻需要40行代碼就可以建構好一個功能。

人們可能會問“為什麼要建立一個新的測試套件?”,大多數情況下,可能沒有必要編寫自己的javascript測試套件。目前已經有大量的高品質測試套件可供選擇。但是,建構自己的測試套件可以作為很好的學習經驗,尤其是了解異步測試是如何工作的時候。

2.4.1 斷言

單元測試架構的核心是斷言方法,通常叫assert()。該方法通常接收一個值——需要斷言的值,以及一個表示該斷言目的的描述。如果該值執行結果為true,換句話說是“真值”,斷言就會通過;否則,斷言就會被認為是失敗的。通常用一個相應的通過(pass)/失敗(fail)标記記錄相關的資訊。

從下面的代碼清單中,可以看到一個簡單的實作。

代碼清單2.4 javascript斷言的一個簡單

《JavaScript忍者秘籍》——2.4 測試套件基礎知識

名為assert()的函數1極為簡單。它建立一個新

元素并包含描述,配置設定其一個pass或fail樣式,該樣式取決于斷言參數的值(value),并将新元素附加到body4内的一個清單元素上。

該測試套件包括兩個微不足道的測試3:一個總是成功,另一個總是失敗。pass和fail的樣式規則2,則使用顔色在視覺上表示成功或失敗。

該函數很簡單,但對于未來開發,它将會作為良好的建構塊,在本書中,我們将使用這個assert()方法測試不同的代碼片段,驗證代碼的完整性。

2.4.2 測試組

簡單的斷言是很有用的,但真正發力,卻是在測試上下文中将它們組合在一起形成測試組的時候。

執行單元測試時,一個測試組可能代表一組斷言,因為它們在我們的api或程式裡關聯的是一個單一的方法。如果是在做行為驅動開發,測試組将通過任務內建斷言。不管是哪種方式,其實作實際上是相同的。

在示例測試套件中,測試組将單個斷言的結果插入到結果中。此外,如果任何斷言失敗,那麼整個測試組标記為失敗。如下代碼清單的輸入相當簡單——在實踐中動态控制層級被證明是非常有用的(如果測試失敗的話,可以收縮/展開測試組,并且過濾測試)。

代碼清單2.5 測試分組的實作

《JavaScript忍者秘籍》——2.4 測試套件基礎知識
《JavaScript忍者秘籍》——2.4 測試套件基礎知識

如代碼清單2.5中看到的,其代碼實作和基本的斷言日志記錄真的是沒有太大差別。一個主要的差別是包含一個results變量,該變量持有目前測試組的引用(這樣可以正确插入斷言)。

除了簡單的測試代碼以外,測試架構的另外一個重要方面是異步操作的處理。

2.4.3 異步測試

很多開發人員在開發測試套件時遇到的一個艱巨而複雜的任務是對異步測試的處理。這些測試的結果在一段不确定的時間後會傳回,這種場景的常見例子如ajax請求和動畫。

處理該問題的方式通常是過度設計,并且設計的要比實際需要的更複雜。處理異步測試,我們需要遵循一些簡單的步驟。

1.将依賴相同異步操作的斷言組合成一個統一的測試組。

2.每個測試組需要放在一個隊列上,在先前其他的測試組完成運作之後再運作。

是以,每個測試組必須能夠異步運作。

讓我們來看一個下面清單中的例子。

代碼清單2.6 簡單的異步測試套件

《JavaScript忍者秘籍》——2.4 測試套件基礎知識

讓我們分解代碼清單2.6中的功能。有三個公開函數:test()、pause()和resume()。這三個函數有以下功能。

test(fn)接受一個包含多個斷言的函數,這些斷言可以是同步的,也可以是異步的——并放置在隊列中等待執行。

pause()應該在test函數内部調用,告訴該測試套件暫停執行測試,直到測試組完成。

resume()恢複測試,經過短暫的延遲,開始下一個測試的運作,旨在避免出現長時間運作的代碼塊。

内部的實作函數runtest(),在測試排隊時從列中移除時進行調用。它用于檢查目前套件目前是否沒被暫停以及隊列中是否有測試任務,一旦滿足情況,将從隊列中取出一個測試并嘗試執行它。此外,測試組完成執行之後,runtest()會檢查該套件目前是否暫停了,如果沒暫停(這意味着,測試組中隻有異步測試),runtest()将開始執行下一組測試。

我們将在第8章仔細研究延遲執行,其重點是定時器,我們将深入研究有關javascript代碼延遲執行的細節。

繼續閱讀