异常测试不是往接口里随便塞一串乱码。它应该明确说明 API 必须拒绝、保持不变或解释什么。
为什么需要这个 Skill
API 异常测试根据契约规则、边界、授权、状态转移和依赖行为设计失败场景。
Skill 用来做什么
提取字段类型、必填/可空规则、范围、长度与大小限制、身份/权限规则、错误契约和依赖行为,再将它们转成 ANT-## 候选,记录前置条件、关注行为、来源证据、验证方法、影响/优先级、责任角色和关闭条件。
字段约束与授权规则要分别追溯。遇到缺失、冲突或不适用的规则时,保留待确认项,不要臆造响应。候选数量不证明覆盖率,这个 Skill 也不执行测试。
Awesome QA Skills 按语言和测试阶段组织 Skill;系列总览 介绍通用安装方式。
它不做什么
它不会替代完整测试策略、补写 API 未定义的行为,也不会自行决定应该使用什么状态码。它也不会因为响应拒绝,就推断没有产生副作用;记录、事件和部分成功行为需要单独的证据。
它主要检查哪些内容
| 规则类别 | 候选变体 | 需要保留的证据 |
|---|---|---|
| 字段必填与类型 | 缺失、null、空值、类型错误 | 字段规则、有效邻近对照、响应和状态 |
| 数字或字符串限制 | 低于、位于或超出有来源的边界;编码与大小 | 约束来源、精确变体和响应 |
| 身份与权限 | 错误主体、权限缺失、禁止访问对象 | 授权来源、身份上下文、允许/拒绝结果 |
| 状态转移 | 从不符合条件或终态发起请求 | 状态规则、起始状态和最终状态 |
| 依赖与限流 | 文档规定的故障或限流条件 | 故障策略、重试含义和持久化副作用 |
对相互独立的规则一次只改一个因素。只有交互本身存在风险时才组合多种无效因素,并注明各因素对应的规则。保留有效邻近值,以区分正确拒绝与过度拒绝。
开始之前先审计输入
围绕“异常用例”开始分析时,先把输入分成六种状态。缺口不会自动变成失败,但也不能被隐藏在结论里。
| 状态 | 含义 | 本 Skill 的处理方式 |
|---|---|---|
| known | 材料直接证明的事实 | 标出来源、版本和时间,允许进入判断 |
| missing | 本轮需要但尚未提供的材料 | 列出最小补证动作,结论保持受限 |
| conflicting | 来源之间互相矛盾 | 并列来源和冲突点,交给负责人裁决 |
| stale | 材料存在但版本或时间已经过期 | 标出新鲜度,不把旧结论当当前事实 |
| out_of_scope | 有关但不在本轮范围内 | 明确排除,避免分析悄悄扩大 |
| assumptions | 为继续分析而暂时采用的假设 | 写出验证方式和失效条件 |
至少把输入版本、范围、环境、证据位置和负责人放在一起。没有运行记录时,只能交付分析、设计或验证计划,不能写执行通过。
从问题到结构化发现
ANT-## 发现字段
每个候选要注明约束或权限规则、输入变体、前置条件、允许/拒绝预期、响应与副作用观察、来源证据、证据状态、影响/优先级、责任角色、关闭条件和验证方法。字段规则与权限规则分别追溯;不要把不同无效类别合并为一个结果。
一个完整案例
本节按输入、分析、发现、决策和验证展开;材料不足时保留 missing、conflicting 或 assumptions,不把它们改写成通过。
输入
| 材料 | 这次提供什么 | 缺失时怎么处理 |
|---|---|---|
| 契约规则 | 必填字段、格式、限制、枚举值和状态转移 | 生成用例前先列规则 |
| 无效分区 | 单个无效因素、组合无效因素和格式错误载荷 | 保留拒绝原因 |
| 安全证据 | 状态码、错误体、持久化记录和下游事件 | 必须证明拒绝没有产生错误写入 |
可以这样调用:
请使用 api-negative-testing Skill。
任务:用格式错误行、超大批次、重复记录和非法状态转移挑战批量导入 API
输入材料:[需求、版本、链接、日志、报告或数据路径]
范围:[本次包含和排除的对象]
未知项:[缺失的环境、账号、数据或权限]
期望输出:[按风险排序的发现、证据状态和下一步动作]
先审计输入。分开写事实、假设和待确认问题。没有运行记录时不要声称已经执行。
分析
先从一个边界清楚的小回合开始:用格式错误行、超大批次、重复记录和非法状态转移挑战批量导入 API。对导入行分别测试未知币种、负金额、重复外部 ID,以及更新已关闭账户的请求。除了断言错误契约,还要确认除非 API 明确承诺部分成功,否则有效行不会被部分提交。
交接产物要同时保留输入版本、时间窗口、证据索引、负责人和下一次验证动作。Skill 可以整理不确定性,不能制造缺失的产物。
发现
以下是记录格式示例,不是执行结果:
| 字段 | 示例 |
|---|---|
| 编号与对象 | ANT-01 —— 批量导入中对已关闭账号的更新 |
| 前置条件与关注行为 | 账号处于关闭状态;有来源的状态规则可能禁止这项更新 |
| 证据状态 | 获取适用规则、响应和持久化状态查询前为 UNASSESSED |
| 影响/优先级与负责人 | 说明受影响记录或下游效果;指定 API/数据负责人;按项目标准评分 |
| 关闭条件与验证 | 用可重复的隔离检查核验允许/拒绝结果、逐行持久化状态和事件账本 |
决策
由 API 或领域负责人确认状态和字段规则是否适用。如果导入契约未说明是否允许部分成功,就把事务决策留为待确认,不要假设所有写入都成功或全部回滚。
验证
在隔离环境中使用已批准的安全数据。将响应与适用规则比较,再查询相关记录和下游事件;仅凭拒绝状态码不能证明没有发生修改。
发现如何进入下一阶段
交接产物
| 输出字段 | 它要回答什么 | 示例状态 |
|---|---|---|
| 异常用例 | 无效条件和预期拒绝 | 对应规则来源 |
| 响应判断 | 状态码、错误码、安全消息和可重试性 | 客户端动作 |
| 变更检查 | 不应变化的记录或事件 | 状态证据 |
没有运行记录、查询结果或原始产物时,不要写“已通过”。好的异常套件是分区设计的,不是表演式的。先找出违反一条规则的最小输入,再只在交互本身有风险时增加组合。
下一步路由
将“约束到输入变体”表、有效对照、响应预期和状态变化检查交给执行者。候选设计、实际执行结果和未解决的事务策略应分别记录。
怎样准备更好的输入
提供有版本的 Schema、字段规则、授权模型、错误契约、限流或依赖策略,以及受影响记录和事件的证据。说明是否允许部分成功;若未知,就保留为契约缺口。
和其他 Skill 怎么配合
- API 错误契约测试:检查失败响应。
- 边界值测试:系统化选择边界。
- API 安全测试:覆盖禁止访问与泄露。
容易踩的坑
- 生成无效数据,却没有对应规则。
- 断言被拒绝,却忽略部分写入。
- 所有失败类别都使用同一个格式错误载荷。
安装与调用
全局安装这个 Skill:
npx skills add https://github.com/naodeng/awesome-qa-skills/tree/main/skills/zh/testing-types/api-negative-testing -g
安装后使用 api-negative-testing Skill,并附上真实项目材料。
常见问题
异常测试应该直接打生产吗?
应使用隔离环境或获批准的安全数据;设计用例不等于授权破坏性请求。
无效组合要测多少?
覆盖独立规则和高风险交互即可,按影响排序,不按组合数量堆积。
参考
源 Skill 与执行契约
完整执行契约位于 API 异常测试 提示词。调用 Skill 前先阅读它;提示词定义了详细流程和输出契约。源目录 中还包含入口文件以及实际存在的配套资料。
入口文件重点约束无效结构、边界值、禁止状态、授权、依赖失败和安全响应。写结论前先阅读配套提示词,并保留这个 Skill 的决策边界。
参考链接
-
Awesome QA Skills:API 异常测试 源文件:https://github.com/naodeng/awesome-qa-skills/tree/main/skills/zh/testing-types/api-negative-testing
-
Awesome QA Skills GitHub:https://github.com/naodeng/awesome-qa-skills
-
API 异常测试 详情页:https://inaodeng.com/zh-cn/qaskills/api-negative-testing/