当前位置: 首页 > article >正文

聊一聊接口测试如何设计有效的错误响应测试用例

目录

一、 覆盖常见的错误场景

a. 输入验证错误

b. 认证与权限错误

c. 资源操作错误

d. 业务逻辑错误

e. 服务端错误

二、设计测试用例的关键原则

a. 明确的错误信息

b. 正确的 HTTP 状态码

c. 幂等性处理

d. 安全性与敏感信息

三、测试用例设计模板

四、工具与自动化实践

五、典型错误响应测试用例示例

参数错误类

权限与认证类

业务逻辑错误类

数据异常类

依赖服务故障类

安全漏洞类


接口能够正确处理各种错误情况,返回合适的错误响应,这样做的目的应该是提高系统的稳定性和用户体验,避免因为错误的处理不当导致系统崩溃或者数据泄露。

接口测试主要验证不同系统组件之间的交互是否正确,包括请求和响应的数据格式、状态码、错误处理等。错误响应测试用例的设计是为了确保当接口接收到无效或意外的输入时,能够返回预期的错误信息,而不是崩溃或返回不明确的结果。

输入验证错误、认证失败、资源不存在、业务逻辑错误、服务器错误等。每个错误类型对应的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."}
http://www.lryc.cn/news/2386540.html

相关文章:

  • 记忆上传与自我同一性的哲学-技术综合分析
  • 人工智能工程师学习路线总结(下)
  • Vue:axios(POST请求)
  • 企业级调度器LVS (面试版)
  • 从OTA双雄「共舞」,透视旅游持续繁荣背后的结构性跃迁
  • 华为OD机试真题——虚拟理财游戏(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现
  • Vue-01(Vue CLI创建项目以及文件配置说明)
  • 华为云Flexus+DeepSeek征文 | DeepSeek-V3/R1商用服务开通体验全流程及使用评测
  • redis列表类型
  • 人工智能数学基础实验(一):智能推荐系统实战
  • uni-app学习笔记十二-vue3中组件传值(对象传值)
  • Vue.js教学第十四章:Vuex模块化,打造高效大型应用状态管理
  • Ubuntu/Linux 服务器上调整系统时间(日期和时间)
  • win11 禁用/恢复 内置笔记本键盘(保证管用)
  • 精度不够?光纤激光尺0.2ppm误差解锁微米级制造
  • Android 16系统源码_自由窗口(一)触发自由窗口模式
  • sqli-labs第十八关——POST-UA注入
  • 流式优先架构:彻底改变实时数据处理
  • WebSockets 在实时通信中的应用与优化
  • 零基础教程:用 Docker + pgloader 将 MySQL 数据库迁移到 PostgreSQL
  • mac上安装 Rust 开发环境
  • 解决RedisTemplate的json反序列泛型丢失问题
  • 【Elasticsearch】创建别名的几种方式
  • 【JAVA】中文我该怎么排序?
  • 《C 语言字符串操作从入门到实战(下篇):strncpy/strncat/strstr 等函数原理与实现》
  • 百度飞桨PaddleOCR 3.0开源发布 OCR精度跃升13%
  • Xilinx 7Series\UltraScale 在线升级FLASH STARTUPE2和STARTUPE3使用
  • 数字孪生驱动的离散制造智能升级:架构设计与工程实践
  • 9.4在 VS Code 中配置 Maven
  • mmaction2——tools文件夹下