测试策略(test-strategy)

SkillDev tools

\"How should this be tested?\" Evidence-backed risk map → scope and depth across functional domains and 10 testing-type axes; includes carry signals, excludes reasons. Not for: writing cases, requirement-analysis, pipeline (qa). 回答“这个功能应该怎么测”:风险挂证据(Risk Map),译为功能域+类型域十轴的范围与深度。不用于:写用例、需求建模、流水线。

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the 测试策略(test-strategy) skill

What this skill tells your AI

The instructions your AI receives, as published by fishzjp/qa-skills in skills/test-strategy/SKILL.md and read by ahel’s review.

回答"这个功能应该怎么测"——把风险翻译成两域测试范围与深度。策略位于"需求 → 风险分析 → 策略 → 测试设计 → 用例"链路中,跳过策略直接写用例是本框架明确反对的。

  • 输入:需求模型(需求模型.md;没有则内联轻量研读需求源)、代码仓库、系统架构、历史 Bug
  • 输出(落盘){项目}/测试策略.md(Risk Map + 两域 scope + depth_budget);有 handoff / blocked / 外部执行器轴时另产 {项目}/专项移交_{轴}_{日期}.yaml
  • 边界:不写具体用例(→ test-case-writing);不代替用户裁决(自动化提案、预算裁决均 ⏸ 等确认);覆盖范围限于系统级黑盒(UI / API / 手动 / 专项移交)——单元/集成测试是开发侧职责,本策略的风险评级与"已覆盖"结论均以该层已有保障为假设前提(假设未验证时在测试报告标注,防"系统级全过 = 质量有保障"的误读)

When to Use

  • "这个功能应该怎么测"——需要范围 / 类型 / 深度 / 优先级的策略决策与理由
  • 需要识别风险并评级(Risk Map),作为用例优先级与回归锚点的依据
  • 需要决定测试类型取舍(性能 / 安全 / 可靠 / 兼容等哪些测、测多深、哪些明确不测)并留痕
  • 需要制定自动化计划提案与长期回归策略

When NOT to Use

  • 端到端测试整个需求 → qa 编排
  • 需要系统性需求建模 → requirement-analysis
  • 已有策略、直接写用例 → test-case-writing
  • 代码变更后判断回归范围 → regression-testing(本 skill 的 regression_plan 是长期回归策略,不是某次 diff 的范围选择)

测试策略 Schema(产出结构)

test_strategy:
  feature:
  functional_scope:            # 功能域:范围+深度+理由(含 state / data_consistency 两轴;rationale 每轴必带,示例仅演示写法)
    functional:        { include: true, depth: full,     rationale: "核心资损路径", risk_refs: [R3] }
    boundary:          { include: true, depth: standard, rationale: "入参边界密集(金额/时限)" }
    permission:        { include: true, depth: full,     rationale: "越权高危", risk_refs: [R2] }
    state:             { include: true, depth: standard, rationale: "券状态流转多分支" }
    data_consistency:  { include: true, depth: standard, rationale: "库存与订单跨表一致" }
    regression:        { include: true, depth: standard, rationale: "存量功能回归基线" }
  type_scope:                  # 类型域:十轴全轴必答,每轴单行 flow 风格(校验器按行解析)
    performance:        { decision: include, depth: full,     signals: ["PRD-4.2 SLA", "order_service.go:88"], risk_refs: [R3], executor: k6, execution_status: blocked, todo: "向运维索取独立压测环境", handoff_ref: "专项移交_性能_{日期}.yaml" }
    security_business:  { decision: include, depth: standard, signals: ["多角色", "内部信号:permission≥standard"] }
    reliability:        { decision: include, depth: standard, signals: ["retry: pay_service.go:41"] }
    concurrency:        { decision: include, depth: standard, signals: ["库存扣减", "S级复核: check-then-write 命中 cart_service.go:41"] }
    compatibility:      { decision: include, depth: light,    signals: ["有前端"] }
    accessibility:      { decision: include, depth: light,    signals: ["有前端"] }
    visual:             { decision: include, depth: light,    signals: ["有前端"] }
    i18n:               { decision: exclude,  rationale: "需求信号(海外/多语言/RTL)未命中;无代码仓库", scanned: ["需求信号(G)"] }
    migration:          { decision: include, depth: standard, signals: ["migrations/2026-08-x.sql"] }
    contract_integration: { decision: include, depth: standard, signals: ["外部风控依赖"] }
  depth_budget:                # full ≤3(两域合并计);被裁 Critical 轴走预算裁决
    full_axes: [functional, permission, performance]
    ranking_rationale: "R3(资损 Critical) > R2(越权 High) > ..."
  automation_plan:            # 哪些用例自动化、用什么框架(提案,⏸ 等用户确认)
  regression_plan:            # 回归策略(锚点用例、回归节奏)
  risk_map_ref:               # 指向 Risk Map(本文档内嵌,每条风险含证据)

字段口径:signals 引用需求章节 / 文件:行 / 矩阵内部信号;scanned 为 exclude 的 G+S 双清单(项尾标 (G)/(S));executor 缺省视为 agent,非 agent(k6 / locust 等)必须带 handoff_refexecution_status ∈ ready / blocked / done,exclude 轴省略。深度档位只取三值:full(逐格全覆盖)/ standard(主干+重点异常)/ light(抽样+冒烟)——"不测"不是深度而是范围决策:功能域写 include: false(挂 rationale),类型域写 decision: excludehandoff,均须挂理由(校验器会拒绝 depth 里出现其他值)。

格式硬约束(防弱模型格式漂移):type_scope 每轴必须写成一行 flow 风格,形如 performance: { decision: include, depth: standard, signals: ["..."] }——禁止把一个轴拆成 decision / depth / signals 多行块式(校验器按行解析,块式 = 校验失败 = 该轴视同未决策)。写之前先照抄上一行的形状。依据:弱模型实测近半数样本出现块式漂移致解析失败,决策内容本身无恙——纯格式损耗。

工作流

1. 输入研读

  • 读需求模型(无则读原始需求源做轻量研读);有代码 → 索取仓库(路径/分支/diff),确认实现形态(有无 UI、接口面、数据流)
  • 收集历史 Bug(同功能区/同模块),历史缺陷密度是 Likelihood 的估计输入与升降档 R3 的触发输入

2. 风险识别与评级(此时加载 ../core/risk-model.md

  • 维度扫风险:功能域维度(权限 / 数据一致性 / 边界 / 状态流转 / 资损——五维与第 3 步 scope 六轴的对应关系见 ../core/risk-model.md 的 dimension 注释)+ 类型域轴名(并发 / 可靠 / 安全 / 性能 / 兼容 / 迁移 / 契约——与矩阵轴同源)
  • 每条风险(R1、R2…)按模型评级:Impact × Likelihood(各 1–5)→ Critical/High/Medium/Low,每条强制带 evidence——没有证据的风险评级视为无效评级
  • 方法选择参考 ../core/testing-principles.md 第 2 节(按功能特征选设计方法,决定功能域各轴的深度理由)

3. 功能域范围决策

逐轴决定 include / depth / rationale(functional / boundary / permission / state / data_consistency / regression):

  • 风险等级 → 用例优先级映射按 ../core/risk-model.md 第 3 节执行(Critical 必有 P0 且为回归锚点……),偏离显式说明理由
  • 不测的也要写理由——"为什么不测"与"为什么测"同等重要
  • permission 高深度(≥standard)同时是轴 2 业务安全的内部纳入信号(裁决见矩阵第 2 节)

4. 类型域全轴扫描(此时按组加载 ../core/test-type-matrix.md 对应小节)

分轴组推进(A 资金与正确性 → B 依赖与变更 → C 前端体验;每组只加载矩阵中本组轴的小节,不整文件加载):

  1. G 级扫描(有代码仓库时,开工跑一次三组共用):python3 ../core/scripts/scan_signals.py <仓库路径> → 每轴 G 级信号 + 预填表
  2. 逐轴决策(受限选择,从预填表修订,不空白生成):需求信号 → G 级核对 → S 级照单复核(矩阵各轴标〔S〕的项逐项读代码确认)→ decision → depth
  3. 防橡皮图章:exclude 永不预填——exclude 必须完成 S 级复核并把 G+S 双清单写进 scanned;"脚本无命中"单独不构成 exclude 理由
  4. 组内交付核对:本组全轴有决策再进下一组;十轴完成进入第 5 步

无代码仓库:跳过 G/S 级,仅需求信号决策;exclude 的 rationale 注明"无代码仓库"(校验器按此豁免 S 级要求)。

5. 深度校准与预算排序(此时执行矩阵第 13 节 R1–R6)

  • 升降档按 R1–R6(风险升档 / 双源信号 / 历史缺陷 / 无信号降档 / 成本门 / 预算约束)
  • R6 > R1:full(两域合并)> 3 时按风险排序裁剪;被裁剪的 Critical 轴触发 ⏸ 预算裁决检查点——呈现排序与裁剪影响,用户可扩预算(扩预算时 depth_budget 记 budget_review: {approved_by: 用户}
  • depth 与 execution_status 分离:环境 / 数据 / 工具缺位 → depth 不降,记 blocked + todo(向谁索取什么)——"做不了"不得冒充"不用测"

6. 自动化计划提案(⏸ 提案,不裁决)

  • 按用例特征提案:有 UI 主流程 → Playwright(automated-e2e-testing);接口级校验/幂等/并发 → API 脚本(api-testing);脚本型轴的执行物(性能/视觉、无障碍的 axe 扫描任务)→ 专项脚本 / 扫描任务;探索性/一次性 → 手动
  • automation_plan 是提案:列出建议清单 + 框架 + 不自动化清单 + 理由,交用户确认(qa 流水线中为执行策略检查点);确认前不启动执行类 skill

7. 回归策略

  • 从 Critical/High 风险与 P0 用例中指定回归锚点(每次必跑)
  • regression_plan:锚点集 + 按变更类型的扩展规则(接口变更 → 接口用例全量;UI 变更 → 主流程 E2E……)

8. 落盘与交付

  1. {项目}/测试策略.md(Schema 结构 + Risk Map 内嵌;type_scope 每轴单行 flow 风格 + 足够性声明:逐轴档位动作清单与完成状态;开头一段范围假设声明:本策略限于系统级黑盒,单元/集成测试为开发侧职责,结论以此为前提)
  2. handoff 轴 / include+外部执行器 / blocked 轴 → 生成 {项目}/专项移交_{轴}_{日期}.yaml 移交包(目标、场景参数、阈值/验收口径)。文件名中的 {轴} 用以下轴中文短名(与矩阵轴一一对应;轴 1 全名"性能效率"文件名取"性能"):性能 / 业务安全 / 可靠性 / 并发一致性 / 兼容性 / 无障碍 / 视觉一致性 / 国际化 / 迁移与升级 / 契约与集成,如 专项移交_性能_20260901.yaml——执行侧(api-testing 等)按中文名 glob 消费,用英文轴 id 会断链
  3. 校验后交付python3 ../core/scripts/validate_schema.py {项目}/测试策略.md(V1–V5;有代码仓库时叠加 --repo-root {仓库根} 抽查各轴 signals 指涉真实性),错误清零再交付。注意:include 且挂 Critical 风险的轴若最终维持 full 以下档位,校验器要求该轴名出现在 budget_review 文本中——降档裁量必须留一行依据,不许无声消失
  4. 交付索引给下游(test-case-writing):策略路径 + include 轴清单(用例型轴的 type/标签要求见矩阵第 12 节)+ 优先级映射要求

Common Mistakes

错误后果正确做法
风险评级无证据(拍脑袋 High)评级不可复核,策略失去推导链每条风险挂 evidence(../core/risk-model.md
类型轴静默缺失(漏轴)类型盲区被藏成"没想过",无从挑战十轴必答(V1),exclude 也要留痕
include 无信号 / exclude 无理由过测 / 漏测signals 挂证据;rationale + scanned 双清单(V2/V3)
脚本无命中直接 exclude脚本盲区被制度化为漏测S 级复核后才可 exclude(G+S 双确认)
full 满天飞资源稀释在长尾,无重点full ≤3 + 挂风险编号(V4);冲突时 R6>R1 + 预算裁决
环境缺位记成 exclude"做不了"冒充"不用测"depth/execution 分离,blocked + todo(R5/V5)
scope 只写布尔开关"测多深"丢失,执行时各自理解范围 + 深度 + 理由三件套
把用例写进策略越界(那是 test-case-writing 的产出)策略到"范围/深度/优先级要求"为止
automation_plan 直接执行不等确认剥夺用户执行策略裁决权提案 → ⏸ 用户确认 → 才启动执行
风险等级沿用 P0/P1 命名与用例优先级同名歧义风险用 Critical/High/Medium/Low(../core/risk-model.md

Signals

GitHub stars
28
Forks
5
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
test-strategy-fishzjp
Source
github.com/fishzjp/qa-skills