mocha+chai使用记录

mocha+chai是比较流行的测试框架‘套装’,能实现一些基本的前端测试如函数功能测试,模拟登陆,异步测试,流程测试等

官方文档

mocha

chai

基本用法

mocha是一个测试工具库,它只纯粹对测试行为(过程)进行描述;而chai是一个断言(推断)库,它可以将测试结果进行各种判断,以此推断是否符合预期,因此两者常常进行组合使用

安装

1
2
//全局安装
$ npm install -g mocha

ps: 全局安装之后,mocha命令将会在全局注册,可以在任何地方使用mocha命令

1
2
//安装项目依赖
$ npm install mocha chai

使用

目录结构

1
2
3
4
5
6
7
8
9
├── test //测试用例
│   ├── hooks.js //生命钩子
│   ├── test.js //入口文件
│   └── unit //测试单例
│   ├── add.js
│   └── ...
└── src //业务代码
   ├── add.js
   └── ...

所有测试代码都在test目录,所有的业务代码都在src目录

一个简单的例子

1
2
3
4
5
6
//src/add.js
function add(a, b){
return a + b;
}
module.exports = add;

1
2
3
4
5
6
7
8
9
//test/unit/add.js
var add = require('../../src/add.js');
var expect = require('chai').expect;

describe('加法函数', function () {
it('1 + 3 = 4', function () {
expect(add(1, 3)).to.be.equal(4);
});
});
1
2
3
4
$ mocha mocha/unit/add
加法函数
√ 1 + 3 = 4
1 passing (16ms)

Expect/Should/Assert

The Expect / Should API covers the BDD assertion styles.
The Assert API covers the TDD assertion style.

异步

  • promise异步一定要带上done(),用于通知mocha该测试已经完成
  • 异步通常和参数-t结合一起用

通配符

1
2
3
4
//test/unit目录下add.js和minus.js
$ mocha test/unit/{add,minus}.js
//test/unit目录下所有js后缀的文件
$ mocha test/unit/*.js

mocha支持shellnode的通配符匹配规则,更多通配符规则可以查看各自的文档

命令行参数与配置文件mocha.opts

常用的命令行

  • –recursive

Mocha默认不对指定目录的子级目录匹配,如果需要使自己目录的测试用例运行,则需要加上--recursive

  • –reporter

输出报告的格式,默认是--reporter spec,可以用--reporters命令查看有哪些输出格式

  • –watch

监听变化,每次修改自动执行test

  • –timeout -t

Mocha默认每个测试用例最多执行2000毫秒,如果到时没有得到结果,就报错。对于涉及异步操作的测试用例,这个时间往往是不够的,需要用-t--timeout参数指定超时门槛

  • –hlep,-h

查看有哪些命令
mocha.opts放在test目录下,执行mocha命令时回去读取里面的配置
命令行参数可以写在mocha.opts文件内,如

1
$ mocha --reporter tap --recursive -t 3000

等价于
test/mocha.opts文件内容

1
2
3
--reporter tap
--recursive
-t 13000
1
$ mocha

hooks(钩子)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
describe('hooks', function() {

before(function() {
// 在本区块的所有测试用例之前执行
});

after(function() {
// 在本区块的所有测试用例之后执行
});

beforeEach(function() {
// 在本区块的每个测试用例之前执行
});

afterEach(function() {
// 在本区块的每个测试用例之后执行
});

// test cases
});

可以写在测试用例内(每个describe块内),此时只对当前测试用例有效
也可以写在外部,此时对所有的测试用例有效

注意

  • 内置promise对象
  • ES6需要转码