Skip to main content
Coding 任务常用一份隐藏测试来判分。Agent 改完代码后,评估用例才把测试文件写进 Sandbox 执行,测试通过就算过。Agent 工作时看不到这份测试,也就没法针对它投机。 这份测试文件就是判分标准。你改了它,等于换了一道题,旧结果就不该再算数。 用 loadText 读它,NiceEval 会记下文件内容,把它算作这条评估用例的输入。文件改一个字节,下次运行时这条评估用例自动重跑,其它评估用例照常沿用旧结果。 如果用 fs.readFile 自己读,拿到的内容一样,但 NiceEval 不知道这次读取。你改了测试文件,它仍然沿用旧结果,你看到的是用旧测试判出来的旧结论。

用 loadText 读入判分文件

  1. 把判分文件和评估用例一起放进仓库,不要放进给 Agent 的起始项目里:
  2. 在 .eval.ts 的模块顶层读入。NiceEval 在运行前就要知道判分文件的内容,才能决定这条评估用例要不要重跑:
    路径写项目根相对的字符串也可以:loadText("evals/fixtures/react-datepicker/pr-6058/tests/run-tests.sh")。 loadText 直接收 URL 对象,不需要 import node:url。
  3. 在 test(t) 里,等 Agent 做完再把测试写进 Sandbox 执行:
    Terminal-Bench 这类仓库任务也是同样的做法。给 Agent 准备起始环境时只放公开的 Fixture,不把隐藏测试或跑测脚本放进镜像、工作目录或 prompt。等 t.send(...) 返回后,再把模块顶层 loadText 读到的原始文件上传进 Sandbox,执行原始的跑测脚本,同时检查预期结果和防泄漏的检查脚本。这样改了隐藏文件会触发重跑,Agent 工作时也看不到它。

确认改了测试会重跑

改一下 datepicker_test.test.tsx,先预览一次运行计划:
这条评估用例应该显示 execute,其它没受影响的显示 reuse。确认后去掉 --dry 正式运行,跑完用 pnpm exec niceeval show 在终端看结果,或用 pnpm exec niceeval view 在浏览器里看。计划的读法见修改后只重跑受影响的评估。 改了测试却显示 reuse 时,先检查这个文件是不是用 fs.readFile 读的。

常见错误

  • loadText 必须写在模块顶层。 要不要重跑在运行开始前就决定了,写在 test(t) 里到运行时才读就来不及了。NiceEval 会直接报错,提示你挪到顶层。
  • 读 Agent 改出来的文件用 t.sandbox,不用 loadText。 Sandbox 里的文件是这次运行的结果,每次都不同,不该决定要不要重跑。用 await t.sandbox.readText(path) 读取,再把字符串交给 t.check。
  • 判分标准是结构化数据(例如用例对照表)时,用 loadYaml / loadJson,见数据驱动测试。