AI-Ops 测试设计方案
版本:v1.0
日期:2026-04-27
状态:初稿
覆盖:AC-01 ~ AC-12、异常流程 F-01 ~ F-08、边缘流程 G ~ I
1. 测试策略
1.1 测试分层模型
1.2 测试通过标准
| 维度 |
标准 |
| 覆盖率 |
domain ≥ 70%, service/handler ≥ 80% |
| 主流程 |
AC-01 ~ AC-12 全部有至少 1 条通过测试 |
| 异常流程 |
F-01 ~ F-08 全部有至少 1 条验证测试 |
| 边缘流程 |
G、H、I 全部有至少 1 条验证测试 |
| 告警噪声率 |
沙盒测试中误报率 ≤ 1%,超过则 CI 失败 |
| 自愈误触发 |
沙盒测试中 0 次误触发,否则 CI 失败 |
1.3 测试环境矩阵
| 环境 |
用途 |
数据特征 |
外部依赖 |
| Local Dev |
开发者快速验证 |
Mock 数据 |
Mock 所有外部服务 |
| CI |
PR Merge 门禁 |
Mock 数据 |
Mock 所有外部服务 |
| Sandbox |
沙盒验证(自愈规则) |
生产数据脱敏副本 |
Mock + 部分真实依赖 |
| Staging |
上线前全流程验证 |
生产数据脱敏副本 |
全真实依赖 |
| Production |
灰度上线 |
真实数据 |
全真实依赖 |
2. Mock 策略
2.1 外部依赖 Mock
| 依赖 |
Mock 方案 |
工具 |
| Prometheus / 时序数据库 |
嵌入式 mock server,返回预置指标数据 |
httptest + 自定义 mock |
| gateway/internal/metrics |
Mock HTTP handler,返回 JSON 指标 |
gock / httptest |
| supply-api/ 供应商健康接口 |
Mock 返回 200/401/429/500 |
gock |
| platform-token-runtime/ 运行时状态接口 |
Mock 返回正常/异常状态 |
gock |
| 通知渠道(Webhook/邮件/飞书) |
Mock server 接收并验证请求格式 |
httptest |
| PostgreSQL |
sqlmock 拦截 SQL,验证查询正确性 |
github.com/DATA-DOG/go-sqlmock |
| Redis |
miniredis 内存模拟 |
github.com/alicebob/miniredis |
2.2 Mock 分层
3. 测试用例矩阵(按 AC 编号)
AC-01 实时监控看板
| 用例 ID |
描述 |
类型 |
覆盖条件 |
| TC-01-01 |
首页加载时间 <2s |
Performance |
Given 用户登录 When 访问首页 Then 响应时间 ≤2s |
| TC-01-02 |
首页显示 6 个指标 |
Happy Path |
Given 系统运行 When 首页加载 Then 显示 QPS/延迟/P99/错误率/供应商数/告警数 |
| TC-01-03 |
指标卡片 15s 内刷新 |
Functional |
Given 指标更新 When 数据推送 Then 15s 内页面刷新 |
| TC-01-04 |
无数据时看板展示"无数据" |
Edge |
Given 指标源断开 When 首页加载 Then 不显示过期数据 |
| TC-01-NEG-01 |
未登录访问首页返回 401 |
Negative |
Given 未登录 When 访问首页 Then 返回 401 |
| TC-01-NEG-02 |
非法时间范围参数返回 400 |
Negative |
Given 非法时间范围参数 When 请求指标 Then 返回 400 |
AC-02 指标下钻
| 用例 ID |
描述 |
类型 |
覆盖条件 |
| TC-02-01 |
下钻显示 1 小时趋势图 |
Happy Path |
Given 点击指标卡片 When 下钻 Then 显示 60min 趋势 |
| TC-02-02 |
按 service/path/supplier 维度分割 |
Functional |
Given 趋势图 When 按 supplier 下钻 Then 正确分割 |
| TC-02-03 |
下钻查询 <3s |
Performance |
Given 大数据量 When 执行下钻 Then 响应 <3s |
| TC-02-04 |
无数据范围返回空图表 |
Edge |
Given 无数据 When 下钻 Then 显示空图表而非报错 |
| TC-02-NEG-01 |
下钻不存在的 service 返回空结果/404 |
Negative |
Given 不存在的 service When 下钻 Then 返回空结果或 404 |
| TC-02-NEG-02 |
超大时间范围返回 413/截断 |
Negative |
Given 超大时间范围 When 下钻 Then 返回 413 或自动截断 |
AC-03 告警规则配置
| 用例 ID |
描述 |
类型 |
覆盖条件 |
| TC-03-01 |
创建告警规则 |
Happy Path |
Given 登录管理员 When 创建规则 Then 规则保存成功 |
| TC-03-02 |
规则字段完整性校验 |
Negative |
Given 缺少必填字段 When 创建规则 Then 返回 400 |
| TC-03-03 |
规则变更 30s 内生效 |
Functional |
Given 规则已创建 When 修改阈值 Then 30s 后新规则生效 |
| TC-03-04 |
支持 50 条规则并发运行 |
Load |
Given 50 条规则 When 同时触发 Then 全部正确评估 |
| TC-03-05 |
规则编辑/禁用/删除 |
Functional |
Given 规则存在 When 编辑/禁用/删除 Then 状态正确变更 |
AC-04 告警通知触达
| 用例 ID |
描述 |
类型 |
覆盖条件 |
| TC-04-01 |
P0/P1 告警 30s 内通知 |
Performance |
Given P1 告警触发 When 通知发送 Then ≤30s 到达 |
| TC-04-02 |
P2 告警 120s 内通知 |
Performance |
Given P2 告警触发 When 通知发送 Then ≤120s 到达 |
| TC-04-03 |
至少 2 种通知渠道 |
Functional |
Given 告警触发 When 发送 Then 飞书和邮件均收到 |
| TC-04-04 |
通知内容完整性 |
Functional |
Given 告警发送 Then 包含级别/规则名/时间/当前值/阈值/事件ID/链接 |
| TC-04-05 |
Webhook 通知失败后自动切换 |
Resilience |
Given Webhook 发送失败 When 告警触发 Then 自动切换至邮件 |
| TC-04-NEG-01 |
通知渠道全部失效时记录失败并触发内部告警 |
Negative |
Given 所有通知渠道失效 When 告警触发 Then 记录失败并触发内部 P2 告警 |
| TC-04-NEG-02 |
非法事件 ID 查询返回 404 |
Negative |
Given 非法事件 ID When 查询事件 Then 返回 404 |
AC-05 告警聚合与抑制
| 用例 ID |
描述 |
类型 |
覆盖条件 |
| TC-05-01 |
1 分钟内 >20 条告警触发聚合 |
Functional |
Given 同一资源 1min 内触发 25 条 When 聚合 Then 生成 1 条集群告警 |
| TC-05-02 |
集群告警包含累计数量和规则列表 |
Functional |
Given 集群告警生成 Then 内容包含数量≥20 和规则列表 |
| TC-05-03 |
5 分钟抑制期内同一规则不重复通知 |
Functional |
Given 告警已发送 When 5min 内再次触发 Then 不重复通知 |
| TC-05-04 |
级别升级时抑制解除 |
Functional |
Given P2 告警抑制中 When 升级为 P1 Then 立即通知 |
| TC-05-NEG-01 |
聚合阈值设置为 0 或负数时的校验拒绝 |
Negative |
Given 阈值为 0 或负数 When 创建/编辑规则 Then 返回 400 并拒绝 |
AC-06 自动自愈
| 用例 ID |
描述 |
类型 |
覆盖条件 |
| TC-06-01 |
自愈动作 60s 内完成 |
Performance |
Given 自愈规则触发 When 执行切换路由 Then ≤60s 完成含重试 |
| TC-06-02 |
自愈成功记录事件 |
Happy Path |
Given 自愈执行成功 When 完成 Then 事件记录 success |
| TC-06-03 |
自愈失败升级 P0 人工告警 |
Functional |
Given 自愈重试均失败 When 停止 Then 升级 P0 通知 |
| TC-06-04 |
无自愈规则时仅通知 |
Functional |
Given 告警无自愈配置 When 触发 Then 仅发送通知 |
| TC-06-05 |
沙盒模式:自愈不生效 |
Resilience |
Given 沙盒模式 When 自愈触发 Then 仅记录,不实际执行 |
| TC-06-06 |
自愈后 2min 评估是否解除 |
Functional |
Given 自愈执行 When 2min 后 Then 评估条件是否满足 |
| TC-06-07 |
自愈级联失败回退 |
Functional |
Given 自愈切换导致新故障 When 检测到 Then 回退并升级 |
| TC-06-NEG-01 |
沙盒未通过时禁止关联生产规则 |
Negative |
Given 沙盒测试未通过 When 关联生产告警规则 Then 返回 400 并拒绝 |
| TC-06-NEG-02 |
自愈动作类型非法返回 400 |
Negative |
Given 非法自愈动作类型 When 配置规则 Then 返回 400 |
AC-07 配置审计日志
| 用例 ID |
描述 |
类型 |
覆盖条件 |
| TC-07-01 |
配置变更 1s 内生成审计记录 |
Performance |
Given 执行配置变更 When 完成 Then ≤1s 审计记录存在 |
| TC-07-02 |
审计字段完整性 |
Functional |
Given 审计记录 When 查询 Then 包含全部 10 个字段 |
| TC-07-03 |
审计日志不可篡改 |
Security |
Given 审计记录 When 尝试修改 Then 数据库层拒绝或被检测 |
| TC-07-04 |
审计日志 90 天保留 |
Functional |
Given 审计数据 91 天 When 查询 Then 91 天前记录不存在(新数据已清理) |
| TC-07-05 |
审计查询 <3s |
Performance |
Given 10000 条审计记录 When 按条件查询 Then <3s |
AC-08 配置回滚
| 用例 ID |
描述 |
类型 |
覆盖条件 |
| TC-08-01 |
正常回滚 <60s |
Performance |
Given 审计记录存在 When 执行回滚 Then ≤60s 完成 |
| TC-08-02 |
回滚前显示子资源影响列表 |
Functional |
Given 回滚操作 When 执行前 Then 显示将被覆盖的子资源 |
| TC-08-03 |
回滚生成新审计记录 |
Functional |
Given 回滚执行 When 完成 Then 新审计记录关联原始 ID |
| TC-08-04 |
目标不存在时返回 OPS_AUD_4101 |
Negative |
Given 目标已被删除 When 执行回滚 Then 返回错误码且不执行 |
| TC-08-05 |
回滚失败不静默 |
Resilience |
Given 回滚执行失败 When 完成 Then 返回错误码并通知 |
AC-09 容量主板
| 用例 ID |
描述 |
类型 |
覆盖条件 |
| TC-09-01 |
显示 7 天趋势数据 |
Functional |
Given 容量主板 When 加载 Then 显示 7 天 Token/QPS/延迟趋势 |
| TC-09-02 |
负载等级标注(正常/警告/过载) |
Functional |
Given 负载数据 When 展示 Then 正确标注等级 |
| TC-09-03 |
预测触达上限时间 |
Functional |
Given 增长率数据 When 计算 Then 显示预测时间(仅供参考) |
| TC-09-NEG-01 |
容量主板数据源丢失时展示降级提示 |
Negative |
Given 时序库断开 When 访问容量主板 Then 显示降级提示而非错误 |
AC-10 日志/指标查询
| 用例 ID |
描述 |
类型 |
覆盖条件 |
| TC-10-01 |
按多维度筛选日志 |
Functional |
Given 查询条件 When 执行 Then 正确过滤 |
| TC-10-02 |
日志查询 <3s |
Performance |
Given 10000 条日志 When 查询 Then <3s |
| TC-10-03 |
CSV 导出 10000 条 |
Load |
Given 查询结果 When 导出 Then 正确生成 CSV |
| TC-10-04 |
分页查询第 2 页 |
Functional |
Given 分页请求 When 获取第 2 页 Then 返回正确偏移 |
| TC-10-NEG-01 |
导出超过 10000 条时返回 413 或分批 |
Negative |
Given 查询结果 >10000 条 When 导出 CSV Then 返回 413 或自动分批导出 |
AC-11 监控数据保存
| 用例 ID |
描述 |
类型 |
覆盖条件 |
| TC-11-01 |
原始数据保留 ≥7 天 |
Functional |
Given 8 天前数据 When 查询 Then 7 天内数据存在 |
| TC-11-02 |
分钟级聚合保留 ≥30 天 |
Functional |
Given 31 天前数据 When 查询 Then 31 天前不存在 |
| TC-11-03 |
小时级聚合保留 ≥90 天 |
Functional |
Given 91 天前数据 When 查询 Then 不存在 |
| TC-11-NEG-01 |
查询已清理数据返回空并提示保留策略 |
Negative |
Given 查询已清理时段 When 查询原始数据 Then 返回空并提示保留策略 |
AC-12 角色与权限
| 用例 ID |
描述 |
类型 |
覆盖条件 |
| TC-12-01 |
查看者只能读不可写 |
Security |
Given 查看者 When 尝试写操作 Then 返回 403 |
| TC-12-02 |
运维人员不可执行回滚 |
Security |
Given 运维人员 When 执行回滚 Then 返回 403 |
| TC-12-03 |
管理员可执行所有操作 |
Functional |
Given 管理员 When 执行任意操作 Then 成功 |
4. 异常流程测试(F-01 ~ F-08)
| 用例 ID |
异常场景 |
验证点 |
预期行为 |
| TF-01 |
自愈动作重试均失败 |
P0 人工告警触发 |
10s 内重试 1 次,失败后立即升级 P0 电话/短信 |
| TF-02 |
通知渠道失效(Webhook 5xx) |
备用渠道切换 |
记录失败,使用邮件→飞书→短信 三次切换 |
| TF-03 |
回滚目标已不存在 |
OPS_AUD_4101 |
返回错误码,运营手动修复 |
| TF-04 |
指标采集器 5min 无数据 |
数据源丢失标识 |
控制台显示丢失标识,触发 P2 内部告警 |
| TF-05 |
审计日志存储满盘 |
降级不阻断业务 |
丢弃非关键字段或异步上报,业务操作继续 |
| TF-06 |
自愈形成级联故障 |
回退并升级 |
自动恢复上一步,升级人工告警,立即电话通知 |
| TF-07 |
监控数据库全面中断 |
只读/降级模式 |
控制台只读,告警引擎本地缓存继续运行 |
| TF-08 |
实时看板指标计算超时 |
显示上次结果 |
显示上次成功结果并标注时间戳 |
5. 灰度发布验证计划
5.1 各 Phase 验证内容
| Phase |
验证内容 |
通过标准 |
回归集 |
| Phase 1 |
监控看板 + 日志查询 |
AC-01, AC-02, AC-10, AC-11 全部通过 |
无历史功能 |
| Phase 2 |
告警规则 + 通知渠道 |
AC-03, AC-04, AC-05 全部通过 |
Phase 1 全量 |
| Phase 3 |
自愈引擎 + 审计回滚 |
AC-06, AC-07, AC-08 全部通过 + 沙盒 10 次无误触发 |
Phase 1+2 全量 |
| Phase 4 |
容量主板 |
AC-09 全部通过 |
Phase 1+2+3 全量 |
5.2 灰度门禁检查项
每次 Phase 升级前必须全部通过:
6. 回归测试集
6.1 快速回归集(每次 PR)
6.2 完整回归集(每次 Phase 升级)
7. 技术栈与集成约束验证
7.1 统一技术栈与双运行模式验证
| 用例 ID |
描述 |
类型 |
验证条件 |
| TOPS-RUN-01 |
独立运行模式启动 |
Happy Path |
Given 独立 config.yaml 与独立数据库/Redis/时序库 When 启动 cmd/ai-ops/main.go Then /actuator/health/ready 返回 200,/api/v1/ai-ops/* 可访问 |
| TOPS-RUN-02 |
集成运行模式挂载 |
Integration |
Given gateway 或 supply-api 主进程加载 IntegrationPlugin When 启动 Then /internal/ai-ops/* 路由、后台 worker、健康检查挂载成功 |
| TOPS-RUN-03 |
配置分离加载 |
Functional |
Given 独立模式与集成模式分别启动 When 读取配置 Then 独立模式仅使用自身配置,集成模式正确合并主项目配置 |
| TOPS-RUN-04 |
数据库前缀隔离 |
Structural |
Given 执行迁移 When 检查 schema Then 仅创建 ai_ops_ 前缀表 |
7.2 独立运行与集成运行验证
7.3 IntegrationPlugin 与模块挂载验证
| 用例 ID |
描述 |
类型 |
验证条件 |
| TOPS-PLG-01 |
IntegrationPlugin 注册路由与健康检查 |
Integration |
Given 集成模式 When 插件注册 Then 监控、告警、日志、审计、健康检查路由挂载成功 |
| TOPS-PLG-02 |
模块开关生效 |
Functional |
Given enabled_modules 关闭某模块 When 启动 Then 对应路由/后台任务不注册,其他模块不受影响 |
| TOPS-PLG-03 |
集成模式共享资源 |
Integration |
Given 主进程注入共享 DB/Redis/logger/metrics client When 插件启动 Then 使用共享资源且不重复初始化冲突依赖 |
7.3 OpenAPI 契约验证
| 用例 ID |
描述 |
类型 |
验证条件 |
| TOPS-OAS-01 |
OpenAPI 文档可访问 |
Functional |
Given 服务启动 When 请求 /openapi.json 或 /docs Then 返回 200 且包含监控、告警、自愈、审计、日志查询接口 |
| TOPS-OAS-02 |
路由与 OpenAPI 一致 |
Contract |
Given 导出的 OpenAPI 文档 When 对照 HTTP 路由 Then 请求/响应/错误码与实现一致,无缺失公开接口 |
| TOPS-OAS-03 |
集成前缀可配置 |
Contract |
Given 集成模式配置内部前缀 When 导出文档 Then 文档反映 /internal/ai-ops/ 前缀或明确区分外部/内部暴露面 |
7.4 NewAPI / Sub2API 适配层验证
| 用例 ID |
描述 |
类型 |
验证条件 |
| TOPS-ADP-01 |
/metrics 采集适配 |
Contract |
Given NewAPI/Sub2API 通过 Prometheus scrape 拉取指标 When 调用 /metrics Then 指标命名、label、采样频率满足契约 |
| TOPS-ADP-02 |
告警回调适配 |
Integration |
Given 外部系统配置 Webhook 回调 When 告警触发 Then 回调内容完整、签名正确、失败可重试 |
| TOPS-ADP-03 |
自愈脚本调用外部管理 API |
Integration |
Given 自愈动作触发程序化脚本 When 通过适配层调用 NewAPI/Sub2API Then 鉴权、错误码映射、回退逻辑符合设计 |
8. 发布门禁与阶段结论
8.1 发布门禁检查表
以下门禁项全部通过前,不得进入生产交付:
8.2 阶段门控结论
当前结论:REQUEST_CHANGES(已转化为具体行动项,见 HLD 10.2 节)
进入开发/实现前必须补齐:
阻断条件(任一触发则不得进入开发):
- 高风险动作没有沙盒/回滚闭环。
- 审计不能证明先写后执行业务。
- 关键能力只存在接口声明,未真实接入运行主链路。
- HLD 门控 8.1 中任意一项未通过。
9. 性能测试
9.1 性能基准
| 指标 |
目标值 |
压测方法 |
| 首页加载 |
<2s (P99) |
k6 并发 50 用户 |
| 告警触发到通知 |
P0/P1 <30s, P2 <120s |
单次告警触发计时 |
| 下钻查询 |
<3s (P99) |
k6 并发 20 用户 |
| 审计查询 |
<3s (P99) |
10000 条数据下查询 |
| 配置回滚 |
<60s (P99) |
单次回滚计时 |
| 支持并发告警规则 |
≥50 条同时评估 |
并发注入 50 条告警数据 |
10. 安全测试
| 测试项 |
方法 |
验证点 |
| 权限越界 |
使用低权限 Token 尝试高权限操作 |
返回 403 |
| 审计日志篡改 |
尝试 UPDATE/DELETE 审计表 |
操作被拒绝或被检测 |
| SQL 注入 |
输入 ' OR 1=1 -- 等 |
参数化查询无注入 |
| 告警信息泄露 |
跨用户查询告警 |
无数据泄露 |
| 高风险变更未二次确认 |
提交影响 90% 流量的变更 |
变更被标记待确认 |