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的测试用例。现在,你可以在对象字面量(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