清單 5. 轉換 (qunit/js/script.js)
function convertFromCelsiusToFahrenheit(c){ var f = c * (9/5) + 32; return f; } function convertFromFahrenheitToCelsius(f){ var c = (f - 32) * (5/9); return c; } |
清單 6 顯示了各自的測試用例。
清單 6. 測試用例 (qunit/js/test.js)
module ("Temperature conversion") test("conversion to F", function(){ var actual1 = convertFromCelsiusToFahrenheit(20); equal(actual1, 68, ?Value not correct?); var actual2 = convertFromCelsiusToFahrenheit(30); equal(actual2, 86, ?Value not correct?); }) test("conversion to C", function(){ var actual1 = convertFromFahrenheitToCelsius(68); equal(actual1, 20, ?Value not correct?); var actual2 = convertFromFahrenheitToCelsius(86); equal(actual2, 30, ?Value not correct?); }) |
QUnit 中的測試用例由 test() 方法定義。邏輯是包含在傳入函數的第二個參數中。在清單 6 中,兩個測試分別名為 conversion to F 和 conversion to C。每個測試包含兩個斷言。該測試中的斷言使用了 equal() 方法。equal() 函數可以將預期值與測試函數的實際值相比較。equal() 方法中的第三個參數是錯誤情況下顯示的消息。
還可以通過 module() 函數將測試組織到模塊中。在清單 6 中,Temperature conversion 模塊含有這兩個測試。
如果要運行測試:
在 HTML 運行程序中包含源代碼和測試文件,如清單 7 所示。
在瀏覽器中打開頁面。
清單 7. 在運行程序中包含 script.js 和 test.js
...<script type="text/javascript" src="js/script.js"></script> <script type="text/javascript" src="js/test.js"></script> ... |
圖 1 顯示了 QUnit 如何在瀏覽器 (Firefox) 中顯示結果。
圖 1. QUnit 結果
清單 6 中的斷言使用了 equal() 方法,但它不是 QUnit 提供的惟一斷言。QUnit 提供的其他斷言包括 ok() 或 strictEqual()。清單 8 顯示了正在執行的方法。
清單 8. 更多的斷言
module ("Other assertion"); test("assertions", function(){ ok(true); ok(3); strictEqual("c", "c"); equal (3, "3"); }); |
ok() 函數檢查第一個參數為 true;strictEqual() 驗證第一個參數嚴格等于第二個參數。在這些代碼背后,strictEqual() 使用了 === 運算符,equal() 使用了 == 運算符。
如果測試失敗,QUnit 還提供了有用的信息。將清單 8 中的代碼改成清單 9 中的代碼,讓上一次斷言執行失敗。
清單 9. 上一次斷言出現的錯誤
module ("Other assertion"); test("assertions", function(){ ok(true); ok(3); strictEqual("c", "c"); strictEqual (3, "3"); }); |
圖 2 顯示了 QUnit 執行清單 9 代碼所返回的結果。
圖 2. QUnit 結果:上次測試失敗
結果非常詳細,而且很容易查到上次斷言的預期值與實際值有什么不同。
QUnit 另一項特性能讓您在模塊中的所有測試執行之前或之后執行命令。module() 函數接受 setup() 和 teardown() 回調作為第二個參數。使用 setup() 函數更新 清單 6,如清單 10 所示。
清單 10. setup() (qunit/js/test-setup.js)
module ("Temperature conversion", { setup : function() { this.celsius1 = 20; this.celsius2 = 30; this.fahrenheit1 = 68; this.fahrenheit2 = 86; } }); test("conversion to F", function(){ var actual1 = convertFromCelsiusToFahrenheit(this.celsius1); equal(actual1, this.fahrenheit1); var actual2 = convertFromCelsiusToFahrenheit(this.celsius2); equal(actual2, this.fahrenheit2); }); test("conversion to C", function(){ var actual1 = convertFromFahrenheitToCelsius(this.fahrenheit1); equal(actual1, this.celsius1); var actual2 = convertFromFahrenheitToCelsius(this.fahrenheit2); equal(actual2, this.celsius2); }); |