跳到主要内容

能跑的测试,不等于能抓错的测试

嘴替
嘴替

· 阅读约 5 分钟

速评:LLM 写的测试跑得绿,不代表它测出了东西。

QTestBench 这篇 10 月 9 号挂上 arXiv,被 QAI 2026 收了。最扎眼的数就一行:Qiskit HumanEval 上最好的测试质量 0.34,PennyLane QHack 那边 0.71。差一倍不是最要命的,要命的是作者自己写了——只看能不能执行,会把生成测试的质量严重高估。

这句话才是全文真正想说的,其余实验都是围着它转。

能跑,是个假信号

这坑不新,量子这块尤其容易踩。

普通代码里,测试跑起来不报错,你至少能推断出几条路径是通的。量子电路不这么玩。概率性输出、数值容差、领域专用检查器说了算——形式上挑不出毛病的测试,跟基准的结论可以完全对不上。你写个 assert,它绿了,模型觉得交差了,可它可能从头到尾就没碰到过那个真会出错的地方。

所以"能跑"在量子测试上信息量约等于零,偏偏它是最容易自动化、最容易做成表格的那一列。benchmark 表格第一列就是 pass rate,我见得太多,整篇文章绕着它转,没人问这列到底测了什么。

QTestBench 的做法是把这列拆掉:不让模型生成的测试自己当基准真值,拿去跟独立检查器的判定对照。三种验证队列,语法、语义、行为三类测试分别注入候选解,运行时给判定打标签。设计意思很直白——你说你测出来了,我不看你的测试报告,我要看你的测试在已知对错的两个解上分别给出什么结论。

它测的不是模型会不会写 test,是模型写的 test 有没有分辨力。

0.34 是哪个 0.34

这个 0.34 怎么来的得说清楚,不然又会被当成"量子太难所以模型差"的复读。

10 个 Qiskit HumanEval 任务,5 个模型轮着上,最好 0.34。QHack 那边能到 0.71。同一个框架、同一批模型、同一套判定逻辑,差整整一倍。问题不在"模型不懂量子",在别的地方。

我猜是任务形态。QHack 那 8 个挑战边界更清楚,错法更收敛;HumanEval 那批的"正确实现"和"错误实现"之间差得更隐蔽——可能就是几个相位差、一个测量顺序、一处参数化容差松了那么一点。这种错光读代码读不出来,必须真构造出能把它逼出来的输入,而模型恰恰最不擅长干这个。

写测试比写实现难,经典代码上也成立,量子这块被放大得特别明显:你得先知道一个东西可能怎么错,才能给它写测试。模型对量子的直觉本来就不牢,让它反过来预测自己会错在哪,等于让它做一件它正向都不太会做的事。

3/10 那个数字,比 0.34 更该抄

论文里有条细节我反复看了两遍:10 个 Qiskit 任务里,3 个压根产不出自然错误解,得靠合成变异体来补。

听着像实验设计的技术说明,其实是个挺重的信号。这批任务里能找到的"错误实现"样本,稀缺到要人工造。测试套件的分辨力没法用真实错误来衡量,只能拿变异体顶上——而变异体是设计出来的错误,分布上跟真实开发者会犯的错天然有偏差。

作者说 oracle 验证过的合成变异体能帮着稳定 bug 检测的估计。这话没错,但也等于承认:在这个任务集上,想用真实错误评估测试质量,样本不够用。

3/10 这个比例,比 0.34 更该被后面做类似 benchmark 的人注意。任务集的错误样本密度,直接决定你这套评测能测出什么、测不出什么。换个人跑,任务选得再偏一点,这比例可能更高,结论跟着就漂。我不是说 QTestBench 的结论不成立,是说它自报的边界条件比结论本身更有价值。

这剧本,眼熟

同款循环我见过:某个新方向起来,先有一批"模型能不能生成正确解"的基准,跑一年分数都上去了、区分度掉了,才有人回头问"这些解到底对不对、谁来验"。

量子这块现在正走在这个转折点上。已有的量子基准基本都在问模型会不会写解,没几个问它写的测试能不能分辨对错。QTestBench 往第二问迈了一步,而且一步迈到最痛的地方——不给模型自证的机会。

这步迈得稳不稳,我倒不觉得。5 个模型、18 个任务、最好 0.34,这样本量更像一个"这条量表能测出东西"的可行性演示,不是某个模型能力的定论。谁要拿这个 0.34 去给模型排名,属于读得太快。

方向我认。可执行性当质量指标这件事,不只在量子代码上虚,在 agent 写的测试上、在 CI 里那些绿了就没人看的用例上,一样虚。区别只是量子把这件事的成本抬到了藏不住的高度。

这里立个 flag:一年内,会有至少一个主流的代码生成基准把"生成测试的分辨力"单独拆成一栏,跟 pass rate 并排放。到时候回来收。

0.34 这个数字本身没什么可兴奋的,兴奋的是终于有人不给模型自己判卷了。