简介
mocha 是一个基于 nodejs 的单元测试框架。
mocha 官网
命名约定:
test case == 测试用例
1
it('description',function(){});
test suite == 测试集 (eg: descript(‘xxx’,function(){}))
1
2
3describe('description',function(){
// test cases
});
安装及入门
1 | npm install mocha -g |
下面是一个小例子:
hello.js1
2
3
4
5
6
7
8 var assert = require("assert");
describe('Array', function() {
describe('#indexOf()', function () {
it('should return -1 when the value is not present', function () {
assert.equal(-1, [1,2,3].indexOf(5));
});
});
});
1 | $ mocha hello.js |
可以看到测试通过了: 1 passing 。
修改一下hello.js ,使它失败。
1 | var assert = require("assert"); |
再次测试
1 | $ mocha hello.js |
输出信息中还会包含很多 stack trace,这里忽略它。
ok,我们基本入门了。
组织结构
项目中,我们一般会在根目录下新建 test 目录,并且,将所有测试js放在这个目录。然后,在根目录下运行1
$ mocha
就会依次执行 test 目录中的测试。
用法
大部分用法都是从官网 copy 的代码,但是 copy 下来的代码其实只是一个示范,并不能直接运行。 为了方便观察效果, 我加入了一些代码,以便他们可以直接执行。
1 异步
基于 callback 的:
1 | function User(name){ |
基于 promise 的:
1 | var chai = require("chai"), |
上面的测试是对官网例子的补充。 拙劣的模拟db,勿怪。
依赖的库 chai,chai-as-promised。 官网中提到后者,但是没有提及用法。
2. Hooks
Mocha 提供了 before(), after(), beforeEach() 和 afterEach(), 事实上, 很多测试框架都提供了这些函数,以用于在测试之前准备数据,在测试之后清理数据,等等。 比如 Jasmine。
1 | describe('hooks', function() { |
3. Pending Tests
有些时候,我们会先创建一个不包含测试函数的 test case, 最后再由自己或者其他人补充测试函数。这种 test case 就叫做 pending test。1
2
3
4
5
6describe('Array', function() {
describe('#indexOf()', function() {
// pending test below
it('should return -1 when the value is not present');
});
});
运行测试,输出的信息是:1
2
3
4
5
6
7Array
#indexOf()
- should return -1 when the value is not present
0 passing (13ms)
1 pending
4. 灵活的选取test suite 和 test case
mocha支持 only 和 skip 方法, 前者用于指定一个唯一执行的测试, 后者用于跳过某一个测试。这里所说的测试,包括 suite 和 case。
Exclusive Tests(单独测试)
有时候,我们需要单独测试某一个测试集(test suite)或者测试用例(test case)。
请确保只在一个地方使用 only
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17describe('Array', function() {
describe.only('#indexOf()', function() {
// ...
});
});
describe('Array', function() {
describe('#indexOf()', function() {
it.only('should return -1 unless present', function() {
// ...
});
it('should return the index when present', function() {
// ...
});
});
});`
跳过测试
有时候,我们需要暂时的跳过某些测试。 可以使用 skip 方法跳过某些测试,并且,这些测试会在测试报告中显示为 pending 状态。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17describe('Array', function() {
describe.skip('#indexOf()', function() {
// ...
});
});
describe('Array', function() {
describe('#indexOf()', function() {
it.skip('should return -1 unless present', function() {
// ...
});
it('should return the index when present', function() {
// ...
});
});
});
总结
mocha 是一个灵活的 js 测试框架, 它本身不支持断言,promise等语法,但是可以通过第三方库,如should.js,chai,chai-as-promised,q,来扩展自己的功能。由此看见,设计一个伟大的框架,不是一定要面面俱到,但是一定要保留开放的接口,以供和其他库交互。 这样, 一方面,框架本身不会太过庞大,其次,可以通过开发的接口,借助开源的力量,逐渐丰富自己的生态系统。最后,终端用户,也可以根据自己的需求,搭建适合的测试系统。
好像跑题了。。。