本節書摘來自異步社群《javascript忍者秘籍》一書中的第2章,第2.2節,作者:【美】john resig(萊西格) , bear bibeault(貝比奧特) 譯者: 徐濤 更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
robert frost曾寫道:籬笆築得牢,鄰居處得好,web應用程式也是如此,不管是何種程式設計準則,好的測試鑄就好的代碼。注意對這個“好”字的強調。如果測試用例的建構很差,它很有可能隻是大量的測試套件,不會真正幫助我們提高代碼品質。
優秀的測試用例具有三個重要特征。
可重用性(repeatability)——測試結果應該是高度可再生的。多次運作測試應該産生相同的結果。如果測試結果是不确定的,那我們又如何知道哪些結果是有效的,哪些又是無效的呢?此外,可重制性可以確定我們的測試不依賴于外部因素(諸如網絡或cpu負載)。
簡單性(simplicity)——測試應該隻專注于測試一件事。在不影響測試用例目的情況下,我們應該盡可能消除過多的html标記、css或javascript。我們删除得越多,測試用例隻受特定代碼影響的可能性就越大。
獨立性(independence)——測試用例應該獨立執行。我們必須避免一個測試結果依賴于另外一個測試結果。把測試分解成盡可能小的單元,這将幫助我們确定在錯誤發生時的确切代碼位置。
有很多方法可以用于建構測試,有兩種主要的方法分别是解構型測試和建構型測試:
解構型測試用例(deconstructive test cases)——解構型測試用例,在消弱代碼隔離問題時進行建立,以消除任何不恰當的問題。這有助于我們實作之前列出的三個特征。我們可能從一個完整的網站開始練習,但在消除額外的html标記、css和javascript之後,我們将看到一個能重制該問題的小用例場景。
建構型測試用例(constructive test cases)——建構型測試用例,我們從一個大家熟知的良好精簡場景開始,建構用例,直到我們能夠重制bug為止。為了使用這種風格的測試,我們需要幾個用于建構測試的簡單測試檔案,以及用于生成這些新測試的幹淨代碼副本。
讓我們來看一個建構型測試的例子。
建立一個精簡的測試用例時,我們可以從幾個已經包含最小功能的html檔案開始。甚至不同的起始檔案可以包含不同的功能,例如,一個檔案用于dom操作,一個檔案用于ajax測試,另外一個則用于動畫,等等。
舉個例子,如下代碼清單展示了一個簡單的用于測試jquery的dom測試用例。
代碼清單2.3 一個精簡的用于jquery的dom測試用例

要使用幹淨的代碼副本生成一個測試用例,我們可以使用shell腳本簽出jquery庫,複制測試用例,并建構測試套件,如下所示:
将上述腳本儲存為一個gen.sh的檔案,并使用如下指令行執行:
該指令将可以讓我們從git庫的dom.html檔案中擷取dom測試用例。
另外一種方式是使用一個預先建構的用于建立測試用例的服務。其中一個叫js bin,它是一個用于建構測試的簡單工具,可以生成一個唯一的url位址——甚至可以引用一些最受歡迎的javascript庫的副本。js bin的示例如圖2.4所示。
一旦具備了建立測試用例所需的工具和知識以後,我們就可以為這些測試建立一些測試套件,進而使得反複運作這些測試變得更加容易。讓我們來研究一下。