- frontend-architecture-refactor: 拆分 hooks/组件、类型筛选器动态化 - http-checker-quality-hardening: ReDoS 防护、failure 格式修正、测试补全
6.0 KiB
6.0 KiB
MODIFIED Requirements
注:仅展示变更的 scenarios,其余 scenarios 保持不变
Requirement: 结构化 expect 失败信息
系统 SHALL 在任一 expect 规则失败时生成结构化 failure,用于标识失败阶段、规则路径、期望值、实际值和可读错误信息。actual 值 SHALL 在构造时截断至不超过 200 字符,超出部分以省略标记和总字符数替代。expected 值不截断。
Scenario: body 规则失败信息
- WHEN HTTP target 的
expect.body[1].json规则失败 - THEN failure SHALL 包含 kind=
mismatch、phase=body、path 指向expect.body[1],并包含 message
Scenario: actual 值截断
- WHEN 失败规则的实际值为字符串且长度超过 200 字符
- THEN failure.actual SHALL 为前 200 字符加
…(共 N 字符)后缀,其中 N 为原始总字符数
Scenario: actual 值未超限
- WHEN 失败规则的实际值为字符串且长度不超过 200 字符
- THEN failure.actual SHALL 保留完整原始值,不做截断
Scenario: actual 值为对象或数组
- WHEN 失败规则的实际值为对象或数组,且 JSON 序列化后长度超过 200 字符
- THEN failure.actual SHALL 为序列化后前 200 字符加
…(共 N 字符)后缀
Scenario: actual 值为标量
- WHEN 失败规则的实际值为 number、boolean、null 或 undefined
- THEN failure.actual SHALL 保留原始值,不做截断
Requirement: HTTP expect 规则启动期校验
系统 SHALL 在启动期校验 HTTP expect 中已支持字段的类型、格式、未知字段和可编译表达式。HTTP expect、body rule、json/css/xpath rule 和 operator 对象中的未知字段 SHALL 导致启动期配置失败。每个 body rule 对象 MUST 恰好包含 contains、regex、json、css、xpath 中的一种规则类型。纯 operator 对象 MUST 至少包含一个已知 operator;body 提取规则可以不配置 operator,并以路径、元素或节点存在作为通过语义。equals operator SHALL 支持任意 JSON value,包括数组和对象。系统 SHALL 在启动期对 regex body 规则和 match operator 的正则表达式进行 ReDoS 安全检测,含有嵌套量词等危险模式的正则 SHALL 导致启动期配置失败。
Scenario: body rule 使用 regex 字段
- WHEN HTTP target 配置
expect.body: [{regex: "ok|healthy"}]且 regex 可编译且无 ReDoS 风险 - THEN 系统 SHALL 接受该配置,并在运行期按 regex body 规则匹配响应体
Scenario: body rule 不支持 match 字段
- WHEN HTTP target 配置
expect.body: [{match: "ok"}]且该规则没有 contains、regex、json、css、xpath 任一支持字段 - THEN 系统 SHALL 在启动期配置校验失败
Scenario: body rule 未知字段启动失败
- WHEN HTTP target 配置
expect.body: [{contains: "ok", note: "ignored"}] - THEN 系统 SHALL 在启动期配置校验失败,提示
note是未知字段
Scenario: body rule 多支持字段非法
- WHEN HTTP target 的同一条 body rule 同时配置 contains 和 regex
- THEN 系统 SHALL 在启动期配置校验失败
Scenario: operator match 正则非法
- WHEN HTTP target 的 expect.headers、json、css 或 xpath operator 配置了不可编译的 match 正则
- THEN 系统 SHALL 在启动期配置校验失败
Scenario: operator 数值比较类型非法
- WHEN HTTP target 的 expect operator 配置 gt、gte、lt 或 lte,且对应值不是有限数字
- THEN 系统 SHALL 在启动期配置校验失败
Scenario: operator 布尔类型非法
- WHEN HTTP target 的 expect operator 配置 empty 或 exists,且对应值不是布尔值
- THEN 系统 SHALL 在启动期配置校验失败
Scenario: JSONPath 子集非法
- WHEN HTTP target 的 json body rule path 不符合系统支持的 JSONPath 子集
- THEN 系统 SHALL 在启动期配置校验失败
Scenario: operator 未知字段非法
- WHEN HTTP target 的 expect operator 配置了
foo: "bar"等未知 operator 字段 - THEN 系统 SHALL 在启动期配置校验失败
Scenario: equals 支持对象
- WHEN HTTP target 配置
expect.body: [{json: {path: "$.payload", equals: {status: "ok"}}}] - THEN 系统 SHALL 接受该配置,并在运行期使用深度相等比较提取值和对象期望
Scenario: equals 支持数组
- WHEN HTTP target 配置
expect.body: [{json: {path: "$.items", equals: ["a", "b"]}}] - THEN 系统 SHALL 接受该配置,并在运行期使用深度相等比较提取值和数组期望
Scenario: 纯 operator 对象不能为空
- WHEN HTTP target 的
expect.headers中某个 header 期望配置为空对象{} - THEN 系统 SHALL 在启动期配置校验失败,要求显式配置至少一个 operator
Scenario: json rule 允许存在性语义
- WHEN HTTP target 配置
expect.body: [{json: {path: "$.status"}}] - THEN 系统 SHALL 接受该配置,并在运行期以 JSONPath 值存在作为通过语义
Scenario: css rule 未知字段非法
- WHEN HTTP target 配置
expect.body: [{css: {selector: "h1", unknown: true}}] - THEN 系统 SHALL 在启动期配置校验失败,提示未知字段
Scenario: xpath rule 未知字段非法
- WHEN HTTP target 配置
expect.body: [{xpath: {path: "/html/body", unknown: true}}] - THEN 系统 SHALL 在启动期配置校验失败,提示未知字段
Scenario: regex body 规则含嵌套量词启动失败
- WHEN HTTP target 配置
expect.body: [{regex: "(a+)+$"}] - THEN 系统 SHALL 在启动期配置校验失败,提示正则存在 ReDoS 风险
Scenario: match operator 含嵌套量词启动失败
- WHEN HTTP target 的 expect operator 配置
{match: "(\\d+)*x"} - THEN 系统 SHALL 在启动期配置校验失败,提示正则存在 ReDoS 风险
Scenario: 安全正则通过校验
- WHEN HTTP target 配置
expect.body: [{regex: "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"}] - THEN 系统 SHALL 接受该配置(无嵌套量词,无 ReDoS 风险)