awesome-skills

Skill 测试:从“凭感觉”到“有证据”的质量体系

本文说明如何在仓库内以最小依赖完成 Skill 的“静态单元测试”与“端到端评估”。结合系统化的测试原则,我们的目标是以确定性信号(行为与产物)构建可复现、可比较、可在 CI 守门的质量闭环,兼容任意 CLI 型开源 Code Agent(如 OpenCode),使团队从“凭感觉的手动验证”走向“结构化、可复现、可对比”的工程化治理。


1 背景与目标

Skill 创作门槛低、数量爆发,但高质量(稳定、可复用、可维护) Skill 的生产仍缺乏系统方法。常见问题包括:触发不稳定(漏触/误触)、步骤偏离、环境污染(如翻译结果污染代码库)、风格约定无法保证。 当缺乏度量时,改动难以判断是改进还是回归。因此,我们遵循软件工程的 TDD 原则,为 Skill 建立测试闭环:“只评结果、不评路径”。

我们通过以下两个层面生成可复现的度量信号:

评估时主要关注以下成功维度

  1. 结果:产出是否可用(报告是否生成、格式是否保留)。
  2. 过程:是否遵循预期步骤(如:先拷贝文件到沙盒,再修改,防止主干污染)。
  3. 效率与消耗:Token 消耗是否在合理范围,有无不必要的“折腾”(通过解析 usage.md 对比)。

2 目录与文件定位

测试框架通过目录约定实现多技能的隔离与调度,核心由统一的主控脚本、各技能独立的配置沙盒以及静态规则集组成。


3 静态单元测试(文档资产与约束)

静态测试不依赖 Agent 与大模型的推理,通过 Python 脚本前置拦截格式错误、死链接与敏感信息,从而阻断低级错误流入端到端环节,有效降低评估成本与噪音。

# 说明:运行静态单测,自动按 SKILL 分发,输出结构化 JSON(overall_pass/score/逐项布尔)
python3 ./unit-test/tests/run_static.py doc-reviewer

4 端到端评估(OpenCode 等 CLI Agent)

端到端评估将 Agent 视为黑盒,通过捕获其 CLI 运行时的标准输出(JSONL 事件流)来重构行为轨迹,进而对工具调用顺序、Token 消耗及最终生成产物执行严格的代码级断言。

4.1 环境准备

评估框架依赖全局环境变量来注入必要的 API 凭证与基础的 Agent 启动指令。

# 说明:如果 Agent 需要 LLM 提供方,按需设置,例如:
export OPENAI_API_KEY=your-key

# 说明:设置 CLI Agent 命令为环境变量,并开启 JSON 事件输出
export AGENT_CMD='opencode run --format json --print-logs'

4.2 运行与生成轨迹

主控脚本通过读取 SKILL 环境变量进行执行路由,拉起 Agent 并将标准输出重定向为 JSONL 轨迹文件,同时自动挂载对应技能的临时沙盒工作区。

# 说明:执行端到端评估,需通过环境变量指定技能(如 doc-reviewer, md-translator)
# 注意:不要将技能名称作为脚本的位置参数传入,否则会触发防呆报错
SKILL=doc-reviewer bash ./unit-test/opencode-skill-eval.sh all

# 产出文件默认位于:
# - 轨迹:./unit-test/evals/artifacts/doc-reviewer.jsonl
# - 报告与产物:./unit-test/evals/reports/doc-reviewer/

4.3 行为与产物断言

我们将“是否成功”的主观判断固化为 Node.js 脚本或 Bash 钩子断言。通过解析 JSONL 轨迹中的 command_execution 与文件操作记录,不仅能校验产物,还能精准捕获 Agent 是否陷入循环重试(“折腾”),并将其作为 CI 拦截红线。

# 说明:解析轨迹并断言关键产物。主控脚本默认会优先执行 config.sh 的 skill_after_artifact_checks 钩子,
# 若未定义则回退使用通用的 checks.js 断言器。
SKILL=doc-reviewer node ./unit-test/evals/agent/checks.js \
  ./unit-test/evals/artifacts/doc-reviewer.jsonl \
  ./unit-test/evals/reports/doc-reviewer

4.4 运行结果与产物说明

单次评估运行后将生成不可变的行为轨迹、沙盒隔离的临时产物以及多维度的资源消耗报告。这些确定的物理文件构成了故障排查与 CI 自动化守门的数据基础。

# 说明:示例输出(不同 Agent 版本可能存在增删字段)
# 你可以将该 JSON 直接采集到 CI 日志中用于守门判断
{
  "hasOutline": true,
  "hasContent": true,
  "hasAssets": true,
  "hasFormat": true,
  "structureOk": true,
  "score": 1,
  "overall_pass": true
}

4.5 运行模式与参数

主控脚本的第一个位置参数 (MODE) 决定了 Agent 的系统提示词 (Prompt) 注入策略,支持内置的全量测试与针对特定功能模块的子集测试。


5 CI 建议与阈值守门

在流水线中结合静态校验与行为断言,可建立拦截 Skill 能力退化的自动化屏障。对于存在非确定性输出的模型,建议引入 pass@k 多次采样策略以平衡通过率与稳定性。


6 如何新增一个 Skill 测试

为了确保框架的可扩展性,新增一个技能的测试只需遵循基于目录的约定,实现配置注入与断言钩子即可,无需修改主控核心脚本。