issuekit 0.1.0__py3-none-any.whl
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.
- issuekit/__init__.py +3 -0
- issuekit/agent_commands.py +80 -0
- issuekit/agents/__init__.py +5 -0
- issuekit/agents/registry.py +68 -0
- issuekit/bundled_commands/issuekit.change.md +52 -0
- issuekit/bundled_commands/issuekit.coding.md +131 -0
- issuekit/bundled_commands/issuekit.design.md +116 -0
- issuekit/bundled_commands/issuekit.knowledge.md +117 -0
- issuekit/bundled_commands/issuekit.release.md +90 -0
- issuekit/bundled_commands/issuekit.require.md +127 -0
- issuekit/bundled_commands/issuekit.review.md +82 -0
- issuekit/bundled_commands/issuekit.test.md +75 -0
- issuekit/bundled_templates/code-review.md +105 -0
- issuekit/bundled_templates/release-note.md +90 -0
- issuekit/bundled_templates/requirement.md +107 -0
- issuekit/bundled_templates/technical-design.md +279 -0
- issuekit/bundled_templates/test-plan.md +250 -0
- issuekit/cli.py +97 -0
- issuekit/commands/__init__.py +0 -0
- issuekit/commands/init.py +185 -0
- issuekit/knowledge/__init__.py +32 -0
- issuekit/templates.py +17 -0
- issuekit-0.1.0.dist-info/METADATA +177 -0
- issuekit-0.1.0.dist-info/RECORD +27 -0
- issuekit-0.1.0.dist-info/WHEEL +4 -0
- issuekit-0.1.0.dist-info/entry_points.txt +2 -0
- issuekit-0.1.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
# {Issue ID} - 技术方案
|
|
2
|
+
|
|
3
|
+
> **状态**: 草稿 / 评审中 / 已确认
|
|
4
|
+
> **作者**: {姓名}
|
|
5
|
+
> **日期**: {YYYY-MM-DD}
|
|
6
|
+
> **关联需求**: [需求文档](./requirement.md)
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 1. 概述
|
|
11
|
+
|
|
12
|
+
{一段话描述技术方案要解决的问题、整体思路和关键技术选型}
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 2. 现状分析
|
|
17
|
+
|
|
18
|
+
### 2.1 现有架构
|
|
19
|
+
|
|
20
|
+
{描述相关模块的当前实现,配 Mermaid 图}
|
|
21
|
+
|
|
22
|
+
### 2.2 现有问题
|
|
23
|
+
|
|
24
|
+
{如果是优化/修复,描述现有问题。纯新功能可写"不适用"。}
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 3. 技术调研
|
|
29
|
+
|
|
30
|
+
{如果方案涉及技术未知项或需要决策的选型,在此记录调研结论。如果方案清晰无未知项,注明"本次方案无技术未知项,跳过调研"。}
|
|
31
|
+
|
|
32
|
+
### 3.1 {调研主题1}
|
|
33
|
+
|
|
34
|
+
**背景**: {为什么需要调研}
|
|
35
|
+
|
|
36
|
+
**结论**: {选择了什么}
|
|
37
|
+
|
|
38
|
+
**理由**: {为什么选这个}
|
|
39
|
+
|
|
40
|
+
**替代方案**:
|
|
41
|
+
|
|
42
|
+
| 方案 | 优点 | 缺点 | 不选择的原因 |
|
|
43
|
+
|------|------|------|------------|
|
|
44
|
+
| {方案A} | {优点} | {缺点} | {原因} |
|
|
45
|
+
| {方案B} | {优点} | {缺点} | {原因} |
|
|
46
|
+
|
|
47
|
+
### 3.2 {调研主题2}
|
|
48
|
+
|
|
49
|
+
{同上格式...}
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 4. 方案设计
|
|
54
|
+
|
|
55
|
+
### 4.1 整体架构
|
|
56
|
+
|
|
57
|
+
{整体技术方案描述,配 Mermaid 架构图}
|
|
58
|
+
|
|
59
|
+
### 4.2 核心流程
|
|
60
|
+
|
|
61
|
+
{用 Mermaid sequenceDiagram 展示关键处理路径的完整调用链}
|
|
62
|
+
|
|
63
|
+
```mermaid
|
|
64
|
+
sequenceDiagram
|
|
65
|
+
participant C as Client
|
|
66
|
+
participant Ctrl as Controller
|
|
67
|
+
participant Mgr as Manager
|
|
68
|
+
participant Svc as Service
|
|
69
|
+
participant DB as Database
|
|
70
|
+
|
|
71
|
+
C->>Ctrl: 请求
|
|
72
|
+
Ctrl->>Mgr: 调用业务
|
|
73
|
+
Mgr->>Svc: 查询数据
|
|
74
|
+
Svc->>DB: SQL
|
|
75
|
+
DB-->>Svc: 结果
|
|
76
|
+
Svc-->>Mgr: 数据
|
|
77
|
+
Mgr-->>Ctrl: 业务结果
|
|
78
|
+
Ctrl-->>C: 响应
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### 4.3 组件设计
|
|
82
|
+
|
|
83
|
+
#### 4.3.1 {组件名称1}
|
|
84
|
+
|
|
85
|
+
**职责**: {一句话描述}
|
|
86
|
+
|
|
87
|
+
**关键逻辑**:
|
|
88
|
+
{详细描述处理流程、校验规则、状态变更等核心逻辑}
|
|
89
|
+
|
|
90
|
+
**注意事项**:
|
|
91
|
+
- {特殊点,如安全配置、拦截器排除、线程安全等}
|
|
92
|
+
|
|
93
|
+
#### 4.3.2 {组件名称2}
|
|
94
|
+
|
|
95
|
+
{同上格式...}
|
|
96
|
+
|
|
97
|
+
### 4.4 接口设计
|
|
98
|
+
|
|
99
|
+
#### `{METHOD} {PATH}` — {接口说明}
|
|
100
|
+
|
|
101
|
+
**请求**:
|
|
102
|
+
|
|
103
|
+
| 项目 | 说明 |
|
|
104
|
+
|------|------|
|
|
105
|
+
| Content-Type | application/json |
|
|
106
|
+
| 认证 | 需要 / 不需要 |
|
|
107
|
+
|
|
108
|
+
**Headers**(如有特殊 Header):
|
|
109
|
+
|
|
110
|
+
| Header | 说明 |
|
|
111
|
+
|--------|------|
|
|
112
|
+
| {header-name} | {说明} |
|
|
113
|
+
|
|
114
|
+
**请求体**:
|
|
115
|
+
|
|
116
|
+
```json
|
|
117
|
+
{
|
|
118
|
+
"field1": "value1",
|
|
119
|
+
"field2": 123
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**响应**:
|
|
124
|
+
|
|
125
|
+
```json
|
|
126
|
+
{
|
|
127
|
+
"code": 0,
|
|
128
|
+
"msg": "success",
|
|
129
|
+
"data": {
|
|
130
|
+
"field1": "value1"
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
**响应参数**:
|
|
136
|
+
|
|
137
|
+
| 字段 | 类型 | 说明 |
|
|
138
|
+
|--------|--------|------------|
|
|
139
|
+
| field1 | string | 示例字段(枚举) |
|
|
140
|
+
|
|
141
|
+
**错误处理**:
|
|
142
|
+
|
|
143
|
+
| 场景 | 处理方式 | 响应码 | 日志级别 |
|
|
144
|
+
|------|---------|--------|---------|
|
|
145
|
+
| {场景1} | {处理} | {code} | INFO/WARN/ERROR |
|
|
146
|
+
| {场景2} | {处理} | {code} | INFO/WARN/ERROR |
|
|
147
|
+
|
|
148
|
+
**处理流程**:
|
|
149
|
+
|
|
150
|
+
```mermaid
|
|
151
|
+
flowchart TD
|
|
152
|
+
A[收到请求] --> B{校验参数}
|
|
153
|
+
B -->|通过| C[业务处理]
|
|
154
|
+
B -->|失败| D[返回错误]
|
|
155
|
+
C --> E[返回成功]
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
#### `{METHOD} {PATH2}` — {接口说明2}
|
|
159
|
+
|
|
160
|
+
{同上格式...}
|
|
161
|
+
|
|
162
|
+
### 4.5 数据模型
|
|
163
|
+
|
|
164
|
+
#### 新增表: {table_name}
|
|
165
|
+
|
|
166
|
+
| 列名 | 类型 | 可空 | 默认值 | 说明 |
|
|
167
|
+
|------|------|------|--------|------|
|
|
168
|
+
| id | bigint | NO | auto_increment | 主键 |
|
|
169
|
+
| {字段} | {类型} | {YES/NO} | {默认值} | {说明} |
|
|
170
|
+
|
|
171
|
+
**索引**:
|
|
172
|
+
|
|
173
|
+
| 索引名 | 列 | 类型 | 说明 |
|
|
174
|
+
|--------|-----|------|------|
|
|
175
|
+
| {idx_name} | {columns} | UNIQUE/NORMAL | {说明} |
|
|
176
|
+
|
|
177
|
+
#### 修改表: {table_name}
|
|
178
|
+
|
|
179
|
+
```sql
|
|
180
|
+
ALTER TABLE {table_name} ADD COLUMN {column} {type} {constraints} COMMENT '{说明}';
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
#### 数据初始化
|
|
184
|
+
|
|
185
|
+
```sql
|
|
186
|
+
INSERT INTO {table_name} (...) VALUES (...);
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### 4.6 配置变更
|
|
190
|
+
|
|
191
|
+
> 同一功能的相关配置项建议合并为一个 json 字段;不相关的配置,使用不同key;{value}给出具体值。
|
|
192
|
+
|
|
193
|
+
| 操作 | 配置项 | 值 | 说明 |
|
|
194
|
+
|--------|------------------|------------------------------------------|-----------------------|
|
|
195
|
+
| 新增 | featureX_config | {"paramA": "value1", "paramB": "value2"} | 功能 X 的相关配置合并 |
|
|
196
|
+
| 修改 | unrelated_key | true | 其他不相关配置项 |
|
|
197
|
+
|
|
198
|
+
### 4.7 项目结构
|
|
199
|
+
|
|
200
|
+
**新增文件**:
|
|
201
|
+
|
|
202
|
+
| 文件 | 模块 | 说明 |
|
|
203
|
+
|------|------|------|
|
|
204
|
+
| {文件名.java} | {web/controller} | {说明} |
|
|
205
|
+
| {文件名.java} | {biz/manager} | {说明} |
|
|
206
|
+
|
|
207
|
+
**修改文件**:
|
|
208
|
+
|
|
209
|
+
| 文件 | 模块 | 变更内容 |
|
|
210
|
+
|------|------|---------|
|
|
211
|
+
| [文件名](path/File.java) | {模块} | {变更描述} |
|
|
212
|
+
|
|
213
|
+
**SQL 文件**:
|
|
214
|
+
|
|
215
|
+
| 文件 | 说明 |
|
|
216
|
+
|------|------|
|
|
217
|
+
| sql/{issue-id}.sql | {说明} |
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## 5. 影响分析
|
|
222
|
+
|
|
223
|
+
### 5.1 功能影响
|
|
224
|
+
|
|
225
|
+
| 功能/流程 | 影响程度 | 说明 |
|
|
226
|
+
|----------|---------|------|
|
|
227
|
+
| {功能} | 无影响/需回归/有风险 | {说明} |
|
|
228
|
+
|
|
229
|
+
### 5.2 性能影响
|
|
230
|
+
|
|
231
|
+
{QPS 预估、DB 查询复杂度、缓存策略}
|
|
232
|
+
|
|
233
|
+
### 5.3 兼容性
|
|
234
|
+
|
|
235
|
+
| 检查项 | 状态 | 说明 |
|
|
236
|
+
|--------|------|------|
|
|
237
|
+
| API 向后兼容 | 兼容/不兼容/不适用 | {说明} |
|
|
238
|
+
| 数据库迁移安全 | 安全/有风险/不适用 | {说明} |
|
|
239
|
+
| 客户端版本兼容 | 兼容/不兼容/不适用 | {说明} |
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
## 6. 风险评估
|
|
244
|
+
|
|
245
|
+
| 风险 | 概率 | 影响 | 应对措施 |
|
|
246
|
+
|------|------|------|---------|
|
|
247
|
+
| {风险} | 高/中/低 | {影响} | {措施} |
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
## 7. 开发步骤
|
|
252
|
+
|
|
253
|
+
*按执行顺序排列,可直接作为开发者的实操指南。*
|
|
254
|
+
|
|
255
|
+
### Step 1: {步骤标题}
|
|
256
|
+
|
|
257
|
+
{具体操作说明、代码片段、SQL 脚本等}
|
|
258
|
+
|
|
259
|
+
### Step 2: {步骤标题}
|
|
260
|
+
|
|
261
|
+
{具体操作说明}
|
|
262
|
+
|
|
263
|
+
### Step N: 验证
|
|
264
|
+
|
|
265
|
+
**本地验证**:
|
|
266
|
+
1. {验证步骤1}
|
|
267
|
+
2. {验证步骤2}
|
|
268
|
+
|
|
269
|
+
**集成验证**:
|
|
270
|
+
1. {验证步骤1}
|
|
271
|
+
2. {验证步骤2}
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## 变更记录
|
|
276
|
+
|
|
277
|
+
| 版本 | 日期 | 变更人 | 变更内容 | 原因 |
|
|
278
|
+
|------|------|--------|---------|------|
|
|
279
|
+
| v1.0 | {日期} | {姓名} | 初稿 | - |
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
# {Issue ID} - 测试方案
|
|
2
|
+
|
|
3
|
+
> **状态**: 草稿 / 评审中 / 执行中 / 已完成
|
|
4
|
+
> **作者**: {姓名}
|
|
5
|
+
> **日期**: {YYYY-MM-DD}
|
|
6
|
+
> **关联需求**: [需求文档](./requirement.md)
|
|
7
|
+
> **关联方案**: [技术方案](./technical-design.md)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 1. 测试概览
|
|
12
|
+
|
|
13
|
+
### 1.1 测试范围
|
|
14
|
+
|
|
15
|
+
{描述本次测试覆盖的功能范围,基于需求文档和技术方案}
|
|
16
|
+
|
|
17
|
+
### 1.2 需求-测试覆盖矩阵
|
|
18
|
+
|
|
19
|
+
| # | 需求点 | 验收标准 | 黑盒用例 | 白盒用例 |
|
|
20
|
+
|---|--------|---------|---------|---------|
|
|
21
|
+
| R1 | {需求描述} | {验收条件} | BIZ-01,02 | UT-01, API-01 |
|
|
22
|
+
| R2 | {需求描述} | {验收条件} | BIZ-03 | UT-02, API-02 |
|
|
23
|
+
|
|
24
|
+
### 1.3 测试用例脑图
|
|
25
|
+
|
|
26
|
+
{用 Mermaid mindmap 展示完整测试用例树状结构,一眼看清全貌}
|
|
27
|
+
|
|
28
|
+
```mermaid
|
|
29
|
+
mindmap
|
|
30
|
+
root(("{Issue ID} 测试方案"))
|
|
31
|
+
业务功能测试(黑盒)
|
|
32
|
+
场景1: {场景名称}
|
|
33
|
+
BIZ-01 {正常场景}
|
|
34
|
+
BIZ-02 {异常场景}
|
|
35
|
+
BIZ-03 {边界场景}
|
|
36
|
+
场景2: {场景名称}
|
|
37
|
+
BIZ-04 {正常流程}
|
|
38
|
+
BIZ-05 {异常分支}
|
|
39
|
+
场景N: ...
|
|
40
|
+
单测接口测试(白盒)
|
|
41
|
+
单元测试
|
|
42
|
+
{ClassName1}
|
|
43
|
+
UT-01 {场景}
|
|
44
|
+
UT-02 {场景}
|
|
45
|
+
{ClassName2}
|
|
46
|
+
UT-03 {场景}
|
|
47
|
+
接口测试
|
|
48
|
+
{METHOD PATH1}
|
|
49
|
+
API-01 {场景}
|
|
50
|
+
API-02 {场景}
|
|
51
|
+
{METHOD PATH2}
|
|
52
|
+
API-03 {场景}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## 2. 业务功能测试(黑盒)
|
|
58
|
+
|
|
59
|
+
从用户/运营人员的视角出发,验证每个功能的输入和可观察输出是否符合需求。
|
|
60
|
+
|
|
61
|
+
> **用例数量策略**: 核心且复杂的场景 → 全面覆盖(所有分支/边界/并发/组合);辅助场景 → happy path + 主要错误路径
|
|
62
|
+
|
|
63
|
+
### 2.1 场景清单
|
|
64
|
+
|
|
65
|
+
| # | 场景名称 | 用户角色 | 优先级 | 用例数 |
|
|
66
|
+
|---|---------|---------|--------|--------|
|
|
67
|
+
| 1 | {场景} | {角色} | P0/P1/P2 | {N} |
|
|
68
|
+
|
|
69
|
+
### 2.2 业务功能测试用例
|
|
70
|
+
|
|
71
|
+
> 格式说明:按用户场景分组。每个场景的所有用例(正常/异常/边界)放在同一张表中。
|
|
72
|
+
> 「输入」列描述用户动作(点击按钮、打开页面、选择选项、提交表单等)。
|
|
73
|
+
> 「预期结果」列描述所有可观察的输出(页面展示、提示信息、接口返回值、数据库记录、日志、推送通知等)。
|
|
74
|
+
|
|
75
|
+
#### 场景 1: {场景名称}
|
|
76
|
+
|
|
77
|
+
| # | 类型 | 前置条件 | 输入(用户操作) | 预期结果(可观察输出) | 验证点 |
|
|
78
|
+
|---|------|---------|----------------|---------------------|--------|
|
|
79
|
+
| BIZ-01 | 正常 | {用户/数据状态} | {操作描述:点击XX按钮/打开XX页面/提交XX表单} | {页面展示内容/Toast提示/接口返回/DB记录/推送消息} | {需要校验的关键点} |
|
|
80
|
+
| BIZ-02 | 正常 | {状态} | {操作描述} | {预期结果} | {验证点} |
|
|
81
|
+
| BIZ-03 | 异常 | {状态} | {操作描述} | {错误提示/阻止操作/降级行为} | {验证点} |
|
|
82
|
+
| BIZ-04 | 边界 | {边界状态} | {操作描述} | {预期结果} | {验证点} |
|
|
83
|
+
|
|
84
|
+
#### 场景 2: {场景名称} — 多步骤流程
|
|
85
|
+
|
|
86
|
+
**完整流程**:
|
|
87
|
+
|
|
88
|
+
| 步骤 | 操作者 | 输入(用户操作) | 预期结果(可观察输出) | 数据状态变化 |
|
|
89
|
+
|------|--------|----------------|---------------------|-------------|
|
|
90
|
+
| 1 | {角色} | {操作} | {结果} | {DB/缓存变化} |
|
|
91
|
+
| 2 | {角色} | {操作} | {结果} | {DB/缓存变化} |
|
|
92
|
+
| 3 | {角色} | {操作} | {结果} | {最终状态} |
|
|
93
|
+
|
|
94
|
+
**异常分支**:
|
|
95
|
+
|
|
96
|
+
| # | 在步骤X后 | 输入(异常操作) | 预期结果 | 验证点 |
|
|
97
|
+
|---|----------|----------------|---------|--------|
|
|
98
|
+
| BIZ-05 | 步骤{N}后 | {异常操作} | {错误提示/阻止} | {验证点} |
|
|
99
|
+
| BIZ-06 | 步骤{N}后 | {并发/重复操作} | {幂等结果/提示} | {验证点} |
|
|
100
|
+
|
|
101
|
+
{继续按场景分组列出所有业务功能测试用例...}
|
|
102
|
+
|
|
103
|
+
### 2.3 业务功能测试汇总
|
|
104
|
+
|
|
105
|
+
| 指标 | 数值 |
|
|
106
|
+
|------|------|
|
|
107
|
+
| 覆盖场景数 | {N} |
|
|
108
|
+
| 正常路径用例 | {N} |
|
|
109
|
+
| 异常路径用例 | {N} |
|
|
110
|
+
| 边界条件用例 | {N} |
|
|
111
|
+
| 多步骤流程用例 | {N} |
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 3. 单测接口测试(白盒)
|
|
116
|
+
|
|
117
|
+
从代码实现的视角验证核心方法和 API 端点的正确性。
|
|
118
|
+
|
|
119
|
+
### 3.1 可测试性重构建议
|
|
120
|
+
|
|
121
|
+
{如果发现方法内部混合了业务逻辑和数据查询/外部调用,建议拆分为纯函数}
|
|
122
|
+
|
|
123
|
+
| # | 现有方法 | 问题 | 重构建议 | 收益 |
|
|
124
|
+
|---|---------|------|---------|------|
|
|
125
|
+
| 1 | [Class#method](path/File) | 方法内部包含 DB 查询,无法独立测试 | 提取纯计算逻辑到 `calculateXxx(data)` 方法,接受预查询数据作为参数 | 可直接单元测试,无需 Mock |
|
|
126
|
+
| 2 | [Class#method](path/File) | 循环内逐条查询数据库 | 改为循环外批量查询,传入 Map/List 到计算方法 | 性能提升 + 可测试 |
|
|
127
|
+
|
|
128
|
+
### 3.2 单元测试
|
|
129
|
+
|
|
130
|
+
核心业务方法的单元测试,优先测试纯函数和可隔离的业务逻辑。
|
|
131
|
+
|
|
132
|
+
#### 测试对象清单
|
|
133
|
+
|
|
134
|
+
| # | 类 | 方法 | 代码位置 | 职责说明 | 重要度 | 复杂度 | 用例数 |
|
|
135
|
+
|---|-----|------|---------|---------|--------|--------|--------|
|
|
136
|
+
| 1 | {ClassName} | {methodName} | [链接](path/File) | {职责} | 核心/辅助 | 高/中/低 | {N} |
|
|
137
|
+
|
|
138
|
+
> **用例数量策略**: 核心+高复杂度 → 全面覆盖(≥8 用例,含所有分支/边界/并发/组合);核心+中复杂度 → 标准覆盖(4-6 用例);辅助/低复杂度 → 基础覆盖(2-3 用例,happy path + 主要错误路径)
|
|
139
|
+
|
|
140
|
+
#### 测试代码注释规范
|
|
141
|
+
|
|
142
|
+
> 生成测试代码时必须遵循以下注释规范:
|
|
143
|
+
>
|
|
144
|
+
> 1. **测试类 Javadoc**: 说明被测类、覆盖的核心方法列表、测试策略(纯函数直接测试 / Mock 集成测试)
|
|
145
|
+
> 2. **分组注释**: 同一被测方法的用例用 `// ===== 方法名 — 职责描述 =====` 分隔
|
|
146
|
+
> 3. **每个 @Test 方法**: 必须包含以下注释内容(写在方法体内部,不用 Javadoc)
|
|
147
|
+
> - **场景**: 一句话描述测试的业务场景
|
|
148
|
+
> - **前置条件**: Mock 设置或数据准备的业务含义(不是罗列代码)
|
|
149
|
+
> - **预期结果**: 期望的业务行为和关键断言点
|
|
150
|
+
> - **验证重点**: 需要 verify 的关键调用(如有)
|
|
151
|
+
> 4. 辅助方法(buildXxx / mockXxx)需注释说明用途和参数含义
|
|
152
|
+
|
|
153
|
+
#### 单元测试用例
|
|
154
|
+
|
|
155
|
+
> 按被测方法分组,每个方法的所有用例放在同一个表格中。
|
|
156
|
+
> 表格列根据方法签名动态调整:输入参数列 + 预期结果列。
|
|
157
|
+
|
|
158
|
+
##### {ClassName}#{methodName1} — {职责描述}
|
|
159
|
+
|
|
160
|
+
> 被测方法: `{methodName1}({参数类型列表})`
|
|
161
|
+
> 用例数: {N}
|
|
162
|
+
|
|
163
|
+
| # | 场景 | {参数1} | {参数2} | ... | 预期返回/状态 | 备注 |
|
|
164
|
+
|---|------|---------|---------|-----|-------------|------|
|
|
165
|
+
| UT-01 | {正常场景} | {值} | {值} | ... | {预期} | - |
|
|
166
|
+
| UT-02 | {边界场景} | {值} | {值} | ... | {预期} | {说明} |
|
|
167
|
+
| UT-03 | {异常场景} | null | {值} | ... | 抛出 {Exception} | - |
|
|
168
|
+
|
|
169
|
+
##### {ClassName}#{methodName2} — Mock 集成测试
|
|
170
|
+
|
|
171
|
+
> Mock 依赖: `{Service1}`, `{Service2}`
|
|
172
|
+
> 用例数: {N}
|
|
173
|
+
|
|
174
|
+
| # | 场景 | Mock 设置 | 调用参数 | 预期返回 | verify 断言 |
|
|
175
|
+
|---|------|----------|---------|---------|------------|
|
|
176
|
+
| UT-04 | {场景} | {Mock行为} | {参数} | {预期} | {verify调用} |
|
|
177
|
+
|
|
178
|
+
{继续按方法分组列出所有单元测试用例表格...}
|
|
179
|
+
|
|
180
|
+
#### 单元测试汇总
|
|
181
|
+
|
|
182
|
+
| 指标 | 数值 |
|
|
183
|
+
|------|------|
|
|
184
|
+
| 覆盖核心方法数 | {N} |
|
|
185
|
+
| 正常路径用例 | {N} |
|
|
186
|
+
| 边界条件用例 | {N} |
|
|
187
|
+
| 异常路径用例 | {N} |
|
|
188
|
+
|
|
189
|
+
### 3.3 接口测试
|
|
190
|
+
|
|
191
|
+
针对所有新增/修改的 API 端点,验证请求-响应契约和业务规则。
|
|
192
|
+
|
|
193
|
+
#### API 端点清单
|
|
194
|
+
|
|
195
|
+
| # | 方法 | 路径 | 说明 | 变更类型 |
|
|
196
|
+
|---|------|------|------|---------|
|
|
197
|
+
| 1 | POST | /api/xxx | {说明} | 新增/修改 |
|
|
198
|
+
|
|
199
|
+
#### 接口测试用例
|
|
200
|
+
|
|
201
|
+
> 按 API 端点分组,同一端点的所有测试场景放在同一个表格中。
|
|
202
|
+
|
|
203
|
+
##### `{METHOD} {PATH}` — {接口说明}
|
|
204
|
+
|
|
205
|
+
> 处理方法: [Controller#method](path/File)
|
|
206
|
+
|
|
207
|
+
| # | 场景 | 前置数据 | 请求体(输入) | 预期 code | 预期 data(输出) | DB 断言 | 备注 |
|
|
208
|
+
|---|------|---------|-------------|----------|-----------------|--------|------|
|
|
209
|
+
| API-01 | 正常请求 | {数据} | `{json}` | 0 | {关键字段} | {断言} | - |
|
|
210
|
+
| API-02 | 参数校验失败 | - | `{json}` | {错误码} | - | 无变更 | - |
|
|
211
|
+
| API-03 | 业务规则违反 | {特定状态} | `{json}` | {错误码} | - | 无变更 | {说明} |
|
|
212
|
+
| API-04 | 权限校验 | - | 无 token | 401 | - | - | - |
|
|
213
|
+
|
|
214
|
+
{继续按端点分组列出所有接口用例表格...}
|
|
215
|
+
|
|
216
|
+
#### 接口测试汇总
|
|
217
|
+
|
|
218
|
+
| 指标 | 数值 |
|
|
219
|
+
|------|------|
|
|
220
|
+
| 覆盖 API 端点数 | {N} |
|
|
221
|
+
| 成功路径用例 | {N} |
|
|
222
|
+
| 参数校验用例 | {N} |
|
|
223
|
+
| 业务规则用例 | {N} |
|
|
224
|
+
| 权限校验用例 | {N} |
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## 4. 测试执行计划
|
|
229
|
+
|
|
230
|
+
### 4.1 执行优先级
|
|
231
|
+
|
|
232
|
+
| 优先级 | 用例范围 | 执行时机 | 预估耗时 |
|
|
233
|
+
|--------|---------|---------|---------|
|
|
234
|
+
| P0 | 黑盒核心场景 + 白盒核心方法单测 | 开发中持续运行 | {N}h |
|
|
235
|
+
| P1 | 黑盒全部场景 + 接口测试 | 功能开发完成后 | {N}h |
|
|
236
|
+
| P2 | 黑盒边界/并发 + 回归测试 | QA 测试阶段 | {N}h |
|
|
237
|
+
|
|
238
|
+
### 4.2 回归测试范围
|
|
239
|
+
|
|
240
|
+
{列出需要回归验证的现有功能}
|
|
241
|
+
|
|
242
|
+
| 功能 | 回归原因 | 验证方式 |
|
|
243
|
+
|------|---------|---------|
|
|
244
|
+
| {功能} | {受影响原因} | 黑盒场景 / 接口测试 |
|
|
245
|
+
|
|
246
|
+
## 变更记录
|
|
247
|
+
|
|
248
|
+
| 版本 | 日期 | 变更人 | 变更内容 | 原因 |
|
|
249
|
+
|------|------|--------|---------|------|
|
|
250
|
+
| v1.0 | {日期} | {姓名} | 初稿 | - |
|
issuekit/cli.py
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"""IssueKit 命令行入口。"""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import sys
|
|
5
|
+
|
|
6
|
+
os.environ.setdefault("PYTHONIOENCODING", "utf-8")
|
|
7
|
+
if sys.stdout.encoding and sys.stdout.encoding.lower() != "utf-8":
|
|
8
|
+
try:
|
|
9
|
+
sys.stdout.reconfigure(encoding="utf-8")
|
|
10
|
+
sys.stderr.reconfigure(encoding="utf-8")
|
|
11
|
+
except Exception:
|
|
12
|
+
pass
|
|
13
|
+
|
|
14
|
+
import typer
|
|
15
|
+
|
|
16
|
+
from issuekit.commands.init import init as init_cmd
|
|
17
|
+
from issuekit.agents import AGENT_REGISTRY
|
|
18
|
+
|
|
19
|
+
SUPPORTED_AI = ", ".join(AGENT_REGISTRY.keys())
|
|
20
|
+
|
|
21
|
+
INIT_USAGE = (
|
|
22
|
+
"\n用法示例:\n"
|
|
23
|
+
" issuekit init --ai cursor\n"
|
|
24
|
+
" issuekit init --ai claude\n"
|
|
25
|
+
" issuekit init --ai cursor --force\n"
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class ChineseErrorGroup(typer.core.TyperGroup):
|
|
30
|
+
"""拦截 Click 层的参数解析错误,替换为中文提示。"""
|
|
31
|
+
|
|
32
|
+
def parse_args(self, ctx, args):
|
|
33
|
+
try:
|
|
34
|
+
return super().parse_args(ctx, args)
|
|
35
|
+
except SystemExit:
|
|
36
|
+
raise
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
app = typer.Typer(
|
|
40
|
+
name="issuekit",
|
|
41
|
+
help="AI 辅助开发的 Issue 全生命周期工具。",
|
|
42
|
+
no_args_is_help=True,
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@app.command("init")
|
|
47
|
+
def init(
|
|
48
|
+
ai: str = typer.Option(
|
|
49
|
+
None,
|
|
50
|
+
help=f"指定 AI 助手:{SUPPORTED_AI}",
|
|
51
|
+
),
|
|
52
|
+
issues_dir: str = typer.Option(
|
|
53
|
+
"issues",
|
|
54
|
+
"--issues-dir",
|
|
55
|
+
help="Issue 文档存放目录(相对项目根目录,默认:issues)",
|
|
56
|
+
),
|
|
57
|
+
here: bool = typer.Option(
|
|
58
|
+
True,
|
|
59
|
+
"--here/--no-here",
|
|
60
|
+
help="在当前目录初始化(默认:是)",
|
|
61
|
+
),
|
|
62
|
+
force: bool = typer.Option(
|
|
63
|
+
False,
|
|
64
|
+
"--force",
|
|
65
|
+
help="如果 .issuekit/ 已存在,强制覆盖",
|
|
66
|
+
),
|
|
67
|
+
):
|
|
68
|
+
"""在项目中初始化 IssueKit。
|
|
69
|
+
|
|
70
|
+
安装文档模板、AI 助手命令和知识库配置。
|
|
71
|
+
|
|
72
|
+
用法示例:
|
|
73
|
+
issuekit init --ai cursor
|
|
74
|
+
issuekit init --ai cursor --issues-dir doc/issues
|
|
75
|
+
issuekit init --ai cursor --force
|
|
76
|
+
"""
|
|
77
|
+
if not ai:
|
|
78
|
+
from rich.console import Console
|
|
79
|
+
console = Console()
|
|
80
|
+
console.print(
|
|
81
|
+
f"[red]错误:[/red] 缺少必需参数 --ai\n"
|
|
82
|
+
f"[dim]支持的选项:[/dim] {SUPPORTED_AI}"
|
|
83
|
+
f"{INIT_USAGE}"
|
|
84
|
+
)
|
|
85
|
+
raise typer.Exit(2)
|
|
86
|
+
init_cmd(ai=ai, issues_dir=issues_dir, here=here, force=force)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
@app.command("version")
|
|
90
|
+
def version():
|
|
91
|
+
"""显示 IssueKit 版本号。"""
|
|
92
|
+
from issuekit import __version__
|
|
93
|
+
typer.echo(f"issuekit {__version__}")
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def main():
|
|
97
|
+
app()
|
|
File without changes
|