Supertest:如何像专业人士一样测试API - Testim博客

作者:API传播员 · 2025-11-01 · 阅读时间:6分钟

如果没有 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 的响应中应包含 messagestatus 属性。以下代码展示了如何验证这些属性:

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 测试时,以下几点需要特别注意:

  1. 覆盖所有端点:确保测试覆盖了所有公开的 API 端点
  2. 测试工作流:通过链接多个 API 调用,测试复杂的业务流程。
  3. 异常测试:测试不存在的端点或发送无效数据,验证 API 是否返回正确的错误信息。
  4. 外部 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/