adspecs 0.1.19 → 0.1.21

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.
Files changed (74) hide show
  1. package/.adspecs/feature.json +16 -16
  2. package/.adspecs/feature.yml +28 -28
  3. package/.adspecs/paths.json +17 -17
  4. package/.adspecs/templates/04-/345/211/215/347/253/257/345/212/237/350/203/275/350/256/276/350/256/241/346/250/241/346/235/277.md +1 -1
  5. package/.adspecs/templates/05-/345/220/216/347/253/257/344/273/273/345/212/241/346/270/205/345/215/225/346/250/241/346/235/277.md +613 -724
  6. package/.adspecs/templates/05b-/345/211/215/347/253/257/344/273/273/345/212/241/346/270/205/345/215/225/346/250/241/346/235/277.md +51 -51
  7. package/.claude-plugin/marketplace.json +23 -23
  8. package/.claude-plugin/plugin.json +18 -18
  9. package/.qoder-plugin/plugin.json +31 -31
  10. package/CLAUDE.md +1 -5
  11. package/INSTALL.md +3 -3
  12. package/README.md +395 -395
  13. package/bin/adspecs.js +129 -129
  14. package/hooks/commit-queue.js +245 -245
  15. package/hooks/hooks.json +63 -63
  16. package/hooks/session-start.js +44 -44
  17. package/hooks/wiki-queue.js +127 -127
  18. package/package.json +61 -61
  19. package/references/ant6-front-standard/index.md +99 -99
  20. package/references/antd-front-demo/public/mockServiceWorker.js +361 -361
  21. package/references/ecp-end-standard/index.md +63 -63
  22. package/references/python-end-standard/01-Python/345/220/216/347/253/257/347/274/226/347/240/201/350/247/204/350/214/203.md +372 -372
  23. package/references/python-end-standard/02-/346/225/260/346/215/256/345/272/223/350/256/276/350/256/241/344/270/216/344/275/277/347/224/250/350/247/204/350/214/203.md +226 -226
  24. package/references/python-end-standard/03-Celery/345/274/202/346/255/245/344/273/273/345/212/241/350/247/204/350/214/203.md +237 -237
  25. package/references/python-end-standard/04-Redis/344/275/277/347/224/250/350/247/204/350/214/203.md +231 -231
  26. package/scripts/postinstall.js +107 -107
  27. package/scripts/sync-version.js +105 -105
  28. package/skills/.claude/.wiki-update-queue +26 -26
  29. package/skills/adspecs-constitution/SKILL.md +157 -0
  30. package/skills/adspecs-export-word/SKILL.md +498 -498
  31. package/skills/adspecs-export-word/references/md-to-docx.js +862 -862
  32. package/skills/adspecs-export-word/references/package-lock.json +220 -220
  33. package/skills/adspecs-export-word/references/package.json +10 -10
  34. package/skills/adspecs-front-prototype/SKILL.md +405 -405
  35. package/skills/adspecs-front-spec/SKILL.md +4 -4
  36. package/skills/adspecs-front-tasks/SKILL.md +213 -173
  37. package/skills/adspecs-plan/SKILL.md +59 -69
  38. package/skills/adspecs-prd/SKILL.md +13 -5
  39. package/skills/adspecs-prd-to-demo/SKILL.md +532 -0
  40. package/skills/adspecs-tasks/SKILL.md +175 -204
  41. package/skills/adspecs-update-status/SKILL.md +382 -382
  42. package/skills/adspecs-utest/SKILL.md +107 -116
  43. package/skills/grill-me/SKILL.md +7 -0
  44. package/skills/grill-me/agents/openai.yaml +5 -0
  45. package/skills/playwright-cli/SKILL.md +420 -0
  46. package/skills/playwright-cli/references/element-attributes.md +23 -0
  47. package/skills/playwright-cli/references/playwright-tests.md +39 -0
  48. package/skills/playwright-cli/references/request-mocking.md +87 -0
  49. package/skills/playwright-cli/references/running-code.md +241 -0
  50. package/skills/playwright-cli/references/session-management.md +225 -0
  51. package/skills/playwright-cli/references/storage-state.md +275 -0
  52. package/skills/playwright-cli/references/test-generation.md +433 -0
  53. package/skills/playwright-cli/references/tracing.md +139 -0
  54. package/skills/playwright-cli/references/video-recording.md +143 -0
  55. package/skills/playwright-trace/SKILL.md +171 -0
  56. package/skills/project-init/SKILL.md +93 -22
  57. package/skills/project-init/references/front-demo/.claude/settings.local.json +9 -0
  58. package/skills/wiki-update/SKILL.md +232 -232
  59. package/src/commands/doctor.js +197 -197
  60. package/src/commands/init.js +83 -83
  61. package/src/commands/plugin.js +165 -165
  62. package/src/commands/update.js +87 -87
  63. package/src/lib/area-scanner.js +129 -129
  64. package/src/lib/copier.js +104 -104
  65. package/src/lib/dir-utils.js +161 -133
  66. package/src/lib/json-merge.js +114 -114
  67. package/src/lib/paths-defaults.js +37 -37
  68. package/src/lib/prompts.js +428 -347
  69. package/src/lib/readme-gen.js +143 -143
  70. package/src/lib/report.js +338 -327
  71. package/src/lib/scaffolder.js +551 -518
  72. package/src/lib/short-name.js +36 -36
  73. package/src/utils.js +80 -80
  74. package/references/antd-front-demo/.env +0 -15
@@ -2,10 +2,10 @@
2
2
  name: adspecs-utest
3
3
  description: "基于后端系统设计文档,生成 Service 层 / Controller 层单元测试代码,并按模板输出单元测试报告"
4
4
  argument-hint: "指定功能名或系统设计文档路径,如 M06-01 或 docs/30-system-design/crm/M06-01-销售预测_system-design.md"
5
- compatibility: "需要 docs/ 目录体系:docs/20-prd(PRD)+ docs/30-system-design(系统设计+tasks)+ CLAUDE.md(ECP 编码宪章)"
5
+ compatibility: "需要 docs/ 目录体系:docs/20-prd(PRD)+ docs/30-system-design(系统设计+tasks)+ CLAUDE.md + docs/40-project_conventions/end-integration/index.md"
6
6
  metadata:
7
7
  author: "qingwen"
8
- source: "基于 adspecs-analyze 通用模板 + ECP 全链路追溯 ID 体系 + CLI 规范 10 条 + TDD 一致性检测改造"
8
+ source: "基于 adspecs-analyze 通用模板 + 全链路追溯 ID 体系 + TDD 一致性检测改造"
9
9
  user-invocable: true
10
10
  disable-model-invocation: false
11
11
  ---
@@ -22,7 +22,7 @@ disable-model-invocation: false
22
22
 
23
23
  | 对比项 | 本技能(adspecs-utest) | /adspecs-tasks |
24
24
  | -------- | -------------------------------------- | ------------------ |
25
- | 输出 | 测试代码(Java)+ 测试报告(md) | TDD 任务清单(md) |
25
+ | 输出 | 测试代码 + 测试报告(md) | TDD 任务清单(md) |
26
26
  | 目标读者 | 开发工程师 / 测试工程师 | 开发工程师 |
27
27
  | 关注点 | 验证 Service/Controller 业务逻辑正确性 | 拆解编码实现步骤 |
28
28
  | 阶段 | 编码完成后 | 编码之前 |
@@ -31,7 +31,7 @@ disable-model-invocation: false
31
31
 
32
32
  读取用户指定的后端系统设计文档,生成 **两类输出**:
33
33
 
34
- 1. **单元测试代码**(`.java`)— Service 层测试 + Controller 层测试,JUnit 5 + Mockito,遵循项目现有测试模式
34
+ 1. **单元测试代码** Service 层测试 + Controller 层测试,按后端规范的测试框架和 Mock 模式,遵循项目现有测试风格
35
35
  2. **单元测试报告**(`.md`)— 按 `.adspecs/templates/07-单元测试报告模板.md` 结构填写
36
36
 
37
37
  本技能**不修改**业务代码、不生成集成测试、不执行测试运行。
@@ -59,118 +59,113 @@ disable-model-invocation: false
59
59
  | ---- | ---------------------------------------------------------------------------------- | -------------------------------------------------------- |
60
60
  | 1 | 用户指定的系统设计文件(如 `{DESIGN_DIR}/crm/M01-01-产品主数据_system-design.md`) | 提取 Service 方法、Controller 端点、异常码、§12 测试场景 |
61
61
  | 2 | `.adspecs/templates/07-单元测试报告模板.md` | 测试报告的输出模板(6 部分结构) |
62
- | 3 | `CLAUDE.md` | 项目模块结构、测试框架约定、包路径规范 |
62
+ | 3 | `CLAUDE.md` | 项目模块结构 |
63
+ | 4 | `docs/40-project_conventions/end-integration/index.md` | 后端编码规范索引(测试框架、Mock 模式、命名约定等) |
63
64
 
64
65
  ### 参考文件(按需读取)
65
66
 
66
- | 序号 | 文件 | 用途 |
67
- | ---- | -------------------------------------------- | ------------------------------------ |
68
- | 4 | 已有的 `*Test.java` 文件(同模块或相邻模块) | 对齐项目现有测试风格和 Mock 模式 |
69
- | 5 | 对应的 `*_tasks.md` 文件 | 了解 T0xx 任务编号与 US 的映射关系 |
70
- | 6 | 实际的 Service / Controller 源码 | 了解方法签名、依赖注入、业务逻辑细节 |
71
- | 7 | 对应的 i18n `.properties` 文件 | 确认消息码与实际异常描述的对应 |
67
+ | 序号 | 文件 | 用途 |
68
+ | ---- | ------------------------------------------ | ------------------------------------ |
69
+ | 5 | 已有的测试文件(同模块或相邻模块) | 对齐项目现有测试风格和 Mock 模式 |
70
+ | 6 | 对应的 `*_tasks.md` 文件 | 了解 T0xx 任务编号与 US 的映射关系 |
71
+ | 7 | 实际的 Service / Controller 源码 | 了解方法签名、依赖注入、业务逻辑细节 |
72
+ | 8 | 对应的 i18n 语言文件 | 确认消息码与实际异常描述的对应 |
73
+
74
+ ### 加载后端编码规范(必选)
75
+
76
+ 1. 读取 `docs/40-project_conventions/end-integration/index.md`
77
+ 2. 按 `index.md` 中"推荐读取顺序"依次加载所有关联规范文件
78
+ 3. 后续所有测试代码中的框架选择、Mock 模式、命名约定、异常类引用等,均以该规范为准
79
+ 4. 如该目录不存在或 `index.md` 缺失,中止执行并提示先运行 `/project-init` 选择技术栈
72
80
 
73
81
  ## 项目测试约定
74
82
 
83
+ > **以下约定均从 `docs/40-project_conventions/end-integration/index.md` 运行时加载。本节仅描述通用结构,具体框架、注解、类名以规范为准。**
84
+
75
85
  ### 技术栈
76
86
 
77
- | 项 | 值 |
78
- | ---------- | ------------------------------------------------------------------------ |
79
- | 测试框架 | JUnit 5(`org.junit.jupiter`) |
80
- | Mock 框架 | Mockito(`@ExtendWith(MockitoExtension.class)`) |
81
- | 断言 | JUnit 5 Assertions(`assertEquals`, `assertNotNull`, `assertThrows` 等) |
82
- | 显示名称 | `@DisplayName("T0xx [US-xx] 描述")` |
83
- | 覆盖率目标 | 行覆盖率 100%,分支覆盖率 100% |
87
+ | 项 | 值 |
88
+ | ---------- | ------------------------------------------ |
89
+ | 测试框架 | 按后端规范(如 JUnit 5 / pytest 等) |
90
+ | Mock 框架 | 按后端规范(如 Mockito / unittest.mock 等) |
91
+ | 断言 | 按后端规范的断言库 |
92
+ | 显示名称 | 按后端规范的测试标注方式 |
93
+ | 覆盖率目标 | 行覆盖率 100%,分支覆盖率 100% |
84
94
 
85
95
  ### 测试类命名与位置
86
96
 
87
- | 被测类 | 测试类命名 | 测试类位置 |
88
- | ---------------------- | -------------------------- | ---------------------------------------------------------------------------------------------------------- |
89
- | `CrmProductService` | `CrmProductServiceTest` | `3100-crm-{mod}-application/src/test/java/com/sie/crm/{mod}/model/service/impl/CrmProductServiceTest.java` |
90
- | `CrmProductController` | `CrmProductControllerTest` | `3100-crm-{mod}-application/src/test/java/com/sie/crm/{mod}/api/controller/CrmProductControllerTest.java` |
97
+ | 被测类 | 测试类命名 | 测试类位置 |
98
+ | ----------- | --------------------- | ---------------------------------- |
99
+ | Service | `{ServiceName}Test` | 按后端规范的测试目录结构 |
100
+ | Controller | `{ControllerName}Test` | 按后端规范的测试目录结构 |
91
101
 
92
- ### Service 层测试模式(Mockito + @Spy + @InjectMocks)
102
+ ### Service 层测试模式
93
103
 
94
- ```java
95
- @ExtendWith(MockitoExtension.class)
96
- @DisplayName("{ClassName} 单元测试")
97
- class {ClassName}Test {
104
+ > 以下为通用模式示意,具体注解和 Mock 方式按后端规范。
98
105
 
99
- @Mock
100
- private {DaoName} {daoField};
106
+ ```
107
+ {ServiceUnderTest} 测试类 {
101
108
 
102
- @Spy
103
- @InjectMocks
104
- private {ServiceImplName} {serviceField};
109
+ // Mock 数据访问层依赖(按后端规范)
110
+
111
+ // Spy 或 InjectMocks 被测 Service 实例(按后端规范)
105
112
 
106
113
  // setUp() 中构建 mock 数据
107
114
 
108
- @Test
109
- @DisplayName("T0xx [US-xx] 场景描述 — 预期结果")
110
- void methodName_scenario() {
111
- // Given
112
- doReturn(...).when(...).method(...);
113
- // When
114
- var result = service.method(args);
115
- // Then
116
- assertNotNull(result);
117
- assertEquals(expected, result.getXxx());
115
+ // 测试方法
116
+ methodName_scenario() {
117
+ // Given — mock 依赖方法
118
+ // When — 调用被测方法
119
+ // Then — 断言返回值/异常
118
120
  }
119
121
  }
120
122
  ```
121
123
 
122
124
  **关键约定**:
123
125
 
124
- - Service 实现类使用 `@Spy + @InjectMocks`,因为需要 mock 继承自 `BaseCommonServer` 的方法(如 `getById`, `save`, `updateById`, `deleteById`)
125
- - DAO 使用 `@Mock`
126
+ - Service 实现类的测试需要 mock 其基类的数据访问方法(如 getByIdsaveupdateById、deleteById 等,按后端规范)
127
+ - 数据访问层使用 Mock
126
128
  - 测试方法命名:`methodName_scenarioDescription`(驼峰式,不用下划线分隔单词)
127
- - 异常测试用 `assertThrows(ExceptionClass.class, () -> ...)`
128
- - 无异常测试用 `assertDoesNotThrow(() -> ...)`
129
+ - 异常测试使用后端规范的断言方式
130
+ - 无异常测试使用后端规范的断言方式
131
+
132
+ ### Controller 层测试模式
129
133
 
130
- ### Controller 层测试模式(Mockito + @InjectMocks)
134
+ > 以下为通用模式示意,具体注解和请求/响应包装按后端规范。
131
135
 
132
- ```java
133
- @ExtendWith(MockitoExtension.class)
134
- @DisplayName("{ClassName} 集成测试")
135
- class {ClassName}Test {
136
+ ```
137
+ {ControllerUnderTest} 测试类 {
136
138
 
137
- @Mock
138
- private II{Entity} {serviceField};
139
+ // Mock Service 依赖(按后端规范)
139
140
 
140
- @InjectMocks
141
- private {ControllerName} controller;
141
+ // InjectMocks 被测 Controller 实例(按后端规范)
142
142
 
143
143
  // setUp() 中构建 mockEntity 和 mockRo
144
144
 
145
- @Test
146
- @DisplayName("T0xx [US-xx] HTTP METHOD /path → 预期结果")
147
- void endpointName_scenario() {
148
- // Given
149
- doReturn(...).when(service).method(...);
150
- // 构造 RequestData / PaginationRequestData
151
- // When
152
- ResponseData<...> response = controller.method(requestData);
153
- // Then
154
- assertNotNull(response);
155
- assertNotNull(response.getData());
145
+ // 测试方法
146
+ endpointName_scenario() {
147
+ // Given — mock Service 方法
148
+ // 构造请求包装对象(按后端规范)
149
+ // When — 调用 Controller 方法
150
+ // Then 断言响应对象的 code / data 结构
156
151
  }
157
152
  }
158
153
  ```
159
154
 
160
155
  **关键约定**:
161
156
 
162
- - Controller 使用 `@InjectMocks`(非 Spy),因为不测试继承行为
163
- - Service 使用 `@Mock`
164
- - 需手动构造 `RequestData<Dto>` 和 `PaginationRequestData<Dto>`
165
- - 测试 Controller dto 为 null 场景(返回 `ResponseData.fail`)
166
- - 验证 `ResponseData` 的 code / data 结构
157
+ - Controller 使用 InjectMocks(非 Spy),因为不测试继承行为
158
+ - Service 使用 Mock
159
+ - 需手动构造后端规范定义的请求包装对象
160
+ - 测试 Controller 的入参为 null 场景(返回失败响应)
161
+ - 验证响应对象的 code / data 结构
167
162
 
168
- ### @DisplayName 命名规则
163
+ ### 测试显示名称命名规则
169
164
 
170
165
  **Service 测试**:`T0xx [US-xx] 方法名 — 场景描述,预期结果`
171
166
 
172
167
  - 示例:`T016-1 [US-01] 分页查询 — 无条件分页,返回 1 条记录`
173
- - 示例:`T028-2 [US-03] 新增 — 编码重复,抛出 GushenRuntimeException`
168
+ - 示例:`T028-2 [US-03] 新增 — 编码重复,抛出业务异常`
174
169
 
175
170
  **Controller 测试**:`T0xx [US-xx] HTTP方法 /端点 → 预期结果`
176
171
 
@@ -200,10 +195,8 @@ class {ClassName}Test {
200
195
 
201
196
  ### 步骤 2:读取参考文件(对齐风格)
202
197
 
203
- 1. 检查同模块下已有的 `*Test.java` 文件,对齐测试风格
204
- 2. 如果没有,读取相邻模块的测试文件作为参考:
205
- - `3100-crm-mdm/.../CrmProductServiceTest.java`
206
- - `3100-crm-mdm/.../CrmCustomerControllerTest.java`
198
+ 1. 检查同模块下已有的测试文件,对齐测试风格
199
+ 2. 如果没有,读取相邻模块的测试文件作为参考
207
200
  3. 如果存在 `*_tasks.md`,读取 T0xx 编号与 US 的映射
208
201
 
209
202
  ### 步骤 3:生成 Service 层测试代码
@@ -229,20 +222,20 @@ class {ClassName}Test {
229
222
 
230
223
  2. **新增方法**(`saveXxx`):
231
224
  - 合法数据保存成功
232
- - 唯一性字段重复(抛出 `GushenRuntimeException`)
225
+ - 唯一性字段重复(抛出后端规范定义的业务异常)
233
226
  - 默认值设置(如 isActive=1)
234
227
 
235
228
  3. **编辑方法**(`updateXxx`):
236
229
  - 合法更新成功,不可修改字段不变
237
- - 数据不存在(抛出 `RecordNotExistsException`)
230
+ - 数据不存在(抛出后端规范定义的数据不存在异常)
238
231
 
239
232
  4. **删除方法**(`deleteXxx`):
240
233
  - 存在数据逻辑删除成功
241
- - 数据不存在(抛出 `RecordNotExistsException`)
234
+ - 数据不存在(抛出后端规范定义的数据不存在异常)
242
235
 
243
236
  5. **详情查询方法**(`findById`):
244
237
  - 数据存在,返回完整字段
245
- - 数据不存在(抛出 `RecordNotExistsException`)
238
+ - 数据不存在(抛出后端规范定义的数据不存在异常)
246
239
 
247
240
  6. **编码查询方法**(`findByCode`):
248
241
  - 上架产品,返回完整信息
@@ -251,7 +244,7 @@ class {ClassName}Test {
251
244
 
252
245
  **Mock 数据构建规则**:
253
246
 
254
- - 在 `@BeforeEach setUp()` 中构建 1-2 个可复用的 mock 对象
247
+ - 在测试初始化方法(setUp)中构建 1-2 个可复用的 mock 对象
255
248
  - mock 对象的业务字段必须使用真实业务数据(如产品编码 "PROD-001"、产品名称 "5052 铝板"),不使用 "test1"、"abc" 等无意义数据
256
249
  - 异常场景专用的 mock 对象在测试方法内部构建
257
250
 
@@ -261,17 +254,17 @@ class {ClassName}Test {
261
254
 
262
255
  **每个端点至少覆盖**:
263
256
 
264
- | 场景 | 验证内容 |
265
- | ---------------- | --------------------------------------------- |
266
- | 正常请求 | ResponseData 非空,data 字段正确 |
267
- | dto 为 null | 返回 `ResponseData.fail`(Controller 空校验) |
268
- | Service 抛出异常 | 异常传播(Controller 不吞异常) |
257
+ | 场景 | 验证内容 |
258
+ | ---------------- | ---------------------------------------------- |
259
+ | 正常请求 | 响应对象非空,data 字段正确 |
260
+ | dto 为 null | 返回失败响应(Controller 空校验) |
261
+ | Service 抛出异常 | 异常传播(Controller 不吞异常) |
269
262
 
270
263
  **Controller 测试生成规则**:
271
264
 
272
- - 手动构造 `RequestData<Dto>` 和 `PaginationRequestData<Dto>`
273
- - 验证 `ResponseData` 的 code 和 data 结构
274
- - dto 为 null 场景直接传入 null 或构造空 RequestData
265
+ - 手动构造后端规范定义的请求包装对象
266
+ - 验证响应对象的 code 和 data 结构
267
+ - dto 为 null 场景直接传入 null 或构造空请求对象
275
268
 
276
269
  ### 步骤 5:生成单元测试报告
277
270
 
@@ -295,31 +288,29 @@ class {ClassName}Test {
295
288
 
296
289
  ### 步骤 6:保存文件
297
290
 
298
- | 输出 | 保存位置 |
299
- | --------------- | ---------------------------------------------------------------------------------------------------- |
300
- | Service 测试 | `{port}-{mod}-application/src/test/java/com/sie/crm/{mod}/model/service/impl/{ServiceName}Test.java` |
301
- | Controller 测试 | `{port}-{mod}-application/src/test/java/com/sie/crm/{mod}/api/controller/{ControllerName}Test.java` |
302
- | 测试报告 | `{TEST_REPORT_DIR}/{模块编号}-{模块名}_单元测试报告.md` |
291
+ | 输出 | 保存位置 |
292
+ | --------------- | ------------------------------------------------------------------ |
293
+ | Service 测试 | `{模块}-application/{测试目录}/{包路径}/service/impl/{ServiceName}Test` |
294
+ | Controller 测试 | `{模块}-application/{测试目录}/{包路径}/controller/{ControllerName}Test` |
295
+ | 测试报告 | `{TEST_REPORT_DIR}/{模块编号}-{模块名}_单元测试报告.md` |
303
296
 
304
297
  ## 输出
305
298
 
306
299
  ### 文件命名
307
300
 
308
- | 文件类型 | 命名规则 | 示例 |
309
- | --------------- | ------------------------------------- | ----------------------------------- |
310
- | Service 测试 | `{ServiceName}Test.java` | `CrmProductServiceTest.java` |
311
- | Controller 测试 | `{ControllerName}Test.java` | `CrmProductControllerTest.java` |
312
- | 测试报告 | `{模块编号}-{模块名}_单元测试报告.md` | `M01-01-产品主数据_单元测试报告.md` |
301
+ | 文件类型 | 命名规则 | 示例 |
302
+ | --------------- | --------------------------------------- | ------------------------------------- |
303
+ | Service 测试 | `{ServiceName}Test.{ext}`(按后端规范) | `CrmProductServiceTest.java` |
304
+ | Controller 测试 | `{ControllerName}Test.{ext}`(按后端规范) | `CrmProductControllerTest.java` |
305
+ | 测试报告 | `{模块编号}-{模块名}_单元测试报告.md` | `M01-01-产品主数据_单元测试报告.md` |
313
306
 
314
307
  ### 输出目录映射
315
308
 
316
- 测试代码目录根据系统设计文档的模块元数据确定:
309
+ 测试代码目录根据系统设计文档的模块元数据和后端规范确定:
317
310
 
318
- | 系统设计文档中的模块 | 测试代码根路径 |
319
- | -------------------- | ---------------------------------------------------------------------------------- |
320
- | 3100-crm-mdm | `crm-service/3100-crm-mdm/3100-crm-mdm-application/src/test/java/` |
321
- | 3103-crm-contract | `crm-service/3103-crm-contract/3103-crm-contract-application/src/test/java/` |
322
- | 3104-crm-fulfillment | `crm-service/3104-crm-fulfillment/3104-crm-fulfillment-application/src/test/java/` |
311
+ | 系统设计文档中的模块 | 测试代码根路径 |
312
+ | -------------------- | -------------------------------------------- |
313
+ | 各业务模块 | `{模块}-application/{后端规范测试目录}/` |
323
314
 
324
315
  ## 测试用例编号规则
325
316
 
@@ -345,14 +336,14 @@ class {ClassName}Test {
345
336
  ### 测试代码质量
346
337
 
347
338
  - [ ] 每个 Service 方法至少 3 个测试用例(正常+异常+边界)
348
- - [ ] 每个 Controller 端点至少 2 个测试用例(正常+dto null)
339
+ - [ ] 每个 Controller 端点至少 2 个测试用例(正常+入参为 null)
349
340
  - [ ] 测试方法命名规范:`methodName_scenarioDescription`
350
- - [ ] @DisplayName 包含 T0xx 编号和 [US-xx] 关联
341
+ - [ ] 测试显示名称包含 T0xx 编号和 [US-xx] 关联(按后端规范的标注方式)
351
342
  - [ ] Mock 数据使用真实业务数据,不使用无意义字符串
352
- - [ ] Service 测试使用 `@Spy + @InjectMocks`
353
- - [ ] Controller 测试使用 `@InjectMocks`
354
- - [ ] 异常测试使用 `assertThrows` 并验证异常类型
355
- - [ ] 无 import 未使用的类
343
+ - [ ] Service 测试按后端规范选择 Spy/InjectMocks 策略
344
+ - [ ] Controller 测试按后端规范使用 InjectMocks
345
+ - [ ] 异常测试按后端规范的断言方式验证异常类型
346
+ - [ ] 无未使用的引用/导入
356
347
  - [ ] 测试类在正确的包路径下
357
348
 
358
349
  ### 测试报告质量
@@ -375,11 +366,11 @@ class {ClassName}Test {
375
366
  ## 约束
376
367
 
377
368
  - **仅生成测试代码和测试报告**:不修改业务代码
378
- - **遵循项目现有测试模式**:参照已有的 `*Test.java` 文件风格
379
- - **不执行测试**:生成代码后不自动运行 `mvn test`
369
+ - **遵循项目现有测试模式**:参照已有的测试文件风格
370
+ - **不执行测试**:生成代码后不自动运行测试命令
380
371
  - **不生成集成测试**:仅 Service 层单元测试 + Controller 层单元测试
381
- - **禁止 QueryWrapper**:测试中不直接使用 QueryWrapper 构造查询条件
382
- - **mock 继承方法**:对 `BaseCommonServer` 的 `getById`/`save`/`updateById`/`deleteById` 使用 `doReturn(...).when(spy).method(...)` 模式
372
+ - **禁止绕过数据访问层**:测试中不直接构造数据访问层的查询对象
373
+ - **mock 继承方法**:对基类的数据访问方法(如 getById/save/updateById/deleteById 等,按后端规范)使用 mock 模式
383
374
  - **测试独立性**:每个测试方法独立运行,不依赖其他测试方法的执行顺序或结果
384
375
 
385
376
  ## 触发关键词
@@ -0,0 +1,7 @@
1
+ ---
2
+ name: grill-me
3
+ description: A relentless interview to sharpen a plan or design.
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ Run a `/grilling` session.
@@ -0,0 +1,5 @@
1
+ interface:
2
+ display_name: "Grill Me"
3
+ short_description: "Sharpen a plan through interview"
4
+ policy:
5
+ allow_implicit_invocation: false