Supertest:如何像专业人士一样测试API - Testim博客
如果没有 API 连接了前端与后端组件,或者不同的后端组件。同时,开发人员也依赖第三方 API 来实现诸如支付和通信等核心功能。每一个 API 都是一个需要双方严格遵守的“契约”,以确保系统的正常运行。这意味着状态码、头部信息和响应主体必须始终与 API 文档保持一致。
对于 API 提供者来说,API 进行测试。无论您是测试内部 API 还是外部 API,都需要一个强大的工具。本文将介绍 SuperTest——一个专为 HTTP API 测试设计的 Node.js 库。我们将探讨其基本功能,并通过分步教程帮助您创建第一个 API 测试。
什么是 SuperTest?
SuperTest 是一个专门用于测试 HTTP API 的 Node.js 库。它基于 SuperAgent 构建,提供了简单直观的 API 接口,能够快速发起 HTTP 请求并验证响应结果。无论是测试内部 API 还是外部 API,SuperTest 都能帮助开发者高效完成任务。
开始使用 SuperTest
要开始使用 SuperTest,首先需要安装它。运行以下命令安装 SuperTest:
npm install supertest --save-dev
安装完成后,您可以通过以下代码在 JavaScript 中引入 SuperTest:
const request = require('supertest');
以下是一个简单的示例,展示如何使用 SuperTest 向 API 发起请求并打印响应结果:
const request = require('supertest');
request('https://dog.ceo')
.get('/api/breeds/image/random')
.end(function(err, res) {
if (err) throw err;
console.log(res.body);
});
在上述代码中:
- get() 方法指定了 HTTP 请求的类型为 GET。
- end() 方法结束请求并处理响应。它接收一个回调函数作为参数,用于处理请求结果。
使用 Express 初始化请求
如果您使用的是 Express 等 Node.js 框架构建的 API,可以直接将应用程序对象传递给 SuperTest。SuperTest 会在必要时启动测试服务器并自动向其发送请求。以下是一个示例,展示如何使用 Express 创建一个简单的 API,并通过 SuperTest 测试该 API:
const request = require('supertest');
const app = require('express')();
app.get('/api/breeds/image/random', function(req, res) {
res.status(200).json({
message: 'https://example.com/',
status: 'success'
});
});request(app)
.get('/api/breeds/image/random')
.end(function(err, res) {
if (err) throw err;
console.log(res.body);
});
在这个示例中,SuperTest 会自动启动 Express 应用并发送请求。
设定响应预期
在上一节中,我们学习了如何发起 HTTP 请求。然而,仅仅发起请求并不足以完成 API 测试。我们需要验证 API 的响应是否符合预期。为此,SuperTest 提供了 expect() 方法,用于验证响应内容。
验证状态码
HTTP API 通常返回不同的状态码,例如:
- 2xx 表示成功
- 4xx 表示客户端错误
- 5xx 表示服务器错误
对于成功的请求,通常期望返回状态码 200。以下是一个示例,展示如何验证状态码:
request('https://dog.ceo')
.get('/api/breeds/image/random')
.expect(200)
.end(function(err, res) {
if (err) throw err;
});
验证响应头
大多数现代 HTTP API 返回 JSON 格式的响应。对于这些响应,Content-Type 头部通常为 application/json。以下代码展示了如何验证响应头:
request('https://dog.ceo')
.get('/api/breeds/image/random')
.expect(200)
.expect('Content-Type', 'application/json')
.end(function(err, res) {
if (err) throw err;
});
检查响应主体
仅验证状态码和头部信息是不够的。为了确保 API 的功能性,我们还需要验证响应主体的内容。例如,Dog API 的响应中应包含 message 和 status 属性。以下代码展示了如何验证这些属性:
request('https://dog.ceo')
.get('/api/breeds/image/random')
.expect(200)
.expect('Content-Type', 'application/json')
.expect(function(res) {
if (!res.body.hasOwnProperty('status')) throw new Error("Expected 'status' key!");
if (!res.body.hasOwnProperty('message')) throw new Error("Expected 'message' key!");
})
.end(function(err, res) {
if (err) throw err;
});
使用 assert 简化验证
为了简化代码,可以使用 Node.js 内置的 assert 模块:
const request = require('supertest');
const assert = require('assert');
request('https://dog.ceo')
.get('/api/breeds/image/random')
.expect(200)
.expect('Content-Type', 'application/json')
.expect(function(res) {
assert(res.body.hasOwnProperty('status'));
assert(res.body.hasOwnProperty('message'));
})
.end(function(err, res) {
if (err) throw err;
});
结合 SuperTest 和 Mocha
SuperTest 可以与测试框架 Mocha 无缝集成,进一步提升测试的可读性和组织性。以下是一个示例,展示如何使用 Mocha 测试 API:
describe('Random Dog Image', function() {
it('responds with expected JSON structure', function(done) {
request('https://dog.ceo')
.get('/api/breeds/image/random')
.expect(200)
.expect('Content-Type', 'application/json')
.expect(/{"message":".*","status":"success"}/, done);
});
});
设计功能测试
在设计 API 测试时,以下几点需要特别注意:
- 覆盖所有端点:确保测试覆盖了所有公开的 API 端点。
- 测试工作流:通过链接多个 API 调用,测试复杂的业务流程。
- 异常测试:测试不存在的端点或发送无效数据,验证 API 是否返回正确的错误信息。
- 外部 API 测试:对于第三方 API,测试您依赖的所有端点,确保其稳定性。
总结
本文介绍了如何使用 SuperTest 测试 HTTP API,包括基本用法、响应验证以及与 Mocha 的集成。通过 SuperTest,您可以轻松编写功能性 API 测试,确保 API 的稳定性和可靠性。
API 测试只是完整测试策略的一部分。除了 API 测试,还应包括端到端测试,覆盖应用程序的用户界面和相关 API。通过结合使用 SuperTest 和其他测试工具,您可以构建更全面的测试体系。
原文链接: https://www.testim.io/blog/supertest-how-to-test-apis-like-a-pro/
最新文章
- 函数调用与工具使用入门 – Apideck
- 什么是API测试?其优势、类型及最佳实践
- API 安全策略和基础指南
- 如何在Python、PHP、Ruby中使用今日头条热搜榜API
- 如何获取文心一言 API Key 密钥(分步指南)
- 2025 ComfyUI 稳定扩散流水线|拖拽式节点化+API 集成教程
- Flask-Limiter:为 API 添加访问速率限制的 Python 扩展!
- OpenAI o1原理逆向工程图解
- 性别预测API:如何让名字背后的性别信息一目了然?
- 小红书AI文章风格转换:违禁词替换与内容优化技巧指南
- REST API 设计:过滤、排序和分页
- 认证与授权API对比:OAuth vs JWT