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); }); |
該例子把用在斷言中的值移到了setup這部分內容中,避免在測試邏輯中使用這些值。
QUnit 還通過asyncTest()函數來提供異步測試支持,如果你正在使用Asynchronous JavaScript and XML(Ajax)來進行事務處理的話,則這是一個非常有用的功能。在這一上下文中,expect()函數能夠讓你輕松地驗證運行在一個測試中的多個斷言。
YUI Test:一個獨立的單元測試模塊
YUI Test,YUI庫(Yahoo!)內部的一個組件,是一個詳盡完整的單元測試框架。若要開始使用YUI Test,你需要:
1. 把YUI種子導入HTML運行器中,如下.
<script src="http://yui.yahooapis.com/3.4.1/build/yui/yui-min.js" kesrc="http://yui.yahooapis.com/3.4.1 /build/yui/yui-min.js">< /script> |
正如該行代碼所反映的那樣,例子使用的是YUI Test的版本3。
在測試腳本文件中,實例化YUI函數,載入所需的模塊test和console,如清單11所示。
清單11. 載入test和console這兩個YUI模塊
YUI().use("test", "console", function (Y) { // 測試用例放在這里 }); |
test模塊顯然是出于測試目的必需的,console模塊則不是強制要用的,不過該例子會使用它來輸出結果。測試用例會放在回調的內部,使用一個全局的Y實例來作為參數。
YUI Test使用Y.Test.Case()構造函數來實例化一個新的測試用例,以及使用Y.Test.Suite()構造函數來實例化一個測試套件,測試套件與JUnit相類似,包含了幾個測試用例,你可以使用add()方法來把測試用例添加到測試套件中。
我們來使用YUI Test重測一下清單5中的源代碼。清單12說明了如何為該測試創建一個套件和一個測試用例。
清單12. 測試套件和測試用例
YUI().use("test", "console", function (Y) { var suite = new Y.Test.Suite("Temperature conversion suite"); //add a test case suite.add(new Y.Test.Case({ name: "Temperature conversion? )); }); |
清單12生成了一個名為Temperature conversion suite的套件,以及一個名為Temperature conversion的測試用例?,F在,你可以在對象字面量(object literal)內部編寫測試方法了,該字面量會被作為參數傳遞給Y.Test.Case構造函數,如清單13所示。
清單13. 填寫了測試方法的測試用例
suite.add(new Y.Test.Case({ name: "Temperature conversion", setUp : function () { this.celsius1 = 20; this.celsius2 = 30; this.fahrenheit1 = 68; this.fahrenheit2 = 86; }, testConversionCtoF: function () { Y.Assert.areEqual(this.fahrenheit1, convertFromCelsiusToFahrenheit(this.celsius1)); Y.Assert.areEqual(this.fahrenheit2, convertFromCelsiusToFahrenheit(this.celsius2)); }, testConversionFtoC: function () { Y.Assert.areEqual(this.celsius1, convertFromFahrenheitToCelsius(this.fahrenheit1)); Y.Assert.areEqual(this.celsius2, convertFromFahrenheitToCelsius(this.fahrenheit2)); } })); |
原文轉自:http://www.uml.org.cn/Test/201301152.asp