本文档介绍了 RealWorld 项目中的 API 测试系统,该系统验证后端实现是否正确符合标准化的 API 规范。您将了解如何运行测试、测试验证的内容以及如何解决常见问题。
API 测试系统使用 Postman 集合来定义用于验证 API 端点的测试。此集合通过 Newman(Postman 的命令行集合运行器)执行,并由一个 shell 脚本进行编排。
API 测试系统架构
来源: api/Conduit.postman_collection.json, api/run-api-tests.sh
您可以在本地或持续集成环境中运行 API 测试,以验证您的后端实现是否正确遵循 RealWorld API 规范。
run-api-tests.sh 脚本设置了以下环境变量:
| 可变 | 默认值 | 描述 |
|---|---|---|
APIURL | https://api.realworld.io/api | 要测试的 API 的基本 URL |
USERNAME | 从时间戳生成 | 测试用户的唯一用户名 |
EMAIL | {USERNAME}@mail.com | 测试用户的电子邮件 |
PASSWORD | password | 测试用户的密码 |
在本地运行测试以针对您的 API 实现
此命令将通过 Newman 执行 Postman 集合,Newman 将向您的 API 发出请求并验证响应。
来源: api/README.md, api/run-api-tests.sh
Postman 集合包含针对不同 API 端点的已组织测试文件夹。
Postman 集合组织
来源: api/Conduit.postman_collection.json
身份验证测试会验证用户注册、登录、个人资料检索和个人资料更新。
注册测试示例
Request:
POST {{APIURL}}/users
Content-Type: application/json
{
"user": {
"email": "{{EMAIL}}",
"password": "{{PASSWORD}}",
"username": "{{USERNAME}}"
}
}
Test Validation:
- Response contains "user" property
- User has "email" property
- User has "username" property
- User has "token" property
来源: api/Conduit.postman_collection.json:13-61
这些测试会验证文章的列出、创建、更新和删除操作。
创建文章测试示例
Request:
POST {{APIURL}}/articles
Content-Type: application/json
Authorization: Token {{token}}
{
"article": {
"title": "How to train your dragon",
"description": "Ever wonder how?",
"body": "Very carefully.",
"tagList": ["training", "dragons"]
}
}
Test Validation:
- Response contains "article" property
- Article has "title", "slug", "body", "createdAt", etc.
- Article's "createdAt" is an ISO 8601 timestamp
来源: api/Conduit.postman_collection.json:570-632
这些测试会验证评论的添加、检索和删除,以及标签的列出。
添加评论测试示例
Request:
POST {{APIURL}}/articles/{{slug}}/comments
Content-Type: application/json
Authorization: Token {{token}}
{
"comment": {
"body": "Test comment text"
}
}
Test Validation:
- Response contains "comment" property
- Comment has "id", "body", "author", etc.
来源: api/Conduit.postman_collection.json
Postman 集合中的每个测试都包含用于验证 API 响应的 JavaScript。这些脚本通常会:
示例测试脚本摘录
来源: api/Conduit.postman_collection.json:65-83
测试会验证您的 API 实现返回的响应格式是否符合 RealWorld API 指定的格式。例如,文章响应的预期格式为:
来源: apps/documentation/src/content/docs/specifications/backend/api-response-format.md:36-58
如果测试无法连接到您的 API,请检查 `APIURL` 环境变量是否设置正确,并指向您的 API 的根目录。
身份验证测试失败通常表明 JWT 令牌实现存在问题。请确保您的后端正确处理身份验证请求并以预期格式返回令牌。
如果测试因属性验证错误而失败,请确保您的 API 返回的 JSON 结构与测试所需的结构完全一致,包括所有必需字段及其正确的名称和数据类型。
来源: api/Conduit.postman_collection.json, api/run-api-tests.sh
API 测试可以集成到持续集成工作流中,以便在每次更改时自动验证您的 API 实现。
这可以确保代码更改不会破坏 API 兼容性。
来源: api/run-api-tests.sh
运行测试时,会发生以下过程:
run-api-tests.sh 脚本设置环境变量。这种顺序执行可确保正确处理测试之间的依赖关系(例如,需要身份验证令牌)。
来源: api/Conduit.postman_collection.json:110-164, api/run-api-tests.sh