@kkeve/suite 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +53 -0
- package/dist/bin/keve.d.ts +13 -0
- package/dist/bin/keve.js +164 -0
- package/dist/commands/auth-update.d.ts +16 -0
- package/dist/commands/auth-update.js +88 -0
- package/dist/commands/clean.d.ts +10 -0
- package/dist/commands/clean.js +78 -0
- package/dist/commands/config.d.ts +17 -0
- package/dist/commands/config.js +99 -0
- package/dist/commands/init.d.ts +15 -0
- package/dist/commands/init.js +292 -0
- package/dist/commands/report.d.ts +12 -0
- package/dist/commands/report.js +159 -0
- package/dist/commands/run.d.ts +29 -0
- package/dist/commands/run.js +417 -0
- package/dist/commands/test.d.ts +12 -0
- package/dist/commands/test.js +102 -0
- package/dist/commands/vitest.d.ts +14 -0
- package/dist/commands/vitest.js +166 -0
- package/dist/config.d.ts +109 -0
- package/dist/config.js +291 -0
- package/dist/core/action-log-writer.d.ts +47 -0
- package/dist/{tools/write-file.js → core/action-log-writer.js} +42 -26
- package/dist/core/auth.d.ts +17 -0
- package/dist/core/auth.js +224 -0
- package/dist/core/cdp-resolver.d.ts +5 -0
- package/dist/core/cdp-resolver.js +93 -0
- package/dist/core/generateReport/report.d.ts +19 -0
- package/dist/core/generateReport/report.js +91 -0
- package/dist/core/generateReport/reportData.d.ts +215 -0
- package/dist/core/generateReport/reportData.js +735 -0
- package/dist/core/global-setup.d.ts +6 -0
- package/dist/core/global-setup.js +113 -0
- package/dist/core/keve-aspect.d.ts +54 -0
- package/dist/core/keve-aspect.js +52 -0
- package/dist/core/keve-decorators.d.ts +51 -0
- package/dist/core/keve-decorators.js +95 -0
- package/dist/core/keve-registry.d.ts +38 -0
- package/dist/core/keve-registry.js +25 -0
- package/dist/core/keve-report.d.ts +27 -0
- package/dist/core/keve-report.js +357 -0
- package/dist/core/keve-test.d.ts +36 -0
- package/dist/core/keve-test.js +364 -0
- package/dist/core/learned-actions.d.ts +24 -0
- package/dist/core/learned-actions.js +65 -0
- package/dist/core/pw-config.d.ts +19 -0
- package/dist/core/pw-config.js +180 -0
- package/dist/index.d.ts +8 -23
- package/dist/index.js +36 -43
- package/dist/page-agent/agent.d.ts +129 -0
- package/dist/page-agent/agent.js +585 -0
- package/dist/page-agent/hooks.d.ts +13 -0
- package/dist/page-agent/hooks.js +218 -0
- package/dist/page-agent/tools.d.ts +29 -0
- package/dist/page-agent/tools.js +297 -0
- package/doc/README.md +124 -0
- package/doc/agents/keve-dev-test-agent.md +140 -0
- package/doc/agents/keve-test-agent.md +178 -0
- package/doc/asserts//346/265/213/350/257/225/345/220/204/351/230/266/346/256/265/350/257/264/346/230/216.png +0 -0
- package/doc/keve-agent-demo.html +370 -0
- package/doc/skills/keve-bddcase-gen/SKILL.md +332 -0
- package/doc/skills/keve-bddcase-gen/references/test-case-rules.md +91 -0
- package/doc/skills/keve-bddcase-gen/references/test-cases-example.md +103 -0
- package/doc/skills/keve-component-gen/SKILL.md +255 -0
- package/doc/skills/keve-component-gen/references/component-mock-strategy.md +74 -0
- package/doc/skills/keve-component-gen/references/component-model-template.md +98 -0
- package/doc/skills/keve-component-gen/references/component-test-template.md +100 -0
- package/doc/skills/keve-component-gen/references/vue-test-utils-guide.md +91 -0
- package/doc/skills/keve-e2e-gen/SKILL.md +179 -0
- package/doc/skills/keve-e2e-gen/references/code-analysis-guide.md +208 -0
- package/doc/skills/keve-e2e-gen/references/decisions.md +36 -0
- package/doc/skills/keve-e2e-gen/references/pom-generation-guide.md +140 -0
- package/doc/skills/keve-e2e-gen/references/script-generation-guide.md +236 -0
- package/doc/skills/keve-e2e-gen/references/test-auditor-guide.md +189 -0
- package/doc/skills/keve-e2e-gen/scripts/extract-components.sh +85 -0
- package/doc/skills/keve-e2e-gen/scripts/inject-testids.sh +95 -0
- package/doc/skills/keve-static-analysis/SKILL.md +362 -0
- package/doc/skills/keve-static-analysis/references/codegraph-analysis-guide.md +108 -0
- package/doc/skills/keve-static-analysis/references/git-impact-analysis.md +81 -0
- package/doc/skills/keve-static-analysis/references/lint-fix-guide.md +69 -0
- package/doc/skills/keve-static-analysis/references/runtime-risk-patterns.md +92 -0
- package/doc/skills/keve-static-analysis/references/security-scan-guide.md +32 -0
- package/doc/skills/keve-static-analysis/references/ts-error-patterns.md +98 -0
- package/doc/skills/keve-static-analysis/references/vue-security-guide.md +72 -0
- package/doc/skills/keve-test-eval/SKILL.md +78 -0
- package/doc/skills/keve-test-eval/references/common-fix-guide.md +166 -0
- package/doc/skills/keve-test-eval/references/confidence-data-guide.md +78 -0
- package/doc/skills/keve-test-eval/references/fix-loop-guide.md +67 -0
- package/doc/skills/keve-unit-gen/SKILL.md +203 -0
- package/doc/skills/keve-unit-gen/references/boundary-conditions.md +78 -0
- package/doc/skills/keve-unit-gen/references/unit-mock-strategy.md +71 -0
- package/doc/skills/keve-unit-gen/references/unit-test-template.md +105 -0
- package/package.json +47 -25
- package/dist/agent/factory.d.ts +0 -25
- package/dist/agent/factory.js +0 -99
- package/dist/agent/index.d.ts +0 -3
- package/dist/agent/index.js +0 -7
- package/dist/agent/loader.d.ts +0 -22
- package/dist/agent/loader.js +0 -117
- package/dist/agent/types.d.ts +0 -9
- package/dist/agent/types.js +0 -2
- package/dist/agent-loop/complete-task.d.ts +0 -28
- package/dist/agent-loop/complete-task.js +0 -70
- package/dist/agent-loop/index.d.ts +0 -16
- package/dist/agent-loop/index.js +0 -26
- package/dist/agent-loop/loop.d.ts +0 -42
- package/dist/agent-loop/loop.js +0 -282
- package/dist/agent-loop/runtime.d.ts +0 -40
- package/dist/agent-loop/runtime.js +0 -163
- package/dist/agent-loop/types.d.ts +0 -161
- package/dist/agent-loop/types.js +0 -105
- package/dist/context/index.d.ts +0 -8
- package/dist/context/index.js +0 -29
- package/dist/context/tokenCalculation.d.ts +0 -55
- package/dist/context/tokenCalculation.js +0 -95
- package/dist/context/truncation.d.ts +0 -67
- package/dist/context/truncation.js +0 -142
- package/dist/context/types.d.ts +0 -7
- package/dist/context/types.js +0 -27
- package/dist/llm/OpenAIClient.d.ts +0 -31
- package/dist/llm/OpenAIClient.js +0 -455
- package/dist/llm/constants.d.ts +0 -2
- package/dist/llm/constants.js +0 -6
- package/dist/llm/errors.d.ts +0 -25
- package/dist/llm/errors.js +0 -51
- package/dist/llm/index.d.ts +0 -49
- package/dist/llm/index.js +0 -158
- package/dist/llm/types.d.ts +0 -124
- package/dist/llm/types.js +0 -2
- package/dist/llm/utils.d.ts +0 -29
- package/dist/llm/utils.js +0 -284
- package/dist/skill/frontmatter-parser.d.ts +0 -50
- package/dist/skill/frontmatter-parser.js +0 -152
- package/dist/skill/index.d.ts +0 -12
- package/dist/skill/index.js +0 -17
- package/dist/skill/loader.d.ts +0 -96
- package/dist/skill/loader.js +0 -256
- package/dist/tools/ask-user.d.ts +0 -8
- package/dist/tools/ask-user.js +0 -47
- package/dist/tools/bash.d.ts +0 -47
- package/dist/tools/bash.js +0 -213
- package/dist/tools/edit-file.d.ts +0 -9
- package/dist/tools/edit-file.js +0 -76
- package/dist/tools/glob.d.ts +0 -8
- package/dist/tools/glob.js +0 -101
- package/dist/tools/grep.d.ts +0 -10
- package/dist/tools/grep.js +0 -76
- package/dist/tools/index.d.ts +0 -24
- package/dist/tools/index.js +0 -47
- package/dist/tools/read-files.d.ts +0 -8
- package/dist/tools/read-files.js +0 -81
- package/dist/tools/write-file.d.ts +0 -8
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: keve-bddcase-gen
|
|
3
|
+
description: Generate structured BDD test cases from requirement documents and code changes. Produces test-cases.yaml with functional module grouping, case ID, description, steps (When), expected results (Then), and preconditions (Given).
|
|
4
|
+
allowed-tools: Bash(shell:*) Bash(git:*) Bash(npx:*) ask_user_questions
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
> 目录结构参见 keve_test_spec/keve.yaml 顶部注释(Single Source of Truth)
|
|
9
|
+
# 测试用例生成技能 (Test Case Generation Skill)
|
|
10
|
+
|
|
11
|
+
## 触发条件
|
|
12
|
+
|
|
13
|
+
本技能在以下场景触发(按优先级排列):
|
|
14
|
+
|
|
15
|
+
| 触发方式 | 场景 | 说明 |
|
|
16
|
+
|----------|------|------|
|
|
17
|
+
| `use_skill("keve-bddcase-gen")` | 需求开发阶段,规划完成后需要生成测试用例 | 在 workflow-req-plan 流程中,PRD 分析完成后加载 |
|
|
18
|
+
| `/keve-bddcase-gen` 指令 | 用户主动要求生成测试用例 | 兼容指令,类似 `/plan`、`/work` |
|
|
19
|
+
| MR Review | 分析 MR 变更影响,生成回归测试用例 | 用户说"分析这个 MR"或"看看这个 MR 有什么测试点" |
|
|
20
|
+
|
|
21
|
+
**与项目 AGENTS.md 的衔接**:
|
|
22
|
+
|
|
23
|
+
在需求开发路径中,本技能应在 **2.1 规划阶段** 中被 workflow-req-plan 加载,产出 `test-cases.md` 后再进入编码阶段。
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
Intent A: 需求开发
|
|
27
|
+
→ 2.0 阶段检测
|
|
28
|
+
→ 2.1 规划阶段 (workflow-req-plan)
|
|
29
|
+
→ use_skill("keve-bddcase-gen") → 产出 test-cases.yaml
|
|
30
|
+
→ 2.2 编码阶段 (workflow-req-work)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 定位
|
|
36
|
+
|
|
37
|
+
本技能从需求文档和代码变更中提取测试点,生成结构化的测试用例文档。
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
需求文档 + 代码变更 → [本技能] → test-cases.yaml
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 核心原则
|
|
46
|
+
|
|
47
|
+
**1. 需求与代码不一致时,以代码为准,并在结论中标注差异**。
|
|
48
|
+
**2. 每一步骤必须有对应的预期结果**
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## 输入
|
|
53
|
+
|
|
54
|
+
| 输入类型 | 来源 | 说明 |
|
|
55
|
+
|----------|------|------|
|
|
56
|
+
| 需求文档 | PRD 链接 / Docs 文档 / Figma 链接 | 业务需求、功能描述、交互设计 |
|
|
57
|
+
| 代码变更 | MR diff / git diff / 提交历史 | 变更涉及的文件和功能模块 |
|
|
58
|
+
| 现有代码 | 仓库源代码 | 理解变更前后的组件结构 |
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## 输出
|
|
63
|
+
|
|
64
|
+
生成 `test-cases.md`,格式遵循以下规范:
|
|
65
|
+
|
|
66
|
+
### 输出格式规范
|
|
67
|
+
|
|
68
|
+
**只输出 YAML 格式**,不再输出 Markdown 格式。
|
|
69
|
+
> `test-cases.yaml` 的字段设计(module/case_id/steps/expected)遵循 Playwright 规范,可直接映射为 describe 块、test title 和断言。
|
|
70
|
+
|
|
71
|
+
详见 [references/test-case-rules.md](references/test-case-rules.md)
|
|
72
|
+
|
|
73
|
+
### 输出路径规范
|
|
74
|
+
|
|
75
|
+
本技能产出的测试用例统一存放于 `.keve/mr-${当前分支名或者MR_id}-temp` 目录下:
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
.keve/mr-XXX-temp
|
|
79
|
+
├── test-cases.yaml # 当前需求测试用例文档(测试计划)
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## 生成流程
|
|
85
|
+
|
|
86
|
+
### Step 1: 需求理解
|
|
87
|
+
|
|
88
|
+
读取需求文档(PRD / Docs / Figma),提取:
|
|
89
|
+
- 新增/修改的功能点列表
|
|
90
|
+
- 交互设计变更点
|
|
91
|
+
- 业务规则变更点
|
|
92
|
+
- 权限/状态变更点
|
|
93
|
+
|
|
94
|
+
### Step 2: 代码变更分析
|
|
95
|
+
|
|
96
|
+
**优先使用 GitNexus(如果项目已索引)**,获取更深层的影响分析;若无 GitNexus 则回退到 git diff。
|
|
97
|
+
|
|
98
|
+
#### GitNexus 模式(推荐)
|
|
99
|
+
|
|
100
|
+
使用 GitNexus MCP 工具获取变更影响:
|
|
101
|
+
|
|
102
|
+
| 工具 | 用途 | 产出 |
|
|
103
|
+
|------|------|------|
|
|
104
|
+
| `detect_changes()` | 分析 MR/分支的所有未提交变更 | 受影响的符号列表 + 受影响的执行流程 + 风险等级 |
|
|
105
|
+
| `impact({target, direction:"upstream"})` | 分析变更符号的爆炸半径 | 直接调用者 + 间接影响者 + 受影响模块 |
|
|
106
|
+
| `query({query})` | 查找相关执行流程 | 按相关性排序的流程 + 涉及的符号和文件 |
|
|
107
|
+
| `context({name})` | 查看符号的完整上下文 | 所有调用者/被调用者/参与的流程 |
|
|
108
|
+
|
|
109
|
+
**分析流程**:
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
1. detect_changes() → 获取 MR 变更涉及的符号和执行流程
|
|
113
|
+
2. 对每个变更符号 → impact(target, "upstream") → 获取受影响的调用链
|
|
114
|
+
3. 对每个受影响的执行流程 → query() → 理解完整业务流程
|
|
115
|
+
4. 输出: 变更功能点列表 + 受影响的执行流程 + 风险评估
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**示例输出**:
|
|
119
|
+
|
|
120
|
+
```json
|
|
121
|
+
{
|
|
122
|
+
"changedSymbols": ["AgentList.vue", "SkillItem.vue", "ToolManagement.vue"],
|
|
123
|
+
"affectedProcesses": ["AgentListFilter", "SkillEditFlow", "ToolAuthFlow"],
|
|
124
|
+
"riskLevel": "MEDIUM",
|
|
125
|
+
"blastRadius": {
|
|
126
|
+
"AgentList.vue": { "directCallers": 3, "affectedModules": ["智能应用管理"] },
|
|
127
|
+
"SkillItem.vue": { "directCallers": 5, "affectedModules": ["技能市场", "技能详情"] }
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
#### Git Diff 模式(回退)
|
|
133
|
+
|
|
134
|
+
如果项目未索引 GitNexus,回退到传统方式:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
git diff origin/main...HEAD --stat # 变更文件列表
|
|
138
|
+
git diff origin/main...HEAD --name-only # 文件名列表
|
|
139
|
+
git diff origin/main...HEAD src/pages/ # 具体变更内容
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
输出:变更涉及的文件列表 + 每个文件的核心变更内容 + 变更前后的行为差异
|
|
143
|
+
|
|
144
|
+
### Step 3: 按功能模块分组
|
|
145
|
+
|
|
146
|
+
将变更点按**功能模块**分组,每个模块对应一个涉及文件集合:
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
功能模块 = 变更涉及的一个或多个组件文件 + 关联的业务功能点
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
分组原则:
|
|
153
|
+
- 一个功能模块对应一组相关的组件文件
|
|
154
|
+
- 同一页面的不同功能区域(如筛选、列表、弹窗)应分开
|
|
155
|
+
- 跨页面的功能(如导航、布局)独立成模块
|
|
156
|
+
|
|
157
|
+
### Step 4: 为每个模块生成测试用例
|
|
158
|
+
|
|
159
|
+
对每个功能模块,从以下维度生成用例:
|
|
160
|
+
|
|
161
|
+
| 维度 | 用例类型 | 说明 |
|
|
162
|
+
|------|----------|------|
|
|
163
|
+
| 正向验证 | 功能点正常行为 | 验证新功能/修改功能是否按预期工作 |
|
|
164
|
+
| 边界验证 | 极端情况 | 空/满/超长/零值 |
|
|
165
|
+
| 权限验证 | 不同角色/状态 | 管理员 vs 普通用户、创建者 vs 协作者 |
|
|
166
|
+
| 禁用验证 | 功能下线 | 禁用按钮、禁用选项、下线提示 |
|
|
167
|
+
| 回归验证 | 跨页面完整流程 | 创建 → 编辑 → 删除完整流程 |
|
|
168
|
+
|
|
169
|
+
### Step 5: 不确定时向用户确认
|
|
170
|
+
|
|
171
|
+
在生成用例过程中,如果遇到以下不确定情况,**必须暂停并向用户确认**:
|
|
172
|
+
|
|
173
|
+
| 不确定情况 | 确认问题示例 | 处理方式 |
|
|
174
|
+
|------------|--------------|----------|
|
|
175
|
+
| **数值不一致** | "欢迎语最大字符限制是多少?PRD描述为200,代码中MAX_LENGTH=300,以哪个为准?" | 提供选项让用户选择 |
|
|
176
|
+
| **数据存在性** | "测试环境中是否存在天策门户类型的智能应用?" | 是/否,是则继续问具体ID |
|
|
177
|
+
| **具体数值** | "天策门户Agent的ID是多少?" | 等待用户输入具体值 |
|
|
178
|
+
| **环境配置** | "测试需要特定的环境配置(如登录态、权限),请确认测试环境是否已配置" | 确认环境就绪后再生成用例 |
|
|
179
|
+
| **需求理解歧义** | "PRD中描述的功能A有两种理解方式:1) xxx 2) yyy,请确认哪种是正确的" | 确认后再继续生成 |
|
|
180
|
+
| **测试范围边界** | "这个功能是否包含子功能B?请确认测试范围" | 明确范围后再生成 |
|
|
181
|
+
|
|
182
|
+
**确认流程**:
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
1. 识别信息缺口 → 2. 将大问题拆分为小问题 → 3. 逐个向用户提问 → 4. 等待用户回复 → 5. 根据回复继续/调整
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
**信息缺口识别机制(推荐模式)**:
|
|
189
|
+
|
|
190
|
+
将确认拆分为多个独立小问题,每个问题聚焦一个具体信息缺口:
|
|
191
|
+
|
|
192
|
+
```
|
|
193
|
+
问题1: 欢迎语最大字符限制是多少?
|
|
194
|
+
├─ 选项A: 300字符(代码中 MAX_LENGTH=300)← 推荐
|
|
195
|
+
├─ 选项B: 200字符(PRD描述为200)
|
|
196
|
+
└─ 选项C: 其他(请确认具体数值)
|
|
197
|
+
|
|
198
|
+
问题2: 测试环境中是否存在天策门户类型的智能应用?
|
|
199
|
+
├─ 是(继续问问题3)
|
|
200
|
+
└─ 否 → 跳过相关用例
|
|
201
|
+
|
|
202
|
+
问题3: 天策门户Agent的ID是多少?
|
|
203
|
+
└─ 输入: _______
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
**设计原则**:
|
|
207
|
+
- 每个问题只问一个具体信息缺口
|
|
208
|
+
- 问题之间有依赖关系("是否存在"决定是否需要问"具体ID")
|
|
209
|
+
- 提供明确的选项,避免开放式问题
|
|
210
|
+
- 推荐选项应标注理由(如"代码中实际限制为300")
|
|
211
|
+
- 提供"无需补充,继续"或"跳过"选项
|
|
212
|
+
|
|
213
|
+
**使用 `ask_user_questions` 工具提问**:
|
|
214
|
+
|
|
215
|
+
当需要用户确认时,使用结构化的问题格式:
|
|
216
|
+
|
|
217
|
+
```json
|
|
218
|
+
{
|
|
219
|
+
"questions": [
|
|
220
|
+
{
|
|
221
|
+
"question": "欢迎语最大字符限制是多少?",
|
|
222
|
+
"options": [
|
|
223
|
+
{
|
|
224
|
+
"label": "300字符",
|
|
225
|
+
"description": "代码中 MAX_LENGTH=300,以代码为准",
|
|
226
|
+
"isRecommended": true
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
"label": "200字符",
|
|
230
|
+
"description": "PRD描述为200",
|
|
231
|
+
"isRecommended": false
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
"label": "其他",
|
|
235
|
+
"description": "请确认具体数值",
|
|
236
|
+
"isRecommended": false
|
|
237
|
+
}
|
|
238
|
+
]
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
"question": "测试环境中是否存在天策门户类型的智能应用?",
|
|
242
|
+
"options": [
|
|
243
|
+
{
|
|
244
|
+
"label": "是",
|
|
245
|
+
"description": "环境中存在TC类型Agent,可以继续测试",
|
|
246
|
+
"isRecommended": false
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
"label": "否",
|
|
250
|
+
"description": "环境中没有TC类型Agent,跳过相关用例",
|
|
251
|
+
"isRecommended": true
|
|
252
|
+
}
|
|
253
|
+
]
|
|
254
|
+
}
|
|
255
|
+
]
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
**提问原则**:
|
|
260
|
+
- 每个问题必须有明确的选项
|
|
261
|
+
- 必须提供推荐选项及理由
|
|
262
|
+
- 避免开放式问题(如"怎么办?")
|
|
263
|
+
- 问题要具体,包含必要的背景信息
|
|
264
|
+
- 大问题拆分为小问题,逐个确认
|
|
265
|
+
|
|
266
|
+
**信息缺口记录**:
|
|
267
|
+
|
|
268
|
+
所有识别到的信息缺口和用户回答,记录在 `.keve/info-gaps.md` 中:
|
|
269
|
+
|
|
270
|
+
```markdown
|
|
271
|
+
## 信息缺口记录
|
|
272
|
+
|
|
273
|
+
| 缺口ID | 问题 | 用户回答 | 影响用例 | 状态 |
|
|
274
|
+
|--------|------|----------|----------|------|
|
|
275
|
+
| IG-001 | 欢迎语最大字符限制 | 300(以代码为准) | WW-001, WW-002 | resolved |
|
|
276
|
+
| IG-002 | TC类型Agent是否存在 | 是,ID=636 | AG-004 | resolved |
|
|
277
|
+
| IG-003 | DATASET类型Agent是否存在 | 否 | AG-005 | skipped |
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### Step 6: 生成回归测试
|
|
281
|
+
|
|
282
|
+
对整体变更,生成 2-3 条回归测试:
|
|
283
|
+
- 完整创建流程(从进入页面到创建成功)
|
|
284
|
+
- 核心交互流程(从列表到详情到编辑)
|
|
285
|
+
- 删除/移除残留检查(检查旧代码引用是否已清理)
|
|
286
|
+
|
|
287
|
+
### Step 7: 输出 test-cases.yaml
|
|
288
|
+
|
|
289
|
+
按照格式规范输出完整的测试用例文档。详见 [references/test-case-example.md](references/test-case-example.md)
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
## 质量校验(自检清单)
|
|
294
|
+
|
|
295
|
+
生成完成后,对照以下清单自检:
|
|
296
|
+
|
|
297
|
+
详见 [references/test-case-rules.md](references/test-case-rules.md)
|
|
298
|
+
|
|
299
|
+
| 检查项 | 通过条件 |
|
|
300
|
+
|--------|----------|
|
|
301
|
+
| 步骤-预期一一对应 | 每个操作步骤都有对应的预期结果,不存在"无预期的步骤" |
|
|
302
|
+
| 用例ID覆盖度 | 每个变更的功能点都有对应的用例ID |
|
|
303
|
+
| 预期结果可验证性 | 每个预期结果都能映射为具体的 Playwright 断言 |
|
|
304
|
+
| 模块分组完整性 | 每个变更涉及的文件都被某个模块覆盖 |
|
|
305
|
+
| 操作步骤具体性 | 步骤描述足够具体,可以直接转化为 POM 方法调用 |
|
|
306
|
+
| 回归测试覆盖 | 至少有 1 条跨页面完整流程的回归测试 |
|
|
307
|
+
| 用例ID唯一性 | 同一模块内用例ID不重复 |
|
|
308
|
+
| 无降级预期 | 关键业务步骤的预期不是"页面可见"这种浅层断言 |
|
|
309
|
+
|
|
310
|
+
## 错误处理
|
|
311
|
+
|
|
312
|
+
| 错误场景 | 处理方式 |
|
|
313
|
+
|----------|----------|
|
|
314
|
+
| 需求文档无法访问 | 记录错误,尝试从代码变更反推需求 |
|
|
315
|
+
| 代码变更分析失败 | 回退到手动分析,标记风险 |
|
|
316
|
+
| 用例生成中断 | 保存已生成部分,从中断点继续 |
|
|
317
|
+
| 用户确认超时 | 使用默认选项继续,标记不确定性 |
|
|
318
|
+
|
|
319
|
+
## 版本控制
|
|
320
|
+
|
|
321
|
+
| 版本 | 说明 |
|
|
322
|
+
|------|------|
|
|
323
|
+
| `test-cases.yaml` | 当前版本(每次生成覆盖) |
|
|
324
|
+
| `test-cases-v{N}.yaml` | 历史版本(保留最近5个版本) |
|
|
325
|
+
| `test-cases.yaml.bak` | 备份版本(生成前自动备份) |
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
## References
|
|
330
|
+
|
|
331
|
+
- [test-cases-example.md](references/test-cases-example.md) — 完整的测试用例文档示例(MR !868)
|
|
332
|
+
- [test-case-rules.md](references/test-case-rules.md) — 用例生成与校验规则(ID命名、预期编写、输出格式、自检清单、核心原则)
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# 用例生成与校验规则
|
|
2
|
+
|
|
3
|
+
## 一、用例ID命名规范
|
|
4
|
+
|
|
5
|
+
**格式**:`[模块前缀]-[序号]`,如 `AG-01`、`SK-03`、`REG-02`
|
|
6
|
+
|
|
7
|
+
**核心规则**:用例ID 在项目内唯一,同一模块内序号递增。
|
|
8
|
+
|
|
9
|
+
**模块前缀生成规则**:
|
|
10
|
+
|
|
11
|
+
| 规则 | 说明 | 示例 |
|
|
12
|
+
|------|------|------|
|
|
13
|
+
| 从模块名提取 | 取模块核心词的前2~3个大写字母 | 智能应用 → AG, 技能 → SK |
|
|
14
|
+
| 避免冲突 | 同一项目内前缀不重复 | 如果"应用管理"和"应用详情"都想用 AG → 一个用 AG,另一个用 AD |
|
|
15
|
+
| 通用前缀 | 回归测试统一用 REG | REG-01, REG-02 |
|
|
16
|
+
| 最大长度 | 前缀不超过3个字符 | ✅ TM, ❌ TOOLMGMT |
|
|
17
|
+
|
|
18
|
+
**常见参考(非强制,按项目实际情况调整)**:
|
|
19
|
+
|
|
20
|
+
| 场景类型 | 常见前缀 | 说明 |
|
|
21
|
+
|----------|----------|------|
|
|
22
|
+
| 应用/智能体 | AG | Agent |
|
|
23
|
+
| 技能/技能卡片 | SK | Skill |
|
|
24
|
+
| 知识库 | KB | Knowledge Base |
|
|
25
|
+
| 工具管理 | TM | Tool Management |
|
|
26
|
+
| 交互/流程 | PI | Process Interaction |
|
|
27
|
+
| 布局/导航 | LY | Layout |
|
|
28
|
+
| 欢迎语/文案 | WW | Welcome Word |
|
|
29
|
+
| 回归测试 | REG | Regression(通用) |
|
|
30
|
+
|
|
31
|
+
**生成流程**:
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
1. 分析 MR/需求 → 列出涉及的功能模块
|
|
35
|
+
2. 为每个模块分配2~3字母前缀(避免冲突)
|
|
36
|
+
3. 模块内用例按序号递增(XX-01, XX-02, XX-03...)
|
|
37
|
+
4. 回归测试统一使用 REG 前缀
|
|
38
|
+
5. 最终验证:所有用例ID 在项目内唯一
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## 二、预期结果编写规范
|
|
42
|
+
|
|
43
|
+
预期结果必须是**可验证的断言**,而非模糊描述。且**每个操作步骤必须有自己的预期结果**:
|
|
44
|
+
|
|
45
|
+
| 写法 | 评价 | 修正 |
|
|
46
|
+
|------|------|------|
|
|
47
|
+
| "筛选功能正常" | ❌ 不可验证 | → "筛选区域仅包含全部/我创建的/可编辑的三个选项" |
|
|
48
|
+
| "页面显示正确" | ❌ 太模糊 | → "天策门户按钮显示 disabled 状态,hover 提示文案为xxx" |
|
|
49
|
+
| "字数统计正确" | ❌ 不具体 | → "输入300字符后字数统计显示 300/300" |
|
|
50
|
+
| "弹窗验证生效" | ❌ 不可验证 | → "不填英文名称点击确认,提示'请输入技能英文名称'" |
|
|
51
|
+
| "进入页面" → "功能正常" | ❌ 步骤-预期不匹配 | → 步骤"进入页面" → 预期"页面加载完成,筛选区域可见";步骤"观察筛选选项" → 预期"只显示3个选项" |
|
|
52
|
+
|
|
53
|
+
**核心原则**:预期结果要能直接映射为 Playwright 断言(`expect(xxx).toEqual(...)`, `expect(xxx).toBeDisabled()` 等),且每个步骤都有断言目标。
|
|
54
|
+
|
|
55
|
+
## 三、输出格式规范
|
|
56
|
+
|
|
57
|
+
**只输出 YAML 格式**,不再输出 Markdown 格式。
|
|
58
|
+
|
|
59
|
+
**核心规则:每一步骤必须有对应的预期结果**
|
|
60
|
+
|
|
61
|
+
| 规则 | 说明 | 反例 |
|
|
62
|
+
|------|------|------|
|
|
63
|
+
| 步骤-预期一一对应 | 每个操作步骤后面紧跟该步骤的预期结果 | ❌ "进入页面,点击按钮" → "筛选正常"(两个步骤只有一个预期) |
|
|
64
|
+
| 预期可验证 | 每个预期结果都能映射为具体的 Playwright 断言 | ❌ "功能正常" → ✅ "按钮选中态" |
|
|
65
|
+
| 不跳过关键验证 | 关键业务逻辑步骤必须有预期,不能只验证"页面可见" | ❌ 步骤"观察筛选选项" → 预期"页面可见" → ✅ 预期"只显示3个选项" |
|
|
66
|
+
|
|
67
|
+
## 四、质量校验(自检清单)
|
|
68
|
+
|
|
69
|
+
生成完成后,对照以下清单自检:
|
|
70
|
+
|
|
71
|
+
| 检查项 | 通过条件 |
|
|
72
|
+
|--------|----------|
|
|
73
|
+
| 步骤-预期一一对应 | 每个操作步骤都有对应的预期结果,不存在"无预期的步骤" |
|
|
74
|
+
| 用例ID覆盖度 | 每个变更的功能点都有对应的用例ID |
|
|
75
|
+
| 预期结果可验证性 | 每个预期结果都能映射为具体的 Playwright 断言 |
|
|
76
|
+
| 模块分组完整性 | 每个变更涉及的文件都被某个模块覆盖 |
|
|
77
|
+
| 操作步骤具体性 | 步骤描述足够具体,可以直接转化为 POM 方法调用 |
|
|
78
|
+
| 回归测试覆盖 | 至少有 1 条跨页面完整流程的回归测试 |
|
|
79
|
+
| 用例ID唯一性 | 同一模块内用例ID不重复 |
|
|
80
|
+
| 无降级预期 | 关键业务步骤的预期不是"页面可见"这种浅层断言 |
|
|
81
|
+
|
|
82
|
+
## 五、核心原则
|
|
83
|
+
|
|
84
|
+
**需求与代码不一致时,以代码为准,并在结论中标注差异**。
|
|
85
|
+
|
|
86
|
+
| 情况 | 处理方式 | 标注格式 |
|
|
87
|
+
|------|----------|----------|
|
|
88
|
+
| 需求文档描述了功能A,代码实现了功能A' | 测试用例以代码实现A'为准 | ⚠️ **需求偏差**: PRD描述为"A",实际代码实现为"A'",以代码为准 |
|
|
89
|
+
| 需求文档有功能B,代码中没有 | 不生成该功能的测试用例 | ⚠️ **需求未实现**: PRD描述的功能B在代码中未找到实现 |
|
|
90
|
+
| 代码有功能C,需求文档没提到 | 生成该功能的测试用例 | ⚠️ **代码额外实现**: 代码中存在功能C,PRD未提及 |
|
|
91
|
+
| 需求文档的文案与代码中的文案不同 | 测试用例使用代码中的实际文案 | ⚠️ **文案偏差**: PRD文案为"X",代码实际文案为"Y" |
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# MR !868 测试用例示例(YAML格式)
|
|
2
|
+
|
|
3
|
+
## 完整示例
|
|
4
|
+
|
|
5
|
+
```yaml
|
|
6
|
+
version: "1.0"
|
|
7
|
+
mr_id: "!868"
|
|
8
|
+
title: "SDD 测试case1-应用后台_测试计划"
|
|
9
|
+
description: "智能应用管理页去掉门户&数据集筛选、数据知识库管理页禁用门户&数据集、欢迎语字符限制从80改为200"
|
|
10
|
+
docs_url: "https://xxx/d/home/fcAB5rrt6h8XwxRiB30uc6tnS"
|
|
11
|
+
generated_at: "2026-05-30"
|
|
12
|
+
principle: "打开 https://localhost:3000"
|
|
13
|
+
|
|
14
|
+
modules:
|
|
15
|
+
- name: "WM"
|
|
16
|
+
description: "欢迎语字符限制"
|
|
17
|
+
priority: "P0"
|
|
18
|
+
files:
|
|
19
|
+
- "src/pages/agent/AgentEdit.vue"
|
|
20
|
+
- "src/components/WelcomeMessageInput.vue"
|
|
21
|
+
cases:
|
|
22
|
+
- id: "WM-01"
|
|
23
|
+
title: "欢迎语输入框字符限制为 300"
|
|
24
|
+
priority: "P0"
|
|
25
|
+
type: "ui"
|
|
26
|
+
precondition:
|
|
27
|
+
- "进入智能应用编辑页"
|
|
28
|
+
steps:
|
|
29
|
+
- step: "定位到欢迎语输入框"
|
|
30
|
+
expected: "输入框可见,placeholder 显示默认文案"
|
|
31
|
+
- step: "查看字数统计"
|
|
32
|
+
expected: "初始显示 0/300"
|
|
33
|
+
- step: "输入 300 个普通字符"
|
|
34
|
+
expected: "输入成功,字数统计显示 300/300"
|
|
35
|
+
- step: "继续输入第 301 个字符"
|
|
36
|
+
expected: "无法输入,字数统计保持 300/300"
|
|
37
|
+
|
|
38
|
+
- id: "WM-02"
|
|
39
|
+
title: "欢迎语 Emoji 等特殊字符按 Grapheme Cluster 计数"
|
|
40
|
+
priority: "P0"
|
|
41
|
+
type: "ui"
|
|
42
|
+
precondition:
|
|
43
|
+
- "进入智能应用编辑页"
|
|
44
|
+
steps:
|
|
45
|
+
- step: "输入包含 Emoji 的文本(如 5 个 Emoji + 295 个普通字符)"
|
|
46
|
+
expected: "字数统计显示 '300/300',每个 Emoji 计为 1 个字符"
|
|
47
|
+
- step: "输入包含组合字符的文本(如带变音符号的字母)"
|
|
48
|
+
expected: "组合字符按 Grapheme Cluster 计数,不超出 300 限制"
|
|
49
|
+
|
|
50
|
+
- id: "WM-03"
|
|
51
|
+
title: "欢迎语保存和回显正常"
|
|
52
|
+
priority: "P0"
|
|
53
|
+
type: "ui"
|
|
54
|
+
precondition:
|
|
55
|
+
- "进入智能应用编辑页"
|
|
56
|
+
steps:
|
|
57
|
+
- step: "输入 300 字符的欢迎语"
|
|
58
|
+
expected: "输入正常,字数统计正确"
|
|
59
|
+
- step: "触发保存(如 blur 或点击保存)"
|
|
60
|
+
expected: "保存成功,页面刷新后欢迎语正确回显"
|
|
61
|
+
- step: "清空欢迎语"
|
|
62
|
+
expected: "字数统计显示 '0/300'"
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## 格式说明
|
|
66
|
+
|
|
67
|
+
### 头部字段
|
|
68
|
+
|
|
69
|
+
| 字段 | 必填 | 说明 |
|
|
70
|
+
|------|------|------|
|
|
71
|
+
| `version` | ✅ | YAML 格式版本 |
|
|
72
|
+
| `mr_id` | ✅ | MR 编号 |
|
|
73
|
+
| `description` | ✅ | 需求标题(从PRD提取) |
|
|
74
|
+
| `docs_url` | ✅ | 需求文档链接 |
|
|
75
|
+
| `generated_at` | ✅ | 生成时间 |
|
|
76
|
+
| `principle` | ✅ | 测试原则 |
|
|
77
|
+
|
|
78
|
+
### 模块字段
|
|
79
|
+
|
|
80
|
+
| 字段 | 必填 | 说明 |
|
|
81
|
+
|------|------|------|
|
|
82
|
+
| `name` | ✅ | 模块前缀(2-3个大写字母) |
|
|
83
|
+
| `description` | ✅ | 功能模块描述 |
|
|
84
|
+
| `priority` | ✅ | 优先级(P0/P1/P2) |
|
|
85
|
+
| `files` | ✅ | 涉及文件列表 |
|
|
86
|
+
| `cases` | ✅ | 测试用例列表 |
|
|
87
|
+
|
|
88
|
+
### 用例字段
|
|
89
|
+
|
|
90
|
+
| 字段 | 必填 | 说明 |
|
|
91
|
+
|------|------|------|
|
|
92
|
+
| `id` | ✅ | 用例ID(模块前缀-序号) |
|
|
93
|
+
| `title` | ✅ | 用例标题 |
|
|
94
|
+
| `priority` | ✅ | 优先级 |
|
|
95
|
+
| `type` | ✅ | 类型(ui/component/regression) |
|
|
96
|
+
| `precondition` | ❌ | 前置条件列表 |
|
|
97
|
+
| `steps` | ✅ | 步骤列表(每个步骤包含 step 和 expected) |
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
**description 规范**:
|
|
101
|
+
- 必须从 PRD/需求文档中提取**需求标题**
|
|
102
|
+
- 禁止写"MR !XXX 测试用例"这类描述
|
|
103
|
+
- 示例:"智能应用管理页去掉门户&数据集筛选、数据知识库管理页禁用门户&数据集、欢迎语字符限制从80改为200"
|