Large-scale, Independent and Comprehensive study of the power of LLMs for test case generation

该研究通过大规模实证评估,首次全面分析了四种大语言模型在生成类级别单元测试中的表现,发现尽管推理式提示(如 GToT)能显著提升测试的可读性和可靠性,但幻觉导致的编译失败率依然高企,表明结合自动化验证与搜索式优化的混合方法才是实现生产级测试生成的关键。

Wendkûuni C. Ouédraogo, Kader Kaboré, Yinghua Li, Haoye Tian, Anil Koyuncu, Jacques Klein, David Lo, Tegawendé F. Bissyandé

发布于 2026-03-05
📖 1 分钟阅读☕ 轻松阅读

Each language version is independently generated for its own context, not a direct translation.

这篇论文就像是一场**“超级大厨(AI)”与“老练的机械臂(传统工具)”之间的烹饪大赛**,比赛内容是:谁能更完美地写出“食谱”(单元测试代码),来确保一道菜(软件功能)不会做坏?

为了让你轻松理解,我们把这篇硬核的学术报告翻译成几个生动的故事:

1. 比赛背景:为什么需要这场大赛?

  • 现状:写“食谱”(单元测试)是保证软件不崩盘的关键,但让程序员手写太累了,大家经常偷懒。
  • 老对手(EvoSuite):这是一个传统的“机械臂”工具。它非常勤奋,能写出覆盖所有角落的食谱,但写出来的东西像乱码,全是机器语言,人类根本看不懂,也没法维护。
  • 新选手(LLM 大模型):像 GPT-4 这样的 AI 大厨,它们很聪明,写出来的食谱人话多、逻辑顺、读起来像人写的。但是,它们有个大毛病:爱“瞎编”(幻觉)。比如,食谱里写着“加一勺魔法粉”,但厨房里根本没有这个粉,导致菜做不出来(代码编译失败)。

这篇论文的目的:就是要把这些 AI 大厨请进厨房,看看它们到底能不能真正帮上忙,以及怎么给它们下指令(提示词工程),才能让它们少犯傻,多干活。


2. 实验设置:怎么比的?

研究人员找了4 位顶级 AI 大厨(GPT-3.5, GPT-4, Mistral 7B, Mixtral 8x7B),让它们去给3 种不同的食材(Defects4J, SF110, CMD 三个数据集)写食谱。

为了测试 AI 的能力,研究人员用了5 种不同的“下指令”方式(提示词工程):

  1. 零样本(ZSL):直接说“做这道菜”,不给任何例子。(像让厨师看天书)
  2. 少样本(FSL):给一个例子,“看,别人是这么做的,你照着做”。
  3. 思维链(CoT):让厨师“先想步骤,再动手”(比如:先切菜,再炒菜,最后调味)。
  4. 思维树(ToT):让厨师“想三条不同的做法,选最好的那条”。
  5. 引导式思维树(GToT):这是研究人员的独家秘籍。想象有三个专家厨师坐在一起讨论,互相挑错,最后合并成一个完美的方案。

3. 比赛结果:谁赢了?

🏆 第一回合:能不能把菜端上来?(生成能力)

  • 机械臂(EvoSuite):只要给它食材,它**100%**能端出一盘菜(生成代码),但有时候菜是生的(无法编译)。
  • AI 大厨:它们端菜的能力很强,几乎90% 以上都能端出来。但是,Mixtral 8x7B 这位大厨在遇到新食材(CMD 数据集)时,有点手忙脚乱,端菜率只有 63%。

🏆 第二回合:菜能不能吃?(编译与正确性)

这是最惨烈的一关。

  • 机械臂:端出来的菜,**98%**都能直接吃(编译通过),非常稳定。
  • AI 大厨:虽然端出来的菜看起来很像样,但**只有不到 10%**能直接吃!
    • 原因:AI 太爱“瞎编”了。它会在食谱里写“放入不存在的调料(幻觉符号)”或者“用没有权限的锅(权限错误)”。
    • 好消息:用了**GToT(三个专家讨论)**这种指令后,AI 的瞎编行为减少了,菜能吃的比例稍微高了一点,但离机械臂的稳定性还有很大差距。

🏆 第三回合:菜谱好不好读?(可读性)

  • 机械臂:它的食谱是天书,全是 test_1, test_2,变量名像乱码,人类看了想砸键盘。
  • AI 大厨:它的食谱非常漂亮!变量名起得像人话(比如 testDivideByZero),逻辑清晰。
  • 结论:如果你想要人类能看懂、好维护的食谱,AI 完胜。特别是用了 GToT 指令后,AI 写的食谱简直像教科书。

🏆 第四回合:菜的营养够吗?(代码覆盖率)

  • 机械臂:它是强迫症,为了覆盖所有角落,它会把锅铲、盘子、甚至桌子腿都测一遍。覆盖率极高(94%+)
  • AI 大厨:它比较随性,只测它觉得重要的地方。覆盖率大概在 50%-70% 左右,远不如机械臂。
  • 结论:如果你追求极致的安全,机械臂更靠谱;如果你追求效率,AI 能帮你快速覆盖核心功能。

🏆 第五回合:有没有“坏毛病”?(测试异味)

  • 机械臂:喜欢用魔法数字(比如直接写 15 而不是 MAX_USERS),而且喜欢写很多废话测试(Lazy Test)。
  • AI 大厨:虽然读起来顺,但也爱犯**“魔法数字”的毛病(几乎 100% 的测试里都有)。而且,如果指令没给好,它容易写出“断言轮盘赌”**(Assertion Roulette),就是测试失败了,你不知道到底是哪一步错了。
  • 好消息:用了GToT指令,AI 的“断言轮盘赌”毛病大幅减少,变得更有条理。

4. 核心发现与启示(人话版总结)

  1. AI 不是万能的,但它是好帮手
    目前的 AI 还不能完全取代传统的测试工具(EvoSuite)。如果你只想要“能跑”的代码,机械臂更稳;如果你想要“人看得懂”的代码,AI 是首选。

  2. 怎么指挥 AI 很重要(提示词工程)
    直接让 AI 干活(零样本),它容易犯傻。如果你让它**“像三个专家一样讨论”(GToT),或者“一步步思考”(CoT),它写出来的代码质量会显著提升**,结构更清晰,瞎编的错误更少。

  3. 最大的痛点是“幻觉”
    AI 最大的问题还是**“不懂装懂”。它经常引用不存在的函数或库。这需要人类开发者或者自动化工具在后面“把关”**(验证和修复),不能直接拿来就用。

  4. 未来的方向:混合双打
    最好的方案是**“机械臂 + AI"**。

    • 机械臂(EvoSuite)去疯狂扫雷,确保代码覆盖率,找出所有隐藏的 Bug。
    • AI(配合 GToT 指令)把这些冷冰冰的代码**“翻译”**成人类能看懂、好维护的漂亮代码。
    • 最后,让人类开发者做最后的审核。

一句话总结

这篇论文告诉我们:AI 写测试代码已经很像样了,特别是让它“多思考”一点,写出来的代码既漂亮又好读。但它还不够靠谱,容易“瞎编”导致代码跑不起来。所以,现在最好的办法是让人类牵着 AI 的手,让它当“创意助手”,而不是让它独自当“总指挥”。