loadText 读它,NiceEval 会记下文件内容,把它算作这条评估用例的输入。文件改一个字节,下次运行时这条评估用例自动重跑,其它评估用例照常沿用旧结果。
如果用 fs.readFile 自己读,拿到的内容一样,但 NiceEval 不知道这次读取。你改了测试文件,它仍然沿用旧结果,你看到的是用旧测试判出来的旧结论。
用 loadText 读入判分文件
-
把判分文件和评估用例一起放进仓库,不要放进给 Agent 的起始项目里:
-
在
.eval.ts的模块顶层读入。NiceEval 在运行前就要知道判分文件的内容,才能决定这条评估用例要不要重跑:路径写项目根相对的字符串也可以:loadText("evals/fixtures/react-datepicker/pr-6058/tests/run-tests.sh")。loadText直接收URL对象,不需要 importnode:url。 -
在
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,见数据驱动测试。