单元测试

前言

测试是一个项目周期里必不可少的环节,开发者在开发过程中也是无时无刻进行“人工测试”,如果每次修改一点代码,都要牵一发动全身都要手动测试关联接口,这样子是禁锢了生产力。为了解放大部分测试生产力,相关的测试框架应运而生,比较出名的有mocha,karma,jasmine等。虽然框架繁多,但是使用起来都是大同小异。

准备工作

安装测试相关框架

  1. 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/

例子目录

  1. .
  2. ├── index.js # api文件
  3. ├── package.json
  4. └── test # 测试目录
  5. └── index.test.js # 测试用例

所需测试demo

  1. const Koa = require('koa')
  2. const app = new Koa()
  3. const server = async ( ctx, next ) => {
  4. let result = {
  5. success: true,
  6. data: null
  7. }
  8. if ( ctx.method === 'GET' ) {
  9. if ( ctx.url === '/getString.json' ) {
  10. result.data = 'this is string data'
  11. } else if ( ctx.url === '/getNumber.json' ) {
  12. result.data = 123456
  13. } else {
  14. result.success = false
  15. }
  16. ctx.body = result
  17. next && next()
  18. } else if ( ctx.method === 'POST' ) {
  19. if ( ctx.url === '/postData.json' ) {
  20. result.data = 'ok'
  21. } else {
  22. result.success = false
  23. }
  24. ctx.body = result
  25. next && next()
  26. } else {
  27. ctx.body = 'hello world'
  28. next && next()
  29. }
  30. }
  31. app.use(server)
  32. module.exports = app
  33. app.listen(3000, () => {
  34. console.log('[demo] test-unit is starting at port 3000')
  35. })

启动服务后访问接口会看到以下数据

http://localhost:3000/getString.json

test-unit-result-01

开始写测试用例

demo/test-unit/test/index.test.js

  1. const supertest = require('supertest')
  2. const chai = require('chai')
  3. const app = require('./../index')
  4. const expect = chai.expect
  5. const request = supertest( app.listen() )
  6. // 测试套件/组
  7. describe( '开始测试demo的GET请求', ( ) => {
  8. // 测试用例
  9. it('测试/getString.json请求', ( done ) => {
  10. request
  11. .get('/getString.json')
  12. .expect(200)
  13. .end(( err, res ) => {
  14. // 断言判断结果是否为object类型
  15. expect(res.body).to.be.an('object')
  16. expect(res.body.success).to.be.an('boolean')
  17. expect(res.body.data).to.be.an('string')
  18. done()
  19. })
  20. })
  21. })

执行测试用例

  1. # node.js <= 7.5.x
  2. ./node_modules/.bin/mocha --harmony
  3. # node.js = 7.6.0
  4. ./node_modules/.bin/mocha

注意:

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

会自动读取执行命令 ./test 目录下的测用例文件 inde.test.js,并执行。测试结果如下 test-unit-result-03

用例详解

服务入口加载

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

  1. const supertest = require('supertest')
  2. const request = supertest( app.listen() )

测试套件、用例

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