单元测试方法、装置、电子设备和存储介质

专利查询4月前  44



1.本技术实施例涉及金融科技(fintech)的软件测试技术领域,尤其涉及一种单元测试方法、装置、电子设备和计算机存储介质。


背景技术:

2.随着计算机技术的发展,越来越多的技术应用在金融领域,传统金融业正在逐步向金融科技转变,但由于金融行业的安全性、实时性要求,也对技术提出了更高的要求。
3.在软件研发过程中,软件需要经历单元测试、集成测试、系统测试、回归测试等阶段,以保证软件各个基本组成单位、各个接口的质量,验证软件功能、界面的正确,同时对发现的错误进行修复。
4.在单元测试中,存在代码模块需要依赖外部的类或者接口,对于某些不容易构造或者不容易获取的对象,需要创建适配的模拟对象,定义模拟对象适配出所需类或者接口进行测试。在实际应用中,由于测试返回的结果受到软件、硬件和系统环境等多方面的影响,测试阶段需要正常、异常各种各样的返回结果。
5.在相关技术中,针对特定领域测试依赖对象,生成特定类型mock object。对一般类型的测试依赖对象,开发者通常需要手动创建mock object,难以给mock object指定合适的行为,无法适配任意的测试依赖对象。因此,如何在单元测试时提高模拟对象的适用性成为亟待解决的重要问题。


技术实现要素:

6.本技术实施例提供了一种单元测试方法、装置、电子设备和计算机存储介质,可以在单元测试时提高模拟对象的适用性。
7.本技术实施例提供的一种单元测试方法,包括:
8.获取第i种群的多个语句集合,每个所述语句集合包括至少一个语句;所述语句用于定义模拟对象的行为;
9.根据每个所述语句对应的变异操作符,对每个所述语句进行变异操作,得到变异操作结果;对所述变异操作结果中的两个语句集合进行交叉互换,得到第i+1种群;
10.若确定所述第i+1种群中存在符合测试用例的测试断言的语句集合,则采用所述符合测试断言的语句集合定义所述模拟对象;基于所述模拟对象对所述测试用例进行单元测试。
11.在一种实现方式中,所述方法还包括:
12.在i为大于1的整数的情况下,若确定第i-1种群中不存在符合测试用例的测试断言的语句集合,则获取所述第i-1种群中每个语句集合的适应度;
13.根据所述每个语句集合的适应度,将所述第i-1种群中适应度大于预设阈值的语句集合作为第i种群的语句集合;
14.或者,根据所述每个语句集合的适应度,确定所述第i-1种群中每个语句集合被抽
中的概率;根据所述每个语句集合被抽中的概率,在所述第i-1种群的多个语句集合中抽样得到所述第i种群的语句集合。
15.在一种实现方式中,所述第i-1种群中包括m个语句集合;所述获取所述第i-1种群中每个语句集合的适应度,包括:
16.确定至少一个适应度函数和每个所述适应度函数的权重系数;获取所述第i-1种群中第j语句集合在每个所述适应度函数下的计算结果;
17.根据所述第j语句集合在每个所述适应度函数下的计算结果和每个所述适应度函数的权重系数,获取所述第j语句集合的适应度;
18.在j依次取1至m的情况下,获取所述第i-1种群中每个语句集合的适应度。
19.在一种实现方式中,所述第i种群中包括n个语句集合;所述对所述变异操作结果中的两个语句集合进行交叉互换,得到第i+1种群,包括:
20.确定所述n个语句集合中的两个语句集合,对所述两个语句集合中语句类型相同的语句进行交叉互换,产生所述两个语句集合的两个子代;
21.将所述两个语句集合中的至少一个和所述两个子代中的至少一个,加入所述第i+1种群中,得到所述第i+1种群中的n个语句集合。
22.在一种实现方式中,所述确定至少一个适应度函数,包括以下任一项:
23.根据语句集合中生成的语句条数和成功执行的语句条数,创建适应度函数;
24.根据测试用例能否执行到测试断言前的状态分布,创建适应度函数;
25.根据测试断言中断言语句的语句数和每个断言语句的期望值和实际值的编辑距离,创建适应度函数;
26.根据在模拟对象中所有方法调用的集合和在模拟对象中已经指定了行为的方法调用的集合,创建适应度函数;
27.根据测试断言中已被满足的断言语句的语句数和测试断言中所有断言语句的语句数,创建适应度函数。
28.在一种实现方式中,所述根据所述测试断言中断言语句的语句数以及每个断言语句的期望值和实际值的编辑距离,创建适应度函数,包括:
29.确定所述测试断言的至少一条断言语句;获取每个断言语句的期望值和实际值的编辑距离;
30.根据每个断言语句的期望值和实际值的编辑距离,获取每个断言语句的编辑距离的归一化结果;
31.根据所述测试断言中断言语句的语句数计算所述每个断言语句的编辑距离的归一化结果的加权平均值,根据所述加权平均值创建适应度函数。
32.在一种实现方式中,所述根据每个所述语句对应的变异操作符,对每个所述语句进行变异操作,包括以下任一项:
33.在语句类型为数值类型时,采用变异操作符对所述语句执行以下任一项操作:增加一个随机数值、减少一个随机数值;
34.在语句类型为字符串类型时,采用变异操作符对所述语句执行以下任一项操作:插入字符、删除字符、修改字符;
35.在语句类型为包含参数列表的语句时,采用变异操作符对所述语句执行以下操
作:将随机选择的一个参数替换为新的值;
36.在语句类型为匹配方法调用的语句时,采用变异操作符对所述语句执行以下操作:对匹配参数列表中的匹配参数进行修改;
37.在语句类型为行为列表的语句时,采用变异操作符对所述语句执行以下任一项操作:对模拟对象每次方法调用的各个行为次序进行调换、增加行为、删除行为、对行为的返回值进行修改。
38.本技术实施例提供的一种单元测试装置,包括:
39.获取模块,用于获取第i种群的多个语句集合,每个所述语句集合包括至少一个语句;所述语句用于定义模拟对象的行为;
40.处理模块,用于根据每个所述语句对应的变异操作符,对每个所述语句进行变异操作,得到变异操作结果;对所述变异操作结果中的两个语句集合进行交叉互换,得到第i+1种群;
41.测试模块,用于若确定所述第i+1种群中存在符合测试用例的测试断言的语句集合,则采用所述符合测试断言的语句集合定义所述模拟对象;基于所述模拟对象对所述测试用例进行单元测试。
42.在一种实现方式中,所述获取模块,还用于:
43.在i为大于1的整数的情况下,若确定第i-1种群中不存在符合测试用例的测试断言的语句集合,则获取所述第i-1种群中每个语句集合的适应度;
44.根据所述每个语句集合的适应度,将所述第i-1种群中适应度大于预设阈值的语句集合作为第i种群的语句集合;
45.或者,根据所述每个语句集合的适应度,确定所述第i-1种群中每个语句集合被抽中的概率;根据所述每个语句集合被抽中的概率,在所述第i-1种群的多个语句集合中抽样得到所述第i种群的语句集合。
46.在一种实现方式中,所述第i-1种群中包括m个语句集合;所述获取模块,用于获取所述第i-1种群中每个语句集合的适应度,包括:
47.确定至少一个适应度函数和每个所述适应度函数的权重系数;获取所述第i-1种群中第j语句集合在每个所述适应度函数下的计算结果;
48.根据所述第j语句集合在每个所述适应度函数下的计算结果和每个所述适应度函数的权重系数,获取所述第j语句集合的适应度;
49.在j依次取1至m的情况下,获取所述第i-1种群中每个语句集合的适应度。
50.在一种实现方式中,所述第i种群中包括n个语句集合;所述处理模块,用于对所述变异操作结果中的两个语句集合进行交叉互换,得到第i+1种群,包括:
51.确定所述n个语句集合中的两个语句集合,对所述两个语句集合中语句类型相同的语句进行交叉互换,产生所述两个语句集合的两个子代;
52.将所述两个语句集合中的至少一个和所述两个子代中的至少一个,加入所述第i+1种群中,得到所述第i+1种群中的n个语句集合。
53.在一种实现方式中,所述获取模块,用于确定至少一个适应度函数,包括以下任一项:
54.根据语句集合中生成的语句条数和成功执行的语句条数,创建适应度函数;
55.根据测试用例能否执行到测试断言前的状态分布,创建适应度函数;
56.根据测试断言中断言语句的语句数和每个断言语句的期望值和实际值的编辑距离,创建适应度函数;
57.根据在模拟对象中所有方法调用的集合和在模拟对象中已经指定了行为的方法调用的集合,创建适应度函数;
58.根据测试断言中已被满足的断言语句的语句数和测试断言中所有断言语句的语句数,创建适应度函数。
59.在一种实现方式中,所述获取模块,用于根据所述测试断言中断言语句的语句数以及每个断言语句的期望值和实际值的编辑距离,创建适应度函数,包括:
60.确定所述测试断言的至少一条断言语句;获取每个断言语句的期望值和实际值的编辑距离;
61.根据每个断言语句的期望值和实际值的编辑距离,获取每个断言语句的编辑距离的归一化结果;
62.根据所述测试断言中断言语句的语句数计算所述每个断言语句的编辑距离的归一化结果的加权平均值,根据所述加权平均值创建适应度函数。
63.在一种实现方式中,所述处理模块,用于根据每个所述语句对应的变异操作符,对每个所述语句进行变异操作,包括以下任一项:
64.在语句类型为数值类型时,采用变异操作符对所述语句执行以下任一项操作:增加一个随机数值、减少一个随机数值;
65.在语句类型为字符串类型时,采用变异操作符对所述语句执行以下任一项操作:插入字符、删除字符、修改字符;
66.在语句类型为包含参数列表的语句时,采用变异操作符对所述语句执行以下操作:将随机选择的一个参数替换为新的值;
67.在语句类型为匹配方法调用的语句时,采用变异操作符对所述语句执行以下操作:对匹配参数列表中的匹配参数进行修改;
68.在语句类型为行为列表的语句时,采用变异操作符对所述语句执行以下任一项操作:对模拟对象每次方法调用的各个行为次序进行调换、增加行为、删除行为、对行为的返回值进行修改。
69.本技术实施例提供一种电子设备,所述电子设备包括存储器、处理器及存储在存储器上可在处理器上运行的计算机程序,所述处理器执行所述程序时实现前述一个或多个技术方案提供的单元测试方法。
70.本技术实施例提供一种计算机存储介质,所述计算机存储介质存储有计算机程序;所述计算机程序被执行后能够实现前述一个或多个技术方案提供的单元测试方法。
71.基于本技术提供的单元测试方法,获取第i种群的多个语句集合,每个语句集合包括至少一个语句;语句用于定义模拟对象的行为。根据每个语句对应的变异操作符,对每个语句进行变异操作,得到变异操作结果。因此,可以生成各种不同应用场景的虚拟对象的语句集合。对变异操作结果中的两个语句集合进行交叉互换,得到第i+1种群。因此,可以对语句集合中的语句进行重新组合,提高语句集合的多样性。在第i+1种群中存在符合测试断言的语句集合的情况下,输出符合测试断言的语句集合,可以采用符合测试断言的语句集合
进行单元测试,从而,在单元测试时提高模拟对象的适用性。
72.应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,而非限制本技术。
附图说明
73.图1为本技术实施例提供的一种单元测试方法的应用场景图;
74.图2为本技术实施例提供的一种单元测试方法的流程示意图;
75.图3为本技术实施例提供的确定第i种群的语句集合的流程示意图;
76.图4为本技术实施例提供的获取种群中每个语句集合的适应度的流程示意图;
77.图5为本技术实施例提供的对两个语句集合进行交叉互换的流程示意图;
78.图6为本技术实施例提供的又一种单元测试方法的流程示意图;
79.图7为本技术实施例提供的一种单元测试装置的示意图;
80.图8为本技术实施例提供的一种电子设备的结构示意图。
具体实施方式
81.以下结合附图及实施例,对本技术进行进一步详细说明。应当理解,此处所提供的实施例仅仅用以解释本技术,不用于限定本技术。另外,以下所提供的实施例是用于实施本技术的部分实施例,而非提供实施本技术的全部实施例,在不冲突的情况下,本技术实施例记载的技术方案可以任意组合的方式实施。
82.单元测试是一种软件测试方法,包括测试用例和测试逻辑,可以对软件中的最小可测试单元进行检查和验证,排查程序代码中的每个单元是否存在代码风险,帮助开发人员验证新的迭代是否对原有的业务逻辑产生影响。
83.在单元测试中,对需要调用外部依赖的程序模块进行测试时,由于外部依赖往往难以构造或获取,会导致单元测试无法进行,或者外部依赖不稳定,导致测试失败率较高、排查成本较大。为此,可以创建一个模拟对象(mock object)替代外部依赖进行测试。
84.本技术实施例提供的单元测试方法,可以应用于软件测试与维护。以下,对本技术实施例提供的单元测试方法进行详细介绍。
85.图1示出了本技术实施例提供的一种单元测试方法的应用场景图。参见图1,种群的遗传变异过程,可以包括以下步骤:步骤a101:初始化种群(initial population);步骤a102:计算种群中每个个体的适应度(fitness evaluation);步骤a103:判断测试结果是否通过,在测试结果通过时执行步骤a104,否则执行步骤a105;步骤a104:输出种群中符合测试断言的个体;步骤a105:对种群中的个体进行个体选择(selection);步骤a106:对种群中的个体进行遗传变异。
86.应理解,遗传算法由美国密歇根大学的霍兰德教授创建,源于生物进化理论,模拟自然界“自然选择”和“优胜略汰”的进化规律,是一种全局优化搜索方法,在迭代搜索过程中具有良好的全局搜索能力;遗传算法的主要是一个“生产-迭代”的过程,主要的环节是种群选择、染色体交叉、染色体变异。
87.在示例中,在测试用例依赖mock object时,关于mock object生成问题,可以对使用mock object的测试用例(t)作以下建模:t=《m,s,e,a》,参见表1,将测试用例划分为
mock object创建部分(m)、mock object设置部分(s)、测试代码执行部分(e)、测试断言部分(a)。
88.在示例中,参见表1,基于模型t=《m,s,e,a》中的四元组,可以将一个测试用例划分为以下部分:mock object创建部分(m),用于创建测试中需要用到的模拟对象;mock object设置部分(s),用于定义模拟对象的行为;测试代码执行部分(e),执行调用被测对象的功能进行测试;测试断言部分(a),对测试的运行结果进行正确性判断。
89.在示例中,参见表1,在mock object创建部分(m),创建了以下模拟对象:var owner1、var owner2、var logger,其中,var owner1、var owner2属于logger类。
90.在示例中,参见表1,mock object设置部分(s),模拟对象var owner1的行为包括以下任一项:when(owner1pipeline1.load()).thenreturn(10000)、when(owner1pipeline1.owner()).thenreturn(owner1);模拟对象var logger的行为包括:when(logger.isfinestenabled()).thenreturn(true)。
91.表1测试用例的组成结构
[0092][0093]
在示例中,在给定mock object创建部分(m)、测试代码执行部分(e),和测试断言部分(a)作为输入时,参见表2,可以采用以下语法规则生成mock object设置部分(s)的代
码,使得测试用例符合测试断言部分(a)中的测试断言。
[0094]
在示例中,参见表2,在mock object的语句集合中,非终结符包括以下任一项:s、stmt、stubstmt、callmatcher、argmatcherlist、argmatcher、reactionlist、reaction、defstmt、expr、literal、newarray、ctorcall、methodcall、staticmethodcall、instancemethodcall、mockcreation、fieldread、static fieldread、instance fieldread、paralist。
[0095]
应理解,在编译过程中,程序语句中的非终结符可以理解为一个可拆分元素,而终结符是不可拆分的最小元素。
[0096]
表2语句集合中语句的语法规则
[0097]
[0098][0099]
在示例中,参见表2,“stub”用于表示对多个复合代码的功能进行模拟的临时的和简单的程序代码。
[0100]
在实际应用中,根据语句集合中语句的语法规则,在生成mock object的设置语句后,可以采用遗传算法搜索符合测试断言的语句集合,采用符合测试断言的语句集合作为mock object的设置语句。
[0101]
图2示出了本技术实施例提供的单元测试方法的示意性流程图。参见图2,本技术实施例提供的单元测试方法,可以包括以下步骤:
[0102]
步骤a201:获取第i种群的多个语句集合,每个语句集合包括至少一个语句;语句用于定义模拟对象的行为。
[0103]
这里,模拟对象的功能可以包括以下任一项:网络请求、文件系统、输入输出、数据库。
[0104]
在示例中,初始化第i种群,第i种群包含n个语句集合。第i种群的多个语句集合,可以包括s1、s2、s3、
……
、si、
……
sn。其中,si为第i个语句集合。
[0105]
在示例中,第i种群可以作为初始种群,初始种群中的语句集合可以是语句中的参数为空的语句集合,或者根据预先定义的语句模板生成的语句集合。这里,预先定义的语句模板中的语句符合上述语句集合中语句的语法规则。
[0106]
应理解,基于创建模拟对象,在单元测试时可以基于模拟对象和测试单元进行交互,判断测试单元在正常逻辑、异常逻辑或者压力情况下是否可以返回预期结果。不必依赖于程序代码中的真实对象,从而隔离程序模块和外部依赖,有助于提高软件测试效率。
[0107]
在示例中,参见表3,语句集合中的语句可以用于定义模拟对象的行为。语句集合中可以包括以下语句类型中的任一项:数值类型、字符串字面量、包含参数列表的语句、匹配方法调用的语句、行为列表的语句、关联语句。
[0108]
在示例中,关联语句的形式为when(callmatcher)reactionlist,关联语句可以用于将mock object的行为与mock object的方法调用关联。
[0109]
例如,“when(logger.isfinestenabled()).thenreturn(var0)”用于表示将mock object的行为“return(var0)”与mock object的方法调用“logger.isfinestenabled()”关联。
[0110]
表3语句集合中的语句
[0111][0112]
步骤a202:根据每个语句对应的变异操作符,对每个语句进行变异操作,得到变异操作结果;对变异操作结果中的两个语句集合进行交叉互换,得到第i+1种群。
[0113]
在示例中,变异操作符可以是对语句集合中的语句进行变异操作时使用到的程序脚本。每一种语句类型可以对应一种类型的变异操作符。参见表4,针对不同类型的语句,采用语句类型对应的变异操作符对语句进行变异操作。
[0114]
例如,对于数值类型的语句,语句形式为var=expr,修改影响变量值var的表达式部分expr,可以对数值类型的语句进行变异操作。
[0115]
表4语句类型和语句类型对应的变异操作符
[0116][0117][0118]
在示例中,在种群中随机选择出两两语句集合作为两个父代,采用交叉互换算法对两个父代中相同语句类型的语句进行交叉互换,产生两个父代的子代。将两个父代中的至少一个和两个子代中的至少一个加入新生代种群中,得到第i+1种群。
[0119]
步骤a203:若确定第i+1种群中存在符合测试用例的测试断言的语句集合,则采用符合测试断言的语句集合定义模拟对象;基于模拟对象对测试用例进行单元测试。
[0120]
在示例中,在单元测试时,在c语言程序代码中单元可以是一个函数,在java程序代码中单元可以是一个类,在图形化的软件中单元可以是一个窗口或一个菜单。
[0121]
在示例中,在第i+1种群中存在某个语句集合可以使得测试断言通过时,停止对第i+1种群中的语句集合进行遗传变异,输出符合测试断言的语句集合。
[0122]
在示例中,在测试单元中添加断言语句进行单元测试,如果测试单元的执行结果不符合断言语句的预期,则抛出异常提示或者报警提示。
[0123]
在示例中,采用语句集合si中的语句设置mock object,在测试用例可以通过单元测试时,说明测试用例符合测试断言部分(a)中的测试断言。
[0124]
在示例中,基于符合测试断言的语句集合,采用jmockit进行单元测试。这里,jmockit是一款java类/接口/对象的模拟工具,广泛应用于java应用程序的单元测试中。
[0125]
应理解,jmockit可以对方法或者模块调用的外围接口进行模拟,实现单元测试过程中与外围系统的完全解耦。在单元测试时测试用例可以用于检查程序代码中的缺陷,关注测试用例是否可以实现正常的接口调用、返回测试用例的预设结果。
[0126]
基于本技术提供的单元测试方法,获取第i种群的多个语句集合,每个语句集合包括至少一个语句;语句用于定义模拟对象的行为。根据每个语句对应的变异操作符,对每个
语句进行变异操作,得到变异操作结果。因此,可以生成各种不同应用场景的虚拟对象的语句集合。对变异操作结果中的两个语句集合进行交叉互换,得到第i+1种群。因此,可以对语句集合中的语句进行重新组合,提高语句集合的多样性。在第i+1种群中存在符合测试断言的语句集合的情况下,输出符合测试断言的语句集合,可以采用符合测试断言的语句集合进行单元测试,从而,在单元测试时提高模拟对象的适用性。
[0127]
在实际应用中,上述步骤a201至步骤a203可以采用处理器实现,上述处理器可以为专用集成电路(application specific integrated circuit,asic)、数字信号处理器(digital signal processor,dsp)、数字信号处理装置(digital signal processing device,dspd)、可编程逻辑装置(programmable logic device,pld)、现场可编程逻辑门阵列(field programmable gate array,fpga)、中央处理器(central processing unit,cpu)、控制器、微控制器、微处理器中的至少一种。
[0128]
在一种实现方式中,在上述单元测试方法中,参见图3,还可以包括以下步骤:
[0129]
步骤a301:在i为大于1的整数的情况下,若确定第i-1种群中不存在符合测试用例的测试断言的语句集合,则获取第i-1种群中每个语句集合的适应度。
[0130]
在示例中,第i-1种群的多个语句集合,可以包括s1、s2、s3、
……
、si、
……
sn。其中,si为第i个语句集合。
[0131]
应理解,在第i-1种群的多个语句集合中,每个语句集合都不符合测试断言,确定第i-1种群中不存在符合测试断言的语句集合。
[0132]
在示例中,在计算语句集合的适应度前,可以基于语句集合运行测试用例,在运行测试用例时收集测试用例的运行数据,参见表5,运行数据可以包括以下任一项:
[0133]
语句集合si中生成的设置语句条数和在测试用例测试过程中成功执行的设置语句条数、采用语句集合定义虚拟对象后测试用例能否执行到测试断言前、在模拟对象中所有方法调用的集合和在模拟对象中已经指定了行为的方法调用的集合、测试断言中已被满足的断言语句的语句数和测试断言中所有断言语句的语句数、测试断言中断言语句的语句数以及每个断言语句的期望值和实际值的编辑距离。
[0134]
表5数据的标识和数据的定义
[0135][0136]
在示例中,在采用语句集合进行单元测试时获取测试用例的运行数据,根据测试用例的运行数据和适应度函数,获取第i-1种群中每个语句集合的适应度。
[0137]
例如,根据语句集合si中生成的语句条数sc和在测试用例测试过程中成功执行的语句条数s0,采用适应度函数计算语句集合si的适应度。
[0138]
步骤a302:根据每个语句集合的适应度,在第i-1种群的多个语句集合中确定第i种群的语句集合。
[0139]
在示例中,根据每个语句集合的适应度,在第i-1种群中语句集合si的适应度大于预设阈值的情况下,将语句集合si作为第i种群的语句集合。即,将第i-1种群中适应度大于预设阈值的语句集合作为第i种群的语句集合。
[0140]
在示例中,根据第i-1种群中语句集合si的适应度,确定第i-1种群中语句集合si被抽中的概率。根据每个语句集合被抽中的概率,在第i-1种群的多个语句集合中抽样得到第i种群的语句集合。
[0141]
应理解,每一个语句集合被抽中的概率为其适应度函数的计算结果。第i-1种群中语句集合si的适应度,决定第i-1种群中语句集合si被抽中的概率。语句集合si的适应度越大,语句集合si被抽中的概率越大。
[0142]
因此,第i种群中语句集合的适应度的平均值大于第i-1种群中语句集合的适应度的平均值。
[0143]
在示例中,在第i-1种群的多个语句集合中确定第i种群的语句集合。在随机抽样过程中,输入为第i-1种群以及第i-1种群中每一个语句集合被抽中的概率,输出为抽样得到的语句集合。
[0144]
在示例中,采用放回抽样的抽样策略,根据每个语句集合被抽中的概率,在第i-1种群的多个语句集合中,每次抽样得到一个语句集合。对抽样过程重复n次,输出n个语句集合,将抽样得到的n个语句集合作为第i种群的语句集合。
[0145]
应理解,采用放回抽样的抽样策略,抽样得到的多个样本中可以存在两个相同的样本。这里,一个样本可以是第i种群的一个语句集合。
[0146]
基于上述抽样过程,对第i-1种群中语句集合si进行筛选,得到第i种群的语句集合。由于第i种群中语句集合的适应度的平均值大于第i-1种群中语句集合的适应度的平均值,相对于直接采用第i-1种群中语句集合进行遗传变异,可以降低部分适应度较低的语句集合对遗传变异过程的影响。
[0147]
在示例中,在第i-1种群中不存在某个语句集合可以使得测试断言通过时,可以在第i-1种群的多个语句集合中确定第i种群的语句集合,继续对第i种群中的语句集合进行遗传变异,直到输出符合测试断言的语句集合。
[0148]
在一种实现方式中,第i-1种群中包括m个语句集合;获取第i-1种群中每个语句集合的适应度,参见图4,可以包括以下步骤:
[0149]
步骤a401:确定至少一个适应度函数和每个适应度函数的权重系数;获取第i-1种群中第j语句集合在每个适应度函数下的计算结果。
[0150]
在示例中,适应度函数用于引导遗传算法的搜索过程,适应度函数包括以下任一项:setup exception(se)、execution exception(ee)、mock method satisfactory(ms)、assertion distances(ad)、assertion coverage(ac)。
[0151]
在示例中,根据语句集合中生成的语句条数sc和成功执行的语句条数s0,创建适应度函数,适应度函数se如下所示:
[0152][0153]
在示例中,测试用例可以执行到测试断言的状态记作e1,测试用例未能执行到测试断言的状态记作e0,根据测试用例能否执行到测试断言前,创建适应度函数。适应度函数ee如下所示:
[0154][0155]
在示例中,ms为mock object中已经指定了行为的方法调用的集合,mi为mock object中所有方法调用的集合。适应度函数ms如下所示:
[0156][0157]
在示例中,ae为所有测试断言的断言语句的集合,d(a.expected,a.actual)为断言语句a的期望值a.expected和实际值a.actual的编辑距离,a∈ae。m
ae
为集合ae中断言语句的语句数。适应度函数ad如下所示:
[0158][0159]
其中,d0=max(la.expected,la.actual),la.expected、la.actual分别为a.expected的字符串长度和a.actual的字符串长度,则d0为la.expected,la.actual中的最大值。
[0160]
在示例中,根据测试断言中已被满足的断言语句的语句数m0和测试断言中所有断
言语句的语句数m
ae
,创建适应度函数。适应度函数ac如下所示:
[0161][0162]
在示例中,编辑距离函数d(x,y)的定义如下所示,在编辑距离函数d(x,y)中,lev(x,y)为字符串的编辑距离函数。
[0163][0164]
步骤a402:根据第j语句集合在每个适应度函数下的计算结果和每个适应度函数的权重系数,获取第j语句集合的适应度。
[0165]
在示例中,语句集合在每个适应度函数下的计算结果分别为:se、ee、ms、ad、ac。相应地,每个适应度函数的权重系数分别为:γ
se
、γ
ee
、γ
ms
、γ
ad
、γ
ac

[0166]
在示例中,γ
se
=1、γ
ee
=2、γ
ms
=4、γ
ad
=16、γ
ac
=16,根据第j语句集合在每个适应度函数下的计算结果和每个适应度函数的权重系数,获取第j语句集合的适应度,如下所示:
[0167]
fitness=se
×
1+ee
×
2+ms
×
4+ad
×
16+ac
×
16
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
(7)
[0168]
步骤a403:在j依次取1至m的情况下,获取第i-1种群中每个语句集合的适应度。
[0169]
在一种实现方式中,第i种群中包括n个语句集合;对变异操作结果中的两个语句集合进行交叉互换,得到第i+1种群,参见图5,可以包括以下步骤:
[0170]
步骤a501:确定n个语句集合中的两个语句集合,对两个语句集合中语句类型相同的语句进行交叉互换,产生两个语句集合的两个子代。
[0171]
在示例中,种群中存在n个语句集合,n为4的整数倍,可以在种群中随机选择n/4组父代,参见表6,在每一组父代中,存在待交叉互换的两个语句集合。
[0172]
表6待交叉互换的两个语句集合
[0173][0174]
在示例中,参见表7,对于每一组父代,对两个父代中相同语句类型的语句进行交叉互换,产生两个父代的子代。将两个父代和两个子代加入新生代种群中,得到第i+1种群。
[0175]
表7交叉互换后的两个语句集合的子代
[0176]
[0177][0178]
在相关技术中,交叉互换算法采用遗传算法中的单点交叉互换,生成的mock object设置语句,调用应用程序接口的参数生成语句和应用程序接口调用语句的不正确组合,将导致测试单元在执行过程中抛出异常。
[0179]
例如,关于应用程序接口调用,在传入的参数不正确时,应用程序接口在参数检查的时候会报错。
[0180]
在示例中,确定n个语句集合中的两个语句集合,识别两个语句集合中的异常语句,将两个语句集合中的异常语句作为交叉互换的切点,对两个语句集合中在切点前、语句类型相同的语句进行交叉互换。
[0181]
应理解,在进行交叉互换时,确保切点在抛异常的语句前,可以切断两个语句集合交叉互换后形成不正确的组合,使得两个语句集合在交叉互换后有更多机会得到正确的组合。
[0182]
步骤a502:将两个语句集合中的至少一个和两个子代中的至少一个,加入第i+1种群中,得到第i+1种群中的n个语句集合。
[0183]
在示例中,种群中存在n个语句集合,n为4的整数倍,可以在种群中随机选择n/4组父代,对于每一组父代,对两个父代中相同语句类型的语句进行交叉互换,产生两个父代的子代。将两个父代和两个子代加入新生代种群中,得到第i+1种群。
[0184]
在一种实现方式中,在上述单元测试方法中,确定至少一个适应度函数,可以包括以下步骤:根据语句集合si中生成的语句条数和成功执行的语句条数,创建适应度函数。
[0185]
在示例中,根据语句集合si中生成的语句条数sc和成功执行的语句条数s0,创建适应度函数
[0186]
在一种实现方式中,在上述单元测试方法中,确定至少一个适应度函数,可以包括以下步骤:根据测试用例能否执行到测试断言前的状态分布,创建适应度函数。
[0187]
在示例中,测试用例可以执行到测试断言的状态记作e1,测试用例未能执行到测试断言的状态记作e0。根据测试用例能否执行到测试断言前的状态分布,创建适应度函数
[0188]
在一种实现方式中,在上述单元测试方法中,确定至少一个适应度函数,可以包括以下步骤:根据测试断言中断言语句的语句数以及每个断言语句的期望值和实际值的编辑距离,创建适应度函数。
[0189]
在示例中,根据测试断言中断言语句的语句数m
ae
以及每个断言语句的期望值a.expected和实际值a.actual的编辑距离d(a.expected,a.actual),创建适应度函数
[0190]
应理解,编辑距离是一种计算文本相似度的算法,如果字符串a.actual通过增加、删除、修改等操作能变换成字符串a.expected,如果相关操作次数越少,则表示字符串a.actual和字符串a.expected越相似。
[0191]
在一种实现方式中,根据测试断言中断言语句的语句数以及每个断言语句的期望值和实际值的编辑距离,创建适应度函数,可以包括以下步骤:
[0192]
确定测试断言的至少一条断言语句;获取每个断言语句的期望值和实际值的编辑距离;根据每个断言语句的期望值和实际值的编辑距离,获取每个断言语句的编辑距离的归一化结果;根据测试断言中断言语句的语句数计算每个断言语句的编辑距离的归一化结果的加权平均值,根据加权平均值创建适应度函数。
[0193]
在示例中,确定测试断言的至少一条断言语句,将至少一条断言语句对应的集合定义为ae,在集合ae中a属于任一条断言语句。
[0194]
在示例中,获取断言语句a的期望值a.expected和实际值a.actual的编辑距离d(a.expected,a.actual),对断言语句a的编辑距离d(a.expected,a.actual)归一化,得到断言语句a的编辑距离的归一化结果1.0-d(a.expected,a.actual)/do。
[0195]
在示例中,根据测试断言中断言语句的语句数m
ae
,计算每个断言语句的编辑距离的归一化结果的加权平均值根据归一化结果的加权平均值创建适应度函数
[0196]
应理解,1.0-d(a.expected,a.actual)/d0越大,说明编辑距离d(a.expected,a.actual)越小,相应地,适应度函数对应的适应度越大。
[0197]
在一种实现方式中,在上述单元测试方法中,确定至少一个适应度函数,可以包括以下步骤:根据测试用例执行到断言所有mock object上被调用的方法和在mock object上已指定行为的方法,创建适应度函数。
[0198]
在示例中,根据测试用例执行到断言所有mock object上被调用的方法和在mock object上已指定行为的方法,创建适应度函数
[0199]
在一种实现方式中,在上述单元测试方法中,确定至少一个适应度函数,可以包括以下步骤:根据测试断言中已被满足的断言语句的语句数和测试断言中所有断言语句的语句数,创建适应度函数。
[0200]
在示例中,根据测试断言中已被满足的断言语句的语句数mo和测试断言中所有断言语句的语句数m
ae
,创建适应度函数
[0201]
以下,针对不同类型的表达式,对本技术实施例定义的变异操作符进行详细介绍。
[0202]
在一种实现方式中,根据每个语句对应的变异操作符,对每个语句进行变异操作,包括:
[0203]
在语句类型为数值类型时,采用变异操作符对语句执行以下任一项操作:增加一个随机数值、减少一个随机数值。
[0204]
在示例中,对于数值类型的语句,语句形式为var=expr,针对数值类型的字面量,可以在var的表达式部分expr增加/减少一个随机数值。
[0205]
在一种实现方式中,根据每个语句对应的变异操作符,对每个语句进行变异操作,包括:
[0206]
在语句类型为字符串类型时,采用变异操作符对语句执行以下任一项操作:插入字符、删除字符、修改字符。
[0207]
在示例中,对于字符串类型的语句,语句形式为primitive string null class,针对字符串字面量,可以在字符串中插入/删除/修改随机字符,调转字符串中的字符顺序。
[0208]
在一种实现方式中,根据每个语句对应的变异操作符,对每个语句进行变异操作,包括:
[0209]
在语句类型为包含参数列表的语句时,采用变异操作符对语句执行以下操作:将随机选择的一个参数替换为新的值。
[0210]
在示例中,对于包含参数列表的语句,语句形式为paralist var|∈,针对包含参数列表的语句,可以在参数列表中随机选择一个参数,将随机选择的参数替换为新的值。
[0211]
在一种实现方式中,根据每个语句对应的变异操作符,对每个语句进行变异操作,包括:
[0212]
在语句类型为匹配方法调用的语句时,采用变异操作符对语句执行以下操作:对匹配参数列表中的匹配参数进行修改。
[0213]
在示例中,对于匹配方法调用的语句,语句形式为when(callmatcher)reactionlist,针对callmatcher部分,可以修改callmatcher中的argmatcherlist。
[0214]
例如,随机选择匹配参数列表argmatcherlist中的单个参数argmatcher,以等概率随机进行如下修改:将匹配参数列表的单个参数argmatcher在any()和eq(var)间切换。
[0215]
例如,在匹配参数列表argmatcherlist中的单个参数argmatcher为eq(var)的情况下,将var替换为新的变量。
[0216]
在一种实现方式中,根据每个语句对应的变异操作符,对每个语句进行变异操作,包括:
[0217]
在语句类型为行为列表的语句时,采用变异操作符对语句执行以下任一项操作:对模拟对象每次方法调用的各个行为次序进行调换、增加行为、删除行为、对行为的返回值进行修改。
[0218]
在示例中,对于行为关联语句,语句形式为when(callmatcher)reactionlist,针对reactionlist部分,可以以等概率随机进行如下修改:
[0219]
调换reactionlist中各个reaction的顺序、随机增加/删除一个reaction、将随机选择的reaction的返回值或异常替换为新的变量、随机生成reaction的返回值。
[0220]
在示例中,对于mock object创建部分,为mock object方法调用随机指定返回值/异常。
[0221]
应理解,在实际应用中,可以对语句集合使用的变异操作符进行增加或者删除;对语句集合使用的适应度计算函数进行增加或者删除。
[0222]
基于前述实施例相同的技术构思,参见图6,本技术实施例提供的单元测试方法,可以包括:
[0223]
步骤a601:对初始种群进行初始化,初始种群包含n个语句集合。
[0224]
步骤a602:确定种群中不存在符合测试断言的语句集合,获取种群中每个语句集合的适应度。
[0225]
在示例中,采用适应度函数计算种群中的每个语句集合计算适应度。
[0226]
步骤a603:根据每个语句集合的适应度,在第i-1种群的多个语句集合中确定第i种群的语句集合。
[0227]
在示例中,i为大于1的整数,i=2时第i-1种群为第1种群,第1种群可以作为初始种群。
[0228]
步骤a604:根据每个语句对应的变异操作符,对每个语句进行变异操作,得到变异操作结果。
[0229]
在示例中,对于第i种群中的每个语句集合中语句,根据每个语句对应的变异操作符,对每个语句进行变异操作,得到变异操作结果。
[0230]
步骤a605:对变异操作结果中的两个语句集合进行交叉互换,产生两个语句集合的子代。
[0231]
在示例中,在变异操作结果中选择两个语句集合作为父代,对两个语句集合中语句类型相同的语句进行交叉互换,产生每个语句集合的子代。
[0232]
在示例中,将两个父代中的至少一个语句集合和两个子代中的至少一个语句集合加入第i+1种群中,得到第i+1种群的语句集合。
[0233]
步骤a606:确定第i+1种群中是否存在符合测试断言的语句集合。
[0234]
在示例中,在第i+1种群中存在符合测试断言的语句集合的情况下,执行以下步骤a607。在第i+1种群中不存在符合测试断言的语句集合的情况下,执行以下步骤a609。
[0235]
步骤a607:输出第i+1种群中符合测试断言的语句集合。
[0236]
步骤a608:报告生成语句集合成功。
[0237]
在示例中,在报告生成语句集合成功的情况下,执行以下步骤a611。
[0238]
步骤a609:确定种群迭代次数是否小于预设值。
[0239]
在示例中,记录种群迭代次数,在初始种群到第i+1种群的迭代次数小于预设值的
情况下,执行上述步骤a602。在初始种群到第i+1种群迭的代次数大于等于预设值的情况下,执行以下步骤a611。
[0240]
步骤a610:报告生成语句集合失败。
[0241]
步骤a610:结束。
[0242]
在相关技术中,将mock object构建技术集成于evosuite,在生成单元测试时生成mock object,用于提高测试的代码覆盖率。从测试用例出发,通过capture-and-replay的方式,在运行测试用例时记录测试依赖对象的行为,将记录得到的行为应用在mock object上。
[0243]
基于前述实施例相同的技术构思,参见图7,本技术实施例提供的单元测试装置,可以包括:
[0244]
获取模块701,用于获取第i种群的多个语句集合,每个所述语句集合包括至少一个语句;所述语句用于定义模拟对象的行为;
[0245]
处理模块702,用于根据每个所述语句对应的变异操作符,对每个所述语句进行变异操作,得到变异操作结果;对所述变异操作结果中的两个语句集合进行交叉互换,得到第i+1种群;
[0246]
测试模块703,用于若确定所述第i+1种群中存在符合测试用例的测试断言的语句集合,则采用所述符合测试断言的语句集合定义所述模拟对象;基于所述模拟对象对所述测试用例进行单元测试。
[0247]
在一种实现方式中,所述获取模块701,还用于:
[0248]
在i为大于1的整数的情况下,若确定第i-1种群中不存在符合测试用例的测试断言的语句集合,则获取所述第i-1种群中每个语句集合的适应度;
[0249]
根据所述每个语句集合的适应度,将所述第i-1种群中适应度大于预设阈值的语句集合作为第i种群的语句集合;
[0250]
或者,根据所述每个语句集合的适应度,确定所述第i-1种群中每个语句集合被抽中的概率;根据所述每个语句集合被抽中的概率,在所述第i-1种群的多个语句集合中抽样得到所述第i种群的语句集合。
[0251]
在一种实现方式中,所述第i-1种群中包括m个语句集合;所述获取模块701,用于获取所述第i-1种群中每个语句集合的适应度,包括:
[0252]
确定至少一个适应度函数和每个所述适应度函数的权重系数;获取所述第i-1种群中第j语句集合在每个所述适应度函数下的计算结果;
[0253]
根据所述第j语句集合在每个所述适应度函数下的计算结果和每个所述适应度函数的权重系数,获取所述第j语句集合的适应度;
[0254]
在j依次取1至m的情况下,获取所述第i-1种群中每个语句集合的适应度。
[0255]
在一种实现方式中,所述第i种群中包括n个语句集合;所述处理模块702,用于对所述变异操作结果中的两个语句集合进行交叉互换,得到第i+1种群,包括:
[0256]
确定所述n个语句集合中的两个语句集合,对所述两个语句集合中语句类型相同的语句进行交叉互换,产生所述两个语句集合的两个子代;
[0257]
将所述两个语句集合中的至少一个和所述两个子代中的至少一个,加入所述第i+1种群中,得到所述第i+1种群中的n个语句集合。
[0258]
在一种实现方式中,所述获取模块701,用于确定至少一个适应度函数,包括以下任一项:
[0259]
根据语句集合中生成的语句条数和成功执行的语句条数,创建适应度函数;
[0260]
根据所述测试用例能否执行到所述测试断言前,创建适应度函数;
[0261]
根据所述测试断言中断言语句的语句数以及每个断言语句的期望值和实际值的编辑距离,创建适应度函数;
[0262]
根据在模拟对象中所有方法调用的集合和在模拟对象中已经指定了行为的方法调用的集合,创建适应度函数;
[0263]
根据测试断言中已被满足的断言语句的语句数和测试断言中所有断言语句的语句数,创建适应度函数。
[0264]
在一种实现方式中,所述获取模块701,用于根据所述测试断言中断言语句的语句数以及每个断言语句的期望值和实际值的编辑距离,创建适应度函数,包括:
[0265]
确定所述测试断言的至少一条断言语句;获取每个断言语句的期望值和实际值的编辑距离;
[0266]
根据每个断言语句的期望值和实际值的编辑距离,获取每个断言语句的编辑距离的归一化结果;
[0267]
根据所述测试断言中断言语句的语句数计算所述每个断言语句的编辑距离的归一化结果的加权平均值,根据所述加权平均值创建适应度函数。
[0268]
在一种实现方式中,所述处理模块702,用于根据每个所述语句对应的变异操作符,对每个所述语句进行变异操作,包括以下任一项:
[0269]
在语句类型为数值类型时,采用变异操作符对所述语句执行以下任一项操作:增加一个随机数值、减少一个随机数值;
[0270]
在语句类型为字符串类型时,采用变异操作符对所述语句执行以下任一项操作:插入字符、删除字符、修改字符;
[0271]
在语句类型为包含参数列表的语句时,采用变异操作符对所述语句执行以下操作:将随机选择的一个参数替换为新的值;
[0272]
在语句类型为匹配方法调用的语句时,采用变异操作符对所述语句执行以下操作:对匹配参数列表中的匹配参数进行修改;
[0273]
在语句类型为行为列表的语句时,采用变异操作符对所述语句执行以下任一项操作:对模拟对象每次方法调用的各个行为次序进行调换、增加行为、删除行为、对行为的返回值进行修改。
[0274]
在实际应用中,获取模块701、处理模块702和测试模块703均可以采用电子设备的处理器实现,上述处理器可以是asic、dsp、dspd、pld、fpga、cpu、控制器、微控制器、微处理器中的至少一种,本技术实施例对此不作限制。
[0275]
在一些实施例中,本技术实施例提供的装置具有的功能或包含的模块可以用于执行上文方法实施例描述的方法,其具体实现可以参照上文方法实施例的描述,为了简洁,这里不再赘述。
[0276]
基于前述实施例相同的技术构思,参见图8,本技术实施例提供的电子设备800,可以包括:存储器810和处理器820;其中,
[0277]
存储器810,用于存储计算机程序和数据;
[0278]
处理器820,用于执行存储器中存储的计算机程序,以实现前述实施例中的任意一种单元测试方法。
[0279]
在实际应用中,上述存储器810可以是易失性存储器(volatile memory),示例性地ram;或者非易失性存储器(non-volatile memory),示例性地rom,快闪存储器(flash memory),硬盘(hard disk drive,hdd)或固态硬盘(solid-state drive,ssd);或者上述种类的存储器的组合。上述存储器810可以向处理器820提供指令和数据。
[0280]
上文对各个实施例的描述倾向于强调各个实施例间的不同处,其相同或相似处可以互相参考,为了简洁,本文不再赘述
[0281]
本技术所提供的各方法实施例中所揭露的方法,在不冲突的情况下可以任意组合,得到新的方法实施例。
[0282]
本技术所提供的各产品实施例中所揭露的特征,在不冲突的情况下可以任意组合,得到新的产品实施例。
[0283]
本技术所提供的各方法或设备实施例中所揭露的特征,在不冲突的情况下可以任意组合,得到新的方法实施例或设备实施例。
[0284]
在本技术所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。以上所描述的设备实施例仅仅是示意性的,示例性地,单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,如:多个单元或组件可以结合,或可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,所显示或讨论的各组成部分相互间的耦合、或直接耦合、或通信连接可以是通过一些接口,设备或单元的间接耦合或通信连接,可以是电性的、机械的或其它形式的。
[0285]
上述作为分离部件说明的单元可以是、或也可以不是物理上分开的,作为单元显示的部件可以是、或也可以不是物理单元,即可以位于一个地方,也可以分布到多个网格单元上;可以根据实际的可以选择其中的部分或全部单元来实现本实施例方案的目的。
[0286]
另外,在本技术各实施例中的各功能单元可以全部集成在一个处理模块中,也可以是各单元分别单独作为一个单元,也可以两个或两个以上单元集成在一个单元中;上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
[0287]
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤。
[0288]
以上,仅为本技术的具体实施方式,但本技术的保护范围不局限于此,任何熟悉本技术领域的技术人员在本技术揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本技术的保护范围内。因此,本技术的保护范围应以权利要求的保护范围为准。

技术特征:
1.一种单元测试方法,其特征在于,包括:获取第i种群的多个语句集合,每个所述语句集合包括至少一个语句;所述语句用于定义模拟对象的行为;根据每个所述语句对应的变异操作符,对每个所述语句进行变异操作,得到变异操作结果;对所述变异操作结果中的两个语句集合进行交叉互换,得到第i+1种群;若确定所述第i+1种群中存在符合测试用例的测试断言的语句集合,则采用所述符合测试断言的语句集合定义所述模拟对象;基于所述模拟对象对所述测试用例进行单元测试。2.根据权利要求1所述的方法,其特征在于,所述方法还包括:在i为大于1的整数的情况下,若确定第i-1种群中不存在符合测试用例的测试断言的语句集合,则获取所述第i-1种群中每个语句集合的适应度,根据所述每个语句集合的适应度,将所述第i-1种群中适应度大于预设阈值的语句集合作为第i种群的语句集合;或者,根据所述每个语句集合的适应度,确定所述第i-1种群中每个语句集合被抽中的概率;根据所述每个语句集合被抽中的概率,在所述第i-1种群的多个语句集合中抽样得到所述第i种群的语句集合。3.根据权利要求2所述的方法,其特征在于,所述第i-1种群中包括m个语句集合;所述获取所述第i-1种群中每个语句集合的适应度,包括:确定至少一个适应度函数和每个所述适应度函数的权重系数;获取所述第i-1种群中第j语句集合在每个所述适应度函数下的计算结果;根据所述第j语句集合在每个所述适应度函数下的计算结果和每个所述适应度函数的权重系数,获取所述第j语句集合的适应度;在j依次取1至m的情况下,获取所述第i-1种群中每个语句集合的适应度。4.根据权利要求1所述的方法,其特征在于,所述第i种群中包括n个语句集合;所述对所述变异操作结果中的两个语句集合进行交叉互换,得到第i+1种群,包括:确定所述n个语句集合中的两个语句集合,对所述两个语句集合中语句类型相同的语句进行交叉互换,产生所述两个语句集合的两个子代;将所述两个语句集合中的至少一个和所述两个子代中的至少一个,加入所述第i+1种群中,得到所述第i+1种群中的n个语句集合。5.根据权利要求3所述的方法,其特征在于,所述确定至少一个适应度函数,包括以下任一项:根据语句集合中生成的语句条数和成功执行的语句条数,创建适应度函数;根据测试用例能否执行到测试断言前的状态分布,创建适应度函数;根据测试断言中断言语句的语句数以及每个断言语句的期望值和实际值的编辑距离,创建适应度函数;根据在模拟对象中所有方法调用的集合和在模拟对象中已经指定了行为的方法调用的集合,创建适应度函数;根据测试断言中已被满足的断言语句的语句数和测试断言中所有断言语句的语句数,创建适应度函数。
6.根据权利要求5所述的方法,其特征在于,所述根据所述测试断言中断言语句的语句数以及每个断言语句的期望值和实际值的编辑距离,创建适应度函数,包括:确定所述测试断言的至少一条断言语句;获取每个断言语句的期望值和实际值的编辑距离;根据每个断言语句的期望值和实际值的编辑距离,获取每个断言语句的编辑距离的归一化结果;根据所述测试断言中断言语句的语句数计算所述每个断言语句的编辑距离的归一化结果的加权平均值,根据所述加权平均值创建适应度函数。7.根据权利要求1所述的方法,其特征在于,所述根据每个所述语句对应的变异操作符,对每个所述语句进行变异操作,包括以下任一项:在语句类型为数值类型时,采用变异操作符对所述语句执行以下任一项操作:增加一个随机数值、减少一个随机数值;在语句类型为字符串类型时,采用变异操作符对所述语句执行以下任一项操作:插入字符、删除字符、修改字符;在语句类型为包含参数列表的语句时,采用变异操作符对所述语句执行以下操作:将随机选择的一个参数替换为新的值;在语句类型为匹配方法调用的语句时,采用变异操作符对所述语句执行以下操作:对匹配参数列表中的匹配参数进行修改;在语句类型为行为列表的语句时,采用变异操作符对所述语句执行以下任一项操作:对模拟对象每次方法调用的各个行为次序进行调换、增加行为、删除行为、对行为的返回值进行修改。8.一种单元测试装置,其特征在于,包括:获取模块,用于获取第i种群的多个语句集合,每个所述语句集合包括至少一个语句;所述语句用于定义模拟对象的行为;处理模块,根据每个所述语句对应的变异操作符,对每个所述语句进行变异操作,得到变异操作结果;对所述变异操作结果中的两个语句集合进行交叉互换,得到第i+1种群;测试模块,用于若确定所述第i+1种群中存在符合测试用例的测试断言的语句集合,则采用所述符合测试断言的语句集合定义所述模拟对象;基于所述模拟对象对所述测试用例进行单元测试。9.根据权利要求1所述的装置,其特征在于,所述获取模块还用于:若确定第i-1种群中不存在符合测试断言的语句集合,则获取所述第i-1种群中每个语句集合的适应度;根据所述每个语句集合的适应度,将所述第i-1种群中适应度大于预设阈值的语句集合作为第i种群的语句集合;或者,根据所述每个语句集合的适应度,确定所述第i-1种群中每个语句集合被抽中的概率;根据所述每个语句集合被抽中的概率,在所述第i-1种群的多个语句集合中抽样得到所述第i种群的语句集合。10.一种电子设备,其特征在于,所述电子设备包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现权利要求1至7中任一
项所述的单元测试方法。11.一种计算机存储介质,所述存储介质存储有计算机程序;其特征在于,所述计算机程序被执行后能够实现权利要求1至7中任一项所述的单元测试方法。

技术总结
本申请实施例提供了一种单元测试方法、装置、电子设备和存储介质,该方法包括:获取第i种群的多个语句集合,每个语句集合包括至少一个语句;语句用于定义模拟对象的行为;根据每个语句对应的变异操作符,对每个语句进行变异操作,得到变异操作结果;对变异操作结果中的两个语句集合进行交叉互换,得到第i+1种群;若确定第i+1种群中存在符合测试用例的测试断言的语句集合,则采用符合测试断言的语句集合定义模拟对象;基于模拟对象对测试用例进行单元测试。基于本申请提供的单元测试方法,在单元测试时提高模拟对象的适用性。测试时提高模拟对象的适用性。测试时提高模拟对象的适用性。


技术研发人员:张成志 朱恒成 魏莉力 盛勤 宋丽红 张兵
受保护的技术使用者:香港科技大学
技术研发日:2021.12.10
技术公布日:2022/3/8

最新回复(0)