有了单元测试,你就可以放心的进行对模块的修改、重构,而不用担心这次修改会对模块以 外的代码产生影响。

使用单元测试有两种开发方式,一种是行为驱动开发(BDD);另一种是测试驱动开发(TDD)。 前者是项目开始之前,写出用例与期望,从而描述程序的行为,依次作为自动化测试的基础; 后者是项目开始之前,先写测试,在测试的辅助下快速实现功能,再在测试的保护下进行重 构去除冗余代码,提高程序质量。

我们一般采用BDD方式,这种方式更加自然。

mocha是一个js测试工具,前后端通用。

1. 安装mocha

npm install mocha

2. 写测试

mocha运行的时候是自动执行/test/目录下的每一个文件,所以,测试的文件需要放在此 目录下。

// 通过describe关键词描述测试套件(suite test)
describe('suites test', function(){
  // 通过it关键词描述测试条目
  it('item test', function(){
    // 这里开始写判断语句
  })
})

3. 通过断言写判断语句

mocha支持多种断言库:

  • nodejs assert
  • should.js
  • chai.js
  • expect.js
  • better-assert

这里我以nodejs assert举例。

// 获取断言库
var assert = require('assert');
describe('suites test', function(){
  it('item test', function(){
    // 通过断言判断语句1+1执行的结果是否如期望(2),如果不如期望,会进行报错提示。
    assert.equal(2, 1+1)
  })
})

4. 测试报告

mocha支持很多种报告形式,可用过-report关键词设置,不过我们一般使用默认就行了。

# 执行自动化测试
mocha

5. 获取代码覆盖率报告

代码覆盖率简而言之就是有多少代码被测试到了,这个报告从侧面反映了测试的完整性、可 靠性。

代码覆盖率一般考察下面几个指标:

  • 行覆盖率 line coverage
  • 函数覆盖率 function coverage
  • 分支覆盖率 branch coverage
  • 语句覆盖率 statement coverage

代码覆盖率的工具是istanbul,你可以通过下面命令查看一个文件运行时代码的覆盖率:

istanbul cover simple.js

下面是参考测试的代码覆盖率:

istanbul cover _mocha

6. 最佳实践

上面的繁琐的命令可以写入package.json,这样会操作简化。

{
  "scripts" :{
    "test" : "mocha",
    "test-cov" : "istanbul cover _mocha"
  }
}

下面可以通过这样的命令运行4中的效果。

npm run test-cov