用于单元测试生成的计算机实现的方法和计算机与流程
本发明涉及用于生成函数的单元测试的计算机实现的方法和计算机。
背景技术:
1、如今,软件正变得日益庞大和复杂,所述软件中存在的缺陷可能导致使用该软件的公司或组织遭受经济损失并对其声誉造成重大损害。单元测试验证单独的函数或源代码的单独的单元的正确性,在当今的软件开发中发挥着关键作用。然而,生成单元测试是一项繁琐且劳动密集型的任务,导致一些开发人员避免编写单元测试。这一事实激发了人们对允许自动化单元测试生成的不同技术的研究。
2、us20090094486a1描述了一种用于根据一段软件的每个参数p的可能值的矩阵(表示为sp)随机生成所述一段软件的测试用例的系统和方法。每个矩阵对于每个相应参数具有数量为mp的可能值,表示为基数。该方法使用质数qp,其为大于或等于mp的下一个质数。为了确定与每个参数相关联的矩阵sp中的哪个值将被用于待生成的单元测试中,针对每个测试编号t计算指示待选择值在相应矩阵内的位置的值np,其中np =t mod qp + 1,使得如果np> mp,则np>np mod mp。然而,在us20090094486a1中描述的系统和方法中,开发人员有必要为所述一段软件的每个参数p生成可能值的矩阵sp,这需要必须由所述一段软件的开发人员完成的工作,同时不保证所生成的测试用例测试所有代码行。
3、us20180210823a1描述了一种用于执行单元测试的系统和方法。该方法涉及基于从用户接收的编译代码来生成源代码。该源代码被分类为可测试组件和不可测试组件,所述可测试组件包括源代码单元。此外,基于所述源代码单元从一组组织好的规则中识别规则。基于所述规则和所述源代码单元的内容确定对应于一个源代码单元的期望参数,其中所述内容包括一个或更多个输入字段。为了确定所述期望参数,可以提供用户界面以从用户接收对应于所述期望参数的值。通过使用所述期望参数为所述源代码单元的每个字段生成测试用例。通过执行所述测试用例来执行所述编译代码的无脚本单元测试。
4、us11102081b1描述了一种用于网络服务及其支持的api进行定量测试的系统和方法。为了便于测试,可以生成测试脚本。该测试脚本可以用从历史数据库导出的输入数据进行参数化。该测试脚本可以被执行,并且可以分析在测试期间从网络接收的响应,以确定与测试脚本的执行相关联的度量。这些度量可以指示成功测试的条件、未成功测试的条件、其它测试度量或其组合。在初始测试周期之后,确定停止条件是否已满足,如果尚未满足,则可以执行另一测试周期。下一测试周期可以利用与先前测试周期中使用的输入数据不同的一组不同输入数据,使得可以测试附加的条件和功能。
5、max shäfer等人于2023年9月6日发表的文章“an empirical evaluation ofusing large language models for automated unit test generation”公开了一项关于llm在自动化单元测试生成中的有效性的大规模实证评估。为此,llm提供有包括待测试函数的签名和实施以及从文档中提取的使用示例的提示。此外,如果生成的测试失败,则通过使用失败的测试和错误消息向模型重新提示来生成修复问题的新测试。
技术实现思路
1、本发明的目的在于提供一种如权利要求中所限定的、用于生成函数的单元测试的计算机实现的方法、非暂时性计算机可读存储介质以及计算机。
2、本发明的用于生成函数的单元测试的计算机实现的方法包括接收步骤,其中,接收所述函数的源代码,所述函数包括至少一个参数和多个代码行。接下来,所述方法包括迭代单元测试生成步骤,其中,为所述函数生成多个单元测试。
3、所述迭代单元测试生成步骤包括选择步骤,其中,从所述源代码中选择待测试代码元素,接下来是输入生成步骤,其中,为所述函数的各个参数生成初始值。所述输入生成步骤包括:初始提示生成步骤,其中,基于所述函数的源代码和所述待测试代码元素来生成初始提示;与llm(大语言模型)交互的步骤,其中,所述llm提供有所述初始提示,并被请求返回激活所述待测试代码元素的所述函数的各个参数的初始值;以及初始文本输出接收步骤,其中,从所述llm接收包含所述函数的各个参数的初始值的初始文本输出。
4、在所述输入生成步骤之后,所述迭代单元测试生成步骤包括迭代验证步骤序列,该迭代验证步骤序列在确定所述待测试代码元素已被激活时终止。所述迭代验证步骤序列包括:模拟步骤,其中,通过为所述函数的各个参数分配模拟值来模拟所述函数的执行,并生成所述函数执行的轨迹(trace),所述模拟值初始为各个参数的所述初始值;在所述模拟步骤之后的激活检查步骤,其中,确定在所述模拟步骤中所述待测试代码元素是否已被激活;以及输入校正步骤,如果在所述激活检查步骤中确定所述待测试代码元素在所述模拟步骤中未被激活,则在所述激活检查步骤之后执行该输入校正步骤。
5、所述输入校正步骤包括:校正提示生成步骤,其中,基于所述函数的源代码、所述待测试代码元素、所述模拟值和在所述模拟步骤中获得的轨迹来生成校正提示;与所述llm交互的步骤,其中,所述llm提供有所述校正提示,并被请求返回激活所述待测试代码元素的所述函数的各个参数的校正值;以及校正文本输出接收步骤,其中,从所述llm接收包含所述函数的各个参数的校正值的校正文本输出,使得在接收到所述校正文本输出后,各个参数的模拟值用相应的校正值进行更新,并且所述方法返回到所述模拟步骤。
6、所述迭代单元测试生成步骤包括:在所述迭代验证步骤序列之后执行的代码生成步骤,其中,生成用于所述待测试代码元素的单元测试的源代码;位于所述代码生成步骤之后的代码覆盖率计算步骤,其中,计算所述函数的覆盖率;以及代码覆盖率检查步骤,其中,确定所述函数的所有代码元素是否都已被测试,使得如果仍有任何代码元素待测试,则随后执行所述选择步骤,选择另一个待测试代码元素。
7、本发明的计算机实现的方法允许使用商业上可用的llm来自动生成单元测试,无需对所述llm进行额外训练,开发人员也不必提供稍后将在单元测试生成中使用的函数的参数的值。由于使用了llm,与使用现有技术中已知的其它方法生成的单元测试相比,使用本发明的方法生成的单元测试更类似于人类开发人员所编写的单元测试,此外还实现了所述函数的高覆盖率。
8、在第二方面,本发明还涉及一种非暂时性计算机可读存储介质,所述非暂时性计算机可读存储介质在其上存储有多条指令,所述指令当由计算机执行时,使所述计算机执行本发明的方法的步骤。
9、在第三方面,本发明还涉及一种计算机,所述计算机包括处理器和可操作地耦合到所述处理器的非暂时性计算机可读存储介质,所述非暂时性计算机可读存储介质在其上存储有多条指令,所述指令当由所述处理器执行时,使所述计算机执行本发明的方法的步骤。
10、本发明的这些和其它优点及特征将结合附图以及本发明的详细描述而变得显而易见。
1.一种用于生成函数的单元测试的计算机实现的方法,所述计算机实现的方法包括以下步骤:
2.根据权利要求1所述的计算机实现的方法,其中,所述函数的各个参数是:
3.根据权利要求1或2所述的计算机实现的方法,其中,所述轨迹包括:
4.根据权利要求3所述的计算机实现的方法,其中,所述函数包括至少一个内部变量,并且其中,所述轨迹包括:对于各个已执行的代码行,在所述模拟步骤(23)中所执行的所述函数的执行模拟中,所述代码行中所引用的内部变量在所述代码行执行之后所具有的值。
5.根据前述权利要求中任一项所述的计算机实现的方法,其中,所述迭代验证步骤序列(20)包括在所述激活检查步骤(24)之后且在所述输入校正步骤(25)之前的压缩步骤(30),其中,根据所述模拟步骤(23)中生成的所述轨迹生成压缩轨迹,所述压缩轨迹被提供给所述输入校正步骤(25)。
6.根据权利要求5所述的计算机实现的方法,其中,所述压缩步骤(30)包括:
7.根据权利要求5所述的计算机实现的方法,其中,所述压缩步骤(30)包括:
8.根据前述权利要求中任一项所述的计算机实现的方法,其中,所述迭代验证步骤序列(20)包括在所述激活检查步骤(24)和所述输入校正步骤(25)之间的方程管理步骤(33),其中,所述方程管理步骤(33)包括:
9.根据权利要求8所述的计算机实现的方法,其中,在所述方程生成提示生成步骤(3311)中,所述方程生成提示还基于在所述迭代验证步骤序列(20)的先前迭代中、针对同一函数和同一待测试代码元素在所述方程生成步骤(331)中选择的所述参数来生成,并且其中,在所述与llm交互的步骤(3312)中,请求所述llm选择不同于所述先前迭代中选择的所述参数的参数。
10.根据前述权利要求中任一项所述的计算机实现的方法,其中,所述迭代验证步骤序列(20)包括在所述激活检查步骤(24)与所述输入校正步骤(25)之间的条件链提取步骤(34),其中,从所接收的轨迹出发,获得直至到达所述待测试代码元素为止必须执行的条件链,使得在所述输入校正步骤(25)中,还基于所述条件链来生成所述校正提示。
11.根据权利要求10所述的计算机实现的方法,其中,在所述条件链提取步骤(34)中,还获得所述条件链中的第一个未执行条件,使得在所述输入校正步骤(25)中,还基于所述第一个未执行条件来生成所述校正提示。
12.一种非暂时性计算机可读存储介质,所述非暂时性计算机可读存储介质在其上存储有多条指令,所述指令当由计算机(500)执行时,使所述计算机(500)执行根据权利要求1至11中任一项所述的方法步骤。
13.一种计算机(500),所述计算机(500)包括处理器(502)以及能够操作地耦合到所述处理器(502)的非暂时性计算机可读存储介质,所述非暂时性计算机可读存储介质在其上存储有多条指令,所述指令当由所述处理器(502)执行时,使所述计算机(500)执行根据权利要求1至11中任一项所述的方法步骤。