评估 并 缓解 含 缺陷 代码 对 大 语言 模型 生成 单元 测试 的 误导 效应 (下 篇)
评估并缓解含缺陷代码对大语言模型生成单元测试的误导效应(下)(中文全译)
本文目录
评估并缓解含缺陷代码对大语言模型生成单元测试的误导效应(下)(中文全译)
上篇:https://openqa.cn/articles/buggy-code-misguidance-tests-zh本篇从「## 4. RQ2:用基于规约的方法缓解误导效应」继续。
4. RQ2:用基于规约的方法缓解误导效应
在 RQ2 中,我们评估所提出的、用于缓解含缺陷代码之误导效应的方法。
表 6. 四种输入下被误导(M)与有效(E)测试的比较:仅使用由含缺陷代码生成的大语言模型文档字符串、仅使用含缺陷代码、既无代码也无文档字符串,以及文档字符串与含缺陷代码并用。结果以数量(#)和百分比(%)给出。
| 模型 | 仅文档(本文)M # | M % | E # | E % | 仅代码 M # | M % | E # | E % | 无代码或文档 M # | M % | E # | E % | 文档+代码 M # | M % | E # | E % |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Gemini 2.5 Pro | 110 | 2.77 | 198 | 4.98 | 173 | 5.27 | 98 | 2.98 | 49 | 1.33 | 124 | 3.37 | 165 | 4.89 | 94 | 2.78 |
| Gemini 2.5 Flash | 105 | 2.39 | 202 | 4.60 | 114 | 3.22 | 140 | 3.96 | 45 | 1.02 | 82 | 1.86 | 117 | 3.23 | 148 | 4.08 |
| Gemini 2.5 Flash(推理) | 126 | 2.44 | 179 | 3.47 | 155 | 3.92 | 99 | 2.50 | 75 | 1.42 | 89 | 1.68 | 209 | 4.92 | 84 | 1.98 |
| Claude 4 Sonnet | 147 | 2.85 | 249 | 4.82 | 149 | 3.55 | 88 | 2.09 | 58 | 1.39 | 107 | 2.56 | 176 | 3.74 | 148 | 3.14 |
| Claude 4 Sonnet(推理) | 165 | 2.91 | 257 | 4.53 | 187 | 4.14 | 88 | 1.95 | 70 | 1.56 | 112 | 2.49 | 196 | 3.90 | 143 | 2.84 |
| Grok-4 | 140 | 3.13 | 239 | 5.35 | 179 | 4.56 | 145 | 3.70 | 106 | 2.32 | 122 | 2.67 | 176 | 4.23 | 157 | 3.77 |
| Grok-3 | 55 | 2.02 | 119 | 4.37 | 71 | 2.79 | 93 | 3.66 | 41 | 1.60 | 93 | 3.64 | 85 | 3.25 | 89 | 3.40 |
| GPT-4.1 | 84 | 2.51 | 160 | 4.79 | 92 | 3.24 | 86 | 3.03 | 37 | 1.22 | 104 | 3.42 | 115 | 3.87 | 98 | 3.30 |
| GPT-O4-mini | 85 | 3.00 | 112 | 3.95 | 130 | 5.20 | 36 | 1.44 | 44 | 1.77 | 91 | 3.65 | 134 | 5.04 | 76 | 2.86 |
| DeepSeek-V3 | 68 | 2.02 | 155 | 4.61 | 76 | 2.53 | 113 | 3.76 | 75 | 2.50 | 77 | 2.57 | 114 | 2.33 | 149 | 3.04 |
| DeepSeek-R1 | 125 | 3.29 | 139 | 3.66 | 145 | 4.25 | 97 | 2.84 | 70 | 1.34 | 106 | 2.03 | 109 | 3.18 | 110 | 3.20 |
| Qwen3-Coder-Plus | 91 | 2.41 | 194 | 5.15 | 80 | 2.32 | 157 | 4.54 | 71 | 1.56 | 77 | 1.69 | 95 | 2.70 | 135 | 3.83 |
| Qwen3-Plus | 168 | 3.19 | 225 | 4.28 | 239 | 4.92 | 114 | 2.35 | 96 | 1.98 | 56 | 1.16 | 208 | 4.10 | 154 | 3.03 |
| 平均 | 113.00 | 2.69 | 186.77 | 4.50 | 137.69 | 3.84 | 104.15 | 2.98 | 64.38 | 1.62 | 95.38 | 2.52 | 146.08 | 3.80 | 121.92 | 3.17 |
表 7. 四种输入下,至少有一条被误导(M)或有效(E)测试的焦点方法数量:仅文档字符串、仅含缺陷代码、既无代码也无文档字符串,以及文档字符串与含缺陷代码并用。
| 模型 | 仅文档 M | 仅文档 E | 仅代码 M | 仅代码 E | 无代码或文档 M | 无代码或文档 E | 文档+代码 M | 文档+代码 E |
|---|---|---|---|---|---|---|---|---|
| Gemini 2.5 Pro | 53 | 86 | 89 | 45 | 27 | 80 | 85 | 42 |
| Gemini 2.5 Flash | 47 | 74 | 44 | 51 | 21 | 50 | 49 | 59 |
| Gemini 2.5 Flash(推理) | 54 | 57 | 64 | 38 | 34 | 48 | 65 | 33 |
| Claude 4 Sonnet | 52 | 85 | 59 | 41 | 26 | 58 | 59 | 59 |
| Claude 4 Sonnet(推理) | 49 | 83 | 63 | 42 | 33 | 64 | 63 | 58 |
| Grok-4 | 53 | 93 | 84 | 60 | 34 | 70 | 76 | 65 |
| Grok-3 | 32 | 60 | 46 | 43 | 26 | 59 | 44 | 43 |
| GPT-4.1 | 42 | 73 | 56 | 45 | 24 | 52 | 61 | 48 |
| GPT-O4-mini | 49 | 61 | 72 | 29 | 22 | 53 | 69 | 41 |
| DeepSeek-V3 | 39 | 65 | 42 | 51 | 28 | 57 | 40 | 60 |
| DeepSeek-R1 | 54 | 68 | 69 | 45 | 36 | 42 | 59 | 53 |
| Qwen3-Coder-Plus | 42 | 73 | 43 | 58 | 26 | 42 | 44 | 55 |
| Qwen3-Plus | 53 | 75 | 81 | 43 | 41 | 46 | 75 | 58 |
| 平均 | 47.62 | 73.31 | 62.46 | 45.46 | 29.08 | 55.46 | 60.69 | 51.85 |
4.1. 将本方法应用于含缺陷代码
在本节中,我们通过与三种替代配置比较来评估本方法的有效性,这些配置分别隔离代码移除与规约替换的效应。表 6 与表 7 给出以下设定的结果:
- 本方法(仅文档): 提示移除含缺陷实现,只使用大语言模型生成的文档字符串作为行为输入。
- 直接基于代码的方法(仅代码): 提示以被测代码作为唯一行为输入,遵循先前基于大语言模型的测试生成研究(Schäfer 等, 2024;Yuan 等, 2024;Lemieux 等, 2023)。
- 上下文剥夺方法(无代码或文档): 提示只包含焦点方法上下文,不含代码或文档字符串,用以评估改进是否仅仅来自隐瞒实现细节,而非用来自大语言模型的文档字符串替换它们。该设定也反映先前测试生成研究中采用的基线(Hossain 等, 2025;Dinella 等, 2022;Hossain 与 Dwyer, 2025)。
- 补充方法(文档+代码): 提示把大语言模型生成的文档字符串与含缺陷代码一起作为额外上下文,遵循 Yuan 等的设定(Yuan 等, 2024)。
相对于仅代码基线,本方法显著提高测试质量:全部模型的被误导测试平均数从 137.69 降至 113.00,减少 24.69 条(-1.15 个百分点)。它也大幅改善缺陷检测,有效测试平均数从 104.15 增至 186.77,增加 82.62 条(+1.52 个百分点)。这些结果提示,让大语言模型聚焦于规约而非含缺陷代码,可以缓解误导,并产生更有用的、能够发现缺陷的测试。
对于无代码或文档基线,被误导测试与有效测试相对于本方法都大幅减少:被误导测试从 113.00 降至 64.38(-1.07 个百分点),有效测试从 186.77 降至 95.38(-1.98 个百分点)。此外,更仔细的考察表明,其所生成测试中只有 56.69% 在含缺陷版本或修复版本上通过,而本方法为 81.05%。这表明,仅仅移除被测代码而不提供行为信息,会使大语言模型对预期行为不确定,导致许多测试既不与含缺陷版本对齐、也不与修复版本对齐,从而使该基线对有效测试生成并不可靠。
文档+代码方法的有效性明显低于本方法:平均而言,它多产生 33.08 条被误导测试(+1.11 个百分点),并且关键地,少 64.85 条有效测试(-1.33 个百分点)。相对于仅代码基线,它只有边际收益:多生成 17.77 条有效测试(+0.19 个百分点),同时也多产生 8.39 条被误导测试。这表明,把大语言模型生成的规约作为上下文加以补充是不够的。
表 7 的方法级结果进一步印证这些发现,在焦点方法层面呈现相似趋势。综合来看,这些结果表明:单独移除被测代码,或单独添加大语言模型生成的文档字符串,都不足以同时缓解误导效应并提高有效测试数量。相反,两个组成部分必须结合:应从行为输入中移除含缺陷实现,并用所生成的规约替换它。
表 8. 基础文档字符串提示、高级文档字符串提示与高级测试提示之间,被误导(M)与有效(E)测试结果的比较,按模型类型分组。结果以测试数量(#)及相应百分比(%)给出。
| 模型 | 基础文档 M # | M % | E # | E % | 高级文档 M # | M % | E # | E % | 高级测试 M # | M % | E # | E % |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Gemini 2.5 Flash | 105 | 2.39 | 202 | 4.60 | 78 | 1.67 | 209 | 4.46 | 139 | 3.29 | 158 | 3.74 |
| Claude 4 Sonnet | 147 | 2.85 | 249 | 4.82 | 98 | 1.77 | 359 | 6.49 | 213 | 3.90 | 120 | 2.20 |
| Grok-3 | 55 | 2.02 | 119 | 4.37 | 52 | 1.76 | 130 | 4.39 | 88 | 2.84 | 115 | 3.72 |
| GPT-4.1 | 84 | 2.51 | 160 | 4.79 | 72 | 2.02 | 200 | 5.61 | 114 | 3.45 | 99 | 3.00 |
| DeepSeek-V3 | 68 | 2.02 | 155 | 4.61 | 52 | 1.54 | 138 | 4.09 | 147 | 2.42 | 184 | 3.03 |
| Qwen3-Coder-Plus | 91 | 2.41 | 194 | 5.15 | 89 | 2.20 | 215 | 5.31 | 177 | 3.30 | 151 | 2.82 |
| 基础模型平均 | 91.67 | 2.37 | 179.83 | 4.72 | 73.50 | 1.83 | 208.50 | 5.06 | 146.33 | 3.20 | 137.83 | 3.09 |
| Gemini 2.5 Pro | 110 | 2.77 | 198 | 4.98 | 90 | 2.06 | 232 | 5.30 | 202 | 5.34 | 116 | 3.06 |
| Gemini 2.5 Flash(推理) | 126 | 2.44 | 179 | 3.47 | 114 | 2.03 | 238 | 4.24 | 169 | 3.85 | 91 | 2.07 |
| Claude 4 Sonnet(推理) | 165 | 2.91 | 257 | 4.53 | 108 | 1.72 | 348 | 5.55 | 256 | 4.47 | 111 | 1.94 |
| Grok-4 | 140 | 3.13 | 239 | 5.35 | 106 | 1.96 | 288 | 5.33 | 184 | 3.70 | 261 | 5.25 |
| GPT-O4-mini | 85 | 3.00 | 112 | 3.95 | 49 | 1.51 | 137 | 4.22 | 145 | 4.81 | 95 | 3.15 |
| DeepSeek-R1 | 125 | 3.29 | 139 | 3.66 | 113 | 2.62 | 191 | 4.43 | 187 | 3.87 | 153 | 3.17 |
| Qwen3-Plus | 168 | 3.19 | 225 | 4.28 | 115 | 1.99 | 308 | 5.33 | 245 | 4.80 | 137 | 2.68 |
| 推理模型平均 | 131.29 | 2.96 | 192.71 | 4.32 | 99.29 | 1.98 | 248.86 | 4.91 | 198.29 | 4.41 | 137.71 | 3.05 |
| 总平均 | 113.00 | 2.69 | 186.77 | 4.50 | 87.38 | 1.91 | 230.23 | 4.98 | 174.31 | 3.85 | 137.77 | 3.06 |
表 9. 表 8 三种提示下,至少有一条被误导(M)或有效(E)测试的焦点方法数量。
| 模型 | 基础文档 M | 基础文档 E | 高级文档 M | 高级文档 E | 高级测试 M | 高级测试 E |
|---|---|---|---|---|---|---|
| Gemini 2.5 Flash | 47 | 74 | 38 | 75 | 53 | 51 |
| Claude 4 Sonnet | 52 | 85 | 42 | 105 | 69 | 55 |
| Grok-3 | 32 | 60 | 38 | 61 | 43 | 49 |
| GPT-4.1 | 42 | 73 | 35 | 87 | 57 | 44 |
| DeepSeek-V3 | 39 | 65 | 35 | 67 | 50 | 66 |
| Qwen3-Coder-Plus | 42 | 73 | 40 | 86 | 53 | 54 |
| 基础模型平均 | 42.33 | 71.67 | 38.00 | 80.17 | 54.17 | 53.17 |
| Gemini 2.5 Pro | 53 | 86 | 43 | 100 | 90 | 50 |
| Gemini 2.5 Flash(推理) | 54 | 57 | 44 | 78 | 65 | 32 |
| Claude 4 Sonnet(推理) | 49 | 83 | 42 | 106 | 65 | 51 |
| Grok-4 | 53 | 93 | 47 | 113 | 69 | 91 |
| GPT-O4-mini | 49 | 61 | 35 | 82 | 84 | 41 |
| DeepSeek-R1 | 54 | 68 | 51 | 77 | 77 | 63 |
| Qwen3-Plus | 53 | 75 | 51 | 96 | 79 | 52 |
| 推理模型平均 | 52.14 | 74.71 | 44.71 | 93.14 | 75.57 | 54.29 |
| 总平均 | 47.62 | 73.31 | 41.62 | 87.15 | 65.69 | 53.77 |
表 10. 断言幻觉行为的「假阳性」测试比例比较:由代码生成、基础文档字符串方法与高级分析方法,按模型类型分组。
| 模型 | 代码提示 | 基础文档字符串提示 | 高级文档字符串提示 |
|---|---|---|---|
| Gemini 2.5 Flash | 18.79% | 17.69% | 21.27% |
| Claude 4 Sonnet | 13.84% | 15.95% | 16.01% |
| Grok-3 | 17.81% | 16.99% | 21.82% |
| GPT-4.1 | 17.42% | 16.50% | 19.37% |
| DeepSeek-V3 | 19.37% | 19.10% | 19.66% |
| Qwen3-Coder-Plus | 19.36% | 19.08% | 19.98% |
| 基础模型平均 | 17.77% | 17.55% | 19.68% |
| Gemini 2.5 Pro | 15.43% | 15.15% | 17.22% |
| Gemini 2.5 Flash(推理) | 15.24% | 15.27% | 16.27% |
| Claude 4 Sonnet(推理) | 14.62% | 15.59% | 16.92% |
| Grok-4 | 14.14% | 12.09% | 17.46% |
| GPT-O4-mini | 9.24% | 12.00% | 15.78% |
| DeepSeek-R1 | 18.76% | 16.77% | 15.91% |
| Qwen3-Plus | 18.64% | 18.26% | 18.24% |
| 推理模型平均 | 15.15% | 15.02% | 16.83% |
| 总平均 | 16.36% | 16.19% | 18.15% |
4.2. 进一步加强本方法
尽管本方法相对于直接从含缺陷代码生成测试有大幅改进,被误导测试与有效测试相对于用修复后代码提示仍存在的差距,凸显了进一步改进的空间,并促使我们采用更精细的规约构造方法,以更好地捕捉预期行为。如第 2.5 节所述,我们提出高级文档字符串提示,以进一步利用现代大语言模型的代码理解能力。我们将其与第 2.5 节讨论的两个基线比较:(1)图 3 中的基础文档字符串提示,对应于第 4.1 节评估的本方法基础版本;(2)直接基于代码的测试生成结合图 3 中的高级分析提示,记为高级测试提示(Advanced Test Prompt):大语言模型首先被指示分析被测代码中的潜在缺陷,然后在假定所有已识别缺陷均已修复的前提下生成测试。
修复后代码
public String generateToolTipFragment(String toolTipText) {
return " title=\"" + ImageMapUtilities.htmlEscape(toolTipText)
+ "\" alt=\"\"";
}含缺陷代码
public String generateToolTipFragment(String toolTipText) {
return " title=\"" + toolTipText
+ "\" alt=\"\"";
}基础文档字符串提示的输出
/**
* Generates an HTML fragment for a tooltip attribute in an image map.
*
* The method constructs a standardized HTML title attribute (used for tooltips) along with an empty alt attribute.
* The resulting string is formatted as valid HTML markup that can be inserted into an image map element.
*
* @param toolTipText The text content to be displayed as the tooltip. This should be properly escaped for HTML inclusion.
* @return A string containing HTML attributes for tooltip functionality, formatted as ‘ title="[toolTipText]" alt=""‘ where
* [toolTipText] is the provided parameter value.
*/生成了 0 条有效测试和 3 条被误导测试 ✗
高级文档字符串提示的输出
/**
* Generates an HTML fragment for a tooltip attribute (‘title‘) and an empty ‘alt‘ attribute. The method ensures the tooltip
* text is properly escaped to prevent HTML syntax errors or security vulnerabilities, e.g., XSS. If the input is ‘null‘, an empty
* ‘title‘ attribute is returned.
*
* @param toolTipText The text to be displayed as a tooltip. If ‘null‘, the ‘title‘ attribute will be empty.
* @return A formatted HTML fragment containing the ‘title‘ and ‘alt‘ attributes. The ‘title‘ attribute will contain the escaped
* version of ‘toolTipText‘, and the ‘alt‘ attribute will always be empty. Example: ‘ title="escaped-text" alt=""‘.
*/生成了 5 条有效测试和 0 条被误导测试 ✓
图 6. 比较基础文档字符串提示与高级文档字符串提示的定性示例。在同一含缺陷方法上比较基础与高级文档字符串提示:高级文档字符串识别出缺失的转义步骤,从而产生能够发现该缺陷的测试。
表 8 与表 9 确认了这一高级方法的有效性。对于推理模型,高级提示相对于基础文档字符串提示带来大幅收益:被误导测试平均减少 32.00(-0.98 个百分点),有效测试增加 56.15(+0.59 个百分点)。量身定制的多步提示同样改善了基础模型:相对于基础文档字符串提示,被误导测试减少 18.17(-0.54 个百分点),有效测试增加 28.67(+0.34 个百分点)。本方法也显著优于高级测试提示。对于推理模型,本方法平均比高级测试提示少生成 99.00 条被误导测试(-2.43 个百分点),多生成 111.15 条有效测试(+1.86 个百分点)。对于基础模型,本方法平均少生成 72.83 条被误导测试(-1.37 个百分点),多生成 70.67 条有效测试(+1.97 个百分点)。这些结果强化了将高级分析策略与我们基于规约的方法相结合的必要性。
由于我们的高级方法提示大语言模型识别潜在缺陷并提出修复,它可能幻觉出并不存在的「虚假意图」行为或不正确的修复,从而导致「假阳性」测试:这些测试断言的行为既不存在于含缺陷版本、也不存在于修复版本,因而在两者上都失败。我们在表 10 中报告此类测试的比例。本方法的基础版本并不提高这一比例。相比之下,高级分析方法涉及一种权衡:它使该比例略有上升,从约 16% 到约 18%,但作为交换获得可观收益——相对于基础版本,带有被误导测试的焦点方法数量平均减少 6 个(降低 12.60%),平均多检测出 14 个缺陷(增加 18.88%)。
图 6 给出一个定性示例,说明我们的高级提示如何引出更准确的规约文档字符串。在该例中,含缺陷代码缺乏稳健性,因为它未能正确转义输入文本。由高级提示生成的文档字符串正确识别了这一缺口并包含必要的转义步骤,从而生成成功检测该缺陷的测试。相比之下,基础文档字符串提示所生成的文档字符串并不包含这一步骤,结果没有生成有效测试。
图 7. 迭代精炼各轮中,已编译、有效与被误导测试数量(上)以及测试套件中至少包含一条此类测试的焦点方法数量(下)的变化,比较含缺陷代码输入与我们的文档字符串输入。折线图展示三轮精炼中,含缺陷代码输入与文档字符串输入下,已编译、有效与被误导测试的数量,以及检测到缺陷和存在被误导测试的焦点方法数量。
4.3. 对多轮提示设定的影响
近期的单元测试生成工作常常采用多轮提示:大语言模型根据执行结果、人工输入或其他人工智能代理等来源的反馈,迭代地精炼测试(Chen 等, 2024;Yuan 等, 2024;Jain 与 Le Goues, 2025)。
为考察误导效应在这种多轮、迭代设定中如何表现,我们采用与 Yuan 等的 ChatTester(Yuan 等, 2024)类似的、由反馈驱动的过程来评估所提出的方法。在该设定中,若生成的测试未能执行,我们抽取所得错误信息并附加到原始上下文。然后将这一增强后的提示重新提交给大语言模型,并指示其修订测试套件。尽管具体的多轮流水线在架构上各不相同,这一精炼循环作为我们评估的一个有代表性的基线。
基于图 7 的结果,我们观察到:尽管两种提示(含缺陷代码与规约文档字符串)以相似速率提高编译成功率,我们基于规约的方法在迭代测试精炼中更为稳健、也更有效。在每一轮中,它都持续加速有效测试的生成,同时抑制被误导测试的产生。
经过三轮精炼后,文档字符串输入使平均有效测试数增加 35.69,超过含缺陷代码输入所增加的 17.62 的两倍;在方法层面也有类似优势(9.85 对 5.69)。相反,使用文档字符串输入时,被误导测试数平均只增长 18.08,而含缺陷代码输入增长 31.77;这一趋势在方法层面同样成立(3.38 对 8.62)。这些结果确认了本方法在多轮测试生成设定中的有效性。
表 11. Gemini 与 Qwen 的 Cohen’s $\kappa$ 一致性及标签组合统计。
(a)Cohen’s $\kappa$
| 标签 | Gemini | Qwen |
|---|---|---|
| (1) | 0.82 | 0.84 |
| (2) | 0.77 | 0.79 |
(b)标签组合统计
| (1) | (2) | Gemini 数量 | Gemini 被误导 | Gemini 已检测 | Qwen 数量 | Qwen 被误导 | Qwen 已检测 |
|---|---|---|---|---|---|---|---|
| 否 | 否 | 72 | 6 | 14 | 101 | 6 | 17 |
| 否 | 是 | 198 | 13 | 80 | 151 | 11 | 55 |
| 是 | 否 | 48 | 24 | 6 | 66 | 23 | 14 |
4.4. 文档字符串质量如何影响测试质量?
为补充经验结果,我们进行人工检查,评估用高级文档字符串提示所生成文档字符串的质量,以及它们如何影响下游测试。如第 2.5 节所述,检查覆盖在本方法下被误导测试套件降幅最大与最小的两个模型:Gemini 2.5 Pro 与 Qwen3-Coder-Plus。遵循定性编码的常见做法(Saldaña, 2025;O’Connor 与 Joffe, 2020),一位作者与一位外部标注者——二者都具有丰富的软件开发经验——独立标注每份文档字符串是否:(1)保留原始缺陷;(2)描述纠正后的行为。我们使用初始的独立标注,分别对每个标签和每个模型计算 Cohen’s $\kappa$,结果见表 11(a)。分歧随后通过讨论解决(Chinh 等, 2019;Miles 等, 2014),共识标签用于最终分析。按照 Landis 与 Koch 的解释(Landis 与 Koch, 1977),$\kappa$ 值表明标签(1)达到「几乎完全一致」(0.82、0.84),标签(2)达到「实质性一致」(0.77、0.79)。
表 11(b)给出全部标签组合的检查结果。我们省略标签(1)与(2)均为「是」的一行,因为其计数为零。这是预期之中的:如果一份文档字符串保留了含缺陷方法中的原始缺陷,它就不太可能同时描述修复该缺陷所需的纠正后行为。我们把这些结果中的关键发现概括如下:
本方法有效减少缺陷向所生成文档字符串的传播,并恢复了大量正确行为。 在每个模型生成的 318 份文档字符串中,只有 48 份 Gemini 生成的文档字符串(15.09%)和 66 份 Qwen 生成的文档字符串(20.75%)保留了原始缺陷。与此同时,198 份 Gemini 生成的文档字符串(62.26%)和 151 份 Qwen 生成的文档字符串(47.48%)恢复了修复焦点方法缺陷所需的正确行为。
不含缺陷行为的文档字符串导致被误导测试套件显著更少,而恢复了正确行为的文档字符串则贡献了大幅更多的被发现缺陷。 对于 Gemini,270 份无缺陷文档字符串只对应 43 个被误导焦点方法中的 19 个,而 48 份保留缺陷的文档字符串对应 43 个中的 24 个;198 份恢复正确行为的文档字符串贡献了 100 个被发现缺陷中的 80 个,其余 120 份文档字符串贡献 100 个中的 20 个。Qwen 亦类似:252 份无缺陷文档字符串对应 40 个被误导焦点方法中的 17 个,而 66 份保留缺陷的文档字符串对应 40 个中的 23 个;151 份恢复正确行为的文档字符串贡献了 86 个被发现缺陷中的 55 个,其余 167 份文档字符串贡献 86 个中的 31 个。
RQ2 回答
我们基于规约的方法是缓解误导效应的一种高度有效的策略。通过用大语言模型生成的规约替换含缺陷代码,我们显著减少被误导测试的生成,同时大幅增加有效测试数量。该方法优于仅仅用规约补充含缺陷代码的先前方法。我们还引入一种由分析驱动的高级提示策略,构造更准确的规约,进一步减少误导并提高缺陷检测效力。我们表明,本方法并不会显著增加断言幻觉行为的测试生成。在多轮、交互式设定中,本方法更为稳健,在加速缺陷检测的同时抵抗错误累积。最后,人工检查表明,本方法大幅阻止缺陷传播到所生成的文档字符串中,并为一大部分含缺陷焦点方法恢复正确行为。前者导致被误导测试套件显著更少,后者则贡献了大幅更多的被发现缺陷。这些发现表明,仅仅移除含缺陷的实现细节是不够的;恢复正确行为对于生成有效测试至关重要。
5. RQ3:对无缺陷代码的影响
在真实应用中,被测代码的正确性是未知的,这意味着本方法也必须适用于无缺陷代码。我们通过把本方法应用于基准中的无缺陷(即修复后)代码来验证这一点。我们依据先前工作中常用的两项准则评估其适用性(Chen 等, 2024;Yuan 等, 2024;Dakhel 等, 2024;Yang 等, 2024b;Schäfer 等, 2024):测试正确性与测试覆盖率。结果与以无缺陷代码为输入的基线进行比较。
表 12. 基线(修复后代码输入)与本方法在测试正确性与覆盖率统计上的比较。CFR 与 FAR 越低越好(↓),覆盖率越高越好(↑)。
| 模型 | 修复后 CFR ↓ | 修复后 FAR ↓ | 本方法 CFR ↓ | 本方法 FAR ↓ | 修复后 行覆盖 ↑ | 修复后 分支覆盖 ↑ | 本方法 行覆盖 ↑ | 本方法 分支覆盖 ↑ |
|---|---|---|---|---|---|---|---|---|
| Gemini 2.5 Pro | 16.07% | 30.55% | 21.78% | 38.69% | 79.43% | 75.70% | 75.39% | 70.05% |
| Gemini 2.5 Flash | 29.95% | 47.59% | 29.87% | 51.10% | 68.14% | 61.11% | 69.03% | 62.33% |
| Gemini 2.5 Flash(推理) | 32.84% | 47.80% | 29.19% | 48.56% | 63.48% | 56.51% | 73.32% | 68.61% |
| Claude 4 Sonnet | 13.76% | 29.48% | 13.59% | 29.69% | 75.89% | 72.14% | 81.83% | 75.99% |
| Claude 4 Sonnet(推理) | 19.15% | 33.82% | 15.43% | 31.11% | 73.16% | 69.49% | 79.84% | 75.81% |
| Grok-4 | 18.17% | 31.89% | 21.03% | 40.57% | 76.16% | 71.76% | 75.42% | 69.63% |
| Grok-3 | 21.85% | 39.33% | 18.15% | 39.38% | 64.67% | 61.04% | 70.23% | 63.55% |
| GPT-4.1 | 20.34% | 36.28% | 14.76% | 33.78% | 69.29% | 64.18% | 77.27% | 72.31% |
| GPT-O4-mini | 20.61% | 32.00% | 20.03% | 37.26% | 73.48% | 68.99% | 71.20% | 63.74% |
| DeepSeek-V3 | 22.04% | 41.59% | 20.79% | 41.25% | 69.43% | 62.34% | 73.27% | 66.89% |
| DeepSeek-R1 | 20.40% | 36.17% | 21.18% | 38.82% | 72.97% | 68.31% | 74.54% | 68.20% |
| Qwen3-Coder-Plus | 21.68% | 42.71% | 15.30% | 35.98% | 67.76% | 64.12% | 76.78% | 73.69% |
| Qwen3-Plus | 19.99% | 37.65% | 20.15% | 41.38% | 75.54% | 70.28% | 78.18% | 73.78% |
| 平均 | 21.30% | 37.45% | 20.10% | 39.04% | 71.49% | 66.61% | 75.10% | 69.58% |
首先,我们通过度量编译失败率(Compilation Failure Rate, CFR)与误报率(False-Alarm Rate, FAR)来评估本方法是否引入虚假问题。如表 12 所示,本方法使 CFR 略降 1.20 个百分点,使 FAR 略升 1.59 个百分点。总体而言,对于无缺陷代码,本方法与用源代码提示的表现相当。
其次,我们评估本方法对测试覆盖率的影响,覆盖率对回归测试等应用是关键指标。表 12 的结果表明,我们基于规约的方法保持了与直接使用源代码这一基线相当的覆盖率,行覆盖率小幅提高 3.61 个百分点,分支覆盖率小幅提高 2.97 个百分点。
RQ3 回答
实验确认,我们基于规约的方法可同时应用于含缺陷代码与无缺陷代码。在无缺陷代码上,相对于代码输入基线,它并不显著提高编译失败率或误报率,并保持相当水平的测试覆盖率。因此,本方法在提高有缺陷代码上的缺陷检测的同时,并不损害为正确代码所生成测试的质量或可靠性,使其适用于一般用途以及回归测试等任务。
6. 效度威胁与局限
外部效度。
对外部效度的威胁涉及我们发现的可推广性。本研究依赖 Defects4J 基准,这是先前工作中的常见选择(Tufano 等, 2021;Alagarsamy 等, 2024;Schäfer 等, 2024;Yang 等, 2024b)。我们使用了覆盖 Defects4J 全部 17 个项目的 318 个多样化焦点方法,确保评估数据具有合理的广度。此外,我们对 11 个前沿大语言模型的评估——它们代表研究开展时最先进的模型——支持结果的可推广性。尽管如此,Defects4J 可能无法完全捕捉两种真实场景。第一,在专有或高度领域特定的系统中,大语言模型可能缺乏推断预期行为所需的充分领域知识或上下文,从而可能产生幻觉的「虚假意图」或不正确的缺陷修复。第二,对于深度有状态或依赖丰富的代码,方法级文档字符串可能省略重要的类、状态或依赖信息,可能导致测试不可用或覆盖更浅。尽管我们的提示遵循 Yang 等(Yang 等, 2024b)纳入了周边类上下文以及用户定义对象类型的构造函数,对于大规模、依赖丰富的项目,这一上下文仍可能不足。
内部效度。
对内部效度的威胁主要来自实验设计与人工分析。为减轻实验设计威胁,我们在全部实验中使用一致的过程:所有模型在每种实验设定中都使用相同的提示模板和相同的参数设定,评估流水线统一应用于全部生成的测试。我们还审查了数据收集脚本以尽量减少错误。对于人工检查,标注者的主观性可能影响标签。为减轻这一风险,我们遵循常见的定性编码实践:一位作者与一位外部标注者独立标注文档字符串,在初始标签上计算 Cohen’s $\kappa$,分歧通过讨论解决直至达成共识。
构念效度。
本研究中对构念效度的威胁主要来自三个来源。第一,为减轻大语言模型固有的随机性,我们在可能的情况下把生成温度设为 0,以促进确定性输出。第二,数据污染是潜在威胁,因为 Defects4J 中人工编写的测试可能曾是模型训练数据的一部分。然而,我们提出的基于文档字符串的方法可以看作一种改写(paraphrasing),这是常用于降低数据污染影响的技术(Lu 等, 2024;Yang 等, 2023;Song 与 Cohen, 2025)。此外,这种提示在全部模型上都带来显著改进而非下降,提示大语言模型并非简单地回忆记忆中的测试,而是在规约所提供的信息上运作。第三,我们的高级提示方法可能引入随后被所生成测试断言的幻觉行为。我们通过度量在含缺陷代码上于含缺陷版本与修复版本都失败的「假阳性」测试,以及在无缺陷代码上于正确实现失败的误报测试,来评估这一风险。在两种设定中,相对于源代码基线我们都只观察到小幅上升,提示这一风险并未被大幅抬高。
7. 相关工作
在大语言模型之前,传统的自动单元测试生成依赖于符号执行(Păsăreanu 等, 2008;Cadar 等, 2008)、基于搜索的算法(Fraser 与 Arcuri, 2014;Lukasczyk 与 Fraser, 2022)以及模型检验(Ammann 等, 1998;Enoiu 等, 2016)等技术。然而,与人工编写的测试相比,这些技术产生的测试往往可维护性与可读性较低,使人类开发者难以从中获得有用知识(Yang 等, 2024b)。
随后,基于 Transformer 的模型(Vaswani 等, 2017)在各种代码相关任务上展现出有前景的结果,包括代码生成(Chen 等, 2021)、自动程序修复(Yin 等, 2024)和代码翻译(Yang 等, 2024a)。将这些模型应用于单元测试生成的早期努力,把该任务视为序列到序列问题——类似于机器翻译——使用较小规模的架构,例如用代码—测试对训练的 BART(Lewis 等, 2020)、PLBART(Ahmad 等, 2021)和 CodeT5(Wang 等, 2021)。例如,Tufano 等(Tufano 等, 2021)引入了专门为单元测试生成训练的基于 BART 的模型;Alagarsamy 等提出 A3Test(Alagarsamy 等, 2024),一种基于 PLBART、通过增强断言来提高测试质量的方法;Shin 等(Shin 等, 2024)对 CodeT5 应用领域自适应以增强单元测试生成。
仅解码器的大语言模型的出现,例如可扩展到数千亿参数的 GPT(Brown 等, 2020),使更自然、更可维护的测试生成成为可能(Pan 等, 2025)。最早的专门方法之一 CAT-LM(Rao 等, 2023)在对齐的代码—测试数据上训练了 GPT 风格的模型。GPT-4(OpenAI, 2024)、Claude(Anthropic, 2024b)和 Llama(Touvron 等, 2023)等更大的模型尽管并非明确为单元测试生成而训练,在精心设计的提示指令引导下仍能产生有意义的测试用例。近期工作探索了各种提示策略,以用这些模型提高测试正确性(Siddiq 等, 2024;Lops 等, 2024;Lemieux 等, 2023)和覆盖率(Wang 等, 2024b;Alshahwan 等, 2024;Altmayer Pizzorno 与 Berger, 2025)。互补研究也考察了不同微调方法如何进一步增强大语言模型在单元测试生成上的能力(Shang 等, 2025;Storhaug 与 Li, 2024)。
尽管相当多的先前研究主要从测试正确性与覆盖率方面评估大语言模型所生成的单元测试,其核心功能——缺陷检测——受到的关注相对有限。近期研究(Yang 等, 2024b;Tang 等, 2024;Dakhel 等, 2024)已开始通过直接评估并改进大语言模型的缺陷检测能力来填补这一空白。然而,这些研究通常使用正确代码作为输入,忽视了被测代码往往可能含有缺陷的真实场景。
少数近期工作开始评估由含缺陷代码生成的单元测试。Abdullin 等(Abdullin 等, 2025)报告了把含缺陷代码作为大语言模型输入时的缺陷检测率。Li 等(Li 等, 2023)提出从大语言模型根据含缺陷代码推断出的意图合成多个代码变体,并基于这些变体之间的差异生成测试。他们进一步提出,当含缺陷代码与修复后代码仅有细微差别时,大语言模型往往能够推断预期行为,但证据基于一个较小的数据集(40 个程序)和相对简单的任务。Mathews 等(Mathews 与 Nagappan, 2024)指出,含缺陷代码可能使其自身缺陷无法被由其生成的测试所检测。Huang 等(Huang 等, 2025)表明,由含缺陷代码生成的测试在正确性、覆盖率和缺陷检测能力上更低,并初步尝试把这一现象框定为误导效应。然而,正如我们在第 2 节所证明的,他们的指标并不能准确刻画误导的存在或幅度。迄今为止,尚无先前研究准确量化含缺陷代码如何误导大语言模型,并提出有效的缓解策略。
8. 结论与未来工作
在本文中,我们对大语言模型所生成测试中的误导效应进行了大规模定量研究:这一现象是指含缺陷代码导致大语言模型把错误行为误解为预期功能。利用我们引入的一项新指标,我们从经验上证明该效应严重的双重影响:它增加验证该缺陷的「被误导测试」的生成,同时抑制本可检测该缺陷的「有效测试」。此外,我们从模型内部视角确认该效应,表明含缺陷代码会使模型的偏好偏向于断言其错误行为的「被误导测试」。
为应对这一问题,我们提出并验证了一种基于规约的方法:以由被测代码构造的规约作为唯一行为输入,从而使测试生成与可能有缺陷的实现解耦。实验表明,即便简单的、由大语言模型生成的文档字符串也能显著缓解误导效应并改善缺陷检测。我们进一步证明,该方法可以用基于推理的代码意图分析加以增强,并可作为多轮、交互式提示工作流更有效的基础。最后,本方法同时适用于含缺陷代码与无缺陷代码,在后者上达到与基线相当的编译失败、误报测试和测试覆盖率水平。
我们的工作强调了应对误导效应的必要性,并表明:把焦点从有缺陷的实现转向预期规约,是基于大语言模型的软件测试一条稳健而有效的前进路径。未来工作包括:开发更稳健的规约生成方法,使其能够在大规模或领域特定项目中可靠地推断预期行为,可能通过把多智能体大语言模型推理与来自静态程序分析的行为信息相结合;探索自然语言之外的规约形式,例如 UML 图或形式化规约;以及把大语言模型生成的规约与高质量的人工撰写规约进行比较,以评估它们在缓解误导方面的有效性,并理解该方法的上界。
致谢
本工作得到加拿大自然科学与工程研究理事会(Natural Sciences and Engineering Research Council of Canada, NSERC)资助 RGPIN-2022-04154,以及 Connaught 基金资助 NR-2022-23 的支持。我们感谢 Yuliang Song 在定性分析中担任外部标注者。
数据可用性
本研究所用数据来自公开可用的 Defects4J 数据集(Just 等, 2014)。为支持可复现性,我们提供复现包(Zhao 等, 2026),包含数据预处理脚本、人工检查结果,以及评估流水线和所提出的基于规约的测试生成方法的源代码。该包在 GitHub 上公开:https://github.com/drixs2050/EvalAndMitigate ,并在 Zenodo 上永久存档(DOI:10.5281/zenodo.21428153)。
署名与许可
- 原文:Junda Zhao, Shurui Zhou, Eldan Cohen. Evaluating and Mitigating the Misguidance Effect of Buggy Code in LLM-Generated Unit Tests. PACMSE / ISSTA, DOI: 10.1145/3832204. arXiv:2607.22883. https://arxiv.org/abs/2607.22883
- 许可:原文以 CC BY 4.0 许可发布。
- 译者:智测团队
觉得有用,转给同事
微信扫码
用微信扫一扫,在手机上打开后即可转发。