团队测试Skill team-testing

团队测试技能是一个统一的自动化测试工具,通过角色分工(协调员、策略师、生成器、执行器、分析师)实现渐进式测试覆盖。支持Generator-Critic循环、共享记忆和动态层级选择,用于测试生成、执行、分析和缺陷追踪,提高软件质量和测试效率。关键词:测试、团队、自动化、覆盖率、角色分工、缺陷模式、软件测试、质量门控。

测试 0 次安装 2 次浏览 更新于 3/16/2026

name: team-testing description: 统一团队技能用于测试团队。所有角色通过–role参数调用此技能以执行角色特定任务。触发词为"team testing"。

团队测试

测试团队技能。通过 Generator-Critic 循环(generator↔executor)、共享记忆(缺陷模式追踪)和动态层级选择,实现渐进式测试覆盖。所有团队成员通过 --role=xxx 路由到角色执行逻辑。

架构概述

┌──────────────────────────────────────────────────┐
│  Skill(skill="team-testing", args="--role=xxx")   │
└───────────────────┬──────────────────────────────┘
                    │ 角色路由器
    ┌───────────┬───┼───────────┬───────────┐
    ↓           ↓   ↓           ↓           ↓
┌──────────┐┌──────────┐┌─────────┐┌────────┐┌────────┐
│协调员││策略师││生成器││执行器││分析师│
│ roles/   ││ roles/   ││ roles/  ││ roles/ ││ roles/ │
└──────────┘└──────────┘└─────────┘└────────┘└────────┘

角色路由器

输入解析

const args = "$ARGUMENTS"
const roleMatch = args.match(/--role[=\s]+(\w+)/)

if (!roleMatch) {
  throw new Error("缺少 --role 参数。可用角色:coordinator, strategist, generator, executor, analyst")
}

const role = roleMatch[1]
const teamName = args.match(/--team[=\s]+([\w-]+)/)?.[1] || "testing"

角色分发

const VALID_ROLES = {
  "coordinator": { file: "roles/coordinator.md", prefix: null },
  "strategist":  { file: "roles/strategist.md",  prefix: "STRATEGY" },
  "generator":   { file: "roles/generator.md",   prefix: "TESTGEN" },
  "executor":    { file: "roles/executor.md",     prefix: "TESTRUN" },
  "analyst":     { file: "roles/analyst.md",      prefix: "TESTANA" }
}

if (!VALID_ROLES[role]) {
  throw new Error(`未知角色:${role}。可用:${Object.keys(VALID_ROLES).join(', ')}`)
}

Read(VALID_ROLES[role].file)

可用角色

角色 任务前缀 职责 角色文件
coordinator N/A 变更范围分析、层级选择、质量门控 roles/coordinator.md
strategist STRATEGY-* 分析 git diff、确定测试层级、定义覆盖率目标 roles/strategist.md
generator TESTGEN-* 按层级生成测试用例(单元/集成/E2E) roles/generator.md
executor TESTRUN-* 执行测试、收集覆盖率、自动修复 roles/executor.md
analyst TESTANA-* 缺陷模式分析、覆盖率差距、质量报告 roles/analyst.md

共享基础设施

角色隔离规则

核心原则: 每个角色仅能执行自己职责范围内的工作。

输出标记(强制)

SendMessage({ content: `## [${role}] ...`, summary: `[${role}] ...` })
mcp__ccw-tools__team_msg({ summary: `[${role}] ...` })

协调员 隔离

允许 禁止
变更范围分析 ❌ 直接编写测试
创建任务链 (TaskCreate) ❌ 直接执行测试
质量门控判断 ❌ 直接分析覆盖率
监控进度 (消息总线) ❌ 绕过 worker 自行完成

工作员 隔离

允许 禁止
处理自己前缀的任务 ❌ 处理其他角色前缀的任务
读写 shared-memory.json (自己的字段) ❌ 为其他角色创建任务
SendMessage 给 coordinator ❌ 直接与其他 worker 通信

团队配置

const TEAM_CONFIG = {
  name: "testing",
  sessionDir: ".workflow/.team/TST-{slug}-{date}/",
  msgDir: ".workflow/.team-msg/testing/",
  sharedMemory: "shared-memory.json",
  testLayers: {
    L1: { name: "单元测试", coverage_target: 80 },
    L2: { name: "集成测试", coverage_target: 60 },
    L3: { name: "端到端测试", coverage_target: 40 }
  }
}

共享记忆(创新模式)

// 阶段 2:读取共享记忆
const memoryPath = `${sessionFolder}/shared-memory.json`
let sharedMemory = {}
try { sharedMemory = JSON.parse(Read(memoryPath)) } catch {}

// 阶段 5:写入共享记忆(仅更新自己负责的字段)
// strategist → sharedMemory.test_strategy
// generator  → sharedMemory.generated_tests
// executor   → sharedMemory.execution_results + defect_patterns
// analyst    → sharedMemory.analysis_report + coverage_history
Write(memoryPath, JSON.stringify(sharedMemory, null, 2))

消息总线(所有角色)

mcp__ccw-tools__team_msg({
  operation: "log",
  team: teamName,
  from: role,
  to: "coordinator",
  type: "<type>",
  summary: `[${role}] <summary>`,
  ref: "<file_path>"
})
角色 类型
coordinator pipeline_selected, gc_loop_trigger, quality_gate, task_unblocked, error, shutdown
strategist strategy_ready, error
generator tests_generated, tests_revised, error
executor tests_passed, tests_failed, coverage_report, error
analyst analysis_ready, error

CLI 回退

Bash(`ccw team log --team "${teamName}" --from "${role}" --to "coordinator" --type "<type>" --summary "<summary>" --json`)

任务生命周期(所有工作员角色)

const tasks = TaskList()
const myTasks = tasks.filter(t =>
  t.subject.startsWith(`${VALID_ROLES[role].prefix}-`) &&
  t.owner === role &&
  t.status === 'pending' &&
  t.blockedBy.length === 0
)
if (myTasks.length === 0) return
const task = TaskGet({ taskId: myTasks[0].id })
TaskUpdate({ taskId: task.id, status: 'in_progress' })

// 阶段 2-4:角色特定
// 阶段 5:报告 + 循环
mcp__ccw-tools__team_msg({ operation: "log", team: teamName, from: role, to: "coordinator", type: "...", summary: `[${role}] ...` })
SendMessage({ type: "message", recipient: "coordinator", content: `## [${role}] ...`, summary: `[${role}] ...` })
TaskUpdate({ taskId: task.id, status: 'completed' })

三管道架构

目标化(小范围变更):
  STRATEGY-001 → TESTGEN-001(L1 unit) → TESTRUN-001

标准(渐进式):
  STRATEGY-001 → TESTGEN-001(L1) → TESTRUN-001(L1) → TESTGEN-002(L2) → TESTRUN-002(L2) → TESTANA-001

全面(全覆盖):
  STRATEGY-001 → [TESTGEN-001(L1) + TESTGEN-002(L2)](并行) → [TESTRUN-001(L1) + TESTRUN-002(L2)](并行) → TESTGEN-003(L3) → TESTRUN-003(L3) → TESTANA-001

Generator-Critic 循环

生成器 ↔ 执行器 循环(覆盖率不达标时修订测试):

TESTGEN → TESTRUN → (如果覆盖率 < 目标) → TESTGEN-fix → TESTRUN-2
                     (如果覆盖率 >= 目标) → 下一层或 TESTANA

统一会话目录

.workflow/.team/TST-{slug}-{YYYY-MM-DD}/
├── team-session.json
├── shared-memory.json          # 缺陷模式 / 有效测试模式 / 覆盖率历史
├── strategy/                   # 策略师输出
│   └── test-strategy.md
├── tests/                      # 生成器输出
│   ├── L1-unit/
│   ├── L2-integration/
│   └── L3-e2e/
├── results/                    # 执行器输出
│   ├── run-001.json
│   └── coverage-001.json
└── analysis/                   # 分析师输出
    └── quality-report.md

协调员生成模板

TeamCreate({ team_name: teamName })

// 策略师
Task({
  subagent_type: "general-purpose",
  team_name: teamName,
  name: "strategist",
  prompt: `你是 team "${teamName}" 的 STRATEGIST。
当你收到 STRATEGY-* 任务时,调用 Skill(skill="team-testing", args="--role=strategist") 执行。
当前需求: ${taskDescription}
约束: ${constraints}

## 角色准则(强制)
- 你只能处理 STRATEGY-* 前缀的任务
- 所有输出必须带 [strategist] 标识前缀
- 仅与 coordinator 通信

## 消息总线(必须)
每次 SendMessage 前,先调用 mcp__ccw-tools__team_msg 记录。

工作流程:
1. TaskList → 找到 STRATEGY-* 任务
2. Skill(skill="team-testing", args="--role=strategist") 执行
3. team_msg log + SendMessage 结果给 coordinator
4. TaskUpdate completed → 检查下一个任务`
})

// 生成器
Task({
  subagent_type: "general-purpose",
  team_name: teamName,
  name: "generator",
  prompt: `你是 team "${teamName}" 的 GENERATOR。
当你收到 TESTGEN-* 任务时,调用 Skill(skill="team-testing", args="--role=generator") 执行。
当前需求: ${taskDescription}

## 角色准则(强制)
- 你只能处理 TESTGEN-* 前缀的任务
- 所有输出必须带 [generator] 标识前缀

## 消息总线(必须)
每次 SendMessage 前,先调用 mcp__ccw-tools__team_msg 记录。

工作流程:
1. TaskList → 找到 TESTGEN-* 任务
2. Skill(skill="team-testing", args="--role=generator") 执行
3. team_msg log + SendMessage
4. TaskUpdate completed → 检查下一个任务`
})

// 执行器
Task({
  subagent_type: "general-purpose",
  team_name: teamName,
  name: "executor",
  prompt: `你是 team "${teamName}" 的 EXECUTOR。
当你收到 TESTRUN-* 任务时,调用 Skill(skill="team-testing", args="--role=executor") 执行。
当前需求: ${taskDescription}

## 角色准则(强制)
- 你只能处理 TESTRUN-* 前缀的任务
- 所有输出必须带 [executor] 标识前缀

## 消息总线(必须)
每次 SendMessage 前,先调用 mcp__ccw-tools__team_msg 记录。

工作流程:
1. TaskList → 找到 TESTRUN-* 任务
2. Skill(skill="team-testing", args="--role=executor") 执行
3. team_msg log + SendMessage
4. TaskUpdate completed → 检查下一个任务`
})

// 分析师
Task({
  subagent_type: "general-purpose",
  team_name: teamName,
  name: "analyst",
  prompt: `你是 team "${teamName}" 的 ANALYST。
当你收到 TESTANA-* 任务时,调用 Skill(skill="team-testing", args="--role=analyst") 执行。
当前需求: ${taskDescription}

## 角色准则(强制)
- 你只能处理 TESTANA-* 前缀的任务
- 所有输出必须带 [analyst] 标识前缀

## 消息总线(必须)
每次 SendMessage 前,先调用 mcp__ccw-tools__team_msg 记录。

工作流程:
1. TaskList → 找到 TESTANA-* 任务
2. Skill(skill="team-testing", args="--role=analyst") 执行
3. team_msg log + SendMessage
4. TaskUpdate completed → 检查下一个任务`
})

错误处理

场景 解决方案
未知 --role 值 错误提示可用角色列表
缺少 --role 参数 错误提示使用提示
角色文件未找到 错误提示期望路径
任务前缀冲突 记录警告,继续
覆盖率从未达到目标 3次 GC 循环后,接受当前覆盖率并警告
测试环境损坏 通知用户,建议手动修复