Mocha测试框架笔记(一)

想写写Javascript测试很久,但是一直没有有过实践,今天花了点实践从官网看了下资料,做一下笔记。实践一下javascript的单元测试.半翻译半笔记。

如果还不知道Mocha是什么,可以看看官网的介绍mocha
简而言之,它是一个测试框架,在yeoman的generator里面很多都用到了macha,它作为一个测试框架,可以和不少断言库一起使用,官网的信息是这些断言库包括:should.js|expect.js|chai|better-asssert
个人这里只听说过chai,而且本文仅仅对mocha做笔记,chai将另外撰文。

安装:

sudo npm install -g mocha 

Hello World

姑且用官网的第一个例子做学习的Hello World:

1
2
3
4
5
6
7
8
9
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));
assert.equal(-1, [1,2,3].indexOf(0));
})
})
})

命令行mocha运行之:

mocha

这里总结一下最简单的一个测试:

1
2
3
4
5
6
describe("测试名目",function(){
it("测试项目说明",function(){
//断言函数
//assert.equal 即是一个相等关系断言
})
})

异步测试

官网的说法是:Testing asynchronous code with Mocha could not be simpler!(用Mocha做异步测试已经不能再简单!)
官方的例子是:

1
2
3
4
5
6
7
8
9
10
11
 describe('User', function(){
describe('#save()', function(){
it('should save without error', function(done){
var user = new User('Luna');
user.save(function(err){
if (err) throw err;
done();
});
})
})
})

PS:这里为了更方便一点,done()回调函数甚至可以接受一个err作为参数,我们可以直接使用,像这样:

1
2
3
4
5
6
7
8
describe('User', function(){
describe('#save()', function(){
it('should save without error', function(done){
var user = new User('Luna');
user.save(done);
})
})
})

值得说明的是所有的API(原文是Hooks):before(),after(),beforeEach(),afterEach()均可在同步异步环境下友好运行,就像仅仅是一个常规测试用例一样:
Example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
describe('Connection', function(){
//连接数据库并本地创建3个User
var db = new Connection
, tobi = new User('tobi')
, loki = new User('loki')
, jane = new User('jane');

beforeEach(function(done){
//清空数据库后在数据库创建新建的3个User --->异步
db.clear(function(err){
if (err) return done(err);
db.save([tobi, loki, jane], done);
});
})

describe('#find()', function(){
//查询数据库确认结果为3 --->异步
it('respond with matching records', function(done){
db.find({ type: 'User' }, function(err, res){
if (err) return done(err);
res.should.have.length(3);
done();
})
})
})
})


这里注意到:
it的回调里面必须能够返回err才可以确保测试无误,否则回调函数执行done()之前务必使用断言测试确保额可以抛出err

接下来使用chai断言库做Promised chai promised
这里仅仅贴上官网的链接 chai在另外的文章总结

API(Hooks)

四个:before(),after(),beforeEach(),afterEach()

作用:设定测试前提条件,简化测试用例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
describe('hooks', function() {
before(function() {
// runs before all tests in this block
})
after(function(){
// runs after all tests in this block
})
beforeEach(function(){
// runs before each test in this block
})
afterEach(function(){
// runs after each test in this block
})
// test cases
})

Exclusive tests(独立测试,排他测试…不知道准确术语)

简单Demo:
仅仅在describe后用only()引用一个回调

1
2
3
4
5
describe('Array', function(){
describe.only('#indexOf()', function(){
...
})
})

一个简单的包含Exclusive Test的测试案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
describe('Array', function(){
describe('#indexOf()', function(){
it.only('should return -1 unless present', function(){
//code here
})

it('should return the index when present', function(){
//code here
})

})

})

Inclusive tests(与上文对应,包容性测试)

同only()用法完全一致,不过这里使用skip()来跳过测试案例里面的通用测试

Example:

1
2
3
4
5
6
7
8
9
10
describe('Array', function(){
describe('#indexOf()', function(){
it.skip('should return -1 unless present', function(){

})
it('should return the index when present', function(){

})
})
})

……….未完待续…………..

Mocha测试框架笔记(二)