使用 Jest 和 Supertest 进行接口端点测试实例详解

如何创建测试是一件困难的事。网络上有许多关于测试的文章,却从来不告诉你他们是如何开始创建测试的。

所以,今天我将分享我在实际工作中是如何从头开始创建测试的。希望能够对你提供一些灵感。

目录:

  • 使用 Express 创建一个应用
  • 使用 Mongoose 链接 MongoDB
  • 使用 Jest 作为测试框架

为什么使用 Jest

  • 易于使用
  • wath-mode 非常棒

开始使用 Jest
首先,你需要安装它:

1

npm install jest --save-dev

接着,将测试启动脚本添加到package.json中:

1

2

3

4

"scripts": {

 "test": "jest",

 "test:watch": "jest --watch"

},

添加testtest:watch是非常有用的,前者是一次性测试,而后者开始了 watch 模式。

使用以下任意方法,Jest 就能识别哪些是测试文件:

    1. 位于 tests 文件夹下的所有 js 文件
    1. 文件名以 test.js 结尾的文件,譬如 user.test.js
    1. 文件名以 spec.js 结尾的文件,譬如 user.spec.js

你可以把它们放在任何位置。但我总是把测试文件和接口放在一起,这有利于维护管理。

1

2

3

4

- routes

 |- users/

  |- index.js

  |- users.test.js

编写你的第一个测试
Jest 包含了descibe,it,expect,你不必在每个测试文件内 require 它们。

  • describe 用来组织文件中的测试项
  • it 用来运行测试用例
  • expect 用于执行断言,当所有断言通过时,该测试才会通过

举一个测试失败的栗子。在该例中我 expect 1 应该严格等于 2。但由于 1 !== 2,所以测试失败。

1

2

3

it('Testing to see if Jest works', () => {

 expect(1).toBe(2)

})

如果运行测试,你会看到错误信息。

1

npm run test:watch

更改测试用例使得测试通过:

1

2

3

it('Testing to see if Jest works', () => {

 expect(1).toBe(1)

})

虽然已经包含了使用 Jest 进行测试的大部分内容,但却没啥卵用,因为实际工作中的测试比这复杂多了。

异步测试
你需要发送请求来测试接口。请求是异步的,这意味着你必须能够编写异步测试用例。

使用 Jest 编写异步测试非常容易,仅仅需要两步:

    1. 添加 async 关键字
    1. 在测试的最后一步,调用 done

就像这样:

1

2

3

4

5

it('Async test', async done => {

 // 其他逻辑

  

 done()

})

测试接口
可以选择 Supertest 来测试接口。我们先安装 Supertest。

1

npm install supertest --save-dev

在测试接口之前,需要设置下 server,以便 Supertest 在测试中使用它。

大多数教程都告诉你,在 server 文件中监听 Express 应用端口,像这样:

1

2

3

4

5

6

7

const express = require('express')

const app = express()

// Middlewares...

// Routes...

app.listen(3000)

这有个潜在问题,当你编写了多个测试文件,运行测试时,会产生"port in use"的错误。

如果想要在每个测试文件都启动一个新的服务,你需要导出一个没有监听端口的 app。

1

2

3

4

5

6

7

const express = require('express')

const app = express()

// Middlewares...

// Routes...

module.exports = app

为了使应用正常工作,需要在另一个文件(比如 start.js)内监听 app.

1

2

3

// start.js

const app = require('./server.js)

app.listen(3000)

使用 Supertest
在测试文件内导入 app 和 supertest 来测试接口。

1

2

3

const app = require('./server') // Link to your server file

const supertest = require('supertest')

const request = supertest(app)

现在,你可以在测试文件中发送 GET,POST,PUT,PATCH 和 DELETE 请求了。在发送请求之前我们需要一个接口(端点)。譬如我们的应用有一个 /test 接口,它返回一个 JSON。

1

2

3

app.get('/test', async (req, res) => {

 res.json({message: 'pass!'})

})

使用 Supertest 的 .get 方法,向 /test 发送一个 GET 请求:

1

2

3

4

5

6

7

it('Gets the test endpoint', async done => {

 // 发送 GET 请求到应用的 /test 接口

 const res = request.get('/test')

 // ...

 done()

})

Supertest 从接口处获取响应结果。你可以测试 HTTP 状态码和响应体:

1

2

3

4

5

6

7

it('gets the test endpoint', async done => {

 const response = await request.get('/test')

 expect(response.status).toBe(200)

 expect(response.body.message).toBe('pass!')

 done()

})

​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值