POST /api/v1/audit-logs/ 400错误诊断:Apifox测试方案
POST /api/v1/audit-logs/ 400错误诊断:Apifox测试方案
一、测试准备
1. 环境配置
- 安装Apifox:从官方下载地址获取最新版本
- 服务保障:确保后端服务运行于127.0.0.1:8000
- 令牌准备:通过登录API获取有效Bearer Token
2. 测试目标
定位POST /api/v1/audit-logs/接口400错误根源,判断是前端数据格式错误还是后端API实现缺陷。
二、核心测试用例设计
测试用例1:基础功能验证(必填字段完整性)
请求配置
POST http://127.0.0.1:8000/api/v1/audit-logs/
Content-Type: application/json
Authorization: Bearer <valid_token>
测试数据(符合接口规范的最小数据集)
[
{
"action": "login_success",
"timestamp": "2025-07-17T08:32:45.123Z",
"user_id": "user_12345",
"user_name": "john.doe",
"session_id": "sess_67890",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/91.0.4472.124 Safari/537.36",
"ip_address": "192.168.1.100",
"device_info": {
"platform": "web",
"app_version": "1.2.3"
},
"metadata": {
"login_method": "password"
}
}
]
预期结果
- HTTP 201 Created
- 响应体返回创建成功的日志ID列表
测试用例2:边界值测试(数据长度/格式极限)
测试数据(包含极端值与特殊格式)
[
{
"action": "a".repeat(255), // 字符串最大长度测试
"timestamp": "2025-07-17T00:00:00.000Z",
"user_id": "", // 空字符串
"user_name": null, // null值
"session_id": "session-".repeat(50), // 超长字符串(500字符)
"ip_address": "2001:0db8:85a3:0000:0000:8a2e:0370:7334", // IPv6格式
"device_info": {
"screen_resolution": "4096x2160", // 4K分辨率
"language": "zh-Hans-CN" // 多语言编码
},
"metadata": {
"nested_object": {"level1": {"level2": {"value": 42}}}, // 深层嵌套对象
"special_chars": "~!@#$%^&*()_+{}|:\"<>?`-=[]\\;',./" // 特殊字符
}
}
]
预期结果
- HTTP 200/201(后端应兼容合法边界值)
- 响应体无错误提示,数据正常入库
测试用例3:错误格式测试(验证后端校验逻辑)
子用例 |
错误类型 |
测试数据示例 |
预期响应 |
3.1 |
缺少必填字段 |
{"timestamp": "2025-07-17T08:32:45Z", "ip_address": "192.168.1.100"} |
400 + 字段缺失提示 |
3.2 |
时间格式错误 |
"timestamp": "2025/07/17 08:32:45"(非ISO格式) |
400 + 时间格式错误 |
3.3 |
数据类型错误 |
"device_info": "invalid_string"(应为对象) |
400 + 类型不匹配 |
测试用例4:批量提交测试(性能与批量处理能力)
测试数据
提交包含10条日志的数组(示例为2条,实际需补充至10条):
[
{
"action": "page_view",
"timestamp": "2025-07-17T09:15:22.456Z",
"user_agent": "Mozilla/5.0...",
"ip_address": "192.168.1.100",
"metadata": {"page_url": "/dashboard"}
},
{
"action": "button_click",
"timestamp": "2025-07-17T09:15:25.789Z",
"user_agent": "Mozilla/5.0...",
"ip_address": "192.168.1.100",
"metadata": {"button_id": "submit_btn"}
}
]
预期结果
- HTTP 200/201
- 响应体返回所有日志ID,后端无超时或内存溢出
测试用例5:安全头部与认证测试
测试场景 |
请求配置差异 |
预期结果 |
自定义安全头部 |
添加X-Audit-Encrypted: trueX-Idempotency-Key: test_key_12345 |
200/201(头部被正确解析) |
令牌过期/无效 |
Authorization: Bearer expired_token |
401 Unauthorized(错误信息明确) |
三、问题诊断流程
1. 分步骤测试与定位
1. 执行测试用例1:验证基础功能是否正常
o ✅ 成功 → 排除核心字段缺失问题
o ❌ 失败 → 检查路由配置、令牌有效性、必填字段定义
2. 执行测试用例3:对比错误响应与前端数据
o 若错误提示与测试用例3一致 → 前端数据格式错误
o 若错误提示不明确 → 后端校验逻辑需优化
3. 前端数据对比:
在前端代码中添加调试日志,对比实际发送数据与Apifox测试数据:
console.debug('[AUDIT] 发送数据:', normalizedLogs);
console.debug('[AUDIT] 请求头:', customConfig.headers);
2. 常见400错误解决方案
错误原因 |
解决方案 |
时间格式非ISO标准 |
前端使用new Date().toISOString()生成标准时间 |
字段命名不一致(如user_idvsuserId) |
以Apifox测试用例1的字段名为基准统一命名 |
嵌套对象类型错误 |
确保device_info和metadata为JSON对象,而非字符串或数组 |
批量提交超限 |
减少单次提交日志数量(建议≤20条/批),或联系后端调整批量限制 |
四、测试用例管理
1. 保存测试集合:在Apifox中创建“审计日志API测试集”,保存所有用例
2. 回归测试:后端修复后,通过Apifox批量执行测试用例验证修复效果
3. 参数化测试:将令牌、IP等动态值设置为环境变量,提高用例复用性
通过以上测试方案,可系统定位400错误根源,覆盖数据格式、边界值、安全校验等关键维度,同时为前后端协作提供明确的验证依据。