TriUTest:内化执行反馈以生成暴露缺陷的 Python 单元测试

《Neurocomputing》:TriUTest: Internalizing execution feedback for defect-exposing python unit test generation

【字体: 大 中 小 】 时间:2026年09月03日 来源:Neurocomputing 6.7

编辑推荐:

   摘要 动态类型语言(如 Python)的自动化单元测试生成通常面临高覆盖率与低缺陷暴露之间的差距问题:模型可以生成可执行测试,但断言较弱,候选分布容易崩溃,且缺乏有效的机制将执行反馈转换为可学习信号。为解决这一问题,我们提出了 TriUTest,一种面向 LLM 的三阶段后训

  

摘要
动态类型语言(如 Python)的自动化单元测试生成通常面临高覆盖率与低缺陷暴露之间的差距问题:模型可以生成可执行测试,但断言较弱,候选分布容易崩溃,且缺乏有效的机制将执行反馈转换为可学习信号。为解决这一问题,我们提出了 TriUTest,一种面向 LLM 的三阶段后训练框架:SFT → DQ-GKD → SM-GRPO。SFT 从真实可执行测试对中学习测试结构和基本断言。DQ-GKD 对学生采样的候选样本进行引导蒸馏(在蒸馏前刷新一次),对测试敏感片段进行质量加权分布校准,并结合质量加权的多候选似然正则化器以缓解候选崩溃。SM-GRPO 的关键在于维护变异覆盖状态,并使用边际增量杀灭奖励将变异杀灭率 (MKR) 的套件级并集目标转换为实例级可优化信号,从而减少冗余并促进互补测试生成。我们在 HumanEval、QuixBugs-Python、codetiming 和 apimd 上评估 TriUTest,使用 Qwen2.5-3B-Instruct 作为学生模型,Qwen2.5-14B-Instruct 作为教师模型。在统一预算下,TriUTest (3B) 实现了宏平均 77.11%/52.55% 的语句/分支覆盖率,最好的宏平均 MKR 为 48.75%,以及在 QuixBugs 上最高的失败触发率 (FTR) 为 78.50%,在缺陷导向指标上优于同等规模及更大规模的仅 SFT 基线,以及包括 Pynguin、MuTAP 和 pytLMtester 在内的强基线。

引言
在自动化测试生成中,最终决定软件质量的不仅仅是结构覆盖率,而是测试套件揭示故障的能力 [2], [4], [7]。高质量的测试不仅应实现高语句和分支覆盖率,还应展示对细粒度语义差异(如变异敏感性)的辨别能力,并可靠地触发真实缺陷 [4], [5], [21], [32]。然而,“高覆盖率 ≠ 高缺陷暴露”这一长期存在的悖论依然存在。传统的基于搜索的软件测试 (SBST) 技术——如进化搜索、随机探索和符号执行——在某些设置下可以有效提高覆盖率,但自动生成的断言通常语义贫乏。因此,测试可能到达执行路径而不验证关键行为属性,甚至更不可能稳定地触发和定位故障 [5], [13], [23]。这种差距在 Python 等动态类型语言中尤为明显:缺乏静态类型约束和编译时检查,输入构建和状态可达性变得更加困难,异常路径更加复杂,生成的测试更频繁地表现出“可运行但无辨别力”的弱断言和脆弱失败模式 [18], [19]。

随着大语言模型 (LLMs) 在代码理解和生成方面的快速进步,“函数签名/自然语言规范/API 文档 → 测试生成”的范式为自动生成结构化且可读的测试代码创造了新的机会 [3], [16], [30], [35]。先前的研究表明,LLM 可以在某些基准测试上实现高语句/分支覆盖率,并能生成更接近人类风格的断言和测试组织 [3], [16], [35]。然而,在真实项目和动态语言环境中,LLM 生成的测试仍然普遍存在“结构正确但语义无效”的问题:断言过于宽松,边界和异常行为得不到充分锻炼,候选测试缺乏互补性。因此,覆盖率的提高并不能可靠地转化为更高的变异杀灭或真实缺陷暴露 [3], [4], [7], [30]。

更细致的分析表明,基于 LLM 的测试生成面临至少三个任务关键瓶颈。首先,可执行性和结构一致性仍然是基本前提:模型必须持续生成一个可运行的测试骨架——可在 pytest 下收集和执行——以及输入构建和基本断言模式;否则,任何基于反馈的优化都缺乏可用的起点 [3], [19], [35]。其次,训练 - 推理分布不匹配(暴露偏差)在一小部分测试敏感片段(如输入构建、被测单元调用和断言表达式)上被放大。在训练期间,模型依赖真实前缀,而在推理时它们基于自生成的前缀进行自回归,这往往导致退化为“类测试语法”但无辨别力的输入和断言 [30], [35]。此外,在单元测试生成中,真正控制故障揭示的信息通常集中在这些关键片段中,而结构元素(如导入、夹具、文件组织)主要影响可执行性,与缺陷暴露的关联不那么直接 [3], [5]。第三,即使引入了执行反馈,优化目标也表现出明显的套件级并集属性。例如,变异杀灭率 (MKR) 的目标本质上是整个套件中杀灭的变异体并集的大小。如果奖励仅由每个测试的局部杀灭定义,模型倾向于重复生成杀死相同变异体子集的冗余测试,导致信用分配与套件级目标不匹配,从而削弱缺陷导向优化 [5], [21], [32]。

一个具体的例子——取自我们的评估对象并在案例研究(第 4.10 节)中重新审视——使得覆盖率 - 暴露差距及由此产生的训练问题变得具体可感。考虑 HumanEval/126,is_sorted,当任何元素出现超过两次时必须返回 False。单个测试已经执行了函数的每个语句——完美的语句覆盖率——却无法区分正确的守卫 count2 和变异的守卫 count2:两种实现在此输入上都返回 True。只有跨越决策边界的测试对,才能区分这两种实现。训练问题在于,监督模仿目标中没有内容偏好第二个测试胜过第一个:两者在语法上都地道,都能执行,且在原始实现上都通过——它们的差异只有在候选测试针对被测代码的语义扰动执行时才变得可见。因此,必须训练测试生成器(而不仅仅是提示)将输入放置在决策边界上并断言确切值;而区分此类测试与弱测试的训练信号只能从执行和变异反馈中获得,而非仅从模仿中获得。

TriUTest 的核心思想直接源于这三个瓶颈:单一训练阶段不能同时使生成的测试可执行、可优化和面向缺陷,因为这三个属性因不同原因失败且需要不同的学习信号。可执行性是一种可监督学习的格式化与构建技能;候选可优化性是一种分布属性(采样的候选集必须是低噪声和结构多样的),而监督模仿通过暴露偏差和模式收缩主动损害;缺陷导向是一个套件级、基于执行的目标,模仿和蒸馏都无法表达。因此,TriUTest 为每个属性分配一个专用阶段并排序它们,以便每个阶段产生下一阶段依赖的恰好前提条件。具体而言,我们提出了一种用于 Python 单元测试生成的三阶段后训练框架,按照 SFT → DQ-GKD → SM-GRPO 的顺序逐步改进可执行性、候选可优化性和缺陷导向性。具体而言,SFT 从真实可执行测试对中学习测试结构、输入构建和基本断言模式,为后续训练提供稳定的可执行起点。接下来,DQ-GKD(多样性与质量感知引导知识蒸馏)针对测试生成进行了定制,使用从学生模型自身生成分布中提取的候选样本(一种单次刷新在策略方案;第 3.2 节)。它(i)通过片段掩码将蒸馏能力集中在具有辨别力的、测试敏感的片段(输入/调用/断言)上;(ii)引入基于可执行性、断言充分性和过滤非语义失败的质量加权蒸馏,以防止不可执行或不可学习噪声注入学生分布;以及(iii)通过结构多样性正则化器明确缓解候选模式崩溃,产生更具“可优化性和互补性”的候选集,并为下游强化学习提供更具信息量的探索轨迹。最后,SM-GRPO(状态化边际 GRPO)的关键贡献不仅仅是采用特定的 RL 优化器,而是为每个目标单元维护变异覆盖状态,并将实例级奖励定义为边际增量杀灭,从而将 MKR 的套件级并集目标转换为可优化的边际信号。在组内相对优势和 KL 约束下,模型将执行反馈内化为稳定的缺陷导向生成偏好,在固定预算下抑制冗余并促进互补测试生成。该设计也不同于将存活的变异体外化为提示并依赖迭代修补的工程风格方法:TriUTest 旨在将缺陷导向信号注入参数更新,使得学习到的偏好是可迁移和可复用的。

我们在三个互补设置中评估 TriUTest:来自 HumanEval 的函数级问题、真实单行错误基准 QuixBugs-Python,以及两个有限大小的开源项目级主题,codetiming (v1.4.0, 3 个模块) 和 apimd (v1.0.0, 25 个文件)。我们报告结构性和缺陷导向指标:通过 coverage 获取语句/分支覆盖率,在可变异测试目标上通过 MKR 测量对细粒度语义扰动的敏感性,以及在 QuixBugs 上通过失败触发率 (FTR) 测量真实缺陷的可靠触发。我们进一步采用基于池的动态近似来减轻等价变异体引入的分母噪声 [21], [32](详见实验部分)。在统一的生成预算和评估协议下,我们沿两个正交轴比较 TriUTest:(1)规模控制,即 3B/7B/14B 的仅 SFT 模型,在敏感性分析中还有额外的 1.5B 学生模型和替代教师模型;以及(2)机制控制,包括传统的 SBST 工具 Pynguin [18] 和两个 LLM 增强基线,MuTAP [7] 和 pytLMtester [36],两者均使用与 TriUTest 相同的本地 LLM 后端和相同预算。

结果表明,在覆盖率方面,TriUTest (3B) 实现了宏平均 77.11% 的语句覆盖率和 52.55% 的分支覆盖率,优于同等规模的 SFT-3B 和更大规模的 SFT-7B,在两项宏平均覆盖率指标上超过所有机制基线(Pynguin、MuTAP、pytLMtester),并接近更大的 SFT-14B。更重要的是,在缺陷导向指标上,TriUTest 在三个可变异测试主题上获得了最好的宏平均 MKR(48.75%,超过每个规模控制和机制基线,包括比 SFT-14B 高 10.22 点)和最高的 QuixBugs FTR(78.5%):比最强的主比较规模控制(SFT-14B)高 6.0 点,比 RQ5 敏感性研究中的 1.5B SFT 学生模型高 2.5 点,比最强的机制基线高 14.5 点。消融研究进一步揭示了在我们训练配方下三个阶段之间明显的顺序依赖:DQ-GKD 校准并稳定候选分布;在不进行 DQ-GKD 校准的情况下直接应用 SM-GRPO 会导致缺陷暴露崩溃(FTR 降至 40.0%),即使在其他完全相同的训练配方下也是如此;当 SM-GRPO 构建在 DQ-GKD 校准的策略之上时,模型获得了显著的故障揭示增益,达到 78.5% 的 FTR。

我们的主要贡献如下:
1. 我们提出了 TriUTest,一种用于 Python 单元测试生成的三阶段后训练范式(SFT→DQ-GKD→SM-GRPO),在一个统一流程中解决三个关键瓶颈:建立可执行起点、利用多样性校准候选分布,以及内化执行反馈以进行缺陷导向偏好学习。(https://github.com/ZIYUANLI-star/TriUTest)
2. 我们引入了专为测试生成定制的 DQ-GKD 和 SM-GRPO:DQ-GKD 结合测试敏感跨度掩码、质量加权蒸馏和多样性正则化器,以缓解辨别 token 稀疏性和候选模式崩溃;SM-GRPO 维护每个单元的变异覆盖状态,并通过边际增量杀灭定义奖励,将套件级 MKR 并集目标转换为实例级可优化信号,并在 KL 约束下实现稳定的策略更新。
3. 我们在标准基准和两个有限大小的开源项目级主题上进行了系统的实证和消融分析,为“分布校准 → 执行反馈优化”的顺序依赖和协同增益提供了证据,并通过结构性(语句/分支覆盖率)和缺陷导向(MKR/FTR)指标验证了有效性。

章节片段
基于 LLM 的代码和单元测试生成
关于利用大语言模型 (LLMs) 进行代码和测试生成的现有研究大致遵循两条路线:(i)以代码生成为中心的执行反馈优化,以及(ii)以测试生成为中心的能力评估和生成框架。
在以代码为中心的路线上,一系列研究将预训练代码模型视为策略网络,并从单元测试结果和执行结果中构建强化学习信号,从而提高功能正确性

方法论
我们提出了 TriUTest,一种用于 Python 单元测试生成的三阶段后训练框架(图 1)。

TriUTest 遵循“首先学习编写可执行测试,然后校准候选分布,最后内化执行反馈以优化测试有效性”的原则。我们强调,这种顺序原则是我们从引言中确定的三个特定任务瓶颈中提炼出的自身设计贡献,而不是从先前的评估数据集中获取的现成方法。为了评估 TriUTest 在不同代码规模(从函数级任务到项目级主题)、不同缺陷类型(真实缺陷与注入变异)以及不同测试生成场景下的有效性,我们构建了三个互补的评估设置:1. 函数级编程任务(HumanEval),衡量模型“给定函数签名和自然语言规范生成可执行单元测试”的基本能力 [6]。2. 单行真实缺陷基准测试 (1) SFT 提供了一个“可执行的起点”,但不足以保证故障揭示行为。SFT 从真实可执行测试对中学习测试结构、输入构建和基本断言模式,使模型能够达成“编写可运行测试”的最小可用能力。然而,SFT 的目标本质上是对离线训练分布的模仿:它既没有系统性地缓解自回归生成引起的暴露偏差,也没有明确优化区分错误实现与细粒度语义扰动的能力。

内部效度:实现与工程偏差 TriUTest 的三阶段后训练流水线(SFTDQ-GKDSM-GRPO)包含多个紧密耦合的组件,包括:AST 解析和测试敏感跨度掩码的构建;策略内候选采样和质量信号的计算;基于 JUnitXML 和 pytest 退出码的故障类型识别;多样性特征提取和 Jaccard 距离的计算;以及在 SM-GRPO 中,变异体覆盖状态的维护和边际变异奖励的更新。任何

结论 本文提出了 TriUTest,这是一个用于 Python 单元测试生成的三阶段后训练框架,旨在缓解动态类型语言中长期存在的高结构覆盖率与低故障暴露率之间的张力。与主要依赖基于搜索的优化或将执行反馈外部化为提示或过程迭代的先前方法相比,TriUTest 在参数层面上统一了渐进式训练轨迹。具体而言,它首先采用

竞争利益声明 作者声明他们没有已知的可能影响本文所述工作的竞争性财务利益或个人关系。

李子源(Ziyuan Li)于 2026 年 7 月获得中国电子科学技术研究院(CAEIT)、中国电子科技集团公司(CETC),北京,中国的硕士学位,目前正在中国东南大学,南京,中国计算机科学与工程学院攻读博士学位。李子源的研究兴趣包括软件测试、大语言模型和强化学习。

李子源 | 王志 | 崔灿 东南大学计算机科学与工程学院,南京,211189,中国
相关新闻
生物通微信公众号
微信
新浪微博
  • 搜索
  • 国际
  • 国内
  • 人物
  • 产业
  • 热点
  • 科普

热点排行

    今日动态 | 人才市场 | 新技术专栏 | 中国科学人 | 云展台 | BioHot | 云讲堂直播 | 会展中心 | 特价专栏 | 技术快讯 | 免费试用

    版权所有 生物通

    Copyright© eBiotrade.com, All Rights Reserved

    联系信箱:

    粤ICP备09063491号