koa2 单元测试

发布于 2024-12-22 01:42:06 字数 3836 浏览 10 评论 0

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

准备工作

安装测试相关框架

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

测试例子

demo 地址:https://github.com/poetries/daily-code-practice/tree/master/node/koa/koa2-demo/test-unit/

例子目录

.
├── index.js # api 文件
├── package.json
└── test # 测试目录
    └── index.test.js # 测试用例

所需测试 demo

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')
})

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

http://localhost:3000/getString.json

test-unit-result-01

开始写测试用例

demo/test-unit/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

注意:

  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 加载服务的入口文件

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 断言有很多种方法,这里只是用了数据类型断言

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

娇柔作态

暂无简介

文章
评论
29 人气
更多

推荐作者

冰魂雪魄

文章 0 评论 0

qq_Wl4Sbi

文章 0 评论 0

柳家齐

文章 0 评论 0

无法言说的痛

文章 0 评论 0

魄砕の薆

文章 0 评论 0

盗琴音

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文