chore: initial import

This commit is contained in:
phamnazage-jpg
2026-05-12 17:47:32 +08:00
commit fc54ba84b2
104 changed files with 11575 additions and 0 deletions

113
test/CASES.md Normal file
View File

@@ -0,0 +1,113 @@
# AI-Ops 测试用例
> 版本v1.0 | 状态:初稿
---
## AC-1 实时监控看板
| 用例编号 | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 |
|---------|------|---------|---------|---------|--------|
| TC-1.1 | 首页加载时间 | 服务运行中,指标数据已采集 | 1. 访问运维主控台首页 2. 记录首屏加载时间 | 加载时间 < 2s | P0 |
| TC-1.2 | 六大指标显示 | 指标数据已采集 | 1. 访问首页 2. 检查指标卡片 | 必须显示 QPS、平均延迟、P99 延迟、5xx 错误率、活跃供应商数量、未关闭告警数量 | P0 |
| TC-1.3 | 指标刷新延迟 | 指标数据已更新 | 1. 触发新指标数据写入 2. 记录前端刷新时间 | 15s 内刷新显示 | P0 |
## AC-2 指标下钻
| 用例编号 | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 |
|---------|------|---------|---------|---------|--------|
| TC-2.1 | 趋势图展示 | 存在 1 小时指标数据 | 1. 点击某指标卡片 2. 观察趋势图 | 展示过去 1 小时分钟级数据 | P0 |
| TC-2.2 | 下钻分割 | 存在多服务/路径/供应商数据 | 1. 选择下钻维度 2. 查看分割结果 | 支持 service、path、supplier 维度 | P1 |
| TC-2.3 | 下钻查询时间 | 大量数据存在 | 1. 执行下钻查询 2. 记录响应时间 | 查询时间 < 3s | P0 |
## AC-3 告警规则配置
| 用例编号 | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 |
|---------|------|---------|---------|---------|--------|
| TC-3.1 | 创建规则 | 登录运维人员 | 1. 填写规则名称、指标、阈值、持续时间、级别、通知渠道 2. 提交 | 规则创建成功,返回规则 ID | P0 |
| TC-3.2 | 缺少字段报错 | 登录运维人员 | 1. 提交空规则名称 2. 提交 | 返回 400 错误,提示缺少字段 | P1 |
| TC-3.3 | 规则生效时间 | 规则已创建 | 1. 创建规则 2. 30s 后触发相关指标超阈值 | 规则生效,触发告警 | P0 |
| TC-3.4 | 同时运行 50 条规则 | 已创建 50 条规则 | 1. 创建 50 条规则 2. 观察系统运行 | 50 条规则同时运行不崩溃 | P1 |
## AC-4 告警通知触达
| 用例编号 | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 |
|---------|------|---------|---------|---------|--------|
| TC-4.1 | P0 告警触发时间 | P0 规则已配置 | 1. 模拟指标超阈值 2. 记录通知发送时间 | 通知发送时间 < 30s | P0 |
| TC-4.2 | P2 告警触发时间 | P2 规则已配置 | 1. 模拟指标超阈值 2. 记录通知发送时间 | 通知发送时间 < 120s | P0 |
| TC-4.3 | 通知渠道覆盖 | 规则已配置 | 1. 配置 Webhook、邮件、飞书通知 2. 触发告警 | 所有配置渠道均收到通知 | P0 |
| TC-4.4 | 通知模板完整性 | 规则已配置 | 1. 触发告警 2. 检查通知内容 | 包含级别、规则名称、触发时间、当前值、阈值、事件 ID、查看链接 | P1 |
## AC-5 告警聚合与抑制
| 用例编号 | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 |
|---------|------|---------|---------|---------|--------|
| TC-5.1 | 集群告警触发 | 规则已配置 | 1. 1 分钟内模拟触发 >20 条同资源告警 | 生成 1 条集群告警,停止单条通知 | P0 |
| TC-5.2 | 抑制周期 | 规则已配置 | 1. 触发告警 2. 5 分钟内再次触发同规则同目标 | 仅发送 1 次通知(除非级别升级) | P0 |
## AC-6 自动自愈
| 用例编号 | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 |
|---------|------|---------|---------|---------|--------|
| TC-6.1 | 自愈动作配置 | 规则已配置 | 1. 为规则配置自愈动作 2. 模拟触发 | 自愈动作在 60s 内执行完成 | P0 |
| TC-6.2 | 自愈执行结果记录 | 自愈已执行 | 1. 执行自愈动作 2. 检查告警事件 | 记录执行结果(成功/失败/拒绝) | P1 |
| TC-6.3 | 自愈失败升级 | 自愈动作配置 | 1. 模拟自愈失败 2. 观察 2 分钟 | 升级为人工告警 | P0 |
## AC-7 配置审计日志
| 用例编号 | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 |
|---------|------|---------|---------|---------|--------|
| TC-7.1 | 审计日志生成 | 登录管理员 | 1. 修改配置 2. 1s 内查询审计日志 | 生成审计记录,包含所有必要字段 | P0 |
| TC-7.2 | 审计日志不可篡改 | 审计日志已生成 | 1. 尝试直接修改数据库审计记录 | 修改被拒绝或不影响查询结果 | P1 |
| TC-7.3 | 审计查询效率 | 存在大量审计记录 | 1. 查询审计日志 2. 记录响应时间 | 响应时间 < 3s | P1 |
## AC-8 配置回滚
| 用例编号 | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 |
|---------|------|---------|---------|---------|--------|
| TC-8.1 | 回滚成功 | 存在可回滚的审计记录 | 1. 选择审计记录 2. 执行回滚 3. 确认覆盖内容 | 回滚成功,生成新审计记录 | P0 |
| TC-8.2 | 回滚目标不存在 | 目标资源已删除 | 1. 尝试回滚已删除的资源 | 返回错误码 `OPS_AUD_4101` | P0 |
| TC-8.3 | 回滚二次确认 | 回滚将影响多个子资源 | 1. 执行回滚 2. 观察提示 | 显示将要覆盖的子资源列表 | P1 |
## AC-9 容量主板
| 用例编号 | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 |
|---------|------|---------|---------|---------|--------|
| TC-9.1 | 趋势展示 | 存在 7 天数据 | 1. 访问容量主板 | 显示 7 天趋势 | P1 |
| TC-9.2 | 负载等级 | 指标数据已采集 | 1. 调整阈值 2. 观察等级变化 | 正确标注正常/警告/过载 | P1 |
## AC-10 日志/指标查询
| 用例编号 | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 |
|---------|------|---------|---------|---------|--------|
| TC-10.1 | 日志筛选 | 存在日志数据 | 1. 按时间范围、服务、状态码筛选 | 返回符合条件的日志 | P0 |
| TC-10.2 | 日志分页 | 存在大量日志 | 1. 查询日志 2. 分页浏览 | 首页返回时间 < 3s单页 100 条 | P1 |
| TC-10.3 | 日志导出 | 存在日志数据 | 1. 导出日志为 CSV | 成功导出,单次上限 10000 条 | P1 |
## AC-11 监控数据保存
| 用例编号 | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 |
|---------|------|---------|---------|---------|--------|
| TC-11.1 | 原始数据保留 | 已采集指标 | 1. 等待 7 天 2. 查询 7 天前的原始数据 | 数据仍可查询 | P1 |
| TC-11.2 | 聚合数据保留 | 已采集指标 | 1. 等待 30 天 2. 查询分钟级数据 | 分钟级聚合数据可查,原始数据已清理 | P1 |
## AC-12 角色与权限
| 用例编号 | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 |
|---------|------|---------|---------|---------|--------|
| TC-12.1 | 查看者权限 | 登录查看者 | 1. 尝试修改配置 | 操作被拒绝(返回 403 | P1 |
| TC-12.2 | 运维人员权限 | 登录运维人员 | 1. 确认告警 2. 尝试回滚 | 确认成功,回滚被拒绝 | P1 |
| TC-12.3 | 管理员权限 | 登录管理员 | 1. 执行回滚 | 回滚成功 | P0 |
## 边缘场景 / 失败路径
| 用例编号 | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 |
|---------|------|---------|---------|---------|--------|
| TC-E1 | 自愈动作重试均失败 | 自愈动作已配置 | 1. 模拟自愈失败 2 次 | 升级为 P0 人工告警 | P0 |
| TC-E2 | 通知渠道失效 | 通知渠道已配置 | 1. 模拟 Webhook 8xx 2. 观察切换 | 切换至备用渠道 | P1 |
| TC-E3 | 回滚目标不存在 | 目标已删除 | 1. 尝试回滚 | 返回错误码 | P1 |
| TC-E4 | 数据源丢失 | 采集器运行中 | 1. 停止采集器 5 分钟 | 显示数据源丢失标识,触发 P2 告警 | P1 |
| TC-E5 | 审计日志存储满盘/写入失败 | 审计日志存储满盘或写入失败 | 1. 模拟存储满盘或写入失败 2. 执行配置变更操作 | 丢弃非关键字段或改为异步上报,不阻断业务操作;记录降级事件 | P1 |
| TC-E6 | 自愈动作触发后形成级联故障 | 自愈动作已配置 | 1. 触发自愈动作(如切换路由) 2. 模拟新节点故障 | 自动恢复上一步操作前的状态,然后升级为人工告警 | P0 |
| TC-E7 | 时序库全面中断 | 监控系统运行中 | 1. 断开时序数据库连接 | 控制台进入只读/降级模式,告警引擎依赖本地缓存持续运行 | P0 |
| TC-E8 | 看板计算超时 | 看板有历史数据 | 1. 模拟查询引擎超时 2. 请求看板指标 | 显示上次成功结果并标注时间戳,不等待当前请求 | P1 |

73
test/STRATEGY.md Normal file
View File

@@ -0,0 +1,73 @@
# AI-Ops 测试策略
> 版本v1.0 | 状态:初稿
---
## 1. 测试目标
| 目标 | 指标 | 验证方式 |
|------|------|---------|
| 功能正确性 | 所有 AC 通过率 100% | 每个 AC 至少 1 个正向 + 1 个负向测试用例 |
| 性能达标 | 首页加载 <2s查询 <3s告警触发 <30s | 负载测试 + 峰值测试 |
| 安全性 | 无越权、无审计日志缺失 | 渗透测试 + 审计追溯测试 |
| 容灾能力 | 单机故障不影响服务 | 混淆工程测试 |
## 2. 测试层级
```
├── 单元测试 (Unit Test)
│ ├── domain 层逻辑测试
│ ├── service 层业务流程测试
│ └── handler 层输入验证测试
├── 集成测试 (Integration Test)
│ ├── 数据库交互测试
│ ├── Redis 缓存交互测试
│ ├── Prometheus 采集测试
│ └── 外部服务 Mock 测试
├── E2E 测试 (End-to-End Test)
│ ├── API 端到端测试
│ ├── WebSocket 实时推送测试
│ └── 前端流程测试
└── 混淆工程测试 (Chaos Test)
├── 单机故障
├── 网络分区
└── 数据库主从切换
```
## 3. 测试工具
| 层级 | 工具 | 说明 |
|------|------|------|
| 单元测试 | Go testing + testify + mockery | 覆盖率门槛 domain ≥ 70%、service/handler ≥ 80% |
| 数据库测试 | testcontainers-go (PostgreSQL) | 每次测试启动独立容器 |
| 缓存测试 | miniredis | 轻量级 Redis Mock |
| HTTP 测试 | httptest + net/http | 标准库内置测试 |
| E2E 测试 | 自定义 Go E2E 框架 | 启动完整服务 + 数据库 + 缓存 |
| 混淆测试 | chaos-mesh / 自定义脚本 | K8s 环境下使用 chaos-mesh非 K8s 使用自定义脚本 |
## 4. 测试环境
| 环境 | 用途 | 数据 |
|------|------|------|
| 本地开发 | 单元 + 快速集成测试 | 测试数据生成 |
| CI | 自动化单元 + 集成测试 | 测试数据生成 |
| 测试环境 | E2E 测试 + 性能基准 | 模拟生产数据(脱敏) |
| 生产前 | 灾备测试 + 回滚演练 | 生产数据副本(脱敏) |
| 生产环境 | 灰度监控 + 告警验证 | 真实生产数据 |
## 5. 测试数据管理
- 测试数据通过 `test/fixtures/` 下的 SQL 脚本和 JSON 文件管理。
- 每个测试用例自洁,启动前加载固定数据集,结束后清理。
- 数据库测试使用编程式事务,测试结束后自动回滚。
## 6. 自动化与 CI 集成
- PR 提交时自动触发单元测试和集成测试。
- 每日定时触发全量 E2E 测试。
- 每周定时触发混淆测试(若有 K8s 环境)。
- 测试失败时自动通知 TechLead 和 QA。

34
test/perf/PERF_ENV.md Normal file
View File

@@ -0,0 +1,34 @@
# AI-Ops 性能压测环境规格
## 压测目标
| 场景 | 并发用户 | 目标 P95 | 目标 P99 | 失败率门槛 |
|------|----------|----------|----------|------------|
| 首页加载 | 50 | < 2s | < 3s | < 1% |
| 指标下钻 | 20 | < 3s | < 5s | < 1% |
| 告警触发到通知 | - | < 30s | < 60s | < 0.1% |
## 环境规格
| 组件 | 规格 | 说明 |
|------|------|------|
| AI-Ops API Server | 2 vCPU / 4GB 内存 | 与生产目标一致 |
| PostgreSQL | 2 vCPU / 4GB 内存 / SSD | 含 10 万条审计日志基准数据 |
| Redis | 1 vCPU / 2GB 内存 | 用于告警抑制缓存 |
| Prometheus | 独立实例 | 采集 10 个指标、15s 间隔 |
## 压测方法
1. **首页加载**`k6 run test/perf/dashboard_k6.js`
2. **下钻查询**`k6 run test/perf/drilldown_k6.js`
3. **告警延迟**:通过 Go 单测 `alert_latency_test.go` 测量触发到通知的延迟
## P99 计算方法
使用 k6 默认统计方法在压测期间10s 滑动窗口)内的所有请求响应时间排序后取 99% 分位数。
## 通过标准
- P95 达标且失败率 < 1% → 通过
- P95 超标但 P99 达标 → CONDITIONAL_APPROVED需性能优化
- P99 超标 → 阻止进入下一阶段

View File

@@ -0,0 +1,29 @@
package perf
import (
"testing"
"time"
"github.com/stretchr/testify/assert"
)
// TestAlertLatency 测量告警触发到通知的延迟
// 目标:< 30s (P95)
func TestAlertLatency(t *testing.T) {
// 模拟规则触发
triggeredAt := time.Now()
// TODO: 替换为实际的告警服务调用
// alert, err := alertService.Evaluate(ctx, ruleID)
// require.NoError(t, err)
// 模拟通知发送
// err = notifyService.Send(ctx, alert)
// require.NoError(t, err)
// 计算延迟
latency := time.Since(triggeredAt)
t.Logf("Alert latency: %v", latency)
assert.Less(t, latency, 30*time.Second, "alert latency should be < 30s")
}

32
test/perf/dashboard_k6.js Normal file
View File

@@ -0,0 +1,32 @@
import http from 'k6/http';
import { check, sleep } from 'k6';
// AI-Ops 看板首页性能压测脚本
// 目标:验证首页加载 < 2s并发 50 用户
export const options = {
stages: [
{ duration: '1m', target: 50 }, // 逐步加载到 50 并发
{ duration: '3m', target: 50 }, // 稳定压测 3 分钟
{ duration: '1m', target: 0 }, // 逐步卸载
],
thresholds: {
http_req_duration: ['p(95)<2000'], // P95 < 2s
http_req_duration: ['p(99)<3000'], // P99 < 3s
http_req_failed: ['rate<0.01'], // 失败率 < 1%
},
};
export default function () {
const url = 'http://localhost:8080/api/v1/ai-ops/dashboard';
const res = http.get(url, {
headers: { 'Authorization': 'Bearer ${__ENV.AI_OPS_TOKEN}' },
});
check(res, {
'status is 200': (r) => r.status === 200,
'response time < 2s': (r) => r.timings.duration < 2000,
});
sleep(1);
}

32
test/perf/drilldown_k6.js Normal file
View File

@@ -0,0 +1,32 @@
import http from 'k6/http';
import { check, sleep } from 'k6';
// AI-Ops 下钻性能压测脚本
// 目标:验证下钻加载 < 3s并发 20 用户
export const options = {
stages: [
{ duration: '30s', target: 20 },
{ duration: '2m', target: 20 },
{ duration: '30s', target: 0 },
],
thresholds: {
http_req_duration: ['p(95)<3000'], // P95 < 3s
http_req_failed: ['rate<0.01'], // 失败率 < 1%
},
};
export default function () {
const service = `service_${Math.floor(Math.random() * 10)}`;
const url = `http://localhost:8080/api/v1/ai-ops/metrics/drilldown?service=${service}&window=5m`;
const res = http.get(url, {
headers: { 'Authorization': 'Bearer ${__ENV.AI_OPS_TOKEN}' },
});
check(res, {
'status is 200': (r) => r.status === 200,
'response time < 3s': (r) => r.timings.duration < 3000,
});
sleep(2);
}