run-puzzle-tests
关于
This skill runs the jigsawR test suite through WSL R, supporting full runs, filtered tests by pattern, or single-file execution. It interprets pass/fail/skip counts and locates failing tests while avoiding the --vanilla flag to maintain renv compatibility. Use it after modifying R source code, adding new puzzle features, before committing changes, or when debugging specific test failures.
快速安装
Claude Code
推荐npx skills add pjt222/agent-almanac -a claude-code/plugin add https://github.com/pjt222/agent-almanacgit clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/run-puzzle-tests在 Claude Code 中复制并粘贴此命令以安装该技能
技能文档
name: run-puzzle-tests description: > 通过 WSL R 执行运行 jigsawR 测试套件。支持完整套件、按模式过滤或单文件运行。 解读通过/失败/跳过计数并定位失败测试。绝不使用 --vanilla 标志(renv 需要 .Rprofile 激活)。适用于修改 R 源代码后、添加新拼图类型或功能后、提交更改前 验证无破坏,以及调试特定测试失败时。 license: MIT allowed-tools: Read Write Edit Bash Grep Glob metadata: author: Philipp Thoss version: "1.0" domain: jigsawr complexity: basic language: R tags: jigsawr, testing, testthat, renv, wsl locale: zh-CN source_locale: en source_commit: 6f65f316 translator: claude-sonnet-4-6 translation_date: 2026-03-16
运行拼图测试
运行 jigsawR 测试套件并解读结果。
适用场景
- 修改包中任何 R 源代码后
- 添加新拼图类型或功能后
- 提交更改前验证无破坏
- 调试特定测试失败
输入
- 必需:测试范围(
full、filtered或single) - 可选:过滤模式(用于 filtered 模式,如
"snic"、"rectangular") - 可选:指定测试文件路径(用于 single 模式)
步骤
第 1 步:选择测试范围
| 范围 | 使用时机 | 耗时 |
|---|---|---|
| 完整 | 提交前、重大更改后 | ~2-5 分钟 |
| 过滤 | 处理某个拼图类型时 | ~30 秒 |
| 单文件 | 调试特定测试文件 | ~10 秒 |
预期结果: 根据当前工作流选择测试范围:提交前选完整套件,处理特定拼图类型时选过滤,调试单个测试时选单文件。
失败处理: 如果不确定选哪个范围,默认使用完整套件。耗时更长但能捕获跨类型回归。
第 2 步:创建并执行测试脚本
完整套件:
创建脚本文件(如 /tmp/run_tests.R):
devtools::test()
R_EXE="/mnt/c/Program Files/R/R-4.5.0/bin/Rscript.exe"
cd /mnt/d/dev/p/jigsawR && "$R_EXE" -e "devtools::test()"
按模式过滤:
"$R_EXE" -e "devtools::test(filter = 'snic')"
单文件:
"$R_EXE" -e "testthat::test_file('tests/testthat/test-snic-puzzles.R')"
预期结果: 测试输出含通过/失败/跳过计数。
失败处理:
- 不要使用
--vanilla标志;renv 需要.Rprofile来激活 - 如果 renv 报错,先运行
renv::restore() - 对于因退出码 5 失败的复杂命令,写入脚本文件替代
第 3 步:解读结果
查找汇总行:
[ FAIL 0 | WARN 0 | SKIP 7 | PASS 2042 ]
- PASS:通过的测试
- FAIL:失败的测试(需要排查)
- SKIP:跳过的测试(通常因缺少可选包如
snic) - WARN:测试中的警告(需审查但非阻塞)
预期结果: 汇总行已解析,识别出 PASS、FAIL、SKIP 和 WARN 计数。干净测试运行应 FAIL = 0。
失败处理: 如果汇总行不可见,测试运行器可能在完成前崩溃。检查汇总行上方的 R 级错误。如果输出被截断,重定向到文件:"$R_EXE" -e "devtools::test()" > test_results.txt 2>&1。
第 4 步:排查失败
如果测试失败:
- 阅读失败消息——包含文件、行号及预期与实际值
- 检查是新故障还是已有的
- 对于断言失败,阅读测试和被测函数
- 对于错误失败,检查函数签名是否变更
# 使用详细输出运行失败的测试
"$R_EXE" -e "testthat::test_file('tests/testthat/test-failing.R', reporter = 'summary')"
预期结果: 每个失败测试的根因已识别。失败要么是真正的回归(代码需修复),要么是测试环境问题(缺少依赖、路径问题)。
失败处理: 如果失败消息不清楚,在测试中添加 browser() 或 print() 语句,使用 testthat::test_file() 重新运行以交互调试。
第 5 步:验证跳过原因
缺少可选依赖时跳过测试是正常的:
snic包的测试通过skip_if_not_installed("snic")跳过- 要求特定操作系统的测试通过
skip_on_os()跳过 - 仅 CRAN 的跳过通过
skip_on_cran()实现
确认跳过原因合理,不是在掩盖真实故障。
预期结果: 所有跳过都有合理原因(可选依赖未安装、平台特定跳过、仅 CRAN 跳过)。没有跳过在掩盖实际测试失败。
失败处理: 如果某个跳过看起来可疑,临时移除 skip_if_*() 调用并运行测试,看它是通过还是暴露隐藏的失败。
验证清单
- 所有测试通过(FAIL = 0)
- 无意外警告
- 跳过计数与预期匹配(仅可选依赖跳过)
- 测试数量未减少(没有测试被意外删除)
常见问题
- 使用
--vanilla:会破坏 renv 激活。jigsawR 中绝不使用。 - 复杂的
-e字符串:shell 转义问题导致退出码 5。使用脚本文件。 - 过时的包状态:如果更改了影响 NAMESPACE 的代码,测试前运行
devtools::load_all()或devtools::document()。 - 缺少测试依赖:某些测试需要 suggested 包。检查
DESCRIPTION的 Suggests 字段。 - 并行测试问题:如果测试互相干扰,使用
testthat::test_file()顺序运行。
相关技能
generate-puzzle— 生成拼图以验证行为是否与测试一致add-puzzle-type— 新类型需要全面的测试套件write-testthat-tests— 编写 R 测试的通用模式validate-piles-notation— 独立测试 PILES 解析
GitHub 仓库
相关推荐技能
evaluating-llms-harness
测试该Skill通过60+个学术基准测试(如MMLU、GSM8K等)评估大语言模型质量,适用于模型对比、学术研究及训练进度追踪。它支持HuggingFace、vLLM和API接口,被EleutherAI等行业领先机构广泛采用。开发者可通过简单命令行快速对模型进行多任务批量评估。
cloudflare-cron-triggers
测试这个Claude Skill提供了关于Cloudflare Cron Triggers的完整知识库,用于通过cron表达式定时执行Workers。它支持配置周期性任务、维护作业和自动化工作流,并能处理常见的cron触发错误。开发者可以用它来设置定时任务、测试cron处理器,并集成Workflows和Green Compute功能。
webapp-testing
测试该Skill为开发者提供了基于Playwright的本地Web应用测试工具集,支持自动化测试前端功能、调试UI行为、捕获屏幕截图和查看浏览器日志。它包含管理服务器生命周期的辅助脚本,可直接作为黑盒工具运行而无需阅读源码。适用于需要快速验证本地Web应用界面和交互功能的开发场景。
finishing-a-development-branch
测试这个Skill用于开发分支完成后的集成决策,当代码实现完成且测试通过时,它会引导开发者选择合适的工作流。它首先验证测试状态,然后提供合并、创建PR或清理等结构化选项。核心价值在于确保代码质量的同时,标准化分支收尾流程。
