测试是一个项目周期里必不可少的环节,开发者在开发过程中也是无时无刻进行“人工测试”,如果每次修改一点代码,都要牵一发动全身都要手动测试关联接口,这样子是禁锢了生产力。为了解放大部分测试生产力,相关的测试框架应运而生,比较出名的有mocha,karma,jasmine等。虽然框架繁多,但是使用起来都是大同小异。
npm install --save-dev mocha chai supertest
demo地址
https://github.com/ChenShenhai/koa2-note/blob/master/demo/test-unit/
.├── index.js # api文件├── package.json└── test # 测试目录└── index.test.js # 测试用例
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 = resultnext && next()} else if ( ctx.method === 'POST' ) {if ( ctx.url === '/postData.json' ) {result.data = 'ok'} else {result.success = false}ctx.body = resultnext && next()} else {ctx.body = 'hello world'next && next()}}app.use(server)module.exports = appapp.listen(3000, () => {console.log('[demo] test-unit is starting at port 3000')})
启动服务后访问接口会看到以下数据
http://localhost:3000/getString.json
demo/test-unit/test/index.test.js
const supertest = require('supertest')const chai = require('chai')const app = require('./../index')const expect = chai.expectconst 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
会自动读取执行命令 ./test 目录下的测用例文件 inde.test.js,并执行。测试结果如下
如果要对一个服务的API接口,进行单元测试,要用supertest加载服务的入口文件
const supertest = require('supertest')const request = supertest( app.listen() )
describe( '开始测试demo的GET请求', ( ) => {it('测试/getString.json请求', () => {// TODO ...})})