JavaScript的单元测试工具(3)

发表于:2014-10-27来源:uml.org.cn作者:Elaine.Ye点击数: 标签:JavaScript
QUnit的另一个很重要的特性是,其允许你在某个模块中的所有测试被执行之前先、或之后再执行一些命令。module()函数把setup()和teardown()回调当成第二参数来

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