斷言
斷言是一個特殊的方法,它執行對它的參數給定的驗證,或標識一個錯誤(通常拋出一個類似AssertionError 異常),或什么也不做。最簡單的斷言是它期望參數是“真”。斷言通常也可接受一個在失敗時用于顯示的消息。
[javascript] view plaincopy1. assert("Small date difference expected\n '3 days, 2 hours, 16 minutes and " +
2. "10 seconds ago' got\n'" + element.text() + "'",
3. element.text() == "3 days, 2 hours, 16 minutes and 10 seconds ago");
斷言以第一個參數為消息。這個主意是要首先說明你的預期,而斷言像是用消息來說明(原文:The idea is thattesting is about stating your expectations upfront, and the assertion resemblesa specification with the leading message.)。
你的全部需要通常像上面那個簡單斷言就能滿足,大多的測試框架都附帶選擇自定義斷言的機會。上面我們真正做的就是驗證計算值與預期值的對比。絕大多數的測試框架都針對這種情況提供多種重載的assertEquals。(Most testframeworks have something along the lines of assertEquals for thisspecific use case.)
[javascript] view plaincopy1. assertEquals("3 days, 2 hours, 16 minutes and 10 seconds ago", element.text());
注意我們不再指定一個說明。assertEquals 知道我們期望是第二個計算的值和第一個值相等,所以它可以為我們生成一個適當的消息。
測試用例,setUp 和 tearDown
在我們手工的單元測試中,我們有兩個獨立的測試。當使用測試框架時,通常在一個測試用例中指定為獨立的函數。一個測試用例是一組測試相關功能的測試的集合。為了使測試報告更容易查看,測試用例通常都有一個名字。下面的例子使用JsTestDriver測試用例來組織前面我們手工的單元測試。
[javascript] view plaincopy1. var second = 1000;
2. var minute = 60 * second;
3. var hour = 60 * minute;
4. var day = 24 * hour;
5.
6. TestCase("TimeDifferenceInWordsTest", {
7. "test 8 day difference should result in '1 week ago'": function () {
8. var dateStr = new Date(new Date() - 8 * day).toString();
9. var element = jQuery('Replace me');
10. element.differenceInWords();
11.
12. assertEquals("1 week ago", element.text());
13. },
14.
15. "test should display difference with days, hours, minutes and seconds": function () {
16. var diff = 3 * day + 2 * hour + 16 * minute + 10 * second;
17. dateStr = new Date(new Date() - diff).toString();
18. var element = jQuery('Replace me');
19. element.differenceInWords();
20.
21. assertEquals("3 days, 2 hours, 16 minutes and 10 seconds ago", element.text());
22. }
23. });
每個測試之前的注釋都轉換為測試函數的名稱,比較轉換為斷言。我們甚至可以通過把創建日期對象提取到一個特定的setUp方法調用中來使每個測試更整潔,setUp會在每個測試函數執行之前調用。
[javascript] view plaincopy1. TestCase("TimeDifferenceInWordsTest", {
2. setUp: function () {
3. this.date8DaysAgo = new Date(new Date() - 8 * day);
4. var diff = 3 * day + 2 * hour + 16 * minute + 10 * second;
5. this.date3DaysAgo = new Date(new Date() - diff);
6. },
7.
8. "test 8 day difference should result in '1 week ago'": function () {
9. var element = jQuery('Replace me');
10. element.differenceInWords();
11.
12. assertEquals("1 week ago", element.text());
13. },
14.
15. "test should display difference with days, hours, minutes and seconds": function () {
16. var element = jQuery('Replace me');
17. element.differenceInWords();
18.
19. assertEquals("3 days, 2 hours, 16 minutes and 10 seconds ago", element.text());
20. }
21. });
setUp 方法還有一個對應的tearDown 方法,在每個測試之后執行。這個例子不需要tearDown 方法,但你可以在任何你需要在每個測試之后執行清理時創建一個tearDown 。假想你測試使用localStorage實現緩存一些數據的代碼。為了防止測試相互之間干涉,你可能想在每個測試之后清除寫進localStorage 中的所有數據。
另外,對代碼和測試,你需要指定某種實際運行測試方法。大多的JavaScript單元測試框架需要一個簡單的HTML文件來按正確的順序加載正確的文件(包括測試框架自身)。這個HTML文件然后可以加載到瀏覽器中。通常所有的測試通過為綠色,有失敗的測試時轉為有威脅的紅色。
自動化,自動化,自動化
通過把基于日志的調試工作轉到單元測試,我們確信我們的經驗是重復的和自驗證的。這樣做可節省花費大量的手工勞動,但還有改善的余地。在瀏覽器中運行包含測試的HTML文件是相當無關痛癢的,但如你注意到的,今天web開發不能在一個瀏覽器中簡單測試就完事。依據你的環境,你可能不得不在至少在3個以上平臺的5個以上的瀏覽器的2個以上最新版本上測試。突然,運行那個HTML文件也是有一點工作量的。