一种基于机器学习的细粒度测试用例检测方法技术

技术编号:38460287 阅读:11 留言:0更新日期:2023-08-11 14:37
本发明专利技术提供一种基于机器学习的细粒度测试用例检测方法,所述方法包括:获取目标软件的产品代码更改信息,根据所述产品代码更改信息得到已更改的目标产品函数;提取所述目标产品函数对应的函数粒度特征,根据所述函数粒度特征得到所述目标产品函数对应的目标特征向量;将所述目标特征向量输入预先训练的分类模型中,得到目标软件的测试代码中需要更改的测试用例的更改类型结果以及测试用例的具体位置信息。本发明专利技术通过获取已更改的目标产品函数,提取目标产品函数对应的函数粒度特征得到目标特征向量,将目标特征向量输入预先训练的分类模型中,实现了对过时测试用例进行函数级别细粒度即时预测,提高了定位需更新的测试用例代码的效率。例代码的效率。例代码的效率。

【技术实现步骤摘要】
一种基于机器学习的细粒度测试用例检测方法


[0001]本专利技术涉及软件测试领域,尤其涉及的是一种基于机器学习的细粒度测试用例检测方法。

技术介绍

[0002]软件测试能够检查软件的代码和行为,从而发现编程错误和可用性问题等缺陷,可以有效帮助开发人员避免在软件开发和维护过程中出现严重的逻辑问题,帮助产品经理扩展或修改需求,最终提升用户体验。在实际产品开发过程中,构建测试框架和编写测试代码(例如,单元测试用例)是整个软件开发过程中必不可少的活动。随着产品代码的不断更新,测试用例可能会变得过时或不足以对现版本产品代码进行测试。例如,它们可能无法测试新的功能,或者测试用例可能由于不恰当的断言而导致报告虚假故障,这都会造成不必要的人力物力财力损失。因此,最佳选择是测试代码需要与产品代码同步更新,让现有的测试代码总能够覆盖最新的业务逻辑,避免过时的测试代码对开发者造成困扰,甚至在生产环境上带来潜在威胁。这被称为产品代码和测试代码的“协同演化”。
[0003]现有工作为了将测试代码与产品代码相关联,利用Java项目的文件命名约定将Java类与其相应的测试类映射(例如,测试类TestFoo对产品类Foo进行测试)。对于测试更新预测,使用机器学习算法从项目的历史提交中训练模型。经过训练的模型综合考虑了多种因素(例如,产品代码中程序结构的变化,以及代码变化的复杂性)来推断当被测类发生变化时是否需要更新测试类。然而,现有的解决方案具有如下的局限性:
[0004]上述工作只能在文件级别执行粗粒度预测,只能预测Java类上的测试更新。也就是说,给定产品代码的更改,该工作仅能够依靠命名约定找到对发生更改的产品类进行测试的测试类,并判断测试类是否需要更新,而不会提供更细粒度的结果。而由于一个测试类可能包含大量的测试方法(或测试函数),使用者仍然需要花费大量精力来定位需要更新的测试用例中的代码。
[0005]因此,现有技术存在缺陷,有待改进与发展。

技术实现思路

[0006]本专利技术要解决的技术问题在于,针对现有技术的上述缺陷,提供一种基于机器学习的细粒度测试用例检测方法,旨在解决现有技术中使用者需要花费大量精力定位需要更新的测试用例中代码的问题。
[0007]本专利技术解决技术问题所采用的技术方案如下:
[0008]一种基于机器学习的细粒度测试用例检测方法,其中,所述方法包括:
[0009]获取目标软件的产品代码更改信息,根据所述产品代码更改信息得到已更改的目标产品函数;
[0010]提取所述目标产品函数对应的函数粒度特征,根据所述函数粒度特征得到所述目标产品函数对应的目标特征向量;
[0011]将所述目标特征向量输入预先训练的分类模型中,得到目标软件的测试代码中需要更改的测试用例的更改类型结果以及测试用例的具体位置信息。
[0012]在一种实现方式中,所述获取目标软件的产品代码更改信息,根据所述产品代码更改信息得到已更改的目标产品函数,包括:
[0013]获取目标软件的产品代码更改信息,以代码行为单位,查找所述产品代码更改信息中发生更改的目标Java文件;
[0014]通过语法解析器解析所述目标Java文件中各个函数的行号区间范围,根据发生更改的代码行号获取发生更改的目标产品函数。
[0015]在一种实现方式中,所述分类模型的训练步骤包括:
[0016]从目标代码库的所有历史提交中查找发生更改的产品代码和测试代码,根据发生更改的所述产品代码和所述测试代码确定发生更改的样本更改函数;
[0017]若所述样本更改函数所在的Java类为产品类,则查找对样本更改函数所在类进行测试的测试类,根据所述测试类得到函数粒度的正样本和负样本;
[0018]利用所述正样本和负样本对初始分类模型进行训练,得到已训练的分类模型。
[0019]在一种实现方式中,所述从目标代码库的所有历史提交中查找发生更改的产品代码和测试代码,根据发生更改的所述产品代码和所述测试代码确定发生更改的样本更改函数,包括:
[0020]从目标代码库的所有历史提交中查找发生更改的产品代码和测试代码;
[0021]以代码行为单位,查找所述产品代码和所述测试代码中发生更改的代码行;
[0022]通过语法解析器解析所述代码行所在文件中各个函数的行号区间范围,得到发生更改的样本更改函数。
[0023]在一种实现方式中,若所述样本更改函数所在的Java类为产品类,则查找对样本更改函数所在类进行测试的测试类,根据所述测试类得到函数粒度的正样本和负样本,包括:
[0024]若所述样本更改函数所在的Java类为产品类,则根据预设命名约定确定对所述样本更改函数所在的Java类进行测试的测试类;
[0025]通过语法解析器查找所述产品类和所述测试类之间函数的多层调用关系,并根据所述多层调用关系确定对所述样本更改函数进行测试的所有样本测试函数;
[0026]根据所述样本测试函数与所述样本更改函数之间的协同演化关系得到所述样本更改函数的初始样本标签;
[0027]若同一个样本更改函数的同一次更改对应多个初始样本标签,则按照预设合并规则将各个初始样本标签进行合并,得到函数粒度的正样本和负样本。
[0028]在一种实现方式中,根据所述样本测试函数与所述样本更改函数之间的协同演化关系得到所述样本更改函数的初始样本标签,包括:
[0029]查找所述样本更改函数对应的第一更改时间,以及所有样本测试函数对应的第二更改时间;
[0030]计算各个所述第二更改时间与所述第一更改时间之间的最短间隔时间,将最短间隔时间对应的第二更改时间作为目标第二更改时间;
[0031]若所述最短间隔时间小于预设第一时间阈值,则确定在第一更改时间和目标第二
更改时间之间所述样本更改函数的更改信息;
[0032]若所述更改信息为在第一更改时间和目标第二更改时间之间没有再次更改,则确定第一更改时间和目标第二更改时间之间的样本测试函数的更改类型,并将所述更改类型记录为所述样本更改函数的初始样本标签;
[0033]其中,所述更改类型为应该更改;或者,所述更改类型包括:应该创建、应该编辑和应该删除。
[0034]在一种实现方式中,所述计算各个所述第二更改时间与所述第一更改时间之间的最短间隔时间之后,还包括:
[0035]若所述最短间隔时间大于或等于预设第一时间阈值,则获取预设第二时间阈值,并比较所述最短间隔时间与所述预设第二时间阈值;
[0036]若所述最短间隔时间大于所述预设第二时间阈值,则将所述样本更改函数的初始样本标签记录为不更改。
[0037]在一种实现方式中,利用所述正样本和负样本对初始分类模型进行训练,得到已训练的分类模型,包括:
[0038]将Java中的所有AST节点类型进行初步筛选,得到特征列表;
[0039]确定所述特征列表中各个特征的代码位置信息,根据各个特征和对应的代码位置本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于机器学习的细粒度测试用例检测方法,其特征在于,所述方法包括:获取目标软件的产品代码更改信息,根据所述产品代码更改信息得到已更改的目标产品函数;提取所述目标产品函数对应的函数粒度特征,根据所述函数粒度特征得到所述目标产品函数对应的目标特征向量;将所述目标特征向量输入预先训练的分类模型中,得到目标软件的测试代码中需要更改的测试用例的更改类型结果以及测试用例的具体位置信息。2.根据权利要求1所述的基于机器学习的细粒度测试用例检测方法,其特征在于,所述获取目标软件的产品代码更改信息,根据所述产品代码更改信息得到已更改的目标产品函数,包括:获取目标软件的产品代码更改信息,以代码行为单位,查找所述产品代码更改信息中发生更改的目标Java文件;通过语法解析器解析所述目标Java文件中各个函数的行号区间范围,根据发生更改的代码行号获取发生更改的目标产品函数。3.根据权利要求1所述的基于机器学习的细粒度测试用例检测方法,其特征在于,所述分类模型的训练步骤包括:从目标代码库的所有历史提交中查找发生更改的产品代码和测试代码,根据发生更改的所述产品代码和所述测试代码确定发生更改的样本更改函数;若所述样本更改函数所在的Java类为产品类,则查找对样本更改函数所在类进行测试的测试类,根据所述测试类得到函数粒度的正样本和负样本;利用所述正样本和负样本对初始分类模型进行训练,得到已训练的分类模型。4.根据权利要求3所述的基于机器学习的细粒度测试用例检测方法,其特征在于,所述从目标代码库的所有历史提交中查找发生更改的产品代码和测试代码,根据发生更改的所述产品代码和所述测试代码确定发生更改的样本更改函数,包括:从目标代码库的所有历史提交中查找发生更改的产品代码和测试代码;以代码行为单位,查找所述产品代码和所述测试代码中发生更改的代码行;通过语法解析器解析所述代码行所在文件中各个函数的行号区间范围,得到发生更改的样本更改函数。5.根据权利要求3所述的基于机器学习的细粒度测试用例检测方法,其特征在于,若所述样本更改函数所在的Java类为产品类,则查找对样本更改函数所在类进行测试的测试类,根据所述测试类得到函数粒度的正样本和负样本,包括:若所述样本更改函数所在的Java类为产品类,则根据预设命名约定确定对所述样本更改函数所在的Java类进行测试的测试类;通过语法解析器查找所述产品类和所述测试类之间函数的多层调用关系,并根据所述多层调用关系确定对所述样本更改函数进行测试的所有样本测试函数;根据所述样本测试函数与所述样本更改函数之间的协同演化关系得到所述样本更改函数的初始样本标签;若同一个样本更改函数的同一次更改对应多个初始样本标签,则按照预设合并规则将各个初始样本标签进行合并,得到函数粒度的正样本和负样本。
6.根据权利要求5所述的基于机器学习的细粒度测试用例检测方法,其特征在于,根据所述样本测试函数与所述样本更改函数之间的协同演化关系得...

【专利技术属性】
技术研发人员:刘蕾王斯南刘烨庞
申请(专利权)人:南方科技大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1