跳到主要内容

测试

单元测试

npm install --save-dev mocha chai supertest

  • mocha 模块是测试框架
  • chai 模块是用来进行测试结果断言库,比如一个判断 1 + 1 是否等于 2
  • supertest 模块是 http 请求测试库,用来请求 API 接口

测试例子

demo 地址

https://github.com/ChenShenhai/koa2-note/blob/master/demo/test-unit/

const Koa = require('koa');
const app = new Koa();

const server = async (ctx, next) => {
let result = {
success: true,
data: null
};

if (ctx.method === 'GET') {
if (ctx.url === '/getString.json') {
result.data = 'this is string data';
} else if (ctx.url === '/getNumber.json') {
result.data = 123456;
} else {
result.success = false;
}
ctx.body = result;
next && next();
} else if (ctx.method === 'POST') {
if (ctx.url === '/postData.json') {
result.data = 'ok';
} else {
result.success = false;
}
ctx.body = result;
next && next();
} else {
ctx.body = 'hello world';
next && next();
}
};

app.use(server);

module.exports = app;

app.listen(3000, () => {
console.log('[demo] test-unit is starting at port 3000');
});

开始写测试用例

/test/index.test.js

const supertest = require('supertest');
const chai = require('chai');
const app = require('./../index');

const expect = chai.expect;
const request = supertest(app.listen());

// 测试套件/组
describe('开始测试demo的GET请求', () => {
// 测试用例
it('测试/getString.json请求', done => {
request
.get('/getString.json')
.expect(200)
.end((err, res) => {
// 断言判断结果是否为object类型
expect(res.body).to.be.an('object');
expect(res.body.success).to.be.an('boolean');
expect(res.body.data).to.be.an('string');
done();
});
});
});

执行测试用例

# node.js <= 7.5.x
./node_modules/.bin/mocha --harmony

# node.js = 7.6.0
./node_modules/.bin/mocha

注意:

如果是全局安装了 mocha,可以直接在当前项目目录下执行 mocha --harmony 命令 如果当前 node.js 版本低于 7.6,由于 7.5.x 以下还直接不支持 async/awiar 就需要加上--harmony

用例详解

服务入口加载

如果要对一个服务的 API 接口,进行单元测试,要用 supertest 加载服务的入口文件

const supertest = require('supertest');
const request = supertest(app.listen());

测试套件、用例

  • describe()描述的是一个测试套件
  • 嵌套在 describe()的 it()是对接口进行自动化测试的测试用例
  • 一个 describe()可以包含多个 it()
describe('开始测试 demo 的 GET 请求', () => {
it('测试/getString.json 请求', () => {
// TODO ...
});
});
  • supertest 封装服务 request,是用来请求接口
  • chai.expect 使用来判断测试结果是否与预期一样
    • chai 断言有很多种方法,这里只是用了数据类型断言