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

本文实例讲述了使用 Jest 和 Supertest 进行接口端点测试。分享给大家供大家参考,具体如下:

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

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

目录:

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

为什么使用 Jest

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

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

npm install jest --save-dev

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

"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

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

- routes
 |- users/
  |- index.js
  |- users.test.js

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

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

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

it('Testing to see if Jest works', () => {
 expect(1).toBe(2)
})

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

npm run test:watch

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

it('Testing to see if Jest works', () => {
 expect(1).toBe(1)
})

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

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

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

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

就像这样:

it('Async test', async done => {
 // 其他逻辑

 done()
})

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

npm install supertest --save-dev

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

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

const express = require('express')
const app = express()

// Middlewares...
// Routes...

app.listen(3000)

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

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

const express = require('express')
const app = express()

// Middlewares...
// Routes...

module.exports = app

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

// start.js
const app = require('./server.js)
app.listen(3000)

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

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

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

app.get('/test', async (req, res) => {
 res.json({message: 'pass!'})
})

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

it('Gets the test endpoint', async done => {
 // 发送 GET 请求到应用的 /test 接口
 const res = request.get('/test')

 // ...
 done()
})

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

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

接下来,我会向你展示如何发送 POST 请求,怎样在测试文件内连接 Mongoose。

译自:https://zellwk.com/blog/endpoint-testing/?ck_subscriber_id=313113699

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.jb51.net/code/HtmlJsRun测试上述代码运行效果。

更多关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

(0)

相关推荐

  • Javascript ParentNode和ChildNode接口原理解析

    ParentNode 接口,ChildNode 接口 节点对象除了继承 Node 接口以外,还拥有其他接口.ParentNode接口表示当前节点是一个父节点,提供一些处理子节点的方法.ChildNode接口表示当前节点是一个子节点,提供一些相关方法. ParentNode 接口 如果当前节点是父节点,就会混入了(mixin)ParentNode接口.由于只有元素节点(element).文档节点(document)和文档片段节点(documentFragment)拥有子节点,因此只有这三类节点会拥

  • 用js简单提供增删改查接口

    本周写实验,需要提供简单的后台接口对数据库进行增删改查,以前写后台只用过php和java,因为比较容易,用js写的也比较快,所以这次想用js实现简单的增删改查接口. 初始化 需要工具:nodejs 依赖:express,mysql,body-parser(这些都是npm的包) 为了能够解析js,需要下载nodejs,下载完nodejs,创建一个文件夹,使用npm init初始化,除了填写名字,一路确定下去,在文件夹下就会多出一个package.json文件. // package.json {

  • JS 封装父页面子页面交互接口的实例代码

    定义标准接口 Interface= {}; Interface.ParentWin = {}; Interface.ChildWin = {}; /** * 父页面提供的标准接口函数名称 */ Interface.ParentWin.funName = { getDataFun: "getDataFun", //子页面调用,提供给子页面的数据接口 updateDataFun: "updateDataFun", //子页面调用,向父页面提交数据接口 closeFun:

  • 详解如何在项目中使用jest测试react native组件

    目前Javascript的测试工具很多,但是针对React的测试策略,Facebook推出的ReactJs标配测试工具是Jest.Jest的官网地址:https://facebook.github.io/jest/.我们可以看到Jest官网宣称的是:Painless JavaScript Testing.是Facebook用于测试服务和React应用程序的JavaScript单元测试框架. 所谓单元测试也就是对每个单元进行测试,通俗的将一般针对的是函数,类或单个组件,不涉及系统和集成.单元测试是

  • vue-resource:jsonp请求百度搜索的接口示例

    1. yarn add vue-resource 2. main.js引入vue-resource import Vue from 'vue' import MintUI from 'mint-ui' import 'mint-ui/lib/style.css' import App from './App.vue' import router from './router' import VueResource from 'vue-resource' Vue.config.production

  • SpringBoot 整合Jest实例代码讲解

    [1]添加Elasticsearch-starter pom文件添加starter如下: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> SpringBoot默认支持两种技术和Elasticsearch进行交互:Sp

  • 在Koa.js中实现文件上传的接口功能

    文件上传是一个基本的功能,每个系统几乎都会有,比如上传图片.上传Excel等. 那么在Node Koa应用中如何实现一个支持文件上传的接口呢? 本文从环境准备开始.最后分别用 Postman 和一个HTML页面来测试. 01-环境准备 首先当然是要初始化一个Koa项目了,安装 Koa.koa-router 即可. npm install koa koa-router 设置图片上传目录,把图片上传到指定的目录中,在 app 路径下新建 public 文件夹,目录结构如下: koa-upload/

  • 基于Spring Data Jest的Elasticsearch数据统计示例

    命令查询职责分离模式(Command Query Responsibility Segregation,CQRS)从业务上分离修改 (Command,增,删,改,会对系统状态进行修改)和查询(Query,查,不会对系统状态进行修改)的行为.从而使得逻辑更加清晰,便于对不同部分进行针对性的优化. CQRS有以下几点有点: 1.分工明确,可以负责不同的部分: 2.将业务上的命令和查询的职责分离能够提高系统的性能.可扩展性和安全性.并且在系统的演化中能够保持高度的灵活性,能够防止出现CRUD模式中,对

  • 详解使用jest对vue项目进行单元测试

    最近领导对前端提出了新的要求,要进行单元测试.之前使用vue做了一个快报名小程序的pc端页面,既然要做单元测试,就准备用这个项目了,之前有些react的经验,vue还是第一遭 vue-cli3.0单元测试方面更加完备,就先升级到了cli3.0,因为项目是用typescript写的,需要ts-jest,得到jest的配置如下 { "jest": { "moduleFileExtensions": [ "js", "jsx", &

  • 详解Nodejs get获取远程服务器接口数据

    本文实例为大家分享了Nodejs get获取远程服务器接口数据的具体代码,供大家参考,具体内容如下 1.GET模块:_get.js /** * Created by jinx on 7/7/17. */ var http = require('http'); module.exports = { /** * 测试获取所有的区域 * / locations: function (cb) { http.get('http://wx.xx.com/locations', function (res)

  • 详解Jest结合Vue-test-utils使用的初步实践

    介绍 Vue-test-utils是Vue的官方的单元测试框架,它提供了一系列非常方便的工具,使我们更加轻松的为Vue构建的应用来编写单元测试.主流的 JavaScript 测试运行器有很多,但 Vue Test Utils 都能够支持.它是测试运行器无关的. Jest,是由Facebook开发的单元测试框架,也是Vue推荐的测试运行器之一.Vue对它的评价是: Jest 是功能最全的测试运行器.它所需的配置是最少的,默认安装了 JSDOM,内置断言且命令行的用户体验非常好.不过你需要一个能够将

随机推荐