最近在写restful API ,实在受不了用postman测试API的效果了,一怒之下翻出来原来用过的mocha。
"devDependencies": {
"mocha": "3.0.2",
"supertest": "3.0.0"
"chai":"4.1.2"
}
安装
Npm install
mocha是JavaScript的一种单元测试框架,既可以在浏览器环境下运行,也可以在Node.js环境下运行。
优点:
1. 可以自动运行所有测试,也可以只运行特定的测试;
2. 可以支持before、after、beforeEach和afterEach来编写初始化代码。
编写测试的原则是,一次只测一种情况,且测试代码要非常简单。我们编写多个测试来分别测试不同的输入,并使用chai模块提供的expect 判断输出是否是我们所期望的。
describe('XXX TEST', function() {
before (function (done) {
}
after(function (done) {
}
beforeEach(function(){
})
afterEach(function(){
})
it('XXX test', function(done) {
}
}
PS:mocha 一次测试默认时间为2000ms ,超过就认为测试失败,我们可以在Describe开始时设置超时时间
Sample:
Describe{
this.timeout(4000);
it('XXX test', function(done) {}
}
我们使用下列断言处理请求返回值
var expect = require('chai').expect;
./node_modules/mocha/bin/mocha ./test/restfulapi_test/accout_test.js
// 相等或不相等
expect(4 + 5).to.be.equal(9);
expect(4 + 5).to.be.not.equal(10);
expect(foo).to.be.deep.equal({ bar: 'baz' });
// 布尔值为true
expect('everthing').to.be.ok;
expect(false).to.not.be.ok;
// typeof
expect('test').to.be.a('string');
expect({ foo: 'bar' }).to.be.an('object');
expect(foo).to.be.an.instanceof(Foo);
// include
expect([1,2,3]).to.include(2);
expect('foobar').to.contain('foo');
expect({ foo: 'bar', hello: 'universe' }).to.include.keys('foo');
// empty
expect([]).to.be.empty;
expect('').to.be.empty;
expect({}).to.be.empty;
// match
expect('foobar').to.match(/^foo/);
expect断言的优点是很接近自然语言
如果要测试异步函数,我们要传入的函数需要带一个参数,通常命名为done:
it('test async function', function (done) {
fs.readFile('filepath', function (err, data) {
if (err) {
done(err);
} else {
done();
}
});
});
测试异步函数需要在函数内部手动调用done()表示测试成功,done(err)表示测试出错。
首先导入supertest模块,然后导入app模块
request = require('supertest'),
app = require('../app');
//app = "http://52.79.113.238";也可以直接给地址
这样就会启动一个express实例 。
下面执行的是一个post请求测试(测试app 这个实例 /v2/devices/xxx API)
describe('devices test', function() {
it('/device api test',function(done) {
request(app)
.post('/v2/devices/xxx')
.set('Content-Type','application/json')
.set('Authorization', 'Bearer ' + accessToken)
.send({
id:targetDeviceId,
})
.expect(204) //断言希望得到返回http状态码
.end(function(err, res) {
console.info(res.body);//得到返回我们可以用2.2中的断言对返回结果进行判断。
done();
});
});
//..................
});
.post(‘api’)
.set 为header内容
.Send 为body 内容
当所有测试运行结束后,app实例会自动关闭,无需清理。
利用mocha的异步测试,配合supertest,我们可以用简单的代码编写端到端的HTTP自动化测试。
如何使用自签名的证书,在使用Postman之类测试工具时,可以在浏览器中添加证书来解决警告问题。
但在supertest中,我们使用下列语句配置node环境变量,让node不去验证证书。
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
执行一个测试:
./node_modules/mocha/bin/mocha -t 4000 编写的测试程序.js
执行多个测试
./node_modules/mocha/bin/mocha 编写的测试程序.js 编写的测试程序2.js 编写的测试程序3.js
每一个it 测试项通过会
✓ xxx test (85ms)
不通过会用红色字体报错
所有测试执行完成后会有总结性输出
13 passing (5s)
3 failing
参考(廖学峰的博客):
https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/00147203593334596b366f3fe0b409fbc30ad81a0a91c4a000
参考(阮一峰的博客):
http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutorial-of-examples.html