Unify and Triumph: Polyglot, Diverse, and Self-Consistent Generation of Unit Tests with LLMs
作者: Djamel Eddine Khelladi, Charly Reux, Mathieu Acher
分类: cs.SE, cs.AI
发布日期: 2025-03-20
💡 一句话要点
PolyTest:利用多语言和多样性生成自洽的单元测试,显著提升测试质量
🎯 匹配领域: 支柱九:具身大模型 (Embodied Foundation Models)
关键词: 单元测试生成 大型语言模型 多语言 多样性采样 自洽性 软件测试 EvalPlus
📋 核心要点
- 现有基于LLM的单元测试生成方法通常只关注单一语言的单次生成,未能充分利用LLM的多样性。
- PolyTest通过跨语言生成和多样性采样,生成更全面和鲁棒的测试集,并通过统一策略解决测试间的不一致性。
- 实验表明,PolyTest在多种语言和模型上显著提升了测试质量,包括覆盖率、通过率和变异分数,优于现有方法。
📝 摘要(中文)
基于大型语言模型(LLM)的测试生成在软件工程领域备受关注,但大多数研究仅评估LLM在单一语言中一次性生成单元测试的能力,错失了利用LLM多样性进行更鲁棒测试的机会。本文提出了PolyTest,一种通过利用多语言和温度控制的多样性来增强测试生成的新方法。PolyTest系统地利用这些特性,通过两种互补的方式:(1)跨语言测试生成,在零温度下以多种语言生成测试并统一;(2)多样化测试采样,在同一语言中以较高温度生成多个测试集,然后统一。一个关键的发现是,LLM可以在不同语言和生成过程中产生多样但矛盾的测试——相同的输入,不同的预期输出。PolyTest通过统一测试集来缓解不一致性,从而提高自洽性并改善整体测试质量。与单语言或单次尝试方法不同,PolyTest无需即时执行即可增强测试,使其特别适用于性能较弱的语言。我们使用EvalPlus在Llama3-70B、GPT-4o和GPT-3.5上评估PolyTest,以五种语言(Java、C、Python、JavaScript和基于CSV的格式)在温度0下生成测试,并在温度1下采样多个集合。我们观察到LLM在不同设置下频繁生成矛盾的测试,并且PolyTest显著提高了所有考虑指标的测试质量——测试数量、通过率、语句/分支覆盖率(高达+9.01%)和变异分数(高达+11.23%)。最后,PolyTest在测试生成、通过率和变异分数方面优于Pynguin。
🔬 方法详解
问题定义:现有基于LLM的单元测试生成方法,主要关注单语言环境下的单次生成,无法充分挖掘LLM在不同语言和不同生成尝试中的多样性。这种单一性导致生成的测试用例可能不够全面,无法充分覆盖代码的各种边界情况和潜在错误,从而影响测试的有效性和可靠性。此外,不同语言生成的测试用例可能存在矛盾,如何有效整合这些测试用例也是一个挑战。
核心思路:PolyTest的核心思路是利用LLM在多语言和多次生成中的多样性,生成更全面、更鲁棒的测试集。通过跨语言生成,利用不同语言的特点来发现潜在的错误。通过多样性采样,在同一语言中生成多个不同的测试集,增加测试的覆盖范围。然后,通过统一策略,解决不同测试集之间的矛盾,提高测试的自洽性和整体质量。
技术框架:PolyTest的整体框架包含两个主要阶段:(1)多样性测试生成阶段:包括跨语言测试生成和多样性测试采样。跨语言测试生成在零温度下,使用多种编程语言生成测试用例。多样性测试采样在较高温度下,使用同一种编程语言生成多个不同的测试集。(2)测试集统一阶段:该阶段旨在解决不同测试集之间的矛盾,提高测试的自洽性。具体的统一策略未知,但目标是生成一个高质量的、一致的测试集。
关键创新:PolyTest的关键创新在于系统性地利用了LLM的多语言和多样性生成能力,并提出了相应的测试集统一策略。与传统的单语言、单次生成方法相比,PolyTest能够生成更全面、更鲁棒的测试集,从而提高测试的有效性和可靠性。此外,PolyTest无需即时执行即可增强测试,使其特别适用于性能较弱的语言。
关键设计:PolyTest的关键设计包括:(1) 选择合适的编程语言集合,以覆盖不同的编程范式和应用场景。(2) 设置合适的温度参数,以控制生成测试的多样性。(3) 设计有效的测试集统一策略,以解决不同测试集之间的矛盾,提高测试的自洽性。论文中使用了五种语言(Java、C、Python、JavaScript和CSV),温度设置为0和1,但具体的测试集统一策略细节未知。
🖼️ 关键图片
📊 实验亮点
实验结果表明,PolyTest在Llama3-70B、GPT-4o和GPT-3.5等模型上,使用EvalPlus评估,在测试数量、通过率、语句/分支覆盖率(最高提升9.01%)和变异分数(最高提升11.23%)等指标上均显著优于现有方法。PolyTest在测试生成、通过率和变异分数方面也优于Pynguin。
🎯 应用场景
PolyTest可应用于软件开发的各个阶段,尤其是在单元测试生成环节,能够显著提高测试的覆盖率和质量。该方法特别适用于对测试要求较高的关键系统和复杂软件项目。此外,PolyTest无需即时执行即可增强测试,使其在资源受限或性能较弱的语言环境中具有优势。未来,PolyTest有望集成到自动化测试平台中,进一步提升软件开发的效率和质量。
📄 摘要(原文)
Large language model (LLM)-based test generation has gained attention in software engineering, yet most studies evaluate LLMs' ability to generate unit tests in a single attempt for a given language, missing the opportunity to leverage LLM diversity for more robust testing. This paper introduces PolyTest, a novel approach that enhances test generation by exploiting polyglot and temperature-controlled diversity. PolyTest systematically leverages these properties in two complementary ways: (1) Cross-lingual test generation, where tests are generated in multiple languages at zero temperature and then unified; (2) Diverse test sampling, where multiple test sets are generated within the same language at a higher temperature before unification. A key insight is that LLMs can generate diverse yet contradicting tests -- same input, different expected outputs -- across languages and generations. PolyTest mitigates inconsistencies by unifying test sets, fostering self-consistency and improving overall test quality. Unlike single-language or single-attempt approaches, PolyTest enhances testing without requiring on-the-fly execution, making it particularly beneficial for weaker-performing languages. We evaluate PolyTest on Llama3-70B, GPT-4o, and GPT-3.5 using EvalPlus, generating tests in five languages (Java, C, Python, JavaScript, and a CSV-based format) at temperature 0 and sampling multiple sets at temperature 1. We observe that LLMs frequently generate contradicting tests across settings, and that PolyTest significantly improves test quality across all considered metrics -- number of tests, passing rate, statement/branch coverage (up to +9.01%), and mutation score (up to +11.23%). Finally, PolyTest outperforms Pynguin in test generation, passing rate, and mutation score.