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

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

目录:

  • 使用 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

使用 Jest 和 Supertest 进行接口端点测试的更多相关文章

  1. 接口API测试和返回值JSON解析的插件

    火狐插件1.   HttpRequest作用:接口API测试例子:http://192.168.10.61:8080/ZHCS/user/loginApp.do?phone=admin&pwd ...

  2. 使用Loadrunner进行http接口压力测试

    业务描述: 在业务系统里进行查询操作,查询的结果是通过请求http接口,从系统中处理并将结果以json字符串返回. 本文就讲述使用Loadrunner对此类接口进行压力测试并记录相关的性能指标数据: ...

  3. RobotFrameWork接口报文测试-----(三)demo的加强版(数据驱动测试)

    在上一篇RobotFrameWork接口报文测试-----(二)demo的升级版基础上,将接口的xml的格式保存在xml文件中,然后程序如果增加一个接口,在xml文件里添加即可,无需修改自动化测试里的 ...

  4. Jmeter 使用实践 - 接口 diff 测试

    大多数人都使用 Jmeter 做过性能测试,但是在使用的过程中你会发现,它不仅可以做性能测试和功能测试,还能够满足基本的接口测试需求. 相比其他工具,Jmeter 入门门槛较低,安装也比较方便,根据自 ...

  5. SoapUI 利用SoapUI进行简单的接口并发测试

    利用SoapUI进行简单的接口并发测试 by:授客 QQ:1033553122 测试环境: SoapUI Pro 5.1.2 步骤如下 1.   把请求添加到测试套件 1.1.     途径1 1.新 ...

  6. Python开发【笔记】:接口压力测试

    接口压力测试脚本 1.单进程多线程模式 # #!/usr/bin/env python # # -*- coding:utf-8 -*- import time import logging impo ...

  7. robotframwork接口测试(五)—接口分层测试粗解

    个人小结,仅供参考. 接口测试很简单,但是很重要. 可以写代码,也可以用工具进行测试.工具说说就很多了,简单介绍一下我目前用过的几个能够测试接口的工具, Burpsuite:这类偏请求攻击类软件 Fi ...

  8. Java面向对象作业-用接口方式测试向下转型

    Java面向对象作业-用接口方式测试向下转型 根据视频的里实例 我们直接修改Test2测试方法: package com.java1234.chap03.sec13; public class Tes ...

  9. RPC接口mock测试

    转载:http://blog.csdn.net/ronghuanye/article/details/71124127 1        简介 Dubbo目前的应用已经越来越广泛.或者基于Dubbo二 ...

随机推荐

  1. Python - 基础语法 - 第一天

    编码 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串. 标识符 第一个字符必须是字母表中字母或下划线 _ . 标识符的其他的部分由字母.数字和下划线 ...

  2. 程序游戏推荐(C语言贪吃蛇,python天天酷跑(需要安装pygame),js是狠人就坚持30s)

    下面是下载位置,我把他们上传到我的文件下了. C语言贪吃蛇:https://files.cnblogs.com/files/ITXiaoAng/%E8%B4%AA%E5%90%83%E8%9B%87. ...

  3. innodb和myisam对比

    MyISAM特点 1)不支持行锁(MyISAM只有表锁),读取时对需要读到的所有表加锁,写入时则对表加排他锁: 2)不支持事务 3)不支持外键 4)不支持崩溃后的安全恢复 5)在表有读取查询的同时,支 ...

  4. 了解MySQL

    目前流行的数据库 MySQL Oracle Microsoft SQLServer Microsoft Access PostgreSQL DB2/UDB InfoMax MySQL介绍 世界上最流行 ...

  5. 【转载】C#中ArrayList使用RemoveRange移除一整段数据

    在C#的编程开发中,ArrayList集合是一个常用的非泛型类集合,如果需要移除ArrayList集合中指定索引位置开始的一整段元素对象,则可以使用ArrayList集合中的RemoveRange方法 ...

  6. C++ http服务

    1.需要使用c++提供http服务,本来想使用libevent,但是经过一番搜索后,发现了只需要引用2个文件的mongoose库. 官方文档:https://cesanta.com/docs/over ...

  7. OL8.0静默安装Oracle 19C

    首先在edelivery中下载Oracle Linux 8.0 然后就默认安装系统 环境准备工具目前不支持OL8,所以需要手动安装,首先设置内核参数,在/etc/sysctl.conf追加 [root ...

  8. poi坑点(springboot)

    工作上需要写了一个将数据库数据生成excel表的接口,在此过程中遇到了一些坑点,现在此纪录 PS:一部分可能是因为我没用明白 1. 样式问题 自动调整尽量不要使用,部分列留白过多,空列列宽过窄,可能是 ...

  9. Linux下安装Nexus-3.15私服

    1.切换到root用户 创建nexus用户:useradd nexus 设置nexus用户密码:passwd nexus 2.创建文件夹并进入该目录 linux中,软件包一般放在opt目录下,安装时, ...

  10. mysql foreignkey

    1.foreign key 当数据足够大的时候,字段会出现大量重复, 解决:额外定义一个大量冗余的字段表,(有id) 一张是关联表(从表),一张是被关联表(主表) 进行关联的时候 ,先创建被关联表, ...