Is ChatGPT the Ultimate Programming Assistant - How far is it?
HAOYE TIAN, University of Luxembourg
WEIQI LU, The Hong Kong University of Science and Technology
TSZ-ON LI, The Hong Kong University of Science and Technology
XUNZHU TANG, University of Luxembourg
SHING-CHI CHEUNG∗, The Hong Kong University of Science and Technology
JACQUES KLEIN, University of Luxembourg
TEGAWENDÉ F. BISSYANDÉ, University of Luxembourg
引用
Tian H, Lu W, Li T O, et al. Is ChatGPT the ultimate programming assistant--how far is it?[J]. arXiv preprint arXiv:2304.11938, 2023..
论文:https://arxiv.org/abs/2304.11938
摘要
最近,ChatGPT LLM备受关注:它可作为讨论源代码的机器人,提出更改建议、代码描述甚至生成代码。典型演示通常集中在现有基准上,可能已用于模型训练(即数据泄漏)。为评估LLM作为程序员有用助手机器人的可行性,我们需评估其对未见问题的实际能力及各种任务的能力。本文展示了ChatGPT作为完全自动编程助手的潜力的实证研究,侧重于代码生成、程序修复和代码摘要三个任务。研究探究了ChatGPT在常见编程问题上的表现,并将其与两个基准上的最新方法进行了比较。我们的研究显示ChatGPT在处理常见编程问题时有效。然而,实验也揭示了其注意力持续时间方面的限制:详细描述将限制ChatGPT的焦点,阻止其利用广泛知识解决实际问题。令人惊讶的是,我们发现了ChatGPT推理代码原始意图的能力。我们期待未来工作能基于此洞察力解决Oracle问题的开放性问题。我们的发现为LLM的编程辅助开发提供了有趣见解,尤其是通过展示提示工程的重要性,提供了ChatGPT在软件工程中的实际应用的更好理解。
1 引言
人工智能(AI)在自动化执行软件工程任务方面具有巨大潜力,包括代码生成、程序修复和代码摘要。AI模型能够根据自然语言描述或代码输入自动生成程序,减少手动调试工作量,提高软件的可靠性和安全性。此外,AI还能生成自然语言描述,帮助理解、维护和重用代码。
大规模语言模型(LLMs)在软件工程中引起了广泛关注,它们在理解代码结构和生成代码或文本方面表现出色。例如,OpenAI的Codex模型已成功应用于多种软件工程任务,包括生成代码、修复缺陷和提供代码摘要。尽管LLMs在软件开发领域展现出巨大潜力,但它们在实际应用中的性能仍有待进一步研究。
最近,ChatGPT这一新的LLM因其在自动修复软件方面的潜力而受到关注。事实上,现有的ChatGPT程序修复研究倾向于使用旧的公开可用的基准数据(2022年之前的)来评估其性能,这些数据可能已经泄露到ChatGPT的训练语料库中。这种实验偏差可能危及报告结果对新的和未见过的问题的泛化性。此外,ChatGPT的代码生成和摘要/解释能力在文献中尚未得到彻底研究。
为了填补这些空白,我们计划进行实证研究,评估ChatGPT作为自动化编程助手的潜力。研究将关注以下关键任务:
代码生成:我们首先评估ChatGPT在两个LeetCode编程数据集上的自然语言到代码(代码生成)能力。程序修复:我们将ChatGPT作为程序修复工具,修复编程作业基准中的大量多样化错误代码。由于作业通常是常见的编码问题,并且它们是代码片段,因此对这些作业的发现可能具有普遍性。代码摘要:探索ChatGPT是否能够准确解释学生作业基准中正确和错误代码样本的意图。我们将详细说明我们如何减轻实验中的数据泄露问题。以下是我们做出的贡献:
我们对ChatGPT在代码生成、程序修复和代码总结任务上的表现进行了实证研究,使用了两个基准测试。我们调查了ChatGPT在常见编程问题上的实际性能,并将其与最先进的方法进行了比较。我们在表1中分析了ChatGPT性能的有趣发现及其影响。这些发现为采用大型语言模型(LLMs)进行编程辅助提供了可操作的见解,并为软件工程社区中ChatGPT的实际应用提供了更好的理解。表1:关于 ChatGPT 在代码生成、程序修复和代码摘要任务上的关键发现和可行的见解
2 技术介绍
2.1 大语言模型和ChatGPT
大型语言模型(LLM)是一类新兴的深度学习模型,在自然语言处理领域取得了重大进展,广泛应用于各个领域。其中,编码模型BERT和解码模型GPT是最具代表性的两种LLM。
BERT基于Transformer架构,使用掩码语言建模(MLM)预训练任务。它会随机掩盖输入序列中的某些词语,然后尝试从上下文中预测这些被掩盖的词。这使BERT能够学习上下文相关的词表示,捕捉词语之间的关联。BERT作为一种强大的编码器,已被广泛应用于软件工程领域的各种下游任务中。
而GPT系列则使用单向的因果注意机制,从左到右预测序列中的下一个词语。GPT-1首次尝试了这种自监督的预训练方法,GPT-2进一步扩大了模型规模和训练数据,展示了更强大的zero-shot迁移能力。GPT-3更是跨越了一个新的里程碑,拥有1750亿个参数。在此基础上,Codex进一步针对代码数据进行了fine-tuning,展现了在软件工程任务上的出色表现。
最近,OpenAI开发的ChatGPT引起了广泛关注。它是GPT-3.5和GPT-4的集大成者,在对话交互方面进行了特殊的优化和训练。相比InstructGPT侧重于指令型任务,ChatGPT更擅长广泛的对话交流。它的训练数据包括大量的文本和代码,使其能够以自然流畅的方式回答各种用户查询。
尽管OpenAI并未公开ChatGPT的技术细节,但其显著的性能提升很可能源于先进的训练技术和海量的训练数据。作为最先进的LLM之一,ChatGPT在软件工程任务上的表现备受关注,值得我们进行深入的探索和评估。
2.2 代码相关任务
2.2.1 代码生成
代码生成是从更高层次的表示(如自然语言描述或规范)自动生成整个程序代码或补全代码片段的过程。这可以提高编程效率,减少人为错误。机器学习和自然语言处理的进展推动了这一领域的发展。
一些工作利用神经网络模型学习如何生成代码补全。例如,Liu等人提出了一种基于自注意力的架构,通过利用代码结构信息和多任务学习,在真实数据集上实现了代码补全的性能提升。Wei等人则提出了一种双向训练框架,同时训练代码总结和代码生成任务,利用它们的对偶性来提高两个任务的性能。
随着预训练LLM的出现,研究人员开始尝试将其应用于代码生成。Ahmad等人提出了PLBART,这是一个强大的序列到序列模型,能够有效学习代码的语法、风格和逻辑。InCoder是一个统一的生成模型,可以通过填充的方式进行程序合成和编辑。Nijkamp等人的CodeGen则是一个大规模LLM家族,在自然语言和编程数据上训练,在零样本Python代码生成任务上展现出出色的性能。
最近的研究还评估了GitHub Copilot等LLM驱动的代码生成工具,发现它们能够生成有效的代码,成功率达到91.5%。但这些结果也表明,我们需要进一步全面评估LLM在代码生成方面的能力。
2.2.2 程序修复
程序修复旨在自动识别和修复软件代码中的bug或漏洞。一些基于机器学习的方法取得了显著进展。
Gulwani等人提出了一种基于正确学生解决方案来修复错误尝试的算法。Hu等人则提出了一种基于搜索的完全自动化方法,通过重构正确的解决方案来生成实时的学生程序修复。这种方法需要较少的正确解决方案,并能够仅使用一个参考解决方案就获得很好的结果。
此外,基于AI的系统也在这一任务上取得了最先进的性能。Chakraborty等人提出的CODIT系统能够从大规模开源数据中学习代码变更模式,并有效地建议补丁和修复Bug。 Ye等人的RewardRepair模型则利用程序特定信息来生成可编译且不易过拟合的修复补丁。
在LLM方面,Prenner等人发现预训练模型Codex在定位和修复代码Bug方面出人意料地有效,甚至与最先进的自动程序修复技术相当。Sobania等人的研究也表明,ChatGPT通过对话交互提供提示,能够修复大部分Bug,优于最先进的方法。这些结果表明,LLM在程序修复任务上展现出了很强的潜力。
2.2.3 代码摘要
代码摘要是指自动为代码提供清晰简洁的总结或解释,以提高代码的可理解性和可维护性。
一些研究利用抽象语法树(AST)结构来生成代码摘要。例如,Hu等人提出了一种基于结构化遍历的方法,能够自动为Java方法生成代码注释。Shido等人则提出了Multi-way Tree-LSTM,可以更好地处理AST结构的复杂性。Wan等人则将AST结构和顺序内容整合到深度强化学习框架中,以优化词预测并提供全局指导。
LeClair等人进一步提出了一种基于图的神经网络架构,结合源代码序列和AST结构信息,以改进自动代码摘要。在我们的论文中,我们重点关注对源代码意图的总结和解释。
3 实验设置
在本节中,我们首先提出三个研究问题,旨在探讨ChatGPT在这些方面的能力。然后,我们介绍两个基准测试集和评估指标,描述如何针对这些研究问题进行设计。最后,我们介绍ChatGPT的应用情况。
3.1 研究问题
RQ-1: ChatGPT在生成常见编程问题的正确高效代码方面的能力如何? 我们拟通过测量ChatGPT在两个数据集上生成代码的正确性和时间复杂度,来评估它的文本到代码生成能力。这两个数据集分别来自2016-2020年和2022年的LeetCode。
RQ-2: ChatGPT是否能有效修复实现常见编程问题的各种有缺陷的代码? 为了回答这个研究问题,我们利用一个包含1783个不同错误代码提交的算法编程作业基准测试集。我们调查ChatGPT是否能在提供问题描述的情况下或不提供的情况下修复这些错误代码。
RQ-3: ChatGPT是否能识别代码的本意? 我们拟探究ChatGPT解释代码的能力。具体来说,我们评估ChatGPT是否能推断出即使存在错误的代码的原始意图。
3.2 基准测试集选择标准
Python是一种广泛使用的高级编程语言。此外,OpenAI GPT-3的后续模型(如ChatGPT和Codex)在Python上也最为擅长。为了研究ChatGPT在代码相关任务中的能力,我们采用Python作为基准测试集的编程语言。此外,我们的研究范围要求基准测试集具有编程问题和实现的多样性。
3.3 数据集
我们的研究基于两个基准测试集。
第一个基准测试集来自LeetCode,这是一个在线平台,提供各种类型的编程问题,如算法、数据结构等。LeetCode根据问题类型(如数组、排序等)和难度级别(简单、中等和困难)对编程问题进行分类。LeetCode还提供足够的测试用例(平均每个问题135个)来验证提交代码的正确性,并提供基于时间复杂度的排名百分位来评估代码的效率。这些有价值的特性使我们决定选择它作为第一个基准测试集。为了确保研究结果的通用性,我们关注LeetCode仓库中4种最常见(数量)的编程问题类型:数组(862个)、字符串(398个)、哈希表(283个)和排序(203个)。我们从每种问题类型的3个难度级别(简单、中等和困难)中随机抽取10个问题。最终,我们分别从2016-2020年和2022年的LeetCode中获得120个(1043)采样编程问题。我们将在本节末尾说明如何利用它们。
第二个基准测试集是Refactory,这是一个2019年发布的大型Python修复Bug的基准测试集。它包含2442个正确和1783个有缺陷的程序,由新加坡国立大学的本科生为5个常见的算法编程作业提交。这些不同且多样的正确和错误Python代码有助于我们的研究。此外,Refactory还提供了教师设计的测试用例(每个问题平均9个)、正确的参考解决方案和描述2。测试套件旨在为学生提供评估结果反馈。我们将这个基准测试集纳入考虑范围,因为它包含了许多实现和针对常见编程问题(如搜索/排序/去重算法)设计良好的测试用例。表2总结了这个基准测试集。
表2 Refactory Benchmark 摘要
我们注意到,ChatGPT已经在一个广泛且多样的文本数据集上进行了训练,包括网页、书籍、文章和在线论坛等来源。这实际上给相关研究带来了潜在的数据泄露问题。因为在选择用于评估ChatGPT的实验基准测试集时,我们不确定ChatGPT是否已经提前学习了这些基准测试集中提供的解决方案参考。在这种情况下,ChatGPT的性能成果和洞见可能无法推广到新的或未见过的问题。为了评估ChatGPT的真实能力,并缓解ChatGPT可能存在的冷启动问题,我们详细说明了如何针对每个研究问题利用上述两个基准测试集。我们并不打算为ChatGPT构建全新的编程问题,因为这是不切实际的。类似的信息广泛存在于网上,这种现有知识对于有效地训练像ChatGPT这样的语言模型来预测和解决未来问题至关重要。
RQ-1: 代码生成。Refactory只包含5个编程问题,这些都可以由ChatGPT和Codex完成。因此,我们主要使用LeetCode编程问题来评估ChatGPT的代码生成能力。需要注意的是,ChatGPT的知识截止时间是2021年9月。我们首先评估ChatGPT在2016-2020年的120个(1043)LeetCode编程问题上的表现,因为这些问题的知识ChatGPT可能已经学习到了。然后,为了研究ChatGPT是否能将其能力推广到新的问题上,我们评估ChatGPT在2022年的另120个(1043)LeetCode编程问题上的表现。我们跳过2021年的LeetCode,因为它既包含可能已训练过的问题,也包含新问题,我们希望分别评估ChatGPT在这两类数据集上的表现。
RQ-2: 程序修复。为了评估ChatGPT的程序修复能力,我们使用Refactory基准测试中的1783个有bug的程序。选择的依据是: (1) 这些有bug程序的修复方案并不公开,因此ChatGPT很可能事先没有被训练过这些内容。(2) 这些有bug的作业代码非常多样化,涵盖了常见的编码问题(搜索/排序算法),它们是代码片段,在这些作业上得到的发现很可能是可推广的。虽然ChatGPT可以访问5个正确参考解决方案,但对于这样一个作业修复工具(ChatGPT在这个研究问题中的作用)来说,学习正确参考解决方案并不是问题。
RQ-3: 代码摘要。我们让ChatGPT完成为各种正确和错误代码生成代码摘要的任务。因此,我们从Refactory中找到2442个正确代码和1783个有bug代码。互联网上没有为它们提供自然语言解释。我们可以相对安全地要求ChatGPT为这些代码生成自然语言意图。
3.4 ChatGPT的应用
ChatGPT是OpenAI在2022年11月推出的一款基于大型语言模型的对话系统。对于使用ChatGPT的标准协议,目前还没有达成共识。在这一部分,我们介绍了我们在实验中如何应用ChatGPT。
ChatGPT API
OpenAI为其开发的几种模型(包括GPT-3和GPT-4)推出了ChatGPT API。其中,最新的GPT-4模型有着非常严格的请求率限制,给大规模实验带来了挑战。与此同时,最近也有报告指出GPT-4存在不稳定和不准确的问题,可能源自其彻底的重新设计。相比之下,GPT-3.5系列产生的结果更加可靠,被广泛使用。基于这一背景,我们选择了GPT-3.5模型,具体使用的是gpt-3.5-turbo-0613模型及其默认参数配置。
随机性
考虑到GPT模型固有的随机性,ChatGPT对于相同的提示输入可能会生成不同的响应,特别是在代码生成和程序修复方面。为了应对这种随机性,确保可靠的分析和结论,我们需要多次向ChatGPT请求相同的提示。我们参照之前的研究,为每个提示对ChatGPT进行五次独立的对话请求。我们用两种方式来评估性能:
(1) TOP-5,如果一种方法中至少有一次尝试成功,则该值为1,否则为0。这个指标反映了一种方法的稳健性。
(2) AVG-5,一种方法对编程问题的五次尝试的平均成功率。这个指标可以更好地表示LLM的平均性能,因为它们的TOP-1结果往往不太稳定。
prompt
prompt是利用ChatGPT和其他LLM的关键组成部分,因为它为文本或代码的生成提供了上下文和方向。我们介绍了我们在研究实验中应用的基线提示。
对于代码生成任务(RQ-1),该提示主要由LeetCode给出的编程任务描述组成,包括编程问题介绍(第1行:自然语言描述,第3-9行:示例,第11-12行:约束条件)和要完成的定义函数(第14-17行)。为了形成最终的Python代码生成提示,我们在最后添加了一个固定的请求语句:"请用Python实现上述任务。"
对于程序修复任务(RQ-2),我们遵循OpenAI设立的提示模板,如图2所示。
对于代码摘要任务(RQ-3), 我们希望获得ChatGPT关于代码语义意图的解释,而不是描述每行代码的作用,因此提示是一个固定的请求语句"你能在一句话内解释下面函数的意图吗?请不要包括任何对代码细节的解释。"
图1 ChatGPT在代码生成的prompt示例
图2 ChatGPT在程序修复的prompt示例
3.5 评价标准
代码正确性。为了评估RQ-1和RQ-2中生成代码的正确性,我们依赖基准测试(LeetCode)提供的测试用例。任何通过所有测试用例的代码都被认为是正确的,而任何失败任何测试用例的代码都被认为是不正确的。我们然后使用上一节中详述的TOP-5和AVG-5指标作为总体性能度量(第(2)点 随机性)。
代码时间复杂度。对于RQ-1代码生成任务,我们也关注代码的效率。我们依赖于提交给LeetCode的代码的官方基于时间复杂度的排名百分位作为一个关键指标,来评估不同代码生成技术的性能,并将其与人工编写的代码进行基准测试。更具体地说,我们计算基于时间复杂度的平均排名百分位。例如,如果平均排名为10%,这意味着生成的代码位于最高效解决方案的前10%。
修复率。为了评估RQ-2中自动程序修复工具的性能,我们利用修复率这一标准指标,即通过所有教师设计的测试用例的修复代码的比例。我们使用上一节中详述的TOP-5和AVG-5指标作为性能度量(第(2)点 随机性)。
4 实验结果
4.1 ChatGPT用于代码生成
[实验目标]:我们旨在评估ChatGPT在常见编程问题上的文本到代码生成能力,方法是评估其在两个LeetCode数据集上的性能。
[实验设计] 我们使用2016-2020年和2022年的LeetCode数据集,将问题描述、示例和约束作为提示输入到ChatGPT、Codex和CodeGen中。我们不评估代码完成能力,而是专注于生成正确解决方案的能力以及正确解决方案的时间复杂度排名。为了比较,我们选择了Codex和CodeGen作为基准模型。此外,我们还分析了提示长度对结果的影响。
[实验结果] 结果显示,ChatGPT在各种难度和问题类型上都优于Codex和CodeGen,能够生成更多正确的代码。在易题上,ChatGPT的正确率达到100%,在难题上也有65%的正确率。但是,在AVG-5方面,我们注意到ChatGPT只能为43%的难题生成正确的代码,这表明多次请求ChatGPT可能会提高发现正确解决方案的概率。在时间复杂度方面,ChatGPT生成的正确代码排名优于Codex,两者基本都在前50%。这些排名分数意味着ChatGPT和Codex生成的代码效率可能优于大多数人工编写的代码(假设几乎所有LeetCode提交都是人类编写的)。
表3 ChatGPT(GPT)、Codex(Dex)和CodeGen(Gen)在LeetCode 2016-2020中代码生成任务上的性能表现。
*"Correctness"列中的整数值表示这些方法在每种类型的十个编程问题中,能在五次尝试内生成正确解决方案的问题数量(TOP-5)。括号中的小数值表示五次尝试的总体平均成功率(AVG-5)。参见第3.4节中关于随机性的内容。
*"Average Rank"列中的百分比值代表生成的正确解决方案的平均排名百分位。排名越低越好。
表4提供了上述三种方法在LeetCode 2022数据集上的性能。ChatGPT和其他模型的表现都有所下降,尤其是在难题上。这表明它们在推广到新问题上仍存在一些局限性,即冷启动问题:模型无法对它还没有足够信息的问题做出任何推论。幸运的是,通过缓解数据泄露的影响,ChatGPT确实显示出了更好的性能和泛化能力。它可以解决大部分的易题(33/40)和仅2个难题。另一方面,ChatGPT生成代码的效率排名仍然在前50%的易题和中等难度问题中,但在难题中则不是。
表4:ChatGPT(GPT)、Codex(Dex)和CodeGen(Gen)在LeetCode 2022中代码生成任务上的性能表现。
图3显示了正确和错误预测的提示长度分布。我们从分析中排除了ChatGPT的难题以及Codex和CodeGen的中等和难题,因为它们解决的问题数量不足以达到统计显著性。我们观察到, 提示长度对模型的预测准确性有一定影响。较短的提示能帮助模型做出更多正确的预测。我们的结果表明,程序员在使用ChatGPT和Codex进行代码生成时,应该提供清晰简洁的提示。
图3:提示长度对ChatGPT和Codex预测结果的影响
4.2 ChatGPT用于程序修复
[实验目标] 我们研究了ChatGPT修复常见编程问题中实现的多种错误代码的能力。
[实验设计] 我们尝试修复Refactory基准中5个常见问题的1783个错误代码,以缓解数据泄漏。我们为ChatGPT的修复设计了两个实验:
提供原始的有错误的代码,让ChatGPT按提示进行修复。之前研究发现,如果提供更多关于错误的信息,ChatGPT可以修复更多错误。但在实践中,我们通常无法获得这些信息,多轮对话也需要更多时间。因此在本实验中,我们只提供问题描述,探索ChatGPT在此条件下的修复能力。将问题描述插入到之前的提示中,构建新的提示。我们选择了两种基准方法进行比较:Codex和Refactory。Refactory是一种基于语义的自动程序修复工具。我们使用修复率作为衡量指标,不考虑时间成本。
图4:排序元组问题的一个错误提交
[实验结果] 结果显示:
就TOP-5指标而言,APR工具Refactory达到了90%的最高修复率,ChatGPT达到84%,Codex则为66%。ChatGPT在某些问题上的修复率甚至超过了Refactory。就AVG-5而言,ChatGPT平均可修复60%的错误代码,高于Codex。提供问题描述对Codex有帮助,但对ChatGPT却没有。我们分析发现,ChatGPT的注意力有限,一些错误不受问题描述的约束,ChatGPT无法修复。
总的来说,ChatGPT在处理给定提示输入时注意力有限。为了提高修复性能,我们建议程序员可以为ChatGPT提供有意义的问题描述或与错误相关的额外信息,如失败的测试用例。为了验证我们的猜测,我们手动分析了35个无法被ChatGPT_D修复的错误代码样本。通过提供问题描述和额外的失败测试用例,可以首次修复其中30个(95%置信度,5%误差)。
表5: ChatGPT、Codex 和 Refactory 在新加坡国立大学五个常见编程作业错误提交上的程序修复性能
4.3 ChatGPT用于代码摘要
[实验目标] 我们旨在探索ChatGPT解释代码的能力。具体来说,我们评估ChatGPT是否能够解释正确和错误代码背后的本意,并将其与编程问题描述对应起来。
[实验设计] 给定一个编程问题,程序员通过编写满足相关规范(如问题描述)的代码来实现同一目标。因此,他们编写的正确和错误代码都反映了与问题描述相同的本意。为了评估ChatGPT总结代码的能力,我们研究ChatGPT是否能够解释包含错误或缺陷的代码的原始本意。
具体来说,我们首先要求ChatGPT解释Refactory基准中2443个正确代码和1783个错误代码的本意(自然语言描述)。然后,我们使用BERT语言模型将这些代码本意和相关问题描述转化为语义向量表示。最后,我们计算正确代码本意与问题描述之间的相似度分布,并将其与错误代码本意与问题描述之间的相似度分布进行比较。我们的目标是评估ChatGPT是否能够一致地生成正确和错误代码的本意。
[实验结果] 结果显示,错误代码本意与问题描述之间的相似度分布与正确代码本意与问题描述之间的分布没有显著差异。我们进一步分析了不同问题中允许ChatGPT成功推断本意的正确和错误代码的特点。
在第二个问题(唯一日期月)中,相似度分布较低,这是因为该问题包含三个函数,给ChatGPT的总结带来挑战。我们单独分析这三个函数,发现ChatGPT能够识别unique_day函数的本意,但无法识别unique_month和contain_unique_days函数的本意,因为后两个函数的错误实现只包含一个返回语句,增加了意图推断的难度。
图5:唯一日期月问题的一个错误提交
对于其他问题,ChatGPT生成的错误代码本意与正确代码和问题描述高度相似。例如,第三个问题(重复消除)的本意描述为"该函数接受一个列表,并返回一个新列表,其中删除了所有重复出现的元素"。图7展示了ChatGPT成功推断该问题错误代码本意的例子。
图 6:正确代码意图与问题描述之间的相似度分布,与错误代码意图与问题描述之间的相似度分布
图7:ChatGPT 对重复消除问题错误实现的意图解释
总的来说,结果表明ChatGPT能够识别给定(正确或错误)代码的原始意图。这一发现使ChatGPT能够解决测试生成中的oracle问题:在没有测试套件的情况下,ChatGPT可以帮助推理代码的原始意图,进而帮助程序员确定测试期望输出并设计测试用例。我们通过分析39个错误代码样本验证了这一猜想,ChatGPT成功识别了其中30个错误的原因。
转述:吴德盛