大规模持续集成的测试用例优先级排序方法、设备及介质



1.本发明涉及计算机软件测试技术领域,更具体地说,它涉及大规模持续集成的测试用例优先级排序方法、设备及介质。


背景技术:



2.持续集成鼓励开发人员频繁地将更改的代码集成到主线代码库,并通过自动化构建和测试来验证提交代码的质量。与传统的开发模式相比,持续集成有利于更早、更快速地检测出代码的错误,从而支持产品的快速迭代。随着持续集成的广泛应用,大量变更代码以极其频繁的速度提交,由于代码更改提交非常频繁,测试数量以惊人的速度增加,如何优化持续集成以降低测试成本和缩短测试反馈周期,以提高测试成本效益,是持续集成在实际应用过程中面临的主要挑战。
3.目前,人们提出的持续集成测试优化方法:(1)基于覆盖信息、风险分析等的传统tcp技术在典型的持续集成环境中变得不适用,因为更改程序代码极其频繁地提交,大量的信息分析和收集需要大量的时间成本。(2)基于启发式规则或信息检索技术的轻量级测试用例排序模型,因忽略了代码语义、上下文等信息,导致测试排序的性能仍然有较大提升空间。(3)基于深度学习的测试用例排序技术(例如,强化学习,预训练语言模型bert),能取得较好的排序性能,但是复杂的模型训练需要大量的训练时间和复杂的参数设置。
4.综上可知,现有的测试用例排序方法中基于覆盖等测试用例排序技术、基于信息检索技术、机器学习或者深度学习方法,难以满足大规模持续集成中对测试的要求。


技术实现要素:



5.本发明的目的是提供大规模持续集成的测试用例优先级排序方法、设备及介质,通过第一排序对测试用例依次进行初排和筛选,得到筛选后的测试集,并利用第二排序对筛选后的初排测试集进行精准排序,达到快速高效地对测试用例排序,并提高排序准确性的目的。
6.本发明的上述技术目的是通过以下技术方案得以实现的:
7.一种大规模持续集成的测试用例优先级排序方法,包括:
8.第一排序,所述第一排序操作包含解析目标代码,所述目标代码包含测试代码,对所述目标代码进行词元化处理,得到至少包含测试用例表示;通过检索算法对测试用例进行第一排序,得到初排测试集;以及
9.第二排序,所述第二排序包含筛选排序后的初排测试集用于作为模型的训练集;将经过训练集训练后的模型对所述初排测试集进行第二排序,得到测试用例优先级排序结果。
10.进一步的,所述目标代码还包含更改程序代码;
11.在第一排序中,更改程序代码经过词元化处理得到更改程序代码表示;
12.在第二排序中,在训练模型时,训练内容包含学习更改程序代码和测试用例的语
义表示;
13.其中,所述更改程序代码与测试用例的对应关系为:1个更改程序代码表示q对应于m个测试用例表示,m为整数,且m大于等于1。
14.进一步的,得到至少包含测试用例表示,获取步骤包括以下步骤:
15.使用python语言的javalang对测试用例代码进行语法和词法分析,并建立抽象语法树对代码进行结构化表示;
16.遍历抽象语法树提取标识符;
17.根据长标识符分割规则将长标识符分成单个词素;
18.过滤无意义的词汇和停止词,得到由词元组成的测试用例表示。
19.进一步的,当更改程序代码表示或测试用例表示出现重复词元时;
20.对词元的唯一性进行评估,包括可选择的进行以下操作:
21.1)保持词元唯一性;对更改程序代码表示或测试用例表示中的词元进行去重,以保持集合中每种标记的唯一性;
22.2)保持原词的出现频率;允许词元的重复出现,并记录更改程序代码表示和测试用例表示中词元出现的词频。
23.进一步的,在第一排序,通过检索算法对测试用例进行第一排序,得到初排测试集中,包含以下操作:
24.给定一个更改程序代码,检索算法采用bm25算法来计算更改程序代码与每个测试用例之间的相似度得分,然后根据bm25算法得分对测试用例进行排序;
25.在第一排序得到的初排测试集中选择一定数量的排序靠前测试用例和排序靠后测试用例,作为所述模型的训练集,以此过滤系数完成后续的操作。
26.进一步的,在第二排序中,包括以下步骤:
27.训练数据的组织;从训练集中构建更改程序代码和测试用例表示对,同时每个测试用例表示设置标签;通过给定的更改程序代码表示为q,对应于q的第i个测试用例表示ti和标签li,构建三元组ti(q,ti,li);
28.所述模型采用siamese-minilm模型,将构建的三元组输入到siamese-minilm模型,通过模型练训后,得到更改程序代码和测试用例的语义嵌入向量u、v,并根据u和v之间的语义相似度对测试集进行排序。
29.进一步的,当测试用例在真实数据集的最后一个版本中检测到了程序错误,将其赋予第一标签,用于表明更改程序代码和测试用例表示在语义和功能上有一定相似性;
30.反之,将其他没有检测出程序错误的测试用例的赋予区别于第一标签的第二标签。
31.进一步的,通过比较更改程序代码u和测试用例v之间的余弦相似度与测试用例的真实标签来设计损失函数;
32.其中,模型每训练预设步数,将在验证集上进行1次评估,并根据损失函数对模型进行更新,保留性能较好的模型。
33.一种电子设备,包括:处理器;存储器,用于存储所述处理器可执行的指令的;其中,所述处理器被配置为执行指令,以实现所述的方法。
34.一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述
计算机程序被处理器执行时实现上述的方法。
35.与现有技术相比,本发明具有以下有益效果:
36.通过第一排序对测试用例依次进行初排和筛选,得到筛选后的测试集,并利用第二排序对筛选后的初排测试集进行精准排序,达到快速高效地对测试用例排序,并提高排序准确性的目的。
附图说明
37.此处所说明的附图用来提供对本发明实施例的进一步理解,构成本技术的一部分,并不构成对本发明实施例的限定。在附图中:
38.图1为本实施例中大规模持续集成的测试用例优先级排序方法的流程示意图;
39.图2为本实施例中基于机器翻译的孪生网络siamese-minilm的测试精准排序的结构示意图;
40.图3为本实施例提供的示例中大规模持续集成的测试用例优先级排序方法与3个基线方法和实际持续集成测试的比较结果示意图。
具体实施方式
41.为使本发明的目的、技术方案和优点更加清楚明白,下面结合实施例和附图,对本发明作进一步的详细说明,本发明的示意性实施方式及其说明仅用于解释本发明,并不作为对本发明的限定。
42.此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括一个或者更多个该特征。在本发明的描述中,“多个”的含义是两个或两个以上,除非另有明确具体的限定。
43.实施例:大规模持续集成的测试用例优先级排序方法、设备及介质,
44.如图1所示,一种大规模持续集成的测试用例优先级排序方法,包括:
45.第一排序,所述第一排序操作包含解析目标代码,所述目标代码包含测试代码,对所述目标代码进行词元化处理,得到至少包含测试用例表示;通过检索算法对测试用例进行第一排序,得到初排测试集;以及
46.第二排序,所述第二排序包含筛选排序后的初排测试集用于作为模型的训练集;将经过训练集训练后的模型对所述初排测试集进行第二排序,得到测试用例优先级排序结果。
47.所述目标代码还包含更改程序代码;在第一排序中,更改程序代码经过词元化处理得到更改程序代码表示;在第二排序中,在训练模型时,训练内容包含学习更改程序代码和测试用例的语义表示;其中,所述更改程序代码与测试用例的对应关系为:1个更改程序代码表示q对应于m个测试用例表示,m为整数,且m大于等于1。
48.得到至少包含测试用例表示,获取步骤包括以下步骤:使用python语言的javalang对测试用例代码进行语法和词法分析,并建立抽象语法树对代码进行结构化表示;遍历抽象语法树提取标识符;根据长标识符分割规则将长标识符分成单个词素;过滤无意义的词汇和停止词,得到由词元组成的测试用例表示。
49.具体地:测试用例表示,通过抽象语法树(ast)对测试用例进行词元化处理后得到,该过程包括四个步骤:a)解析测试用例并建立ast。使用python语言的javalang来分析测试用例的语法和形态,并将测试用例解析得到ast;b)提取标识符。遵循命名规则的标识符往往带有与测试用例功能相关的语义信息,因此通过遍历抽象语法树来提取所有标识符。c)长标识符分割。为了能够更准确地表达意图,标识符(例如类名、方法名、变量名等)往往是通过词元拼接或者驼峰命名法进行命名,形成长标识符(例如某函数名printemploypaychecks())。因此,将长标识符根据大写字母、符号等特征分割分成单个词素,以便获得更丰富的语义特征。d)过滤无意义的词汇和停止词。在英语里面会遇到很多a,the,or等使用频率很多的字或词,常为冠词、介词、副词或连词等,如果搜索引擎要将这些词都索引的话,那么工作量巨大。因此,实验过程都会将这一类词语,包括英文停止词、java关键词等无意义的词素全部过滤掉,得到由词元组成的测试用例表示。
50.当更改程序代码表示或测试用例表示出现重复词元时;对词元的唯一性进行评估,包括可选择的进行以下操作:1)保持词元唯一性;对更改程序代码表示或测试用例表示中的词元进行去重,以保持集合中每种标记的唯一性;2)保持原词的出现频率;允许词元的重复出现,并记录更改程序代码表示和测试用例表示中词元出现的词频。
51.具体地:更改程序代码表示是由两个版本之间的更改的程序代码,用与测试用例相同的词元化处理方式得到。变更的程序文件,可能只包含一行或几行的代码更改,采用变更文件的全部代码来对变更的程序文件中更改的代码进行更改。由于词元在更改程序代码表示或测试用例表示中都是可能重复出现的,是否保持词元的唯一性,对模型性能可能造成不同的影响。因此,在分析不同策略对模型的不同影响,以选择能够取得较好性能的策略完成后续的操作的基础上,提供以下两种策略以供选择:1)保持词元唯一性(mu)——对更改程序代码表示或测试用例表示中的词元进行去重,以保持集合中每种标记的唯一性;2)保持原词的出现频率(mf)——允许词元的重复出现,并记录更改程序代码表示或测试用例表示中词元出现的词频。与现有技术相比,本实例中评估了不同策略对不同模型性能的影响,然后选择适当的策略以使模型达到最佳的性能,例如stir采用mf策略,而基线方法optir采用mu策略。
52.在第一排序,通过检索算法对测试用例进行第一排序,得到初排测试集中,包含以下操作:给定一个更改程序代码,检索算法采用bm25算法来计算更改程序代码与每个测试用例之间的相似度得分,然后根据bm25算法得分对测试用例进行排序;在第一排序得到的初排测试集中选择一定数量的排序靠前测试用例和排序靠后测试用例,作为所述模型的训练集,以此过滤系数完成后续的操作。
53.在第二排序中,包括以下步骤:训练数据的组织;从训练集中构建更改程序代码和测试用例表示对,同时每个测试用例表示设置标签;通过给定的更改程序代码表示为q,对应于q的第i个测试用例表示ti和标签li,构建三元组ti(q,ti,li);所述模型采用siamese-minilm模型,将构建的三元组输入到siamese-minilm模型,通过模型练训后,得到更改程序代码和测试用例的语义嵌入向量u、v,并根据u和v之间的语义相似度对测试集进行排序。
54.当测试用例在真实数据集的最后一个版本中检测到了程序错误,将其赋予第一标签,用于表明更改程序代码和测试用例表示在语义和功能上有一定相似性;反之,将其他没有检测出程序错误的测试用例的赋予区别于第一标签的第二标签。
55.通过比较更改程序代码u和测试用例v之间的余弦相似度与测试用例的真实标签来设计损失函数;其中,模型每训练预设步数,将在验证集上进行1次评估,并根据损失函数对模型进行更新,保留性能较好的模型
56.具体地:本实施例中使用bm25算法对大规模测试集进行快速排序,在第一排序,给定一个更改程序代码,通过检索算法采用bm25算法来计算更改程序代码与每个测试用例之间的相似度得分,然后根据bm25算法得分由高到低对测试用例进行排序。
57.bm25是信息检索领域中比较高效的模型,通过计算文本的相似度进行排序。但是,将相关性视为概率统计的问题而不是单词的实际语义;考虑到程序代码中的方法/类名称与测试用例中的名称几乎相同,可近似地认为,bm25的得分表明了更改程序代码和测试用例表示之间的潜在语义相似度。因此,在当前的实施案例中,给定一个更改程序代码,可使用bm25来计算更改程序代码与每个测试用例之间的相似度得分,然后根据bm25得分对测试用例进行排序。
58.如何对bm25初排后的测试集进行选择,直接影响到下一阶段模型的排序性能。如果只选取预排序的结果中排序靠前的k个样本作为精准排序阶段的训练集,可能会导致精准排序模型对数据集的探索不足。为了缓解这个问题,可选择优先级较低的少量负面样本加入到精准排序的训练集中。在本实施例中观察到,仅仅选取bm25得分排序的前k个样本作为第二阶段精准排序的训练样本,模型的性能表现欠佳,因此,选择少量的bm25得分较低的样本,作为负样本加入训练集来提升其性能。本实施例中,设计筛选策略从第一排序得到的初排测试集中选择一定数量的排序靠前(得分高)的测试和少量排序靠后(得分低)的测试,作为第二排序模型的训练集,得分较高的测试用例表示是为了使与代码更改语义相似度较高的测试用例学习得到高优先级,以尽快检测出集成错误;得分较低的测试用例则是为了增强第二排序模型的探索能力。充分分析不同筛选系数的时间开销和对模型性能的影响,选择合适的过滤策略,并以此过滤系数完成后续的操作。通过仔细分析并调整了过滤系数,以使模型获得了较好的性能;最后选择初步排序前20%-60%的测试用例和排序后2%-6%的测试用例,作为精准排序阶段模型的训练集,并以此过滤系数完成后续的所有实验。
59.图2给出了基于机器翻译的孪生网络siamese-minilm的测试精准排序结构图。本实施例中,利用基于transformer的预训练语言模型(即siamese-minilm)对测试用例进行精确排序,该方法结合了minilm网络较少的参数来训练语义表示的优势和siamese-bert网络在语义文本相似性计算只需较少的计算和时间开销。
60.具体为,(1)首先从训练集中构建更改程序代码和测试用例的表示对,通常一个查询表示对应于多个测试用例表示,但每个测试用例表示对应一个标签。本方案的实验是基于开源项目的持续集成测试历史数据,如果测试用例在最近的集成版本中检测到了程序错误,则将其标签定义为第一标签并设置为1,说明更改程序代码和测试用例表示在语义和功能上有很强的相似性。反之,将其他没有检测出程序错误的测试用例定义为第二标签并设置为0,这些负样本可促进模型学习更改程序代码和测试用例表示之间的差异。通过给定的更改程序代码的表示为q,对应于q的第i个测试用例表示ti和标签li,构建三元组ti(q,ti,li)。(2)将三元组分别输入到minilm模型中,该模型具有深度自注意蒸馏模块,在超过10亿个句子对上进行了预训练,可学习得到通用的语言表达知识,有利于下游任务取得较好的表现。更改程序代码和测试用例表示经过minilm模型学习后,分别获得语义嵌入向量u、v。
接着,根据u和v之间的语义相似度对测试集进行再排序,得到最终排序的结果。(3)在训练阶段,通过比较更改程序代码u和测试用例v之间的余弦相似度与测试用例的真实标签来设计损失函数。每训练预设步数后,这里设置为1000步,模型将在验证集上进行1次评估,进行多轮训练后保留性能表现较好的模型。在评估阶段,对每个项目提取成对的更改程序代码和测试用例表示,然后通过siamese-minilm模型计算它们的语义相似度,得到最终排名的测试集,对本实施例提供的方法进行评估。
61.为了减少模型实现过程中的错误,本实施方案使用sentence-transformers实现本方案并训练模型,该框架是一个完善的python框架,拥有最先进的句子文本和图像嵌入方法,可进行语义文本相似性分析、语义搜索或释义挖掘等工作。该框架以pytorch和transformers为基础,提供了大量的预训练模型以便各种下游任务进行调整。
62.综上可知,本实施例提供的大规模持续集成的测试用例优先级排序方法具有以下优点:
63.①
采用代码表示法和minilm语言模型来精确捕捉代码的语义信息,并计算代码语义相似度来对测试用例进行排序,有利于提高排序的准确性。
64.②
使用siamese-minilm模型作为精准排序的模型,该模型结合了minilm模型参数少的优势和siamese-bert网络计算成本和时间开销较少的优点,在保证排序性能的同时,减少了模型计算的时间开销和训练的参数量。
65.③
初筛和精准排序的两阶段的测试用例排序策略,结合初筛和精准排序的优势,不仅提高了排序性能,而且只选取55%的测试用于精准排序阶段的模型训练,大大减少了模型的训练时间。
66.示例:本实施例提供的大规模持续集成的测试用例优先级排序方法(sattcp)在github社区119开源项目的2038个持续集成版本上进行实验,并选择初步排序前50%的测试用例和排序后5%的测试用例,作为精准排序阶段模型的训练集,并以此过滤系数完成后续的所有实验,得到实验结果,并从缺陷检测性能(apfd,apfdc)和时间开销方面,与3个基线方法和实际持续集成(ci)测试进行比较,比较结果如图3和表1所示;
[0067][0068]
表1
[0069]
由图3和表1中实验结果可知,本方法在所有项目上的平均apfdc(缺陷检测性能的综合评价指标)高于所有基线14.8%~28.8%,特别在大型项目中,apfdc和apfd高出性能最好的基线方法32.9%和11%。并且随着项目规模的扩大,方法性能呈现出明显的上升趋势。此外,本发明方法的总时间成本(包括测试排序时间和测试执行时间)最低,相比实际持续集成测试时间减少了71.6%,相比基线方法平均减少了33.7%-41.1%。
[0070]
本实施例还提供一种电子设备,包括:处理器;存储器,用于存储所述处理器可执行的指令的;其中,所述处理器被配置为执行指令,以实现所述的方法。
[0071]
本实施例还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现上述的方法。
[0072]
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

技术特征:


1.一种大规模持续集成的测试用例优先级排序方法,其特征在于,包括:第一排序,所述第一排序操作包含解析目标代码,所述目标代码包含测试代码,对所述目标代码进行词元化处理,得到至少包含测试用例表示;通过检索算法对测试用例进行第一排序,得到初排测试集;以及第二排序,所述第二排序包含筛选排序后的初排测试集用于作为模型的训练集;将经过训练集训练后的模型对所述初排测试集进行第二排序,得到测试用例优先级排序结果。2.如权利要求1所述的方法,其特征在于,所述目标代码还包含更改程序代码;在第一排序中,更改程序代码经过词元化处理得到更改程序代码表示;在第二排序中,在训练模型时,训练内容包含学习更改程序代码和测试用例的语义表示;其中,所述更改程序代码与测试用例的对应关系为:1个更改程序代码表示q对应于m个测试用例表示,m为整数,且m大于等于1。3.如权利要求2所述的方法,其特征在于,得到至少包含测试用例表示,获取步骤包括以下步骤:使用python语言的javalang对测试用例代码进行语法和词法分析,并建立抽象语法树对代码进行结构化表示;遍历抽象语法树提取标识符;根据长标识符分割规则将长标识符分成单个词素;过滤无意义的词汇和停止词,得到由词元组成的测试用例表示。4.如权利要求2所述的方法,其特征在于,当更改程序代码表示或测试用例表示出现重复词元时;对词元的唯一性进行评估,包括可选择的进行以下操作:1)保持词元唯一性;对更改程序代码表示或测试用例表示中的词元进行去重,以保持集合中每种标记的唯一性;2)保持原词的出现频率;允许词元的重复出现,并记录更改程序代码表示和测试用例表示中词元出现的词频。5.如权利要求2所述的方法,其特征在于,在第一排序,通过检索算法对测试用例进行第一排序,得到初排测试集中,包含以下操作:给定一个更改程序代码,检索算法采用bm25算法来计算更改程序代码与每个测试用例之间的相似度得分,然后根据bm25算法得分对测试用例进行排序;在第一排序得到的初排测试集中选择一定数量的排序靠前测试用例和排序靠后测试用例,作为所述模型的训练集,以此过滤系数完成后续的操作。6.如权利要求1所述的方法,其特征在于,在第二排序中,包括以下步骤:训练数据的组织;从训练集中构建更改程序代码和测试用例表示对,同时每个测试用例表示设置标签;通过给定的更改程序代码表示为q,对应于q的第i个测试用例表示t
i
和标签l
i
,构建三元组t
i
(q,t
i
,l
i
);
所述模型采用siamese-minilm模型,将构建的三元组输入到siamese-minilm模型,通过模型练训后,得到更改程序代码和测试用例的语义嵌入向量u、v,并根据u和v之间的语义相似度对测试集进行排序。7.如权利要求6所述的方法,其特征在于,当测试用例在真实数据集的最后一个版本中检测到了程序错误,将其赋予第一标签,用于表明更改程序代码和测试用例表示在语义和功能上有一定相似性;反之,将其他没有检测出程序错误的测试用例的赋予区别于第一标签的第二标签。8.如权利要求6所述的方法,其特征在于,通过比较更改程序代码u和测试用例v之间的余弦相似度与测试用例的真实标签来设计损失函数;其中,模型每训练预设步数,将在验证集上进行1次评估,并根据损失函数对模型进行更新,保留性能较好的模型。9.一种电子设备,其特征在于,包括:处理器;存储器,用于存储所述处理器可执行的指令的;其中,所述处理器被配置为执行指令,以实现所述权利要求1-8中任一项所述的方法。10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1-8中任一项所述的方法。

技术总结


本发明公开了大规模持续集成的测试用例优先级排序方法、设备及介质,涉及计算机软件测试技术领域,解决了现有的测试用例排序方法不能快速高效并准确对测试用例进行排序的问题,其技术方案要点是:第一排序,所述第一排序操作包含解析目标代码,所述目标代码包含测试代码,对所述目标代码进行词元化处理,得到至少包含测试用例表示;通过检索算法对测试用例进行第一排序,得到初排测试集;以及第二排序,所述第二排序包含筛选排序后的初排测试集用于作为模型的训练集;将经过训练集训练后的模型对所述初排测试集进行第二排序,得到测试用例优先级排序结果,达到快速高效地对测试用例排序,并提高排序准确性的目的。并提高排序准确性的目的。并提高排序准确性的目的。


技术研发人员:

李英玲 王子翱 王俊杰

受保护的技术使用者:

西南民族大学

技术研发日:

2022.09.20

技术公布日:

2022/12/12

本文发布于:2024-09-21 18:38:19,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/34415.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:测试   所述   程序代码   模型
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议