目录
接口能够正确处理各种错误情况,返回合适的错误响应,这样做的目的应该是提高系统的稳定性和用户体验,避免因为错误的处理不当导致系统崩溃或者数据泄露。
接口测试主要验证不同系统组件之间的交互是否正确,包括请求和响应的数据格式、状态码、错误处理等。错误响应测试用例的设计是为了确保当接口接收到无效或意外的输入时,能够返回预期的错误信息,而不是崩溃或返回不明确的结果。
输入验证错误、认证失败、资源不存在、业务逻辑错误、服务器错误等。每个错误类型对应的HTTP状态码也要正确,比如400表示客户端错误,401未授权,404资源不存在,500服务器错误等。
我们还要考虑如何覆盖各种边界情况和异常情况。例如输入超出范围的参数、必填字段缺失、数据类型不匹配、特殊字符注入等。这些都属于输入验证的错误,应该返回4xx的状态码,并附带具体的错误信息。
还有资源相关的错误,比如访问不存在的资源,或者尝试操作其他用户的资源,这时候需要404或403。同时,处理并发操作时的冲突,比如使用版本号或时间戳来检测资源是否已被修改,返回409 Conflict。
设计有效的错误响应测试用例是接口测试的关键环节,确保接口在异常场景下返回预期的错误信息、状态码和响应体。
一、 覆盖常见的错误场景
a. 输入验证错误
测试点:
必填字段缺失:移除必填参数,验证返回 400 Bad Request 及错误描述(如 "username is required")。
数据类型不匹配:传递字符串到数值字段,验证 400 及错误提示(如 "age must be a number")。
参数超出范围:输入超过允许范围的数值(如年龄为 -1 或 200),验证 400 及合理提示。
格式错误:测试无效的日期、邮箱、手机号格式,返回 400 及具体原因(如 "Invalid email format")。
非法字符:注入特殊字符(如 !@#)、SQL 或 XSS 攻击字符串,验证接口过滤并返回 400。
b. 认证与权限错误
测试点:
无效 Token:使用过期或伪造的 Token,验证返回 401 Unauthorized。
权限不足:普通用户尝试访问管理员接口,返回 403 Forbidden。
认证方式错误:缺失 Authorization 头或使用错误的认证类型(如 Basic 代替 Bearer),返回 401。
c. 资源操作错误
测试点:
资源不存在:请求不存在的资源 ID,返回 404 Not Found(如 "/users/9999")。
资源冲突:重复创建唯一性约束的资源(如相同用户名),返回 409 Conflict。
操作不允许:对只读资源执行写操作(如 GET 接口接收 POST 请求),返回 405 Method Not Allowed。
d. 业务逻辑错误
测试点:
状态不合法:尝试取消已完成的订单,返回 400 及业务错误码(如 "Order already completed")。
依赖条件不满足:下单时库存不足,返回 400 及明确提示(如 "Insufficient stock")。
违反业务规则:转账金额为负数,返回 400 及错误码(如 "Amount must be positive")。
e. 服务端错误
测试点:
依赖服务不可用:模拟数据库连接失败或第三方 API 超时,返回 503 Service Unavailable 或 500 Internal Server Error。
服务器超负荷:高并发下返回 429 Too Many Requests 并建议重试时间。
二、设计测试用例的关键原则
a. 明确的错误信息
响应体中需包含机器可读的 error_code 和人类可读的 message,例如:
json
代码语言:javascript
{ "error_code": "INVALID_REQUEST", "message": "Username must be 6-20 characters."}
b. 正确的 HTTP 状态码
遵循 REST 规范:
4xx:客户端错误(如 400, 401, 404)。
5xx:服务端错误(如 500, 503)。
c. 幂等性处理
对于重试场景(如支付接口),设计重复请求的测试用例,验证是否返回 409 Conflict 或幂等性处理结果。
d. 安全性与敏感信息
避免在错误响应中暴露敏感信息(如数据库错误详情、服务器路径),防止信息泄露。
三、测试用例设计模板
图片
四、工具与自动化实践
工具选择:
Postman/Newman:手动或自动化执行测试集合。
pytest + requests:编写自动化测试脚本。
JMeter:模拟高并发下的错误场景。
断言设计:
验证状态码、错误码、错误消息、响应时间。
检查响应头(如 Retry-After 用于限流场景)。
五、典型错误响应测试用例示例
参数错误类
测试用例1:必填参数缺失
接口:POST /api/users(创建用户)
场景:未提供必填字段email
输入:{"name": "Alice"}
预期响应:
状态码:400 Bad Request
响应体:
json
代码语言:javascript
{ "code": "MISSING_REQUIRED_FIELD", "message": "The 'email' field is required.", "details": {"missing_field": "email"}}
测试用例2:参数类型错误
接口:GET /api/products?page=1&size=abc(分页查询商品)
场景:size参数传入非数字字符串
预期响应:
状态码:400 Bad Request
响应体:
json
代码语言:javascript
{ "code": "INVALID_PARAM_TYPE", "message": "The 'size' parameter must be an integer.", "details": {"field": "size", "received_type": "string"}}
权限与认证类
测试用例3:未授权访问
接口:GET /api/admin/dashboard(管理员仪表盘)
场景:请求头未携带Authorization Token
预期响应:
状态码:401 Unauthorized
响应体:
json
代码语言:javascript
{ "code": "UNAUTHENTICATED", "message": "Authentication credentials are missing."}
测试用例4:权限不足
接口:DELETE /api/orders/123(删除订单)
场景:普通用户尝试删除他人订单
预期响应:
状态码:403 Forbidden
响应体:
json
代码语言:javascript
{ "code": "INSUFFICIENT_PERMISSIONS", "message": "You are not authorized to perform this action."}
业务逻辑错误类
测试用例5:库存不足
接口:POST /api/cart/checkout(购物车结算)
场景:商品库存为5,用户尝试购买10件
输入:{"items": [{"product_id": 1001, "quantity": 10}]}
预期响应:
状态码:400 Bad Request
响应体:
json
代码语言:javascript
{ "code": "INSUFFICIENT_STOCK", "message": "Product 1001 only has 5 units available.", "details": {"product_id": 1001, "available": 5, "requested": 10}}
测试用例6:重复提交(幂等性校验)
接口:POST /api/payments(发起支付)
场景:重复提交相同请求(相同idempotency_key)
输入:{"amount": 100, "currency": "USD", "idempotency_key": "abc123"}
预期响应:
状态码:409 Conflict
响应体:
json
代码语言:javascript
{ "code": "DUPLICATE_REQUEST", "message": "A request with the same idempotency key already exists.", "details": {"idempotency_key": "abc123"}}
数据异常类
测试用例7:查询不存在的资源
接口:GET /api/users/999(获取用户详情)
场景:用户ID=999不存在
预期响应:
状态码:404 Not Found
响应体:
json
代码语言:javascript
{ "code": "RESOURCE_NOT_FOUND", "message": "User with ID 999 does not exist."}
测试用例8:数据格式错误
接口:POST /api/events(创建事件)
场景:start_time字段格式非法(如"2023-13-01T10:00:00Z")
输入:
代码语言:javascript
{"name": "Meeting", "start_time": "2023-13-01T10:00:00Z"}
预期响应:
状态码:400 Bad Request
响应体:
json
代码语言:javascript
{ "code": "INVALID_DATE_FORMAT", "message": "start_time must be in ISO 8601 format (e.g., YYYY-MM-DDTHH:mm:ssZ).", "details": {"field": "start_time", "invalid_value": "2023-13-01T10:00:00Z"}}
依赖服务故障类
测试用例9:数据库连接失败
接口:GET /api/products(查询商品列表)
场景:模拟数据库服务不可用
预期响应:
状态码:503 Service Unavailable
响应体:
json
代码语言:javascript
{ "code": "DATABASE_CONNECTION_ERROR", "message": "Failed to connect to the database. Please try again later."}
测试用例10:第三方API超时
接口:GET /api/weather?city=Beijing(调用天气API)
场景:第三方天气服务未响应(超时3秒)
预期响应:
状态码:504 Gateway Timeout
响应体:
json
代码语言:javascript
{ "code": "THIRD_PARTY_API_TIMEOUT", "message": "The weather service is currently unavailable."}
安全漏洞类
测试用例11:SQL注入攻击
接口:GET /api/users?filter=name=' OR '1'='1(用户查询)
场景:参数含SQL注入语句
预期响应:
状态码:400 Bad Request
响应体:
json
代码语言:javascript
{ "code": "INVALID_INPUT", "message": "The 'filter' parameter contains malicious content."}
测试用例12:XSS攻击
接口:POST /api/comments(提交评论)
场景:评论内容含<script>alert(1)</script>
输入:{"content": "<script>alert(1)</script>", "post_id": 1}
预期响应:
状态码:400 Bad Request
响应体:
json
代码语言:javascript
{ "code": "INVALID_CONTENT", "message": "The 'content' field contains disallowed HTML tags."}