csspilot 0.5.0 → 0.7.0

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.
@@ -1,78 +1,84 @@
1
- # TestPilot
2
-
3
- ## What is TestPilot
4
-
5
- TestPilot is an AI Native cross-platform testing infrastructure.
6
-
7
- It lets AI understand, generate, validate and run business tests for Web and Mini Program apps.
8
-
9
- TestPilot is a **tool, not a business test project**. Business cases always belong to the project (`tests/e2e/cases/`), never to TestPilot itself.
10
-
11
- ## When to use
12
-
13
- Use TestPilot when the user wants to:
14
-
15
- - review test requirements for testability
16
- - create business test cases
17
- - validate test cases
18
- - run tests
19
- - inspect test results
20
-
21
- ## Core workflow
22
-
23
- 1. Understand user requirement
24
- 2. Review requirements & produce test points (`workflows/test-requirements-review.md`)
25
- 3. Inspect project
26
- 4. Identify test target
27
- 5. Create TestPilot Case (`tests/e2e/cases/*.yaml`, linked to test point IDs)
28
- 6. Validate Case (`npx csspilot validate`)
29
- 7. Run Case (`npx csspilot run`)
30
- 8. Analyze result (`npx csspilot report`)
31
-
32
- ## Important rules
33
-
34
- - Never directly control Playwright.
35
- - Never directly control WeChatIDE.
36
- - Use TestPilot DSL to describe tests.
37
- - Business cases belong to the project.
38
- - Prefer existing project conventions.
39
- - Never invent locators without evidence.
40
- - Validate before running.
41
-
42
- ## CLI
43
-
44
- ```bash
45
- npx csspilot init # install TestPilot into the current project
46
- npx csspilot validate # validate cases against the DSL
47
- npx csspilot list # list cases (--tag smoke)
48
- npx csspilot run # run cases (file paths / --tag)
49
- npx csspilot report # generate JSON + HTML report
50
- npx csspilot doctor # health check (config / cases / adapters / env / server)
51
- npx csspilot ci init # generate TestPilot CI workflow template
52
- npx csspilot sync-metadata # sync case metadata to TestPilot Server (CI, after git push)
53
- ```
54
-
55
- ## Project context
56
-
57
- Read `references/` first (generated by `csspilot init` for this project):
58
-
59
- - `references/project.md` — project name / type / test dirs / available adapters
60
- - `references/test-conventions.md` — the testing rules this project enforces
61
- - `references/adapters.md` — detected adapter status
62
-
63
-
64
- ## Directory map (business project)
65
-
66
- - `.agents/skills/testpilot/` — this skill (AI usage spec)
67
- - `.testpilot/` — TestPilot runtime state and artifacts
68
- - `tests/e2e/cases/` — business cases
69
- - `testpilot.yaml` — project-level TestPilot config
70
-
71
- ## Further reading
72
-
73
- - `rules/case-design.md` — what a case is, evidence-first generation
74
- - `rules/dsl.md` — case structure and the V0.1 action set
75
- - `rules/locator.md` — locator forms and the no-invention rule
76
- - `rules/assertion.md` — assertions and variable references
77
- - `workflows/test-requirements-review.md` — requirements review, test point checklist
78
- - `workflows/` — step-by-step workflows (review / create / validate / run / analyze)
1
+ # TestPilot
2
+
3
+ ## What is TestPilot
4
+
5
+ TestPilot is an AI Native cross-platform testing infrastructure.
6
+
7
+ It lets AI understand, generate, validate and run business tests for Web and Mini Program apps.
8
+
9
+ TestPilot is a **tool, not a business test project**. Business cases always belong to the project (`tests/e2e/cases/`), never to TestPilot itself.
10
+
11
+ ## When to use
12
+
13
+ Use TestPilot when the user wants to:
14
+
15
+ - review test requirements for testability
16
+ - create business test cases
17
+ - validate test cases
18
+ - run tests
19
+ - inspect test results
20
+
21
+ ## Core workflow
22
+
23
+ 1. Understand user requirement
24
+ 2. Review requirements, expand the rule matrix, and map QA coverage (`workflows/test-requirements-review.md`)
25
+ 3. Inspect project
26
+ 4. Identify test target
27
+ 5. Create TestPilot Case (`tests/e2e/cases/*.yaml`, linked to test point IDs)
28
+ 6. Validate Case (`npx csspilot validate`)
29
+ 7. Run Case (`npx csspilot run`)
30
+ 8. Analyze result (`npx csspilot report`)
31
+
32
+ ## Important rules
33
+
34
+ - Never directly control Playwright.
35
+ - Never directly control WeChatIDE.
36
+ - Use TestPilot DSL to describe tests.
37
+ - Business cases belong to the project.
38
+ - Prefer existing project conventions.
39
+ - Never invent locators without evidence.
40
+ - Validate before running.
41
+ - Generate only evidence-backed `requires`; never assume every project has accounts, coupons, promotions, or PPM.
42
+ - Use data-driven Case groups only when the steps are the same and each row remains one decidable rule/data point.
43
+
44
+ ## CLI
45
+
46
+ ```bash
47
+ npx csspilot init # install TestPilot into the current project
48
+ npx csspilot validate # validate cases against the DSL
49
+ npx csspilot list # list cases (--tag smoke)
50
+ npx csspilot run # run cases (file paths / --tag)
51
+ npx csspilot report # generate JSON + HTML report
52
+ npx csspilot doctor # health check (config / cases / adapters / env / server)
53
+ npx csspilot ci init # generate TestPilot CI workflow template
54
+ npx csspilot sync-metadata # sync case metadata to TestPilot Server (CI, after git push)
55
+ ```
56
+
57
+ `run` exit codes encode a three-way verdict: `1` = product regression or inconclusive (assertion / prerequisite variable missing), `2` = blocked by environment or missing fixture/account (NOT a product regression — fix the environment, do not file a bug), `0` = pass or skipped. Unknown error codes always count as product failure. In CI, treat **both 1 and 2 as failures** (2 only routes to environment debugging); a case with a missing fixture is blocked while the remaining cases in the same run still execute.
58
+
59
+ ## Project context
60
+
61
+ Read `references/` first (generated by `csspilot init` for this project):
62
+
63
+ - `references/project.md` — project name / type / test dirs / available adapters
64
+ - `references/test-conventions.md` — the testing rules this project enforces
65
+ - `references/adapters.md` — detected adapter status
66
+
67
+
68
+ ## Directory map (business project)
69
+
70
+ - `.agents/skills/testpilot/` — this skill (AI usage spec)
71
+ - `.testpilot/` — TestPilot runtime state and artifacts
72
+ - `tests/e2e/cases/` — business cases
73
+ - `tests/e2e/data/` — YAML/JSON fixtures and dataset rows
74
+ - `tests/e2e/reviews/` — requirement matrix and QA coverage artifacts
75
+ - `testpilot.yaml` — project-level TestPilot config
76
+
77
+ ## Further reading
78
+
79
+ - `rules/case-design.md` — what a case is, evidence-first generation
80
+ - `rules/dsl.md` — case structure and the V0.1 action set
81
+ - `rules/locator.md` — locator forms and the no-invention rule
82
+ - `rules/assertion.md` — assertions and variable references
83
+ - `workflows/test-requirements-review.md` — requirements review, test point checklist
84
+ - `workflows/` — step-by-step workflows (review / create / validate / run / analyze)
@@ -2,7 +2,7 @@
2
2
  # `npx csspilot init` 会把整个 skills/testpilot/ 安装到业务项目 .agents/skills/testpilot/
3
3
  id: testpilot
4
4
  name: TestPilot
5
- version: 0.5.0
5
+ version: 0.6.0
6
6
 
7
7
  description: >
8
8
  AI Native cross-platform testing skill.
@@ -4,3 +4,11 @@
4
4
  - `expected` 支持 `${variable}` 变量引用,变量来自之前的 `extract` 步骤(存于 ExecutionContext,可跨端传递,如小程序提取订单号 → Web 端断言)。
5
5
  - 断言必须对应真实业务预期(如订单号出现在 Web 后台),不写恒真断言。
6
6
  - 断言失败不一定是 Case 错误:先分析 Evidence(截图 / trace / log),判断是用例问题还是产品 bug,再决定修改 Case 还是上报问题。
7
+
8
+ ## 请求次数断言
9
+
10
+ - UI 操作需要验证“只请求一次”时使用 `expectRequests`,不要用 wait 或页面文案间接推断。
11
+ - 匹配条件是可选 `method` + 必填 `urlContains`;`count` 是精确次数,不是最小次数。
12
+ - `windowMs` 是动作完成后的观察窗口,应取业务可合理完成的最小值。
13
+ - Web 和 MiniApp 观察器必须透明调用真实请求,不得 mock 响应或改变业务行为。
14
+ - URL 证据会隐藏 query 值;Case 中不要把 token 等秘密直接写入 `urlContains`。
@@ -1,29 +1,47 @@
1
- # Case 设计规范
2
-
3
- ## Case 属于业务项目
4
-
5
- - Case 只存在于业务项目的 `tests/e2e/cases/`,永远不要写进 TestPilot 仓库的 `packages/`。
6
- - 一个 Case 描述一条完整的业务流程(如:创建订单、提交退款),不是单个页面操作。
7
- - `id` 使用 kebab-case,与文件名一致:`order-create.yaml` → `id: order-create`。
8
-
9
- ## AI 不能凭空生成测试
10
-
11
- 正确路径:
12
-
13
- ```text
14
- 用户需求 → 代码 / 页面 / 配置 → Evidence → 测试步骤 → Case
15
- ```
16
-
17
- 禁止路径:
18
-
19
- ```text
20
- 用户需求 → AI 猜 → Case
21
- ```
22
-
23
- 看到"测试登录"就直接写 `locator: { text: 登录 }` 是错误的。
24
- 必须先阅读项目真实页面/代码,确认元素存在、文案准确,再生成步骤。
25
-
26
- ## 业务数据
27
-
28
- - 不要把业务账号、密码硬编码进 Case。
29
- - 测试数据放业务项目 `tests/e2e/fixtures/` 或 `tests/e2e/data/`,Case 中通过变量引用。
1
+ # Case 设计规范
2
+
3
+ ## Case 属于业务项目
4
+
5
+ - Case 只存在于业务项目的 `tests/e2e/cases/`,永远不要写进 TestPilot 仓库的 `packages/`。
6
+ - 一个 Case 描述一条完整的业务流程(如:创建订单、提交退款),不是单个页面操作。
7
+ - `id` 使用 kebab-case,与文件名一致:`order-create.yaml` → `id: order-create`。
8
+
9
+ ## Case 与数据行
10
+
11
+ - 默认一条独立业务流程一个 Case。
12
+ - 多个测试点的步骤模板完全相同、差异仅为输入数据和可判定预期时,允许合并为一个 data-driven Case。
13
+ - 每个 dataset 行必须有稳定唯一的 rowId,并仍保持“一个可判定规则/数据点”粒度。
14
+ - 不同页面路径、不同角色权限流程、不同清理策略或不同断言结构不得为了减少 Case 数量而强行合并。
15
+ - 报告按 `caseId#rowId` 标识执行结果;统计时每个数据行算一次执行。
16
+
17
+ ## AI 不能凭空生成测试
18
+
19
+ 正确路径:
20
+
21
+ ```text
22
+ 用户需求 → 代码 / 页面 / 配置 → Evidence → 测试步骤 → Case
23
+ ```
24
+
25
+ 禁止路径:
26
+
27
+ ```text
28
+ 用户需求 → AI 猜 → Case
29
+ ```
30
+
31
+ 看到"测试登录"就直接写 `locator: { text: 登录 }` 是错误的。
32
+ 必须先阅读项目真实页面/代码,确认元素存在、文案准确,再生成步骤。
33
+
34
+ ## 业务数据
35
+
36
+ - 不要把业务账号、密码硬编码进 Case。
37
+ - 测试参数统一放业务项目 `tests/e2e/data/` 的 YAML/JSON 文件,Case 通过 `${fixture.*}` / `${dataset.*}` 引用。
38
+ - `requires` 只声明当前 Case 有证据支持的静态依赖。AI 必须从 PRD/Spec、代码、配置、已有 Case 或 QA 用例识别,不得因为业务名称自动发明账号、优惠券、PPM 等字段。
39
+ - `.env` 提供当前环境的实际值;只有 `testpilot.yaml variables` 白名单映射的值可通过 `${variable.*}` 暴露给 Case。
40
+ - 缺失依赖会使该数据行 `skipped(dependency-not-ready)`,这只表示静态值未就绪,不保证远端业务对象有效。
41
+ - setup/teardown 优先使用 API 造数和清理;teardown 必须可重复执行。
42
+
43
+ ## charter:* 视角标签
44
+
45
+ - `charter:` 前缀为评审视角保留标签(命名固定,勿作他用):`charter:persona` / `charter:edge-input` / `charter:numbers-copy` / `charter:state-recovery` / `charter:error-path`。
46
+ - 由需求评审的视角覆盖表驱动写入(见 `workflows/create-case.md`);视角在需求内不适用时不打对应 tag。
47
+ - 按视角抽查覆盖:`npx csspilot list --tag charter:error-path`。
@@ -6,11 +6,29 @@ Case 是 YAML 文件,V0.1 顶层结构:
6
6
  id: order-create # kebab-case,与文件名一致
7
7
  name: 用户创建订单 # 人类可读名称
8
8
  accountRef: test-user # 可选:引用环境凭据,用 ${account.username} 等变量,禁止明文密码
9
+ fixtures: # 可选:项目相对路径,仅允许 tests/e2e/data 下的 YAML/JSON
10
+ - tests/e2e/data/products.yaml
11
+ datasets: # 可选:同一 steps 按对象数组逐行执行
12
+ file: tests/e2e/data/checkout-rows.yaml
13
+ idField: id
14
+ requires: # 可选:逐行执行前的静态依赖契约
15
+ - fixture.product.styleNo
16
+ - dataset.expectedTotal
17
+ - variable.ppmProjectId
18
+ setup: # 可选:主步骤前执行
19
+ - target: api
20
+ action: request
21
+ url: /test-support/cart/clear
9
22
  steps: # 有序步骤列表
10
23
  - target: miniapp # 执行端:miniapp | web | api
11
24
  action: click # 见下方 Action 表
12
25
  locator: # 定位器(见 rules/locator.md)
13
26
  text: 提交订单
27
+ teardown: # 可选:setup 开始后始终执行
28
+ - target: api
29
+ action: request
30
+ url: /test-support/cart
31
+ method: DELETE
14
32
  ```
15
33
 
16
34
  ## V0.1 稳定 Action
@@ -30,6 +48,50 @@ steps: # 有序步骤列表
30
48
 
31
49
  字段定义最终以 `packages/dsl` 的 zod schema 为准;不要使用表中之外的字段。
32
50
 
51
+ ## Data-driven、fixture 与 variables
52
+
53
+ - fixture 文件根必须是对象;多个文件按顺序深合并,字段冲突直接校验失败。
54
+ - dataset 文件根必须是对象数组;`idField` 默认 `id`,每行值必须非空且唯一。
55
+ - 每个数据行有独立 ExecutionContext,同一 Case 的行之间不能共享 extract 变量。
56
+ - 可用作用域:
57
+ - `${fixture.*}`:合并后的共享 fixture
58
+ - `${dataset.*}`:当前数据行
59
+ - `${account.*}`:`accountRef` 对应凭据
60
+ - `${variable.*}`:`testpilot.yaml variables` 白名单
61
+ - `${name}`:之前 `extract` 产生的运行时变量
62
+ - 禁止 `${env.*}` 或其他方式任意读取进程环境变量。
63
+
64
+ `requires` 只检查路径存在且不是 `null`、空字符串或未解析的 `${ENV_VAR}`。缺失时该行不执行任何阶段,结果为 `skipped`,原因 `dependency-not-ready`。
65
+
66
+ ## setup / steps / teardown
67
+
68
+ 执行顺序固定:
69
+
70
+ 1. `requires` 预检
71
+ 2. `setup`
72
+ 3. `steps`
73
+ 4. `teardown`
74
+
75
+ setup 失败时主结果 failed、跳过主步骤并执行 teardown;主步骤失败也执行 teardown。teardown 失败记 warning,不改变主结果。
76
+
77
+ ## UI 请求次数断言
78
+
79
+ `expectRequests` 可附在 web/miniapp 的 `navigate`、`click`、`input`、`select`:
80
+
81
+ ```yaml
82
+ - target: web
83
+ action: click
84
+ locator:
85
+ css: .submit
86
+ expectRequests:
87
+ - method: POST
88
+ urlContains: /api/orders
89
+ count: 1
90
+ windowMs: 1000
91
+ ```
92
+
93
+ 它只观察并计数,不拦截、不修改响应。断言失败时报告实际次数和已脱敏的匹配 URL。
94
+
33
95
  ## api 端(HTTP 接口测试与造数)
34
96
 
35
97
  `target: api` 走 HTTP 执行端:相对 `url` 按 `testpilot.yaml` 的 `api.baseUrl` 解析。典型用法:API 造数 → UI 操作 → API/JSON 断言的混合编排。
@@ -2,7 +2,7 @@
2
2
 
3
3
  1. 执行 `npx csspilot report` 生成报告。
4
4
  2. 产物位于 `.testpilot/artifacts/runs/<run-id>/`:
5
- - `report.json` —— 结构化结果,AI 优先读这个:`{ generatedAt, summary: { runId, status, totals, cases: [{ caseId, status, steps: [{ index, target, action, status, durationMs, error?, screenshot?, extracted? }] }] }, history(最近 12 次运行趋势), failures(失败分类明细:category / caseId / message) }`;失败步骤的 `category` ∈ assert / element / adapter / env / timeout / other
5
+ - `report.json` —— 结构化结果,AI 优先读这个:`{ generatedAt, summary: { runId, status, totals, cases: [{ caseId, rowId, status, skipReason?, missingDependencies?, warnings?, steps: [{ phase, index, target, action, status, durationMs, error?, screenshot?, extracted?, requestAssertions? }] }] }, history(最近 12 次运行趋势), failures(失败分类明细:category / caseId / message) }`;失败步骤的 `category` ∈ assert / element / adapter / env / timeout / other
6
6
  - `report.html` —— 交互式报告(步骤树、失败分类筛选、历史趋势)
7
7
  - `screenshots/`、`videos/`、`traces/`、`logs/` —— 失败取证
8
8
  3. 失败分析顺序:report.json 中失败步骤的 `category` 与 `error` → 对应 `screenshot` → `logs/run.log` → `events.ndjson`。
@@ -10,4 +10,6 @@
10
10
  - Case 问题(locator 过期、步骤错误)→ 修改 Case,重新 validate → run
11
11
  - 产品 bug → 停止修改 Case,向用户报告证据与结论
12
12
  5. 历史趋势中出现反复失败的用例(intermittent / flaky)要在结论中单独标注。
13
- 6. 不要在未分析 Evidence 的情况下盲目重跑或修改 Case。
13
+ 6. `skipped(dependency-not-ready)` 先按 missingDependencies 补数据,不归类为产品 bug;teardown warning 单独报告,不把已通过主流程改判 failed。
14
+ 7. 请求次数断言失败时比较 `actualCount/count` 和匹配请求摘要,排查重复绑定、重试或双击。
15
+ 8. 不要在未分析 Evidence 的情况下盲目重跑或修改 Case。
@@ -1,16 +1,33 @@
1
- # Workflow:创建测试 Case
2
-
3
- 输入:用户需求,或 `test-requirements-review` 产出的**测试点清单**(推荐先做需求评审)。
4
-
5
- 1. 尚无测试点清单时,先执行 `workflows/test-requirements-review.md`;已有清单则直接使用。
6
- 2. 阅读本 Skill:`rules/dsl.md`、`rules/case-design.md`、`rules/locator.md`。
7
- 3. 分析项目结构:确定被测端(miniapp / web)与业务入口页面。
8
- 4. 针对测试点收集证据(读代码 / DOM / 现有测试),确定业务路径:从入口到业务结果页的完整步骤。
9
- 5. 按 DSL 规范生成 Case,写入 `tests/e2e/cases/<case-id>.yaml`:
10
- - 一条 Case 覆盖一个测试点(或一组强关联测试点)
11
- - Case 的 `description` 注明关联的测试点编号(如 `测试点: TP-001`),保持需求可溯源
12
- - 按评审产出的平台执行信息声明 `accountRef` / `workspace`;发现 `.env` 缺少某平台的地址或凭据变量时,向用户索取后写入 `.env`,**不写进 Case**
13
- 6. 执行 `npx csspilot validate tests/e2e/cases/<case-id>.yaml`。
14
- 7. 校验失败则修复 Case 后重新 validate,直到通过。
15
-
16
- 禁止:跳过第 3-4 步直接生成 Case(AI 不能凭空生成测试)。
1
+ # Workflow:创建测试 Case
2
+
3
+ 输入:用户需求,或 `test-requirements-review` 产出的**测试点清单**(推荐先做需求评审)。
4
+
5
+ 1. 尚无测试点清单时,先执行 `workflows/test-requirements-review.md`;已有清单则直接使用。
6
+ 2. 阅读本 Skill:`rules/dsl.md`、`rules/case-design.md`、`rules/locator.md`。
7
+ 3. 分析项目结构:确定被测端(miniapp / web)与业务入口页面。
8
+ 4. 针对测试点收集证据(读代码 / DOM / 现有测试),确定业务路径:从入口到业务结果页的完整步骤。
9
+ 5. 按 DSL 规范生成 Case,写入 `tests/e2e/cases/<case-id>.yaml`:
10
+ - 一条 Case 覆盖一个测试点(或一组强关联测试点)
11
+ - 多个测试点步骤完全一致、仅数据和预期不同,使用 `datasets` 形成 data-driven Case;否则保持独立 Case
12
+ - Case 的 `description` 注明关联的测试点编号(如 `测试点: TP-001`),保持需求可溯源
13
+ - 按评审产出的平台执行信息声明 `accountRef` / `workspace`;发现 `.env` 缺少某平台的地址或凭据变量时,向用户索取后写入 `.env`,**不写进 Case**
14
+ - 从需求与项目证据中识别最小 `requires`;项目没有账号/优惠/PPM 等概念时不要生成对应依赖
15
+ - 公共参数写入 `tests/e2e/data/` fixture;环境参数先加入 `testpilot.yaml variables` 白名单
16
+ - 造数与清理使用 `setup` / `teardown`;UI 动作需验证接口调用次数时使用 `expectRequests`
17
+ - 把该 Case 关联 TP 的每个 charter 视角写入 `tags`,与既有 tag(如 `smoke`)共存;一个 TP 多视角则多 tag。映射(视角定义见 `test-requirements-review` 步骤 6):
18
+
19
+ | 评审视角 | case tag |
20
+ | --- | --- |
21
+ | persona | `charter:persona` |
22
+ | 边界输入 | `charter:edge-input` |
23
+ | 数字与文案 | `charter:numbers-copy` |
24
+ | 状态恢复 | `charter:state-recovery` |
25
+ | 错误路径 | `charter:error-path` |
26
+
27
+ ```yaml
28
+ tags: [smoke, charter:persona, charter:error-path]
29
+ ```
30
+ 6. 执行 `npx csspilot validate tests/e2e/cases/<case-id>.yaml`。
31
+ 7. 校验失败则修复 Case 后重新 validate,直到通过。
32
+
33
+ 禁止:跳过第 3-4 步直接生成 Case(AI 不能凭空生成测试)。
@@ -17,4 +17,7 @@ CLI → Case Loader → DSL Validator → Execution Engine → Adapter(Playwrigh
17
17
  - 只通过 testpilot CLI 执行测试,不要直接调用 playwright 或 wechat-devtools。
18
18
  - 被测服务需先就绪(如业务后端、本地页面服务),`navigate` 的相对 url 基于 testpilot.yaml 的 `web.baseUrl` 解析。
19
19
  - 环境变量来源:shell / CI secrets,或项目根目录 `.env` 文件(CLI 自动加载,真实环境变量优先);`.env` 含敏感信息,确认已加入 .gitignore。
20
+ - Case 只能读取 `testpilot.yaml variables` 白名单映射后的 `${variable.*}`,不能直接访问任意环境变量。
21
+ - 运行前按 dataset 行展开并预检 `requires`;依赖缺失的行显示 `skipped(dependency-not-ready)`,不是产品失败。
22
+ - 每行按 setup → steps → teardown 执行;teardown warning 不改变主结果。
20
23
  - 运行产物写入 `.testpilot/artifacts/runs/<run-id>/`(screenshots / traces / logs)。
@@ -1,61 +1,143 @@
1
- # Workflow:测试需求评审(可测性评审 + 测试点分析)
2
-
3
- 输入:需求文档 / PRD / 用户的一句话(如"帮我测试用户下单")。
4
- 产出:**测试点清单** + **平台执行信息表** + 澄清问题 + 评审结论。测试点清单是 `create-case` 的正式输入。
5
-
6
- ## 步骤
7
-
8
- 1. **复述理解**:用自己的话列出需求覆盖的功能点与业务流程,向用户确认理解偏差。
9
- 2. **平台盘点**:识别需求涉及的执行端(miniapp / web / api)。跨端需求(如"小程序下单、Web 后台验证")必须逐平台澄清执行信息,见下方"多平台"一节。
10
- 3. **可测性检查清单**(逐项过):
11
- - 验收标准是否明确:输入 / 操作步骤 / 预期结果是否可判定
12
- - 边界与异常:空值、极值、重复提交、并发、权限、网络异常
13
- - 数据准备可行性:测试账号、mock 数据、上下游依赖是否可用
14
- - 平台与入口:miniapp / web 的页面路径与入口是否真实存在(不确定时先看项目代码)
15
- - 回归范围:改动是否影响现有功能,需要哪些已有 Case 回归
16
- 4. **输出测试点清单**,每条包含:
17
-
18
- | 字段 | 说明 |
19
- | --- | --- |
20
- | 编号 | `TP-001` 格式,Case 需回链 |
21
- | 模块 | 所属功能模块 |
22
- | 场景 | 一句话描述验证什么 |
23
- | 类型 | 正向 / 边界 / 异常 |
24
- | 优先级 | P0 / P1 / P2 |
25
- | 平台 | miniapp / web / 双端 |
26
-
27
- 5. **澄清阻塞项**:需求缺失、矛盾、不可判定时,列出问题向用户提问。**不猜测**。
28
- 6. **给出评审结论**:
29
- - 可测:测试点清单完整,直接进入 `create-case`
30
- - 有条件可测:部分测试点依赖澄清,先对可执行部分建 Case
31
- - 不可测:说明缺口,等待需求补充
32
-
33
- ## 多平台:平台执行信息澄清
34
-
35
- 需求涉及多个平台时,**每个平台都必须澄清以下三项**;缺任何一项,该平台相关测试点只能标记"有条件可测",不得开始写 Case:
36
-
37
- | 平台 | 必须澄清 | 落地位置 |
38
- | --- | --- | --- |
39
- | web | 测试地址(baseUrl)+ 页面入口路由 + 登录角色 | `.env` 的 `WEB_BASE_URL` / `TEST_BASE_URL`;`accountRef` |
40
- | miniapp | 小程序项目路径 + 起始页面路由 + 登录角色(连哪个环境后端) | `.env` 的 `MINIAPP_PROJECT_PATH`;`accountRef` |
41
- | api | 服务 baseUrl + 鉴权方式(token / session)+ 账号角色 | `.env` 的 `API_BASE_URL`;`accountRef` |
42
-
43
- 规则:
44
-
45
- - **登录角色**:每个平台确认用什么角色(普通用户 / 管理员 / 游客),映射为 `accountRef`(如 `admin` / `test-user`);真实凭据放 `TESTPILOT_ACCOUNT_<REF大写>` 环境变量或 Server Secrets,**禁止写进 Case**
46
- - **测试地址**:一律指向测试环境,写入 `.env`(如 `WEB_BASE_URL`);**禁止把内网 / 生产地址写进 Case 或 testpilot.yaml**
47
- - **使用 Workspace 的项目**:以上信息应登记为 Workspace 的绑定(项目 → 环境),Case 用 `workspace: <名称>` 声明,不逐条硬编码
48
-
49
- ### 澄清问题示例(多平台需求)
50
-
51
- - Web 后台的测试地址是什么?订单查询页面的入口路由是?
52
- - 小程序连接哪个环境的后端?小程序项目目录在本机哪里?
53
- - 各平台分别用什么角色登录(普通用户 / 管理员)?该角色是否有完成流程所需的权限?
54
- - 这些地址和账号是否已写入 `.env`?缺哪个我来补?
55
-
56
- ## 铁律
57
-
58
- - 没有测试点清单,不要进入 `create-case`。
59
- - 涉及多平台但执行信息(地址 / 入口 / 登录角色)不全时,结论只能是"有条件可测",先澄清再建 Case。
60
- - 评审基于需求 + 项目代码/页面证据;两项都没有时先收集证据,不空谈。
61
- - 每个测试点必须可验证:都能回答"怎么判定通过"。
1
+ # Workflow:测试需求评审(可测性评审 + 测试点分析)
2
+
3
+ 输入:需求文档 / PRD / 用户的一句话(如"帮我测试用户下单")。
4
+ 产出:**原子规则清单** + **规则矩阵** + **测试点清单** + **视角覆盖表** + **QA → TestPilot Coverage Map** + **平台执行信息表** + 澄清问题 + 评审结论。测试点清单是 `create-case` 的正式输入。
5
+
6
+ ## 步骤
7
+
8
+ 1. **复述理解**:用自己的话列出需求覆盖的功能点与业务流程,向用户确认理解偏差。
9
+ 2. **平台盘点**:识别需求涉及的执行端(miniapp / web / api)。跨端需求(如"小程序下单、Web 后台验证")必须逐平台澄清执行信息,见下方"多平台"一节。
10
+ 3. **可测性检查清单**(逐项过):
11
+ - 验收标准是否明确:输入 / 操作步骤 / 预期结果是否可判定
12
+ - 边界与异常:空值、极值、重复提交、并发、权限、网络异常
13
+ - 数据准备可行性:测试账号、mock 数据、上下游依赖是否可用
14
+ - 平台与入口:miniapp / web 的页面路径与入口是否真实存在(不确定时先看项目代码)
15
+ - 回归范围:改动是否影响现有功能,需要哪些已有 Case 回归
16
+ 4. **拆解原子规则**:从验收标准中提取一条条可独立判定的规则或数据点。粒度必须是“一个输入/条件组合对应一个可判断预期”,不能把多个折扣、角色或状态变化塞进一个测试点。
17
+ 5. **建立规则矩阵**:
18
+ - 识别需求中的“类型 × 组合”维度,如折扣类型 × 账号等级 × 门槛边界 × 是否叠加
19
+ - 列出每个维度的值域、来源证据和约束
20
+ - 展开全部有效组合,每个有效组合至少生成一个测试点
21
+ - 互斥、不适用或业务禁止的组合不能静默删除,必须记录排除理由及需求证据
22
+ - 项目没有账号、优惠、PPM 等概念时不得自动添加这些维度
23
+ 6. **套用 charter 视角矩阵**(固定 5 视角,逐视角过 checklist,为每个 TP 标注视角,可多个):
24
+
25
+ | 视角 | tag | 判定问题 |
26
+ | --- | --- | --- |
27
+ | persona | `charter:persona` | 首次用户 / 未登录 / 无权限角色走这个流程会怎样? |
28
+ | 边界输入 | `charter:edge-input` | 空值 / 极值 / 特殊字符 / 超长输入? |
29
+ | 数字与文案 | `charter:numbers-copy` | 金额计算、计数、提示文案是否正确一致? |
30
+ | 状态恢复 | `charter:state-recovery` | reload / 中断 / 返回后状态是否保持? |
31
+ | 错误路径 | `charter:error-path` | 网络失败 / 服务端错误 / 非法操作的表现? |
32
+
33
+ - 规则:每个测试点至少标注一个视角;某视角在本需求内无任何测试点时,**必须显式记录「不适用 + 需求证据」,禁止静默跳过**。
34
+ - **三分判定规则**:视角问题想到需求未覆盖的场景(如重复点击、非法输入、文案细节)时,按「需求是否给出预期结果」当场归类,三选一,禁止静默丢弃:
35
+
36
+ | 去向 | 条件 | 动作 |
37
+ | --- | --- | --- |
38
+ | 纳入 TP | 需求已有该场景的预期结果 | 进步骤 7 测试点清单,打视角 tag,正常进 `create-case` |
39
+ | 澄清问题 | 需求无预期,且出问题伤业务(资损 / 核心流程 / 数据一致性) | 列入澄清问题(步骤 9),标注视角与风险等级;整单结论至多「有条件可测」 |
40
+ | 暂缓 | 需求无预期,且不伤业务 | 视角覆盖表记「暂缓 + 理由」 |
41
+
42
+ 澄清问题得到需求方答复后,回流为新 TP 再进 `create-case`。
43
+
44
+ 7. **输出测试点清单**,每条包含:
45
+
46
+ | 字段 | 说明 |
47
+ | --- | --- |
48
+ | 编号 | `TP-001` 格式,Case 需回链 |
49
+ | 模块 | 所属功能模块 |
50
+ | 场景 | 一句话描述验证什么 |
51
+ | 类型 | 正向 / 边界 / 异常 |
52
+ | 优先级 | P0 / P1 / P2 |
53
+ | 平台 | miniapp / web / 双端 |
54
+ | 视角 | 步骤 6 标注的 charter 视角(可多个) |
55
+
56
+ 8. **对标 QA 用例库**(用户提供时):
57
+ - 将每条 QA 用例映射到一个或多个 TP
58
+ - 标记 `covered` / `partial` / `missing` / `conflict`
59
+ - QA 有而 TestPilot 无的覆盖形成待补 checklist
60
+ - TestPilot 有而 QA 无的覆盖保留并说明来源,不得为追求一致而删除
61
+ - 将完整结果写入 `tests/e2e/reviews/<需求-slug>-coverage.md`,回复中只给摘要和文件路径
62
+ 9. **澄清阻塞项**:需求缺失、矛盾、不可判定时,列出问题向用户提问。**不猜测**。charter 三分判定产生的澄清问题(带视角与风险等级)一并在此列出。
63
+ 10. **给出评审结论**:
64
+ - 可测:测试点清单完整,直接进入 `create-case`
65
+ - 有条件可测:部分测试点依赖澄清,先对可执行部分建 Case
66
+ - 不可测:说明缺口,等待需求补充
67
+
68
+ ## 规则矩阵模板
69
+
70
+ ```markdown
71
+ | 维度 | 值域 | 来源证据 | 约束 |
72
+ | --- | --- | --- | --- |
73
+ | discountType | percentage / fixed | PRD §3.2 | fixed 不参与 VIP 加码 |
74
+ | accountLevel | normal / vip | account.ts:L10-L16 | 游客不可下单 |
75
+
76
+ | 组合 ID | discountType | accountLevel | 有效性 | 预期 / 排除理由 | TP |
77
+ | --- | --- | --- | --- | --- | --- |
78
+ | C-001 | percentage | vip | 有效 | 折扣后再加 VIP 优惠 | TP-001 |
79
+ | C-002 | fixed | vip | 排除 | PRD §3.2 明确 fixed 不叠加 | — |
80
+ ```
81
+
82
+ 矩阵只使用需求、代码、配置、已有 Case 或 QA 用例中的真实维度。缺少证据时提出问题,不得套用电商默认字段。
83
+
84
+ ## QA → TestPilot Coverage Map 模板
85
+
86
+ ```markdown
87
+ | QA Case | 对应 TP | 覆盖状态 | 差异 / 冲突 | 行动 |
88
+ | --- | --- | --- | --- | --- |
89
+ | QA-101 | TP-001 | covered | — | 无 |
90
+ | QA-102 | TP-004 | partial | 缺少上边界 | 补 dataset 行 |
91
+ | QA-103 | — | missing | TestPilot 无对应 TP | 新增 TP 和 Case |
92
+
93
+ ## Missing coverage checklist
94
+ - [ ] QA-103: 新增……
95
+ ```
96
+
97
+ ## 视角覆盖表模板
98
+
99
+ 写入评审产物 `tests/e2e/reviews/<需求-slug>-coverage.md` 末尾:
100
+
101
+ ```markdown
102
+ ## 视角覆盖表
103
+
104
+ | 视角 | 测试点 | 说明 |
105
+ | --- | --- | --- |
106
+ | persona | TP-001, TP-003 | 覆盖首次用户与无权限角色 |
107
+ | edge-input | TP-002 | 覆盖空值与超长输入 |
108
+ | numbers-copy | TP-001 | 金额计算 |
109
+ | state-recovery | 暂缓 | 需求无跨刷新状态(PRD §2 未涉及),不伤业务 |
110
+ | error-path | TP-004 | 支付失败回退;连点提交无预期且涉资损 → 澄清 Q-2 |
111
+ ```
112
+
113
+ ## 多平台:平台执行信息澄清
114
+
115
+ 需求涉及多个平台时,**每个平台都必须澄清以下三项**;缺任何一项,该平台相关测试点只能标记"有条件可测",不得开始写 Case:
116
+
117
+ | 平台 | 必须澄清 | 落地位置 |
118
+ | --- | --- | --- |
119
+ | web | 测试地址(baseUrl)+ 页面入口路由 + 登录角色 | `.env` 的 `WEB_BASE_URL` / `TEST_BASE_URL`;`accountRef` |
120
+ | miniapp | 小程序项目路径 + 起始页面路由 + 登录角色(连哪个环境后端) | `.env` 的 `MINIAPP_PROJECT_PATH`;`accountRef` |
121
+ | api | 服务 baseUrl + 鉴权方式(token / session)+ 账号角色 | `.env` 的 `API_BASE_URL`;`accountRef` |
122
+
123
+ 规则:
124
+
125
+ - **登录角色**:每个平台确认用什么角色(普通用户 / 管理员 / 游客),映射为 `accountRef`(如 `admin` / `test-user`);真实凭据放 `TESTPILOT_ACCOUNT_<REF大写>` 环境变量或 Server Secrets,**禁止写进 Case**
126
+ - **测试地址**:一律指向测试环境,写入 `.env`(如 `WEB_BASE_URL`);**禁止把内网 / 生产地址写进 Case 或 testpilot.yaml**
127
+ - **使用 Workspace 的项目**:以上信息应登记为 Workspace 的绑定(项目 → 环境),Case 用 `workspace: <名称>` 声明,不逐条硬编码
128
+
129
+ ### 澄清问题示例(多平台需求)
130
+
131
+ - Web 后台的测试地址是什么?订单查询页面的入口路由是?
132
+ - 小程序连接哪个环境的后端?小程序项目目录在本机哪里?
133
+ - 各平台分别用什么角色登录(普通用户 / 管理员)?该角色是否有完成流程所需的权限?
134
+ - 这些地址和账号是否已写入 `.env`?缺哪个我来补?
135
+
136
+ ## 铁律
137
+
138
+ - 没有测试点清单,不要进入 `create-case`。
139
+ - 涉及多平台但执行信息(地址 / 入口 / 登录角色)不全时,结论只能是"有条件可测",先澄清再建 Case。
140
+ - 评审基于需求 + 项目代码/页面证据;两项都没有时先收集证据,不空谈。
141
+ - 每个测试点必须可验证:都能回答"怎么判定通过"。
142
+ - 视角覆盖表缺任意一行(含不适用 / 暂缓行)不得给出评审结论。
143
+ - charter 三分判定判为「澄清问题」的场景,必须出现在澄清问题清单中(带视角与风险等级),否则不得给出评审结论。