Unit Test Generation using Generative AI : A Comparative Performance Analysis of Autogeneration Tools
作者: Shreya Bhatia, Tarushi Gandhi, Dhruv Kumar, Pankaj Jalote
分类: cs.SE, cs.AI
发布日期: 2023-12-17 (更新: 2024-02-13)
备注: Accepted to LLM4Code @ ICSE 2024
💡 一句话要点
对比ChatGPT与Pynguin,评估生成式AI在Python单元测试用例自动生成中的性能。
🎯 匹配领域: 支柱九:具身大模型 (Embodied Foundation Models)
关键词: 单元测试生成 大型语言模型 ChatGPT Pynguin 代码覆盖率 软件测试 自动化测试
📋 核心要点
- 软件开发中单元测试生成耗时费力,现有方法难以充分覆盖各种代码结构,存在效率瓶颈。
- 利用大型语言模型(LLM)如ChatGPT自动生成单元测试脚本,旨在提高测试效率和覆盖率。
- 实验对比ChatGPT与Pynguin在不同代码结构下的测试生成性能,并分析覆盖率、正确性和可读性。
📝 摘要(中文)
本文旨在实验性地研究大型语言模型(LLM),以ChatGPT为例,在生成Python程序单元测试脚本方面的有效性,并将生成的测试用例与现有单元测试生成器(Pynguin)生成的测试用例进行比较。实验考虑了三种类型的代码单元:过程脚本、基于函数的模块化代码和基于类的代码。基于覆盖率、正确性和可读性等标准评估生成的测试用例。结果表明,ChatGPT在覆盖率方面的性能与Pynguin相当,在某些情况下甚至优于Pynguin。同时发现,ChatGPT为某些类别生成的断言中约有三分之一是不正确的。结果还表明,ChatGPT和Pynguin在遗漏语句方面几乎没有重叠,表明结合使用这两种工具可以提高单元测试生成性能。最后,实验表明,提示工程可以提高ChatGPT的性能,从而实现更高的覆盖率。
🔬 方法详解
问题定义:论文旨在解决软件开发中单元测试用例生成效率低下的问题。现有方法,如Pynguin,虽然可以自动生成测试用例,但在覆盖率、正确性和对复杂代码结构的适应性方面存在局限性,需要耗费大量人工进行补充和修改。
核心思路:论文的核心思路是利用大型语言模型(LLM)的强大代码理解和生成能力,直接从源代码生成单元测试用例。通过对比LLM(ChatGPT)与传统工具(Pynguin)的性能,评估LLM在单元测试生成方面的潜力。这样设计的目的是探索一种更智能、更高效的单元测试生成方法。
技术框架:整体流程包括:1) 选择Python代码单元(过程脚本、函数、类);2) 使用ChatGPT和Pynguin分别生成单元测试用例;3) 运行生成的测试用例,收集覆盖率数据;4) 人工评估测试用例的正确性和可读性;5) 对比ChatGPT和Pynguin的性能指标。
关键创新:论文的关键创新在于首次系统性地对比了大型语言模型(ChatGPT)与传统单元测试生成工具(Pynguin)在Python代码单元测试生成方面的性能。通过实验数据,揭示了LLM在某些场景下优于传统工具的潜力,并指出了LLM生成测试用例的不足之处,为后续研究提供了方向。
关键设计:实验中,使用了三种不同类型的Python代码单元,以评估工具在不同场景下的性能。采用了覆盖率、正确性和可读性作为评估指标。通过提示工程(prompt engineering)来优化ChatGPT的性能。对ChatGPT生成的断言进行了人工检查,以评估其正确性。
📊 实验亮点
实验结果表明,ChatGPT在覆盖率方面与Pynguin相当,在某些情况下甚至优于Pynguin。通过提示工程,ChatGPT的性能得到显著提升,实现了更高的覆盖率。同时发现,ChatGPT和Pynguin在遗漏语句方面几乎没有重叠,表明结合使用这两种工具可以提高单元测试生成性能。但ChatGPT生成的断言中约有三分之一是不正确的,需要人工审查。
🎯 应用场景
该研究成果可应用于软件开发流程的自动化测试环节,提高测试效率,降低测试成本。通过结合LLM和传统测试工具,可以更全面地覆盖代码,减少潜在的bug,提高软件质量。未来,可以进一步探索LLM在更复杂软件系统中的应用,并开发更智能的测试生成工具。
📄 摘要(原文)
Generating unit tests is a crucial task in software development, demanding substantial time and effort from programmers. The advent of Large Language Models (LLMs) introduces a novel avenue for unit test script generation. This research aims to experimentally investigate the effectiveness of LLMs, specifically exemplified by ChatGPT, for generating unit test scripts for Python programs, and how the generated test cases compare with those generated by an existing unit test generator (Pynguin). For experiments, we consider three types of code units: 1) Procedural scripts, 2) Function-based modular code, and 3) Class-based code. The generated test cases are evaluated based on criteria such as coverage, correctness, and readability. Our results show that ChatGPT's performance is comparable with Pynguin in terms of coverage, though for some cases its performance is superior to Pynguin. We also find that about a third of assertions generated by ChatGPT for some categories were incorrect. Our results also show that there is minimal overlap in missed statements between ChatGPT and Pynguin, thus, suggesting that a combination of both tools may enhance unit test generation performance. Finally, in our experiments, prompt engineering improved ChatGPT's performance, achieving a much higher coverage.