8.3 KiB
8.3 KiB
🧪 camelCase API 测试指南
测试目标
验证整条链路:后端 Go → JSON (camelCase) → 前端 TypeScript 是否正常工作。
📋 准备工作
1. 确保依赖已安装
# 后端依赖
cd backend
go mod download
# 前端依赖
cd ../frontend
npm install
2. 确保代码已重新生成
# 从项目根目录
make openapi-gen-frontend
🎮 后端运行模式
后端提供三种运行模式,根据你的需求选择:
run-0: Mock 模式(推荐用于测试)
cd backend
make run-0
- ✅ 无依赖:不需要数据库、Redis 等
- ✅ 快速启动:立即可用
- ✅ 热重载:代码变更自动重启
- ✅ 适合开发和测试
run-1: 真实数据库模式
cd backend
make run-1
- 🐘 PostgreSQL (Docker)
- 🔥 热重载
- 📊 真实数据持久化
- 停止:
Ctrl+C+make clean-1
run-2: 全容器模式
cd backend
make run-2
- 🐳 所有服务在 Docker 中
- 🔄 后台运行
- 🏭 接近生产环境
- 停止:
docker compose down
🚀 测试步骤
方案 A:自动化测试脚本(推荐)
步骤 1: 启动后端服务(Mock 模式)
# 在终端 1 中运行
cd /home/mango/workspace/ocdp-go/backend
make run-0
# run-0: Mock 模式(无依赖,最简单)
# run-1: 真实 PostgreSQL(Docker)
# run-2: 全部 Docker(后台运行)
等待看到:
🎭 Run-0: Hot reload + Mock
✓ Server started on :8080 (Mock mode)
步骤 2: 运行 API 测试脚本
# 在终端 2 中运行
cd /home/mango/workspace/ocdp-go
./scripts/test-api-camelcase.sh
预期结果:
- ✅ 所有 API 返回 camelCase 字段
- ✅
accessToken,refreshToken,userId存在 - ✅
createdAt,updatedAt存在 - ✅
caData,certData,keyData,hasCaData存在
步骤 3: 启动前端服务
# 在终端 3 中运行
cd /home/mango/workspace/ocdp-go/frontend
npm run dev
步骤 4: 前端测试页面
访问: http://localhost:5173/api-test
点击 "🚀 完整测试" 按钮,观察:
- 注册测试 - 创建新用户
- 登录测试 - 获取 JWT token
- 验证响应包含
accessToken(camelCase)
- 验证响应包含
- 获取集群列表 - 测试 GET 请求
- 验证响应包含
createdAt,updatedAt(camelCase)
- 验证响应包含
- 创建集群 - 测试 POST 请求
- 发送
caData,certData,keyData(camelCase) - 验证响应包含
hasCaData(camelCase)
- 发送
预期结果:
🧪 开始完整测试流程...
步骤 1: 注册用户
✅ 注册成功
步骤 2: 登录
✅ 登录成功 - Token: eyJhbGciOiJIUzI1NiIs...
步骤 3: 获取集群列表
✅ 获取成功 - 共 X 个集群
步骤 4: 创建测试集群 (camelCase)
✅ 创建成功 - ID: cluster-xxx
🎉 完整测试流程完成! 所有 API 调用成功,camelCase 工作正常!
方案 B:手动 cURL 测试
1. 测试健康检查
curl http://localhost:8080/health
# 预期: {"status":"healthy"}
2. 测试登录(获取 Token)
curl -X POST http://localhost:8080/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{
"username": "admin",
"password": "admin123"
}'
预期响应(注意 camelCase):
{
"accessToken": "eyJhbGci...",
"refreshToken": "eyJhbGci...",
"userId": "user-123",
"username": "admin"
}
✅ 验证点:字段名是 accessToken、refreshToken、userId(camelCase)
3. 测试创建集群(使用 camelCase)
# 替换 YOUR_TOKEN 为上一步获取的 token
curl -X POST http://localhost:8080/api/v1/clusters \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"name": "test-cluster",
"host": "https://k8s.example.com:6443",
"description": "Test cluster",
"caData": "LS0tLS1CRUdJTi1DRVJUSUZJQ0FURS0tLS0t",
"certData": "LS0tLS1CRUdJTi1DRVJUSUZJQ0FURS0tLS0t",
"keyData": "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVkt"
}'
预期响应(注意 camelCase):
{
"id": "cluster-abc123",
"name": "test-cluster",
"host": "https://k8s.example.com:6443",
"description": "Test cluster",
"hasCaData": true,
"hasCertData": true,
"hasKeyData": true,
"hasToken": false,
"caData": "••••••••",
"certData": "••••••••",
"keyData": "••••••••",
"createdAt": "2025-11-10T10:00:00Z",
"updatedAt": "2025-11-10T10:00:00Z"
}
✅ 验证点:
- 请求使用
caData、certData、keyData(camelCase) - 响应包含
hasCaData、createdAt、updatedAt(camelCase)
4. 测试获取集群列表
curl -X GET http://localhost:8080/api/v1/clusters \
-H "Authorization: Bearer YOUR_TOKEN"
预期响应:
[
{
"id": "cluster-abc123",
"name": "test-cluster",
"createdAt": "2025-11-10T10:00:00Z",
"updatedAt": "2025-11-10T10:00:00Z",
...
}
]
✅ 验证点:响应字段使用 camelCase
🔍 验证清单
后端验证
- Go struct JSON tags 使用 camelCase
- OpenAPI 规范属性使用 camelCase
- API 响应 JSON 使用 camelCase
- 后端可以正确解析 camelCase 请求
前端验证
- TypeScript 类型定义使用 camelCase
- 前端代码使用 camelCase 属性
- API 调用发送 camelCase JSON
- 响应解析为 camelCase 对象
- IDE 自动补全正常工作
字段验证
必须验证这些关键字段都是 camelCase:
Auth API:
accessToken✅refreshToken✅userId✅
Cluster API:
caData✅certData✅keyData✅hasCaData✅hasCertData✅hasKeyData✅hasToken✅createdAt✅updatedAt✅
Registry API:
registryId✅registryUrl✅hasPassword✅createdAt✅updatedAt✅
Instance API:
registryId✅clusterId✅valuesYaml✅
📊 测试结果示例
成功的测试输出
🧪 OCDP API camelCase 测试
================================
步骤 1: 检查服务健康状态
✅ 后端服务运行正常
步骤 2: 测试注册 API
✅ 注册成功,发现 accessToken 字段 (camelCase)
步骤 3: 测试登录 API
✅ 登录成功!
Token (前20字符): eyJhbGciOiJIUzI1NiIs...
✅ 验证: accessToken 字段存在 (camelCase) ✓
✅ 验证: refreshToken 字段存在 (camelCase) ✓
✅ 验证: userId 字段存在 (camelCase) ✓
步骤 4: 测试创建集群 API (camelCase)
✅ 集群创建成功!
Cluster ID: cluster-1731240123456
✅ 验证: createdAt 字段存在 (camelCase) ✓
✅ 验证: hasCaData 字段存在 (camelCase) ✓
步骤 5: 测试获取集群列表
✅ 获取集群列表成功,字段使用 camelCase ✓
步骤 6: 测试 Registry API (camelCase)
✅ Registry API 使用 camelCase ✓
================================
🎉 API 测试完成!
测试总结:
✅ 后端服务运行正常
✅ JSON 字段使用 camelCase 格式
✅ 前后端通信正常
🐛 故障排查
问题 1: 后端未启动
症状: Connection refused
解决:
cd backend
make run-mock
问题 2: 字段仍是 snake_case
检查:
- 确认 Go DTO JSON tags 已更新
- 确认 OpenAPI 规范已更新
- 重新编译后端:
go build - 清除缓存并重启
问题 3: 前端类型不匹配
检查:
- 确认前端代码已重新生成:
npm run openapi-gen - 检查生成的类型:
cat src/api/generated-orval/api.schemas.ts | grep CreateClusterRequest -A 10 - 重启 TypeScript 服务器(VSCode: Cmd/Ctrl + Shift + P → "TypeScript: Restart TS Server")
问题 4: 401 Unauthorized
解决:
- 确保先调用登录 API 获取 token
- 在请求头中正确设置:
Authorization: Bearer <token> - 或使用前端的
setAuthToken()函数
📚 相关文档
CAMELCASE-MIGRATION.md- 迁移总结frontend/src/api/README.md- API 使用文档frontend/src/api/example.ts- 代码示例
✅ 完成标志
当你看到以下结果时,说明测试成功:
- ✅ 后端 API 返回 camelCase JSON
- ✅ 前端可以正确解析 camelCase 响应
- ✅ 前端发送 camelCase 请求
- ✅ 后端可以正确解析 camelCase 请求
- ✅ TypeScript 类型提示正常工作
- ✅ 所有 API 调用成功
🎉 恭喜!你的 camelCase API 已经完全正常工作!