jsharness 1.12.2 → 1.12.3

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.
@@ -46,10 +46,12 @@ outputFormat: .harness/doc/test-report/test-report-{task-id}.md
46
46
  3. 记录和跟踪缺陷
47
47
  4. 输出完整的测试报告
48
48
  5. 评估回归风险
49
+ 6. 设计阶段测试用例编写(使用 test-case-designer Skill)
49
50
 
50
51
  ## 测试覆盖矩阵
51
52
  | 测试类型 | 执行时机 | 负责人 | 必须? | 引用Skill |
52
53
  |----------|----------|--------|-------|-----------|
54
+ | 测试用例设计 | 设计阶段 | Tester | ✅ 必须 | test-case-designer |
53
55
  | 单元测试 | 开发时 | Developer | ✅ 必须 | test-unit |
54
56
  | 静态检查 | 每次 commit | Dev/CI | ✅ 必须 | lint-check |
55
57
  | API 集成测试 | PR 前 | Tester | ✅ 必须 | test-api |
@@ -34,6 +34,34 @@ mcp_server:
34
34
  credentials_ref: "DOCKER_REGISTRY_TOKEN"
35
35
  enabled: false # 阶段二才启用
36
36
 
37
+ # === 基础设施系统 ===
38
+ nacos:
39
+ type: "nacos_api"
40
+ base_url: "${NACOS_ADDR:http://localhost:8848}"
41
+ username_ref: "NACOS_USERNAME" # 环境变量注入,禁止硬编码
42
+ password_ref: "NACOS_PASSWORD"
43
+ enabled: true
44
+ description: "Nacos 3.0 — 服务注册发现 + 配置管理"
45
+
46
+ mysql:
47
+ type: "mysql_api"
48
+ host: "${MYSQL_HOST:localhost}"
49
+ port: "${MYSQL_PORT:3306}"
50
+ database: "${MYSQL_DATABASE:jieshun}"
51
+ username_ref: "MYSQL_USERNAME"
52
+ password_ref: "MYSQL_PASSWORD"
53
+ enabled: true
54
+ description: "MySQL 8.0 — 主数据存储(utf8mb4)"
55
+
56
+ redis:
57
+ type: "redis_api"
58
+ host: "${REDIS_HOST:localhost}"
59
+ port: "${REDIS_PORT:6379}"
60
+ password_ref: "REDIS_PASSWORD"
61
+ database: "${REDIS_DATABASE:0}"
62
+ enabled: true
63
+ description: "Redis 5.x — 缓存 + 分布式锁(Redisson)"
64
+
37
65
  # 安全设置
38
66
  security:
39
67
  rate_limit:
@@ -44,6 +72,12 @@ mcp_server:
44
72
  - "git:*" # Git 操作(阶段二细分)
45
73
  - "ci:status:read" # CI 状态读取
46
74
  - "issue:list" # Issue 列表读取
75
+ - "nacos:config:read" # Nacos 配置读取
76
+ - "nacos:service:read" # Nacos 服务发现读取
77
+ - "mysql:status:read" # MySQL 状态读取
78
+ - "mysql:schema:read" # MySQL 表结构读取
79
+ - "redis:info:read" # Redis 信息读取
80
+ - "redis:key:read" # Redis Key TTL/类型读取
47
81
  ```
48
82
 
49
83
  ## 阶段一:只读集成 Tools 定义
@@ -191,6 +225,231 @@ mcp_server:
191
225
 
192
226
  ---
193
227
 
228
+ # ════════════════════════════════════════════════════════
229
+ # 基础设施 Tools 定义(Nacos / MySQL / Redis)
230
+ # ════════════════════════════════════════════════════════
231
+
232
+ > **安全原则**: 所有基础设施 Tool 均为只读,禁止通过 MCP 修改配置/数据/缓存值
233
+
234
+ ## Nacos 只读 Tools
235
+
236
+ ```javascript
237
+ // mcp/tools/nacos-read.js
238
+
239
+ /**
240
+ * Tool: nacos_config_get
241
+ * 读取 Nacos 配置中心指定 DataId 的配置内容
242
+ */
243
+ {
244
+ name: "nacos_config_get",
245
+ description: "读取 Nacos 配置中心指定 DataId 的配置内容(只读)",
246
+ parameters: {
247
+ dataId: { type: "string", description: "配置 DataId(如 jieshun-app-server.yaml)" },
248
+ group: { type: "string", description: "配置 Group", default: "DEFAULT_GROUP" },
249
+ namespace: { type: "string", description: "命名空间 ID", optional: true, default: "public" }
250
+ },
251
+ readOnly: true,
252
+ handler: async ({ dataId, group, namespace }) => {
253
+ // GET /nacos/v1/cs/configs?dataId=...&group=...&tenant=...
254
+ // 返回配置内容(YAML/Properties 文本)
255
+ }
256
+ }
257
+
258
+ /**
259
+ * Tool: nacos_config_list
260
+ * 列出 Nacos 配置中心指定 Group 下的配置列表
261
+ */
262
+ {
263
+ name: "nacos_config_list",
264
+ description: "列出 Nacos 配置中心指定 Group 下的所有配置项(只读)",
265
+ parameters: {
266
+ group: { type: "string", description: "配置 Group", optional: true, default: "DEFAULT_GROUP" },
267
+ namespace: { type: "string", description: "命名空间 ID", optional: true, default: "public" },
268
+ page: { type: "number", description: "页码", default: 1 },
269
+ pageSize: { type: "number", description: "每页数量", default: 50 }
270
+ },
271
+ readOnly: true
272
+ }
273
+
274
+ /**
275
+ * Tool: nacos_service_list
276
+ * 列出注册到 Nacos 的服务实例
277
+ */
278
+ {
279
+ name: "nacos_service_list",
280
+ description: "列出 Nacos 注册中心的所有服务实例(服务发现,只读)",
281
+ parameters: {
282
+ namespace: { type: "string", description: "命名空间 ID", optional: true, default: "public" },
283
+ groupName: { type: "string", description: "服务分组", optional: true, default: "DEFAULT_GROUP" },
284
+ serviceName: { type: "string", description: "服务名过滤(可选)", optional: true },
285
+ healthyOnly: { type: "boolean", description: "仅健康实例", default: true }
286
+ },
287
+ readOnly: true
288
+ }
289
+
290
+ /**
291
+ * Tool: nacos_service_detail
292
+ * 获取指定服务实例的详细信息
293
+ */
294
+ {
295
+ name: "nacos_service_detail",
296
+ description: "获取 Nacos 中指定服务实例的详细信息(IP、端口、权重、健康状态)",
297
+ parameters: {
298
+ serviceName: { type: "string", description: "服务名" },
299
+ namespace: { type: "string", description: "命名空间 ID", optional: true, default: "public" },
300
+ groupName: { type: "string", description: "服务分组", optional: true, default: "DEFAULT_GROUP" }
301
+ },
302
+ readOnly: true
303
+ }
304
+ ```
305
+
306
+ ## MySQL 只读 Tools
307
+
308
+ ```javascript
309
+ // mcp/tools/mysql-read.js
310
+
311
+ /**
312
+ * Tool: mysql_query_status
313
+ * 查询 MySQL 服务器状态信息
314
+ */
315
+ {
316
+ name: "mysql_query_status",
317
+ description: "查询 MySQL 服务器运行状态(连接数、线程数、QPS 等,只读)",
318
+ parameters: {
319
+ metrics: {
320
+ type: "array",
321
+ description: "需要查询的状态指标",
322
+ optional: true,
323
+ default: ["Threads_connected", "Threads_running", "Queries", "Slow_queries"]
324
+ }
325
+ },
326
+ readOnly: true,
327
+ handler: async ({ metrics }) => {
328
+ // 执行 SHOW STATUS LIKE 'Threads%' 等
329
+ // 返回各指标的当前值
330
+ }
331
+ }
332
+
333
+ /**
334
+ * Tool: mysql_schema_list
335
+ * 列出指定数据库的表结构概要
336
+ */
337
+ {
338
+ name: "mysql_schema_list",
339
+ description: "列出 MySQL 指定数据库中的表名和行数概要(不读取业务数据,只读)",
340
+ parameters: {
341
+ database: { type: "string", description: "数据库名", optional: true },
342
+ tablePattern: { type: "string", description: "表名匹配模式(LIKE)", optional: true }
343
+ },
344
+ readOnly: true
345
+ }
346
+
347
+ /**
348
+ * Tool: mysql_table_structure
349
+ * 查询指定表的 DDL 结构
350
+ */
351
+ {
352
+ name: "mysql_table_structure",
353
+ description: "获取 MySQL 表的 CREATE TABLE 语句(表结构定义,只读)",
354
+ parameters: {
355
+ table: { type: "string", description: "表名" },
356
+ database: { type: "string", description: "数据库名", optional: true }
357
+ },
358
+ readOnly: true
359
+ }
360
+
361
+ /**
362
+ * Tool: mysql_index_list
363
+ * 查询指定表的索引信息
364
+ */
365
+ {
366
+ name: "mysql_index_list",
367
+ description: "获取 MySQL 表的索引定义(SHOW INDEX,只读)",
368
+ parameters: {
369
+ table: { type: "string", description: "表名" },
370
+ database: { type: "string", description: "数据库名", optional: true }
371
+ },
372
+ readOnly: true
373
+ }
374
+ ```
375
+
376
+ ## Redis 只读 Tools
377
+
378
+ ```javascript
379
+ // mcp/tools/redis-read.js
380
+
381
+ /**
382
+ * Tool: redis_server_info
383
+ * 查询 Redis 服务器信息
384
+ */
385
+ {
386
+ name: "redis_server_info",
387
+ description: "查询 Redis 服务器运行信息(内存、连接数、命中率等,只读)",
388
+ parameters: {
389
+ sections: {
390
+ type: "array",
391
+ description: "需要查询的 INFO 区段",
392
+ optional: true,
393
+ default: ["Server", "Memory", "Clients", "Stats", "Keyspace"]
394
+ }
395
+ },
396
+ readOnly: true,
397
+ handler: async ({ sections }) => {
398
+ // 执行 INFO Server / INFO Memory 等
399
+ // 返回关键指标:used_memory, connected_clients, keyspace_hits/misses
400
+ }
401
+ }
402
+
403
+ /**
404
+ * Tool: redis_key_scan
405
+ * 扫描 Redis 中匹配模式的 Key 列表
406
+ */
407
+ {
408
+ name: "redis_key_scan",
409
+ description: "扫描 Redis 中匹配模式的 Key 列表(不读取值,只读)",
410
+ parameters: {
411
+ pattern: { type: "string", description: "Key 匹配模式(如 user:login:token:*)", default: "*" },
412
+ count: { type: "number", description: "扫描数量限制", default: 100 },
413
+ database: { type: "number", description: "Redis 数据库编号", optional: true, default: 0 }
414
+ },
415
+ readOnly: true
416
+ }
417
+
418
+ /**
419
+ * Tool: redis_key_ttl
420
+ * 查询指定 Key 的 TTL 和类型
421
+ */
422
+ {
423
+ name: "redis_key_ttl",
424
+ description: "查询 Redis Key 的剩余过期时间和数据类型(只读,不返回 value)",
425
+ parameters: {
426
+ key: { type: "string", description: "Redis Key 名称" },
427
+ database: { type: "number", description: "Redis 数据库编号", optional: true, default: 0 }
428
+ },
429
+ readOnly: true,
430
+ handler: async ({ key, database }) => {
431
+ // 执行 TTL key / TYPE key
432
+ // 返回 { key, type, ttl } — 不返回 value(安全红线)
433
+ }
434
+ }
435
+
436
+ /**
437
+ * Tool: redis_key_type_scan
438
+ * 按 Key 前缀统计各类型数量
439
+ */
440
+ {
441
+ name: "redis_key_type_scan",
442
+ description: "按 Key 前缀统计 Redis 中各类型(String/Hash/List/Set/ZSet)的数量分布(只读)",
443
+ parameters: {
444
+ prefix: { type: "string", description: "Key 前缀(如 user:)", default: "" },
445
+ database: { type: "number", description: "Redis 数据库编号", optional: true, default: 0 }
446
+ },
447
+ readOnly: true
448
+ }
449
+ ```
450
+
451
+ ---
452
+
194
453
  # ════════════════════════════════════════════════════════
195
454
  # Java 后端专属 Tools 定义
196
455
  # ════════════════════════════════════════════════════════
@@ -403,21 +662,44 @@ permission_matrix:
403
662
  - "ci:status:read"
404
663
  - "pr:create" # 阶段二
405
664
  - "pr:read:*"
665
+ - "nacos:config:read" # 读取 Nacos 配置
666
+ - "nacos:service:read" # 读取服务注册信息
667
+ - "mysql:status:read" # 读取 MySQL 状态
668
+ - "mysql:schema:read" # 读取数据库表结构
669
+ - "redis:info:read" # 读取 Redis 服务器信息
670
+ - "redis:key:read" # 读取 Key TTL/类型(不读 value)
406
671
  blocked_tools:
407
672
  - "ci:trigger:*" # 必须审批
408
673
  - "deploy:*"
674
+ - "nacos:config:write" # 禁止修改 Nacos 配置
675
+ - "mysql:data:read" # 禁止读取业务数据(安全红线)
676
+ - "mysql:data:write" # 禁止写入数据
677
+ - "redis:key:value:read" # 禁止读取缓存值(可能含敏感数据)
678
+ - "redis:key:write" # 禁止修改缓存
409
679
 
410
680
  gate_controller:
411
681
  allowed_tools:
412
682
  - "git:read:*"
413
683
  - "ci:status:read"
414
684
  - "security:scan:*"
685
+ - "nacos:config:read" # 读取 Nacos 配置(检查合规性)
686
+ - "nacos:service:read" # 读取服务注册信息(检查健康)
687
+ - "mysql:status:read" # 读取 MySQL 运行状态
688
+ - "mysql:schema:read" # 读取表结构(检查 DDL 合规性)
689
+ - "redis:info:read" # 读取 Redis 运行信息
690
+ - "redis:key:read" # 读取 Key TTL/类型
415
691
 
416
692
  tester:
417
693
  allowed_tools:
418
694
  - "git:read:*"
419
695
  - "ci:status:read"
420
696
  - "ci:logs:read"
697
+ - "nacos:config:read" # 测试环境配置查看
698
+ - "nacos:service:read" # 测试服务状态查看
699
+ - "mysql:status:read" # 测试数据库状态查看
700
+ - "mysql:schema:read" # 测试表结构查看
701
+ - "redis:info:read" # 测试 Redis 信息查看
702
+ - "redis:key:read" # 测试 Key TTL 查看
421
703
  ```
422
704
 
423
705
  ### 凭证注入方案
@@ -20,7 +20,7 @@ enabled: true
20
20
  | # | 禁止内容 | 说明 | 应在哪个阶段 |
21
21
  |---|---------|------|-------------|
22
22
  | DDB-01 | 具体的代码实现和示例 | 含伪代码实现、代码片段 | 开发实现阶段 |
23
- | DDB-02 | 测试相关内容 | 单元测试、功能测试、集成测试用例和方案 | 测试验证阶段 |
23
+ | DDB-02 | 测试执行方案 | 测试执行策略、测试环境配置、自动化测试脚本、测试报告 | 测试验证阶段 |
24
24
  | DDB-03 | 监控和日志设计 | 日志格式、监控指标、告警规则 | 部署/运维阶段 |
25
25
  | DDB-04 | 部署设计 | 部署架构、容器编排、CI/CD 流水线 | 部署/运维阶段 |
26
26
  | DDB-05 | 数据库优化方案 | 索引优化、分库分表策略、SQL 调优 | 开发实现 + 性能优化 |
@@ -44,6 +44,7 @@ enabled: true
44
44
  | DDA-08 | 类图设计 | 核心类的静态结构和关系 |
45
45
  | DDA-09 | 关键实现逻辑 | 文字描述(非代码),阐述核心流程和决策 |
46
46
  | DDA-10 | 影响面分析与风险 | 变更影响范围和缓解策略 |
47
+ | DDA-11 | 测试用例文件引用 | 设计文档可引用独立存放的测试用例文件路径(如 `[用例](../test-cases/xxx/feature-points.md)`),但不得内嵌测试用例内容 |
47
48
 
48
49
  ---
49
50
 
@@ -106,7 +107,8 @@ enabled: true
106
107
  设计文档完成后,方案设计师必须自检:
107
108
 
108
109
  - [ ] 文档中无代码实现和示例(DDB-01)
109
- - [ ] 文档中无测试方案内容(DDB-02)
110
+ - [ ] 文档中无测试执行方案内容(DDB-02)
111
+ - [ ] 测试用例仅引用未内嵌(DDA-11)
110
112
  - [ ] 文档中无监控和日志设计(DDB-03)
111
113
  - [ ] 文档中无部署设计(DDB-04)
112
114
  - [ ] 文档中无数据库优化方案(DDB-05)
@@ -0,0 +1,196 @@
1
+ ---
2
+ name: test-case-designer
3
+ description: 测试用例设计技能 — 提供功能点/周期计划/专项计划三种标准化模板的生成能力,支持在设计阶段由测试工程师编写测试用例
4
+ alwaysApply: false
5
+ enabled: true
6
+ outputPath: .harness/doc/test-cases/
7
+ ---
8
+
9
+ # 测试用例设计技能 (test-case-designer)
10
+
11
+ > **Skill 类型**: 测试设计辅助 Skill
12
+ > **触发场景**: 方案设计完成后、PM 或 solution-designer 请求测试用例设计时
13
+ > **所属 Agent**: tester / solution-designer
14
+ > **作用**: 基于需求文档和设计文档,按标准化模板生成测试用例
15
+
16
+ ---
17
+
18
+ ## 1. 核心职责
19
+
20
+ 作为测试用例设计技能,核心职责是:
21
+
22
+ 1. **基于需求文档和设计文档生成结构化测试用例**
23
+ 2. **提供三种标准化模板:功能点、周期计划、专项计划**
24
+ 3. **确保测试用例与验收标准对齐,作为设计阶段的质量保障产物**
25
+
26
+ ### 1.1 触发条件
27
+
28
+ 以下场景**可以**调用本 Skill:
29
+
30
+ - 方案设计师完成设计文档后,需要测试覆盖度评估
31
+ - PM 或 solution-designer 请求测试用例设计
32
+ - 设计评审阶段需要测试用例支撑
33
+ - 测试工程师在设计阶段提前介入
34
+
35
+ ### 1.2 输入
36
+
37
+ | 输入项 | 来源 | 格式 | 必须 |
38
+ |--------|------|------|------|
39
+ | 需求文档 | `.harness/doc/prd/` 或 `.harness/doc/originRequirements/` | Markdown | 是 |
40
+ | 设计文档 | `.harness/doc/design/{需求名称}/design.md` | Markdown | 是 |
41
+ | 模板类型 | 用户指定 | feature-points / cycle-plan / special-plan / all | 否(默认 all) |
42
+
43
+ ### 1.3 输出
44
+
45
+ | 产出物 | 路径 | 格式 |
46
+ |--------|------|------|
47
+ | 功能点测试用例 | `.harness/doc/test-cases/{需求名称}/feature-points.md` | Markdown 表格 |
48
+ | 周期计划测试用例 | `.harness/doc/test-cases/{需求名称}/cycle-plan.md` | Markdown 表格 |
49
+ | 专项计划测试用例 | `.harness/doc/test-cases/{需求名称}/special-plan.md` | Markdown 表格 |
50
+
51
+ ---
52
+
53
+ ## 2. 执行步骤
54
+
55
+ ### Step 1: 读取输入文档
56
+
57
+ 按以下顺序查找并读取输入文档:
58
+
59
+ 1. **需求文档查找**:
60
+ - 优先:`.harness/doc/prd/requirements-{name}.md`
61
+ - 回退:`.harness/doc/originRequirements/` 下的需求文件
62
+ - 未找到 → 终止并提示用户指定需求文档路径
63
+
64
+ 2. **设计文档查找**:
65
+ - 优先:`.harness/doc/design/{name}/design.md`
66
+ - 回退:`.harness/doc/ttspec/change/{name}/design.md`
67
+ - 未找到 → 警告但允许继续(仅基于需求文档生成)
68
+
69
+ ### Step 2: 确定模板类型
70
+
71
+ - 用户指定模板类型 → 按指定类型生成
72
+ - 用户未指定 → 默认生成全部三种模板
73
+ - 模板类型:`feature-points`(功能点)、`cycle-plan`(周期计划)、`special-plan`(专项计划)、`all`(全部)
74
+
75
+ ### Step 3: 按模板生成测试用例
76
+
77
+ 根据指定的模板类型,按以下格式生成测试用例:
78
+
79
+ #### 3.1 功能点测试用例模板
80
+
81
+ ```markdown
82
+ # 功能点测试用例:{需求名称}
83
+
84
+ > 生成时间:{YYYY-MM-DD}
85
+ > 来源:{需求文档路径} + {设计文档路径}
86
+
87
+ | 所属模块 | 功能点 | 约束条件 | 优先级 |
88
+ |----------|--------|----------|--------|
89
+ | {模块名} | {功能点描述} | {业务约束和前置条件} | {P0/P1/P2/P3} |
90
+ ```
91
+
92
+ **字段说明**:
93
+ - **所属模块**:功能所属的业务模块名称
94
+ - **功能点**:具体测试的功能点描述
95
+ - **约束条件**:功能点的业务约束和前置条件
96
+ - **优先级**:P0(致命)/ P1(严重)/ P2(一般)/ P3(轻微),根据业务影响自动建议
97
+
98
+ **生成规则**:
99
+ - 按需求文档中的模块分组
100
+ - 每个功能点对应一行
101
+ - 优先级根据功能点的业务影响面自动建议(可人工调整)
102
+ - 约束条件从需求文档的业务规则和验收标准中提取
103
+
104
+ #### 3.2 周期计划测试用例模板
105
+
106
+ ```markdown
107
+ # 周期计划测试用例:{需求名称}
108
+
109
+ > 生成时间:{YYYY-MM-DD}
110
+ > 来源:{需求文档路径} + {设计文档路径}
111
+
112
+ | 用例ID | 所属模块 | 功能点 | 用例标题 | 前置条件 | 操作步骤 | 预期结果 | 优先级 | 测试类型 | 备注 |
113
+ |--------|----------|--------|----------|----------|----------|----------|--------|----------|------|
114
+ | TC_{模块缩写}_{序号} | {模块名} | {功能点} | {测试场景标题} | {前置条件} | {步骤描述} | {预期行为} | {P0/P1/P2/P3} | {测试类型} | {补充} |
115
+ ```
116
+
117
+ **字段说明**:
118
+ - **用例ID**:唯一标识,格式 `TC_{模块缩写}_{三位序号}`(如 `TC_USER_001`)
119
+ - **所属模块**:功能所属的业务模块名称
120
+ - **功能点**:具体测试的功能点描述
121
+ - **用例标题**:简洁描述测试场景
122
+ - **前置条件**:执行测试前必须满足的条件
123
+ - **操作步骤**:逐步描述测试操作,编号列出
124
+ - **预期结果**:每步操作对应的期望结果,与操作步骤一一对应
125
+ - **优先级**:P0 / P1 / P2 / P3
126
+ - **测试类型**:功能测试 / 边界测试 / 异常测试 / 兼容性测试 / 安全测试
127
+ - **备注**:补充说明
128
+
129
+ **生成规则**:
130
+ - 每个功能点至少生成 3 个用例:正常场景、边界场景、异常场景
131
+ - 用例ID 按模块缩写自增编号
132
+ - 操作步骤和预期结果必须一一对应
133
+ - 周期计划中的每个用例必须关联到功能点测试用例中的至少一个功能点
134
+ - 必须覆盖功能点中所有约束条件
135
+
136
+ #### 3.3 专项计划测试用例模板
137
+
138
+ ```markdown
139
+ # 专项计划测试用例:{需求名称}
140
+
141
+ > 生成时间:{YYYY-MM-DD}
142
+ > 来源:{需求文档路径} + {设计文档路径}
143
+ > 专项类型:{性能测试/安全测试/兼容性测试/可靠性测试/可访问性测试}
144
+
145
+ | 用例ID | 所属模块 | 功能点 | 用例标题 | 前置条件 | 操作步骤 | 预期结果 | 优先级 | 测试类型 | 备注 |
146
+ |--------|----------|--------|----------|----------|----------|----------|--------|----------|------|
147
+ | SP_{专项缩写}_{序号} | {模块名} | {功能点} | {测试场景标题} | {前置条件} | {步骤描述} | {预期行为} | {P0/P1/P2/P3} | {专项测试类型} | {补充} |
148
+ ```
149
+
150
+ **字段说明**:
151
+ - **用例ID**:唯一标识,格式 `SP_{专项类型缩写}_{三位序号}`(如 `SP_PERF_001`、`SP_SEC_001`)
152
+ - **测试类型**:性能测试 / 安全测试 / 兼容性测试 / 可靠性测试 / 可访问性测试(仅限非功能性测试类别)
153
+ - 其余字段与周期计划相同
154
+
155
+ **专项类型缩写对照**:
156
+
157
+ | 专项类型 | 缩写 | 用例ID前缀 |
158
+ |---------|------|------------|
159
+ | 性能测试 | PERF | SP_PERF_ |
160
+ | 安全测试 | SEC | SP_SEC_ |
161
+ | 兼容性测试 | COMP | SP_COMP_ |
162
+ | 可靠性测试 | REL | SP_REL_ |
163
+ | 可访问性测试 | A11Y | SP_A11Y_ |
164
+
165
+ **生成规则**:
166
+ - 从需求文档中识别非功能性约束(性能指标、安全要求、兼容性要求等)
167
+ - 按专项类型分组生成
168
+ - 每种识别到的专项类型至少生成 2 个用例
169
+ - 测试工程师可手动添加或删除专项测试类型
170
+
171
+ ### Step 4: 写入产出物
172
+
173
+ 1. 创建目录:`.harness/doc/test-cases/{需求名称}/`
174
+ 2. 按模板类型写入对应文件:
175
+ - `feature-points.md` — 功能点测试用例
176
+ - `cycle-plan.md` — 周期计划测试用例
177
+ - `special-plan.md` — 专项计划测试用例
178
+ 3. 如果文件已存在 → 提示用户确认覆盖或追加
179
+
180
+ ---
181
+
182
+ ## 3. 与设计文档的关系
183
+
184
+ - **设计文档可引用测试用例**:在设计文档中使用相对路径引用,格式为 `[功能点测试用例](../test-cases/{需求名称}/feature-points.md)`
185
+ - **测试用例不内嵌到设计文档**:遵循 DDB-02/DDA-11 规则,测试用例作为独立文件存放
186
+ - **测试用例设计 ≠ 测试执行方案**:本 Skill 产出的是"What to test",测试执行方案(How to test)仍属于测试验证阶段
187
+
188
+ ---
189
+
190
+ ## 4. 约束
191
+
192
+ - **不执行测试** — 本 Skill 仅生成测试用例文档,不执行任何测试操作
193
+ - **不修改设计文档** — 测试用例作为独立产出物,不修改上游设计文档
194
+ - **不替代验收标准** — 测试用例基于验收标准展开,但不替代需求文档中的验收标准定义
195
+ - **优先级可调整** — 自动建议的优先级可由测试工程师人工调整
196
+ - **所有输出使用中文**
package/lib/index.mjs CHANGED
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * 多适配器架构:检测 AI 工具 → 转换规则格式 → 注入到对应位置
5
5
  *
6
- * v1.12.2: 新增 frontend-coding-basics 规则(CSS BEM/属性顺序 + JS/TS 基础语法 + 模块化 + 禁止事项)
6
+ * v1.12.3: 新增 test-case-designer Skill(功能点/周期计划/专项计划三种测试用例模板);修改 DDB-02 规则细化测试执行方案与测试用例设计边界;tester Agent 增加设计阶段测试用例编写职责
7
7
  * v1.12.1: 操作手册新增 8 张 Mermaid 可视化图表(三层约束架构图、jsspec三步流程图、标准流程总览图、Agent协作时序图、门禁检查流程图、init注入流程图、Agent调度架构图、交付物流转图)
8
8
  * v1.12.0: 新增 jsspec Skills(explore/propose/deliver/skill-creator)+ design-context-reader;需求分析三步流程;Agents 改为摘要+指引模式;设计文档按需求名称分目录
9
9
  * v1.10.0: 新增 5 个 OpenSpec Skills(openspec-explore/propose/apply/archive/skill-creator),Commands 精简为 Skill 委托模式
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jsharness",
3
- "version": "1.12.2",
3
+ "version": "1.12.3",
4
4
  "description": "Harness Engineering - AI 编程行为工程化管控系统。将 rules/skills/commands/agents 四桶一键注入到 CodeBuddy、Cursor、Copilot、Claude Code 等 AI 工具中。",
5
5
  "main": "lib/index.mjs",
6
6
  "bin": {