ChatGPT and Software Testing Education: Promises & Perils
Sajed Jalil; Suzzana Rafi; Thomas D. LaToza; Kevin Moran; Wing Lam
引用
S. Jalil, S. Rafi, T. D. LaToza, K. Moran and W. Lam, "ChatGPT and Software Testing Education: Promises & Perils," 2023 IEEE International Conference on Software Testing, Verification and Validation Workshops (ICSTW), Dublin, Ireland, 2023, pp. 4130-4137, doi: 10.1109/ICSTW58534.2023.00078.
论文:https://ieeexplore.ieee.org/abstract/document/10132255
摘要
鉴于ChatGPT 等模型工具的新生性质,我们目前缺乏与它们在不同教育环境中的表现以及它们可能对传统教学形式带来的潜在前景(或危险)相关的基础知识。因此,在本文中,我们研究了 ChatGPT 在回答流行软件测试课程中的练习问题时的表现。我们发现,鉴于其目前的能力,ChatGPT 能够回答我们检查的 77.5% 的问题,并且在这些问题中,它能够在 55.6% 的情况下提供正确或部分正确的答案,提供正确或部分正确的解释53.0% 的情况下得到答案,并且在共享问题上下文中提示该工具会导致正确答案和解释的比率略高。基于这些发现,我们讨论了学生和教师使用 ChatGPT 的潜在前景和风险。
1 引言
复杂的软件通常在其源代码中包含未被发现的错误。这些发现越晚,产生的影响就越深远。软件中未经纠正的错误可能会导致重要系统故障,从而导致高昂的经济成本。
自从 Hindle 等人首次阐述了代码建模的前景以来,代码的语言建模一直是软件工程研究中的一个重要课题。随着语言建模技术的改进,研究人员开始利用深度学习 (DL) 架构来学习丰富的、分层的代码表示,然后将其用于各种下游任务。与此同时,机器学习和自然语言处理社区开始构建以特定类型的神经架构为中心的大规模模型,即 Transformer在大量文本数据集上进行训练。实验说明了这些大型语言模型 (LLMs) 和专门为代码定制的语言模型的表示能力。然而,此类模型在很大程度上受限于特定的任务设置,并且直到最近才提供与最终用户交互的自然形式。
2022 年末,OpenAI 推出了 ChatGPT,这是一种构建在现有 LLMs 之上的 AI 工具,可通过对话界面进行交互。为了实现这种类型的交互,OpenAI 利用来自人类反馈的强化学习,改进了 InstructGPT过去工作的方法,该方法使用无监督数据和任务指令形式的监督来训练 LLMs 。本质上,该模型最初是在真实的、基于人类文本的对话上进行训练的,然后根据人类评估者的反馈来改进其响应,这些评估者在强化学习环境中对答案的质量进行了评估。事实证明,这个过程非常成功地创建了一个界面,让用户可以轻松访问LLMs的潜在“知识”。
考虑到交互的便捷性以及模型中包含的看似海量的知识,学术界就这种工具对学生和教师的潜在危险和机遇展开了激烈的讨论。人们的情绪多种多样,从担心学生会使用这些模型来规避学习材料,到对 ChatGPT 等新型学习、作业和自动化工具可能引入学术界各个层面的兴奋。然而,为了就如何在各种教育环境中使用(或不使用)ChatGPT 做出明智的决定,我们必须首先全面了解其功能、优势和劣势。
在本文中,我们的目标是在传统软件测试课程的背景下研究和理解 ChatGPT 的功能。因此,我们进行了全面的实证研究,要求 ChatGPT 回答流行软件测试教科书的五个章节中的问题,并在多个维度上彻底审查结果。我们的目标是了解
(i) ChatGPT 正确回答问题的频率
(ii) 它能够充分准确地解释其答案的频率
(iii) 向 ChatGPT 提问的不同方式如何影响其提供正确答案的能力
(iv) ChatGPT 所表达的信心是否提供(iii) 向 ChatGPT 提问的不同方式会如何影响其提供正确答案的能力,从而影响其答案的正确性。
我们发现 ChatGPT 当前的功能使其能够正确回答我们检查的 77.5% 的测试问题。对于 ChatGPT 能够回答的问题,它在 55.6% 的情况下提供了正确或部分正确的答案,并在 53.0% 的情况下提供了正确或部分正确的解释。我们还发现,在共享上下文中提示模型,其中类似一起提出问题会得到稍微更好的答案,并且该工具声称的置信水平似乎对答案的正确性影响不大。基于这些发现,我们讨论了在软件测试课程中使用 ChatGPT 的潜在前景和风险。
综上所述,本文的贡献如下:
ChatGPT 对流行软件测试教科书5章中31个问题的答案进行手动审查的数据集。我们的数据集包含 ChatGPT 对每个问题的三个回复。对这些答案进行彻底分析,检查 ChatGPT 正确的频率以及何时能够正确解释给定的答案。调查两种提示策略及其对答案和解释正确性的影响,并分析 ChatGPT 宣称的置信度是否影响答案/解释正确性。我们的数据、分析代码和实验基础设施,以促进 ChatGPT 在计算机科学教育各个主题中的应用的可复制性和未来工作。2 技术介绍
ChatGPT提供了一种机器学习模型,旨在与用户进行对话。它提供对提示中提出的问题的答复,并且能够答复后续问题并自我纠正。
为了研究 ChatGPT 回答软件测试课程中常见问题的适用性,我们提出了 Ammann 和 Offutt 教科书前五章的问题(P. Ammann and J. Offutt, Introduction to Software Testing. Cambridge University Press, 2016.)。本书已在乔治梅森大学的本科生和研究生软件测试课程中使用,并被数百个组织用作软件测试知识的来源。我们的研究使用:
第 1 章和第 2 章讨论软件故障、错误和故障。
第 3 章讨论可达性、感染性、传播性和可揭示性 (RIPR) 模型。
第 4 章讨论测试驱动开发 (TDD) 和持续集成
第 5 章,讨论覆盖标准和包含 本节的其余部分提供了每章中课程内容的简要描述。
2.1 故障、错误和失败
故障是软件中的静态缺陷。错误是不正确的内部状态,由程序计数器和该程序计数器位置的实时变量组成。
失败是相对于需求或预期行为的描述而言的外部的、不正确的行为。
2.2 RIPR模型
根据 Ammann 和 Offutt的说法,要观察到故障需要满足四个条件。这些条件一起称为 RIPR 模型。首先,测试需要到达有缺陷的代码行的位置——即可达性。故障执行后,导致程序状态不正确,称为感染。感染必须传播到不正确的最终状态——即传播,最后,测试人员必须可以观察到最终状态的不正确部分——即可揭示性。
2.3 CI和TDD
Ammann 和 Offutt将持续集成 (CI) 描述为开发人员使用新的开发环境、获取待测代码和测试代码、构建代码并运行测试的过程。完成代码更改后,更改将启动 CI 流程,其中新的环境会重建代码并重新运行测试。此过程可帮助开发人员快速识别其更改可能引入的任何故障。
测试驱动开发 (TDD) 是一种创建软件的方法,其中测试是在测试代码之前编写的。该方法基于重复较短的开发周期,包括创建测试、运行测试以确认其失败、编写被测代码以使测试通过、创建更多测试以及改进被测代码以使更多测试通过。TDD 的目标是通过只编写被测试的代码来使测试通过,从而生成干净且无故障的代码。
2.4 覆盖标准和纳入
覆盖标准是对测试集施加测试要求的规则或规则集合。当且仅当满足标准 C1 的每个测试集也满足 C2 时,覆盖标准 C1 包含 C2。
3 实验评估
为了调查使用 ChatGPT 进行软件测试教育的前景和风险,我们研究了以下研究问题 (RQ):
RQ1:ChatGPT 能够为不同提示策略提供正确答案和解释的频率如何?RQ2:ChatGPT 多久给出不同正确程度的答案解释对?RQ3:ChatGPT 的非确定性如何影响其提供正确答案和解释的能力?RQ4:ChatGPT 对其响应的置信度与响应的正确性有何关联?3.1 数据集
我们的数据集包含 Ammann 和 Offutt广泛使用的软件测试书中的问题。在本研究中,我们使用第 1 章至第 5 章中的所有教科书问题,这些问题在本书的官方网站上提供了解决方案。这些解决方案已公开发布,以帮助我们使用第 1 章至第 5 章中的所有教科书问题,这些问题在本书的官方网站(P. Ammann and J. Offutt, “Introduction to Software Testing Book So-lution.” https://cs.gmu.edu/∼offutt/softwaretest/exer-student.pdf, 2023.)上提供了学生学习的解决方案。我们省略了没有学生解决方案的问题,因为发布我们的结果可能会暴露本书作者不打算公开的答案。我们的研究仅限于本书的前五章,这些章节强调大多数介绍性软件测试课程中教授的主题。通常,我们选择的问题都有子问题,这些子问题将更全面的问题分解为更小的部分。例如,对于给定的代码片段,可能有多个相关的子问题,每个子问题都询问该代码片段的属性。在我们的研究中,为了简单起见,我们将所有问题和子问题称为问题——考虑到我们将它们视为具有同等重要性。
我们一共收集了40道符合我们要求的练习题。经过手动检查后,我们发现了 9 个要求 ChatGPT 无法生成的材料的问题,因为它只能生成基于文本的响应。例如,我们遇到了要求代码执行的屏幕打印输出、从互联网获取项目或设置持续集成服务器的问题。 ChatGPT 基于文本的响应无法完全正确地回答此类任务的问题。
我们删除了 ChatGPT 无法正确回答的 9 个问题,并报告了 ChatGPT 可能给出正确答案的总共 31 个问题的结果。在 31 个问题中,6 个问题是多部分问题,总共包含 27 个子问题,4 个问题是不包含任何子问题的独立问题。
表1列出了我们数据集中每个问题的特征。我们发现有六个问题只要求在答案中提供代码,九个问题要求解释一个概念,其余 16 个要求提供代码和概念解释。我们的数据集可在 GitHub和 Zenodo上公开获取。
表 1 我们研究中的问题概述
在本研究的数据收集过程中,OpenAI尚未公开 ChatGPT API,因此,在给定时间内我们能够通过在线界面向 ChatGPT 提出的问题数量受到限制。我们开发了一个开源工具来收集 ChatGPT 对数据集中问题的回答。我们的工具会自动查询 ChatGPT、收集响应,并在收到答案后等待 10 秒,然后再询问下一个问题。我们根据自动化工具的实验确定了此延迟的长度(例如,尝试多次等待时间)。我们发现 10 秒的等待时间为我们提供了最多数量的查询响应。
3.2 实验过程
对于 RQ1,我们希望了解 ChatGPT 能够为我们的软件测试问题数据集提供正确答案和解释的频率,并确定在单个聊天上下文中逐一询问子问题时与在单独聊天上下文中询问子问题时 ChatGPT 的表现如何。在不同的上下文中询问。我们将这两种提问方式分别称为共享上下文和单独上下文。
对于 RQ2,我们研究 ChatGPT 给出不同正确程度的答案-解释对(例如,正确答案但不正确解释)的频率。
对于 RQ3,我们的目标是通过提出每个问题 3 次并检查回答中的任何差异来分析 ChatGPT 的非确定性如何影响其提供正确答案和解释的能力。
对于 RQ4,我们的目标是确定与答案/解释相关的 ChatGPT 自我报告的置信度(可以通过置信度查询收集)是否会影响该答案的正确性。我们的研究结果可能有助于教师和学生确定给定答案的潜在效用。下面,我们定义 (1) 单独上下文查询、(2) 共享上下文查询、(3) 置信度查询和 (4) 响应标记的过程。
(1) 单独上下文查询
我们将 27 个子问题中的每一个都视为一个独立的问题。每个子问题都是在单独的聊天上下文中提出的。结合四个独立问题,每次运行总共提出 31个问题。为了评估单独上下文与共享上下文的比较情况,我们为每个问题总共收集了3次运行,这总共产生了93个单独的上下文响应。
图 1 lastZero() 的代码片段
(2) 共享上下文查询
所有问题都在单个 ChatGPT 会话中提出,在此会话期间共享对话上下文(即,ChatGPT 能够引用初始提示或代码片段以及先前子问题的一部分),只要子问题涉及相同的代码或场景。例如,考虑图 1 中的 lastZero() 方法。lastZero() 应该查找数组中出现零的最后一个索引。人们可能会根据此代码提出多个子问题(例如,给出(1) 不执行故障或 (2) 执行故障,但没有故障的测试。
在共享上下文查询中,我们提供了lastZero()的实现,并在一个聊天上下文中询问第一个子问题。获得响应后,我们继续在相同的共享上下文中询问下一个子问题。重复此过程,直到在上下文被破坏之前询问所有子问题。对于具有多个子问题的下一个问题,我们然后打开另一个聊天上下文。
总体而言,我们通过运行 27 个子问题中的每一个 3 次获得 81个响应,通过运行 4个独立问题中的每一个 3 次获得 12个响应。对于没有子问题的问题,共享上下文与单独上下文相同,因此,在共享上下文和单独上下文的数据集中,对四个独立问题的回答是相同的,只有对 27 个子问题的 81个回答。问题不同。在 RQ1 中,我们比较同时存在共享上下文和单独上下文的响应,即 81个响应。我们发现共享上下文比单独上下文更有可能给出正确的响应。在 RQ2-RQ4 中,我们使用来自共享上下文的响应——81个共享上下文响应和 12个共享/独立上下文响应。
(3) 置信度查询
为了确定 ChatGPT 对 RQ4 答案的置信度,我们在每次回答后向 ChatGPT 询问以下问题——“您对之前的回答是否正确有多大信心?”。为了回答 RQ1-RQ3,我们每个问题问了 3 次。然而,为了简化我们的数据收集过程,我们仅收集第一次在共享上下文设置中向 ChatGPT 提出问题时对置信度查询的响应。我们记录了 ChatGPT 的以下回复:高度自信、非常自信、自信和可靠。请注意,我们不会尝试对 ChatGPT 的置信度回复进行排名,因为它们的相对排名尚不清楚(例如,“高度自信”是否比“非常自信”更自信)。我们试图通过要求 ChatGPT 提供相对排名来解决这些置信度回复的排名,但 ChatGPT 无法提供结论性的答复。因此,对于 RQ4,我们只是研究 ChatGPT 在给定特定类别的置信度答复的情况下给出正确解释或答案的可能性。
(4)响应标记
为了确定ChatGPT响应的正确性,两位作者独立检查了响应并对其进行了标记。对于任何分歧,第三位作者参与并对问题进行讨论,以便所有三位作者达成一致。所有三位评估者都要么 (1) 参加过使用教科书的研究生水平软件测试课程,我们的研究问题来源于,(2) 教授过使用教科书作为助教的软件测试课程,(3)以教材为指导教授软件测试课程。
ChatGPT 的回复分为两部分 - 解释和答案。我们的标签考虑了两个角度:(1)总体答案是否正确;(2)给出的解释是否正确。相对于问题的解决方案,这两种观点都被分为正确、不正确或部分正确。
ChatGPT 对问题的响应示例如下:
上面的示例响应被标记为答案为不正确,但解释为部分正确。由于ChatGPT的答案是T1可能不满足C2(当正确答案是T1满足C2时),我们将答案标记为不正确。这个解释是部分正确的,因为 ChatGPT 正确地提到 C1 包含了 C2 的所有要求(基于第 II-D 节中包含的定义),但也错误地解释了这一事实并不能保证 T1 满足 C2。
3.3 结论
A. RQ1:ChatGPT 能够为不同提示策略提供正确答案和解释的频率是多少?
1) 答案正确性:我们发现在共享上下文中,49.4% 的答案是正确的,6.2% 的答案是部分正确的。相比之下,在不同的上下文中,响应的正确率为 34.6%,部分正确的率为 7.4%。如图2所示,平均而言,共享上下文产生的错误答案比单独上下文要少。对此行为的一种解释是,在共享上下文中,ChatGPT 从先前的子问题中获取上下文信息。例如,如果 ChatGPT 已经在先前的子问题中识别出错误,则更有可能正确地利用此错误来回答有关错误的后续问题。
2)解释正确性:解释的结果正确性如图3所示。在这里,我们获得了与回答正确性类似的结果。即,共享上下文中的解释准确性更高。话虽这么说,当我们专注于答案和解释完全正确时,我们发现共享上下文比单独上下文更好。考虑到这一发现,我们剩下的 RQ 仅关注我们共享的上下文结果。其余 RQ 的单独上下文相关数据位于我们的网站上。
图 2 ChatGPT 共享和单独上下文答案的正确性
图 3 ChatGPT 对共享和单独上下文的解释的正确性
共享上下文比单独上下文更有可能是正确的。在共享上下文中使用 ChatGPT 可以在 55.6% 的情况下得出正确或部分正确的答案,在 53.0% 的情况下得出正确或部分正确的解释。
B. RQ2:ChatGPT 多久给出不同正确程度的答案解释对?
表2显示了我们定义的共享查询上下文的三个迭代中答案-解释对的正确性结果(例如,每个问题三个响应)。例如,答案不正确 (AIC) 和解释部分正确 (EPC) 对意味着 ChatGPT 提供了不正确的答案,但提供了部分正确的解释。在九个可能的对中,有三对的答案和解释的正确程度相同:(1)AC-EC,答案和解释都正确,(2)APCEPC,两者都部分正确,或 (3) AIC-EIC,两者都不正确。所有其他对都有不同程度的正确性。我们的结果表明,平均有 11.8% 的时间,ChatGPT 给出的答案与其正确性的解释不完全匹配。
表 2 三个共享上下文迭代的 A 解释对。我们为答案正确性定义了三个顶级列:从左到右,答案正确 (AC)、答案部分正确 (APC) 和答案不正确 (AIC)。在顶层的每一列中,我们显示分类对给定顶级答案类型的解释:从左到右,解释正确 (EC)、解释部分正确 (EPC) 和解释不正确 (EIC)。
11.8% 的情况下,ChatGPT 生成的响应中答案-解释对具有不同程度的正确性(例如,答案正确,但解释不正确)。
C. RQ3:ChatGPT 的非确定性如何影响其提供正确答案和解释的能力?
当多次询问同一问题时,ChatGPT 每次可能会给出不同的响应,因为其根据学习的概率分布进行采样过程的随机性。我们检查 ChatGPT 给出的这些不同响应的正确性存在差异的频率。例如,某个问题可能在一次运行中得到正确答案,但在另一次运行中得到错误答案。我们发现,对于 9.7% 的问题,答案的正确性受到非确定性的影响,对于 6.5% 的问题,解释的正确性受到影响。
ChatGPT 的答案正确性在 9.7% 的问题之间存在差异,而解释的正确性则有 6.5% 的问题存在差异。
D. RQ4:ChatGPT 对其响应的置信度与响应的正确性有何关联?
为了确定 ChatGPT 对答案的信心程度,我们要求它报告其信心。询问置信度通常被称为“校准”,经过良好校准的模型在正确时会充满信心,在不正确时则信心不足。在我们的实验中,ChatGPT 使用四个不同的关键字进行响应。图4和图5分别显示了每个关键词的数据以供答案和解释。
ChatGPT 对其回应表达了不同程度的信心。当 ChatGPT 对其响应“高度自信”时,我们发现其答案大约有一半是错误的,并且解释不正确的概率是正确的两倍。另一方面,当 ChatGPT 对其响应“有信心”时,我们发现其答案或解释正确的可能性至少是错误的三倍。对于其他两个类别,我们发现 ChatGPT 提供了混合的响应。
ChatGPT 的自我报告置信度似乎并不是特别有用,因为它对问题正确性影响不大。这一发现似乎表明,对于软件测试问题,ChatGPT 没有得到很好的校准。
图 4 ChatGPT 报告的正确、部分正确和错误答案的置信度。
图 5 ChatGPT 报告的正确、部分正确和错误解释的置信度。
3.4 讨论:承诺与风险
在本文中,我们研究了 ChatGPT 在流行软件测试课程中的潜在适用性。我们发现 ChatGPT 能够为 55.6% 的问题提供正确或部分正确的答案。此外,ChatGPT 对自身正确性的判断很差:它的置信度对其响应的正确性影响不大。换句话说,至少在进行这项研究时,对于与软件测试课程相关的问题,ChatGPT 的答案很可能是不正确的。话虽如此,我们的研究结果仍然引起了人们对如何检测 ChatGPT 的使用以确保问题有意义地评估学生对课程材料的理解的直接担忧。
虽然对学生使用 ChatGPT 规避评估的担忧是一种潜在危险,但将 ChatGPT 融入课堂也有几个有希望的方向。我们发现 ChatGPT 能够对 53.0% 的问题提供正确或部分正确的解释。此外,我们发现使用某些提供额外问题背景的提示策略可以提高正确答案和解释的机会。这一发现表明,对于精心设计的课堂活动或实验室,ChatGPT(而不是教师或助教)可以用来指导学生完成一系列练习,以提高学生对材料的理解。
此外,我们发现某些上下文使 ChatGPT 难以正确回答,此类设置可用于防止作弊,尤其是在需要访问互联网时。我们的数据集包含编码问题和概念问题,以及一些两者兼而有之的问题。在我们的实验中,ChatGPT 在涉及代码和概念的问题上表现最差。它最常输出正确答案和解释的是编码问题 (83.3%),然后是概念问题 (55.6%),最后是组合问题 (31.3%)。
我们的结果与在其他领域应用 ChatGPT 的结果形成鲜明对比,例如在医学或法律中,ChatGPT 显示通过了考试的某些部分。这种差异可能是由于可能有更多的内容可供 ChatGPT 用于这些考试的训练,或者可能是由于问题本身性质的差异。由于 ChatGPT 最近才发布,其功能和此类工具的影响的全面情况仍有待确定。
转述:王朝澜