面向代码生成的测试驱动开发

💡 原文中文,约1700字,阅读约需4分钟。
📝

内容提要

本文综述了大语言模型在代码生成与测试中的应用,涵盖测试驱动开发、CodeT自动生成测试用例、基于Transformer的单元测试框架等方法。研究发现Codex覆盖率较高但部分基准表现差,GPT-4生成代码需人工验证,结合UML与OCL约束可提升质量,CAT-LM在测试生成上优于更大模型。

🔎

延伸解读

测试驱动开发与LLM结合的价值

文章指出,将测试驱动开发(TDD)与大型语言模型结合,可进行迭代式代码生成,以提高软件系统正确性。这种方法在ChatGPT和LeetCode编码问题上的实证评估显示,不同测试、提示和问题属性会影响LLM4TDD方法的有效性。这表明TDD框架为LLM提供了结构化反馈,有助于逐步修正代码,但效果受多种因素影响。

自动测试生成:潜力与局限

文章综述了多种自动测试生成方法,如CodeT利用预训练模型生成测试用例以减少人工成本,基于Transformer的框架能生成可编译的单元测试。然而,研究也发现,Codex在HumanEval数据集上覆盖率超过80%,但在EvoSuite SF110基准测试中,所有模型覆盖率均未超过2%,且生成的测试存在多种测试异味。这说明自动测试生成在特定场景下有效,但泛化能力有限。

LLM生成代码的可靠性挑战

文章提到,使用GPT-4生成代码需要人类验证以确保准确性和可靠性,生成的测试同样需要人工验证。尽管GPT-4在代码改进方面能显著提高质量,但完全依赖LLM仍存在风险。此外,结合UML与OCL约束可提升代码质量,但本体论约束会使代码更复杂。这些发现提示,在实际应用中,LLM生成的代码和测试应经过严格审查。

模型规模与测试生成效果

文章指出,CAT-LM模型使用27亿参数在Python和Java项目语料库上训练,通过考虑代码和测试文件之间的映射来生成与开发人员相似的测试代码,并且在生成测试完成时比更大的语言模型和最近的测试特定模型表现更好。这表明,针对测试生成任务进行专门设计和训练的小模型,可能比通用大模型更有效。

❓

Q&A

LLM4TDD是什么?它如何利用测试驱动开发来提升代码生成质量?

LLM4TDD是一种使用测试驱动开发方法,将大型语言模型指导进行迭代式代码生成,以提高软件系统正确性的程序综合方法。通过在ChatGPT和LeetCode编码问题上进行实证评估,研究了不同测试、提示和问题属性对LLM4TDD方法有效性的影响。

CodeT如何自动生成测试用例并用于代码解决方案选择?

CodeT利用预先训练的语言模型自动生成代码示例的测试用例,从而减少人工成本并增加测试场景的覆盖范围,最终实现基于生成的测试用例的代码解决方案选择。

大型语言模型在单元测试生成中的效果如何?有哪些局限性?

研究探讨了三种代码生成模型(CodeGen、Codex和GPT-3.5)在单元测试生成中的效果,发现Codex模型在HumanEval数据集中可以达到80%以上的覆盖率,但在EvoSuite SF110基准测试中,没有模型的覆盖率超过2%且生成的测试代码存在多种测试异味问题。

基于Transformer的自动化测试框架有什么优势?

使用Transformer-based代码模型,提出完全自动化的测试框架,能够生成可编译和可读的单元测试,可以补充搜索-based测试生成的测试,并且能够覆盖开发人员编写测试中未覆盖的代码行。

GPT-4生成的代码是否需要人工验证?如何提高生成代码的质量?

使用GPT-4进行多项实验生成计算机代码,发现AI编码工具需要人类的验证才能确保准确性和可靠性。同时,使用GPT-4进行代码改进可以显著提高代码质量,但生成的测试仍需要人类验证。

如何结合UML和OCL约束来提升GPT-4自动生成代码的质量?

提出一种敏捷模型驱动开发(MDD)方法,使用OpenAI的GPT-4增强代码自动生成。使用统一建模语言(UML)图示构建文本表示,引入对象约束语言(OCL)微调代码构建细节,并利用FIPA本体论塑造通信语义和协议。最后自动生成Java和Python代码。评估表明,自动生成的代码与预期的UML顺序图完全一致,本体论约束的模型产生更复杂的代码但可管理且风险较低。

CAT-LM在测试生成方面有什么优势?

CAT-LM是一个使用27亿参数在Python和Java项目语料库上进行训练的新颖的预训练信号,通过考虑代码和测试文件之间的映射来生成与开发人员相似的测试代码,并且在生成测试完成时比更大的语言模型和最近的测试特定模型表现更好。

🏷️

标签

➡️

继续阅读