使用Node.js的断言模块assert进行单元测试

 2015年06月27日    168     声明


单元测试对于及早发现代码问题、定位问题,有其它测试不可替代的作用。做好单元测试在代码的可维护性、代码重构及后期功能扩展方面,都有极重要的意义。对于Node.js来说,有很多第三方自动化测试模块,如:mocha。本文主要介绍,Node.js提供的编写单元测试用例的模块,assert断言模块。使用断言模块require('assert')引用即可。

  1. 抛出断言导常:assert.fail(actual, expected, message, operator)
  2. 检测结果是否为真:assert(value[, message]), assert.ok(value[, message])
  3. 相等和不相等判断:assert.equal(actual, expected[, message])、assert.notEqual(actual, expected[, message])
  4. 严格相等和不相等判断:assert.strictEqual(actual, expected[, message])、assert.notStrictEqual(actual, expected[, message])
  5. 深度匹配和不匹配判断:assert.deepEqual(actual, expected[, message])、assert.notDeepEqual(actual, expected[, message])
  6. 声明模块抛出和不抛出异常:assert.throws(block[, error][, message])、assert.doesNotThrow(block[, message])
  7. 判断是否为假:assert.ifError(value)


1. 抛出断言导常:assert.fail(actual, expected, message, operator)

assert.fail(value)方法用于抛出断言异常。当有异常信息message时将显示异常信息,没有时将显示用例的实际值actual和期望值expected通过分隔符operator分隔。

assert.fail(1, 2, '1应该小于2', '<'); //AssertionError: 1应该小于2 
assert.fail(1, 2, '', '<'); //AssertionError: 1 < 2


2. 检测结果是否为真:assert(value[, message]), assert.ok(value[, message])

assert(value[, message])或assert.ok(value[, message])方法用于检测结果是否为真,不为真时将抛出异常。本站在判断ORM中对象必填项是否填入时使用了此方法,示例如下:

//文章标题和简介必填
 assert.ok(article.title && article.summary, "Need a title and a summary");


3. 相等和不相等判断:assert.equal(actual, expected[, message])、assert.notEqual(actual, expected[, message])

assert.equal(actual, expected[, message])方法用于判断实际值actual和期望值expected是否相等,判断方式相当于使用"=="assert.notEqual(actual, expected[, message])方法则用于判断是否不相等。

assert.equal(1>2, true, '1应该小于2');    //AssertionError: 1应该小于2
assert.notEqual(1>2, false, '1应该小于2');    //AssertionError: 1应该小于2


4. 严格相等和不相等判断:assert.strictEqual(actual, expected[, message])、assert.notStrictEqual(actual, expected[, message])

assert.strictEqual(actual, expected[, message])方法用于判断实际值actual和期望值expected是否严格相等,判断方式相当于使用"==="assert.notStrictEqual(actual, expected[, message])方法则用于判断是否严格不相等。

assert.strictEqual(1, '1', '1和"1"不一样');    //1和"1"不一样
assert.notStrictEqual(1, 1, '1和1一样');  //1和1一样


5. 深度匹配和不匹配判断:assert.deepEqual(actual, expected[, message])、assert.notDeepEqual(actual, expected[, message])

assert.deepEqual(actual, expected[, message])方法用于判断实际值actual和期望值expected是否深度匹配,其判断方式首先会使用"==="进行匹配,还会判断是否为同一个Buffer,是否为相同的Date类型,是否为相同的RegExp类型。assert.notDeepEqual(actual, expected[, message])方法则判断方式相同结果相反。

var buf1 = new Buffer('abc');
var buf2 = new Buffer('abc');
assert.strictEqual(buf1, buf2, 'buf1和buf2不一样');  //AssertionError: buf1和buf2不一样
assert.notDeepEqual(buf1, buf2, 'buf1和buf2一样');  //AssertionError: buf1和buf2一样


6. 声明模块抛出和不抛出异常:assert.throws(block[, error][, message])、assert.doesNotThrow(block[, message])

assert.throws(block[, error][, message])方法使声明的block模块抛出异常。error可以是构造函数,验证函数或者正则表达式assert.doesNotThrow(block[, message])方法判断方式相反。

//用构造函数验证实例
assert.throws(
  function() {
    throw new Error("Wrong value");
  },
  Error
);

//用正则表达式验证
assert.throws(
  function() {
    throw new Error("Wrong value");
  },
  /value/
);

//自定义错误校验
assert.throws(
  function() {
    throw new Error("Wrong value");
  },
  function(err) {
    if ( (err instanceof Error) && /value/.test(err) ) {
      return true;
    }
  },
  "unexpected error"
);


7. 判断是否为假:assert.ifError(value)

assert.ifError(value)方法用于断言value是否为falsefalse时不抛出异常,true时抛出异常。

assert.ifError(1>2); 	//无异常抛出
assert.ifError(1<2); //抛出异常