用途
ln-512-manual-tester 用于在运行中的代码上手动验证 Story 的验收标准(AC),并向质量门禁报告结构化结果。它由 ln-510-test-planner 在 ln-511-test-researcher 完成后调用,前提是 Story 上存在来自 ln-511 的“## Test Research:”研究评论,且 Story 中所有实现任务状态为 Done。
主要能力
- 在目标项目的 tests/manual/ 文件夹中创建可执行测试脚本,并永久保存用于回归测试(非临时文件)。
- 通过 bash/curl(API)或 puppeteer(UI)运行 AC 驱动的检查。
- 在 Linear 中记录结果,包含每个 AC 的通过/失败状态和脚本路径。
- 不更改状态,不创建任务,仅提供证据和结论。
测试设计原则
- 快速失败(Fail-Fast):当任何标准未满足时,测试必须立即返回 1(失败)。禁止使用 print_status "WARN" + return 0 处理验证失败、无显式标志的优雅降级、隐藏错误的静默回退。例外(WARN 可接受):不影响正确性的信息性警告、可选功能(需在注释中明确说明理由)、基础设施问题(如开发环境缺少 Nginx)。
- 基于期望的测试(Expected-Based Testing):测试必须将实际结果与期望参考文件比较,而非应用启发式或算法检查。目录结构示例:tests/manual/NN-feature/ 下包含 samples/(输入文件)、expected/(期望输出文件,必需)、test-*.sh。启发式仅适用于动态/非确定性数据(时间戳、UUID、令牌——比较前需规范化;无序键的 JSON——使用 jq --sort-keys)。
- 结果存储:测试结果保存到 tests/manual/results/(持久化,加入 .gitignore),命名为 result_{ac_name}.{ext} 或 response_{ac_name}.json,测试完成后可检查用于调试。
- 期望文件生成:运行测试并查看 results/ 中的输出;若正确,复制到 expected/ 并正确命名;若错误,先修复实现再复制。切勿盲目复制结果到 expected,必须先验证正确性。
使用方式
工作流程
阶段 1:设置 tests/manual 结构
- 阅读 docs/project/runbook.md 获取 Docker 命令、API 基础 URL、测试前提条件和环境设置。
- 检查项目根目录是否存在 tests/manual/ 文件夹。若缺失,创建结构:config.sh(共享配置)、README.md(文件夹文档)、test-all.sh(运行所有测试套件的主脚本)、results/(测试输出文件夹,加入 .gitignore)。
- 若存在,读取现有 config.sh 复用设置(BASE_URL、令牌)。
阶段 2:创建 Story 测试脚本
- 获取 Story,将 AC 解析为 Given/When/Then 列表(3-5 个期望)。
- 检查研究评论(来自 ln-511-test-researcher),将发现纳入测试用例。
- 检测 API 还是 UI(API → curl,UI → puppeteer)。
- 创建测试文件夹结构:tests/manual/{NN}-{story-slug}/samples/(输入文件,如需要)、expected/(期望输出文件,确定性测试必需)。
- 生成测试脚本:tests/manual/{NN}-{story-slug}/test-{story-slug}.sh,使用适当模板(TEMPLATE-api-endpoint.sh 用于直接调用,TEMPLATE-document-format.sh 用于异步任务)。脚本包含:头部(Story ID、AC 列表、前提条件)、每个 AC 的测试函数及边界/错误用例、基于 diff 的验证(主要方式)、结果保存到 tests/manual/results/、带计时的摘要表。使脚本可执行(chmod +x)。
阶段 2.5:更新文档
- 更新 tests/manual/README.md:在“Available Test Suites”表中添加新测试,包含 Story ID、覆盖的 AC、运行命令。
- 更新 tests/manual/test-all.sh:在 SUITES 数组中添加对新脚本的调用,保持执行顺序(00-setup 优先,然后编号套件)。
阶段 3:执行并报告
- 重新构建 Docker 容器(无缓存),确保健康。
- 运行生成的脚本,捕获输出。
- 解析结果(通过/失败计数)。
- 发布 Linear 评论,包含:AC 矩阵(每个 AC 的通过/失败)、脚本路径、重跑命令。
关键规则
- 脚本保存到项目 tests/manual/,而非临时文件。
- 测试前重新构建 Docker;若重建/运行不健康则失败。
- 在脚本注释和 Linear 评论中保持 Story 的语言(EN/RU)。
- 不修复,不更改状态;仅提供证据和结论。
- 脚本必须幂等(可随时重跑)。
完成定义(Definition of Done)
- tests/manual/ 结构存在(config.sh、README.md、test-all.sh、results/ 如缺失则创建)。
- tests/manual/results/ 已加入项目 .gitignore。
- 测试脚本创建于 tests/manual/{NN}-{story-slug}/test-{story-slug}.sh。
- expected/ 文件夹已创建,每个确定性 AC 至少有一个期望文件。
- 脚本使用基于 diff 的验证(非启发式)。
- 脚本将结果保存到 tests/manual/results/ 供调试。
- 脚本可执行且幂等。
- README.md 已在“Available Test Suites”表中更新新测试套件。
- test-all.sh 已在 SUITES 数组中更新对新脚本的调用。
- 应用已重建并运行;测试已执行。
- 已发布结论和 Linear 评论,包含脚本路径和重跑命令。
适用场景
- 由 ln-510-test-planner 在 ln-511-test-researcher 完成后调用。
- Story 上存在“## Test Research:”研究评论。
- Story 中所有实现任务状态为 Done。
限制
- 不更改状态,不创建任务。
- 仅提供证据和结论,不进行修复。
- 需要 Docker 容器运行、jq 已安装。
- 测试前必须重新构建 Docker,若重建/运行不健康则失败。
脚本模板与参考文件
- README.md(每个项目创建一次):包含快速开始、前提条件、文件夹结构、可用测试套件表、添加新测试说明。
- test-all.sh(每个项目创建一次):运行所有手动测试套件的主脚本。
- config.sh(每个项目创建一次):共享配置(BASE_URL、辅助函数、颜色)。
- 测试脚本模板:template-api-endpoint.sh(API 端点测试,无异步任务)、template-document-format.sh(文档/文件处理,有异步任务)。
- 参考文件:脚本格式参考 prompsit-api tests/manual/(生产示例)、AC 格式 shared/templates/test_task_template.md、基于风险的上下文 ln-513-auto-test-planner/references/risk_based_testing_guide.md、研究发现 ln-511-test-researcher 创建的“## Test Research”评论。
版本:1.0.0(从 ln-503 重命名,阶段 0 研究移至 ln-511-test-researcher)。最后更新:2026-01-15。