2025-11-21T20:19:23.757806

The Prompt Alchemist: Automated LLM-Tailored Prompt Optimization for Test Case Generation

Gao, Wang, Gao et al.
Test cases are essential for validating the reliability and quality of software applications. Recent studies have demonstrated the capability of Large Language Models (LLMs) to generate useful test cases for given source code. However, the existing work primarily relies on human-written plain prompts, which often leads to suboptimal results since the performance of LLMs can be highly influenced by the prompts. Moreover, these approaches use the same prompt for all LLMs, overlooking the fact that different LLMs might be best suited to different prompts. Given the wide variety of possible prompt formulations, automatically discovering the optimal prompt for each LLM presents a significant challenge. Although there are methods on automated prompt optimization in the natural language processing field, they are hard to produce effective prompts for the test case generation task. First, the methods iteratively optimize prompts by simply combining and mutating existing ones without proper guidance, resulting in prompts that lack diversity and tend to repeat the same errors in the generated test cases. Second, the prompts are generally lack of domain contextual knowledge, limiting LLMs' performance in the task.
academic

The Prompt Alchemist: Automated LLM-Tailored Prompt Optimization for Test Case Generation

基本信息

  • 论文ID: 2501.01329
  • 标题: The Prompt Alchemist: Automated LLM-Tailored Prompt Optimization for Test Case Generation
  • 作者: Shuzheng Gao, Chaozheng Wang, Cuiyun Gao, Xiaoqian Jiao, Chun Yong Chong, Shan Gao, Michael R. Lyu
  • 分类: cs.SE cs.AI cs.CL
  • 发表时间/会议: JOURNAL OF LATEX CLASS FILES, VOL. 18, NO. 9, SEPTEMBER 2020
  • 论文链接: https://arxiv.org/abs/2501.01329

摘要

测试用例对于验证软件应用程序的可靠性和质量至关重要。近期研究表明大型语言模型(LLMs)具备为给定源代码生成有用测试用例的能力。然而,现有工作主要依赖人工编写的简单提示词,这往往导致次优结果,因为LLMs的性能高度依赖于提示词的质量。此外,这些方法对所有LLMs使用相同的提示词,忽略了不同LLMs可能最适合不同提示词的事实。本文提出MAPS方法,通过多样性引导的提示生成、失败驱动的规则归纳和领域上下文知识提取三个核心模块,实现针对不同LLMs的自动化提示优化。

研究背景与动机

1. 核心问题

测试用例生成是软件工程中的关键任务,传统方法如Evosuite和Randoop依赖搜索和约束技术,而基于LLM的方法虽然显示出潜力,但存在以下问题:

  • 依赖人工编写的简单提示词,导致性能次优
  • 对所有LLM使用相同提示词,忽略了LLM间的差异性
  • 缺乏针对测试用例生成任务的专门优化

2. 问题重要性

  • 手动编写测试用例耗时且困难
  • 高质量测试用例对软件质量保证至关重要
  • LLM在代码理解和生成方面的强大能力需要通过优化提示词来充分发挥

3. 现有方法局限性

作者通过初步实验发现现有自动提示优化(APO)方法在测试用例生成任务上的三个主要问题:

  • 低多样性: 生成的提示词缺乏多样性,容易陷入局部最优
  • 重复错误: 优化后的提示词仍产生与原始提示词相同的错误
  • 缺乏领域知识: 缺少必要的项目级上下文信息,如继承关系和类调用信息

核心贡献

  1. 首次研究: 据作者所知,这是首个专门针对测试用例生成任务的LLM定制化提示优化研究
  2. 创新方法: 提出MAPS方法,集成了多样性引导的提示生成、失败驱动的规则归纳和领域上下文知识提取
  3. 显著提升: 在三个流行LLM上的实验表明,MAPS相比最强基线方法平均提高6.19%的行覆盖率和5.03%的分支覆盖率
  4. LLM定制化: 证明了为不同LLM生成定制化提示词的有效性

方法详解

任务定义

给定黑盒模型M、小型开发集Ddev、测试集Dtest和评分函数s(·),APO旨在基于Ddev从自然语言空间中发现一个优化提示词p,使M在测试集Dtest上的性能最大化。

模型架构

MAPS包含三个核心模块:

1. 领域上下文知识提取(Domain Contextual Knowledge Extraction)

该模块为LLM提供相关的项目级上下文信息:

文件内上下文知识:

  • 类签名:包含焦点方法的类的类型和名称
  • 焦点方法:需要生成测试用例的具体方法
  • 成员方法签名:类内其他方法的函数签名

跨文件上下文知识:

  • 类继承信息:对于抽象或私有类,扫描整个项目定位其子类
  • 类调用信息:识别焦点方法参数类型,追踪用户定义类型的定义和构造函数

2. 多样性引导的提示生成(Diversity-guided Prompt Generation)

该模块通过探索不同的修改路径创建多样化的提示词:

Algorithm 2: PROMPTIMPROVEMENT
1. 选择性能最好的K个提示词
2. 生成N个不同的修改方法
3. 基于每个修改方法生成新提示词
4. 合并选中的提示词和新生成的提示词

3. 失败驱动的规则归纳(Failure-driven Rule Induction)

该模块通过分析失败测试用例归纳规则来避免重复错误:

失败信息选择:

  • 收集失败测试用例及错误信息
  • 使用DBSCAN聚类算法聚合失败信息
  • 基于聚类大小和与历史失败的相似性进行加权采样

错误反思:

  • 选择代表性失败案例构建反思提示词
  • 让LLM提供详细解释和解决方案
  • 将解释和解决方案转换为简洁规则

规则验证:

  • 验证每个新生成规则的有效性
  • 保留性能最佳的规则

技术创新点

  1. 多样性保证: 通过强制使用不同修改方法确保提示词多样性,避免局部最优
  2. 失败学习: 从失败案例中学习,通过规则归纳指导优化过程
  3. 上下文增强: 提供项目级上下文信息,帮助LLM生成准确测试用例
  4. 软集成: 将反思输出转换为简洁规则,避免冗长提示词带来的性能下降

实验设置

数据集

使用广泛采用的Defects4J基准测试,包含5个Java项目:

  • Apache Commons CLI (29个bug)
  • Apache Commons CSV (15个bug)
  • Google Gson (17个bug)
  • JFreeChart (26个bug)
  • Apache Commons Lang (60个bug)
  • 总计:147个bug,85个焦点类,5,278个焦点方法

评价指标

  • 行覆盖率(%): 测试期间执行的代码行百分比
  • 分支覆盖率(%): 测试期间执行的分支百分比

对比方法

LLM模型:

  • ChatGPT (gpt-3.5-turbo-0125)
  • Llama-3.1-70B-Instruct
  • Qwen2-72B-Instruct

基线方法:

  • Basic: 最佳种子提示词性能
  • APE: 直接要求LLM生成语义保持的提示词变体
  • OPRO: 结合性能信息生成新提示词
  • EVOPROMPT (GA/DE): 基于进化算法的最新提示优化方法

实现细节

  • 种子提示词数量: 5
  • 每轮生成提示词数量: 2
  • 最大迭代次数: 5
  • 开发集: 随机采样10个bug
  • 重复实验3次报告平均结果

实验结果

主要结果

ChatGPT上的性能:

  • 行覆盖率: MAPS达到53.80%,最强基线EVOPROMPT(GA)为46.63%,提升7.17%
  • 分支覆盖率: MAPS达到41.84%,最强基线为35.88%,提升5.96%

Llama-3.1上的性能:

  • 行覆盖率: MAPS达到50.59%,最强基线为46.52%,提升4.07%
  • 分支覆盖率: MAPS达到39.50%,最强基线为35.07%,提升4.43%

Qwen2上的性能:

  • 行覆盖率: MAPS达到45.51%,最强基线为39.41%,提升6.10%
  • 分支覆盖率: MAPS达到32.71%,最强基线为28.92%,提升3.79%

消融实验

各模块贡献分析(以ChatGPT为例):

  • 移除领域上下文知识提取:行覆盖率下降9.64%,分支覆盖率下降8.53%
  • 移除多样性引导提示生成:行覆盖率下降8.21%,分支覆盖率下降7.80%
  • 移除失败驱动规则归纳:行覆盖率下降6.94%,分支覆盖率下降4.76%

LLM定制化效果

实验验证了MAPS能为不同LLM生成定制化提示词:

  • 每个LLM在其专属优化提示词上表现最佳
  • ChatGPT的最终提示词在ChatGPT上比其他LLM的提示词分别高出2.45%和2.66%的行覆盖率
  • MAPS优化的提示词均优于手动设计的提示词

案例分析

案例1 - Llama-3.1: 通过第二条归纳规则,模型正确生成了包含异常处理的测试用例 案例2 - ChatGPT: 通过跨文件上下文知识,模型能够正确初始化抽象类

相关工作

自动提示优化

  • APE: 直接要求LLM生成语义保持的提示词变体
  • OPRO: 结合性能信息指导提示词生成
  • EVOPROMPT: 基于进化算法的最新方法

测试用例生成

  • 传统方法: Randoop(随机模糊测试)、Evosuite(搜索算法)
  • 深度学习方法: AthenaTest(微调BART)、A3Test(断言知识增强)
  • LLM方法: ChatUniTest、ChatTESTER等

结论与讨论

主要结论

  1. MAPS在所有LLM上均显著优于现有提示优化方法
  2. 不同LLM确实需要定制化的提示词
  3. 三个核心模块都对性能提升有重要贡献,其中领域上下文知识提取贡献最大

局限性

  1. LLM局限: 仅在三个代表性LLM上进行评估
  2. 语言局限: 实验仅限于Java项目,未涵盖其他编程语言
  3. 数据集范围: 仅使用Defects4J基准测试

未来方向

  1. 扩展到更多LLM和编程语言
  2. 与现有LLM测试生成方法结合
  3. 探索更复杂的项目级上下文信息

深度评价

优点

  1. 问题定义清晰: 首次系统性地研究了LLM测试用例生成的提示优化问题
  2. 方法创新性强: 三个模块设计合理,解决了现有方法的关键问题
  3. 实验充分: 在多个LLM、多个项目上进行了全面评估
  4. 实用价值高: 方法通用,可应用于不同LLM和项目

不足

  1. 计算成本: 迭代优化过程可能需要大量API调用,成本较高
  2. 规则质量: 失败驱动的规则归纳依赖LLM的反思能力,规则质量可能不稳定
  3. 上下文提取: 跨文件上下文提取的完整性和准确性需要进一步验证

影响力

  1. 学术贡献: 开创了LLM测试用例生成的提示优化研究方向
  2. 实用价值: 可直接应用于实际软件开发中的测试用例生成
  3. 可复现性: 提供了完整的复现包,便于后续研究

适用场景

  1. 需要自动生成高质量测试用例的软件项目
  2. 使用不同LLM进行代码生成的团队
  3. 需要优化LLM性能的软件工程任务

参考文献

论文引用了48篇相关文献,涵盖了软件测试、提示工程、大型语言模型等多个领域的重要工作,为研究提供了坚实的理论基础。


总体评价: 这是一篇高质量的软件工程研究论文,在LLM测试用例生成领域具有重要的理论和实用价值。方法设计合理,实验评估充分,结果令人信服。虽然存在一些局限性,但整体贡献显著,为该领域的发展提供了重要推动力。