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

文档序号:32893452发布日期:2023-01-12 23:46阅读:31来源:国知局
单元测试方法及装置、电子设备和存储介质

1.本技术实施例涉及但不限于软件测试技术领域,尤其涉及一种单元测试方法及装置、电子设备和存储介质。


背景技术:

2.单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。在单元测试中,由于测试用例中的部分代码模块存在依赖对象(例如,外部的类、接口等),而这些依赖对象难以获取或创建,此时需要创建适配的模拟对象(mock object)用于替代依赖对象进行该单元测试。
3.在相关技术中,用户可以根据实际场景需求,手动创建的mock object,并利用桩代码(stub code)来指定该mock object的行为,而这样人为设定的行为,使得该模拟对象及其行为只能适配于当前场景,而无法适配于其它场景,存在准确度低、适配度单一等问题。同时,在对stub code进行迭代更新的过程中,一方面,由于搜索空间过大,使得搜索效率低;另一方面,由于对个体质量的评估过于粗糙,存在个体准确度不高、且容易筛除较好的个体等问题。


技术实现要素:

4.有鉴于此,本技术实施例提供一种单元测试方法及装置、电子设备、存储介质和计算机程序产品。
5.本技术实施例的技术方案是这样实现的:
6.第一方面,本技术实施例提供一种单元测试方法,所述方法包括:
7.确定当前语句群体,所述当前语句群体中包括至少两个语句集合,每一所述语句集合中包括至少一个语句子集,每一所述语句子集包括用于定义模拟对象的行为语句和所述行为语句的至少一条依赖语句;
8.对所述当前语句群体进行迭代处理,得到下一语句群体;
9.基于第一测试用例的断言部分和所述下一语句群体,确定目标语句集合,所述目标语句集合用于定义所述模拟对象;
10.基于所述模拟对象对所述第一测试用例进行所述单元测试。
11.第二方面,本技术实施例提供一种单元测试装置,所述装置包括:
12.第一确定模块,用于确定当前语句群体,所述当前语句群体中包括至少两个语句集合,每一所述语句集合中包括至少一个语句子集,每一所述语句子集包括用于定义模拟对象的行为语句和所述行为语句的至少一条依赖语句;
13.迭代模块,用于对所述当前语句群体进行迭代处理,得到下一语句群体;
14.第二确定模块,用于基于第一测试用例的断言部分和所述下一语句群体,确定目标语句集合,所述目标语句集合用于定义所述模拟对象;
15.测试模块,用于基于所述模拟对象对所述第一测试用例进行所述单元测试。
16.第三方面,本技术实施例提供一种电子设备,包括存储器和处理器,所述存储器存储有可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述方法中的步骤。
17.第四方面,本技术实施例提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述方法中的步骤。
18.第五方面,本技术实施例提供一种计算机程序产品,所述计算机程序产品包括存储了计算机程序的非瞬时性计算机可读存储介质,所述计算机程序被计算机读取并执行时实现上述方法。
19.在本技术实施例中,通过确定当前语句群体,所述当前语句群体中包括至少两个语句集合,每一所述语句集合中包括至少一个语句子集,每一所述语句子集包括用于定义模拟对象的行为语句和所述行为语句的至少一条依赖语句;对所述当前语句群体进行迭代处理,得到下一语句群体;基于第一测试用例的断言部分和所述下一语句群体,确定目标语句集合;基于所述模拟对象对所述第一测试用例进行所述单元测试。这样,首先,利用多个语句集合定义不同场景下的模拟对象的行为,可以提高模拟对象的适配性;其次,通过在语句子集中定义模拟对象的行为语句及其依赖语句,可以在迭代处理过程中,一并交换对应的行为语句及其依赖语句,从而可以降低产出不正确的个体的可能性,进而不仅可以减少计算开销,而且还可以提高搜索效率;然后,基于断言部分和下一语句群体得到模拟对象的目标语句集合,可以提高模拟对象的准确度和适用性;最后,使用模拟对象进行单元测试,而不必依赖于程序模块中的真实对象,实现了程序模块和依赖对象的分离,从而有助于提高软件测试效率。
附图说明
20.图1a为本技术实施例提供的一种单元测试方法的应用场景示意图;
21.图1b为本技术实施例提供的一种单元测试方法的实现流程示意图;
22.图2为本技术实施例提供的一种单元测试方法的实现流程示意图;
23.图3a为本技术实施例提供的一种单元测试系统的组成结构示意图;
24.图3b为本技术实施例提供的一种单元测试方法的实现流程示意图;
25.图3c为本技术实施例提供的一种生成下一语句群体的实现流程示意图;
26.图4为本技术实施例提供的一种单元测试装置的组成结构示意图;
27.图5为本技术实施例提供的一种电子设备的硬件实体示意图。
具体实施方式
28.为了使本技术的目的、技术方案和优点更加清楚,下面结合附图和实施例对本技术的技术方案进一步详细阐述,所描述的实施例不应视为对本技术的限制,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本技术保护的范围。
29.在以下的描述中,涉及到“一些实施例”,其描述了所有可能实施例的子集,但是可以理解,“一些实施例”可以是所有可能实施例的相同子集或不同子集,并且可以在不冲突的情况下相互结合。
30.如果申请文件中出现“第一/第二”的类似描述则增加以下的说明,在以下的描述中,所涉及的术语“第一\第二\第三”仅仅是区别类似的对象,不代表针对对象的特定排序,可以理解地,“第一\第二\第三”在允许的情况下可以互换特定的顺序或先后次序,以使这里描述的本技术实施例能够以除了在这里图示或描述的以外的顺序实施。
31.除非另有定义,本文所使用的所有的技术和科学术语与属于本技术的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述本技术实施例的目的,不是旨在限制本技术。
32.在相关技术中,用户可以根据实际场景需求,手动创建的mock object,并利用stub code来指定该mock object的行为,而这样人为设定的行为,使得该模拟对象及其行为只能适配于当前场景,而无法适配于其它场景,存在准确度低、适配度单一等问题。在对stub code进行迭代更新的过程中,首先,由于使用从零开始搜索stub code,存在搜索空间过大,使得搜索效率低;其次,由于对个体质量的适应度评估过于粗糙,存在个体准确度不高、且容易筛除较好的个体;最后,由于在交叉互换过程中,仅交换行为语句,容易产生大量不正确的后代,同时由于未考虑后代的正确性,从而大大增加了计算开销。
33.本技术实施例提供一种单元测试方法,首先,利用多个语句集合定义不同场景下的模拟对象的行为,可以提高模拟对象的适配性;其次,通过在语句子集中定义模拟对象的行为语句及其依赖语句,可以在迭代处理过程中,一并交换对应的行为语句及其依赖语句,从而可以降低产出不正确的个体的可能性,进而不仅可以减少计算开销,而且还可以提高搜索效率;然后,基于断言部分和下一语句群体得到模拟对象的目标语句集合,可以提高模拟对象的准确度和适用性;最后,使用模拟对象进行单元测试,而不必依赖于程序模块中的真实对象,实现了程序模块和依赖对象的分离,从而有助于提高软件测试效率。本技术实施例提供的单元测试方法可以由电子设备执行,其中电子设备可以是笔记本电脑,平板电脑,台式计算机,机顶盒,移动设备(例如,移动电话,便携式音乐播放器,个人数字助理,专用消息设备,便携式游戏设备)等各种类型的终端,也可以实施为服务器。服务器可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、内容分发网络(content delivery network,cdn)、以及大数据和人工智能平台等基础云计算服务的云服务器。
34.图1a为本技术实施例提供的一种单元测试方法的应用场景图。如图1a所示,利用遗传算法实现种群的遗传变异过程,包括步骤s101至步骤s106,其中:
35.步骤s101、随机生成m个个体作为初始群体p(0);
36.步骤s102、计算群体p(t)中各个个体的适应度;
37.步骤s103、基于各个个体的适应度,将选择算子作用于群体p(t);
38.这里,选择的目的是把优化的个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代。
39.步骤s104、将交叉算子作用于群体p(t);
40.这里,遗传算法中起核心作用的就是交叉算子。
41.步骤s105、将变异算子作用于群体p(t),得到下一代群体p(t+1);
42.这里,即是对群体中的个体串的某些基因座上的基因值作变动。
43.步骤s106:若满足终止条件,则以进化过程中所得到的具有最大适应度个体作为最优解输出,终止计算。
44.这里,终止条件可以包括但不限于当最优个体的适应度达到给定的阈值、最优个体的适应度和群体适应度不再上升、或者迭代次数达到预设的代数等。
45.在单元测试中,对于使用模拟对象的测试用例(t),可以先对t进行以下建模:
46.t=《m,s,e,a》;
47.其中,m表示模拟对象的创建部分,用于创建测试中需要用到的mock object;s表示桩代码部分,用于指定m中mock object如何对其方法调用作出响应;e表示测试代码执行部分,用于调用被测对象的功能进行测试;a表示测试断言部分,用于对测试的运行结果进行正确性判断。
48.在实施时,可以按照如下分割方法对测试用例进行切分,得到上述m、s、e、a这四个部分,即:
49.m:包括从测试用例开始,直到第一个when(
……
)then语句的这一部分;
50.s:从第一个when(
……
)then语句开始,直到第一个对mock object的引用的这一部分;
51.e:从第一个对mock object的引用开始,直到第一个juint的assertion或mockito的verity(
……
)的代码部分;
52.a:从第一个juint的assertion或mockito的verity(
……
)开始,到测试用例结束的这一部分。
53.其中,junit是一个java语言的单元测试框架。mockito是用于java开发的模拟测试框架。
54.例如,对于如下测试用例,按照上述切分方法可以将其切分为四个部分,即:第一部分m1、第二部分s1、第三部分e1和第四部分a1。
[0055][0056]
那么,在测试用例依赖模拟对象的情况下,可以采用遗传算法,从若干个定义模拟对象的语句集合中搜索出符合测试断言的目标语句集合,将该目标语句集合用来定义该模拟对象。
[0057]
图1b为本技术实施例提供的一种单元测试方法的实现流程示意图,如图1b所示,所述方法包括步骤s11至步骤s14,其中:
[0058]
步骤s11、确定当前语句群体,所述当前语句群体中包括至少两个语句集合,每一所述语句集合中包括至少一个语句子集,每一所述语句子集包括用于定义模拟对象的行为语句和所述行为语句的至少一条依赖语句。
[0059]
这里,当前语句群体可以是初始语句群体,也可以是经迭代处理后的后代语句群体。语句集合中的语句的类型可以包括但不限于包含变量的语句、包含参数的语句、包含行为语句的语句等。
[0060]
在一些实施方式中,对于初始语句群体中的某一语句集合,可以通过如下目标抽象语法,对测试用例中的s部分进行表示得到的。其中,目标抽象语法包括:
[0061]
s:=elem*
[0062]
elem:=vardef|stubcall
[0063]
vardef:=v

expr
[0064]
expr:=literal|array(v*)|api(v*)|mock
[0065]
stubcall:=《v,m,argmatcher*》

reaction
[0066]
argmatcher:=any|eq(v)
[0067]
reaction:=return(v)|throw(v)
[0068]
其中:
[0069]
s:对应整个stub code部分,s可以展开为零个或多个elem。
[0070]
elem:代表stub code里面的一行代码,这行代码可以定义一个变量(vardef)或者给一个mock 0bject指定行为(stubcall)。
[0071]
vardef:变量定义,它将一个表达式(expr)的计算结果赋值给一个变量(v)。
[0072]
stubcall:给一个mock object指定行为,其含义为“当变量v所指的mock object被调用了方法m并且调用的参数满足一系列argmatcher的约束时,执行由reaction制定的行为”。
[0073]
argmatcher:用于匹配方法调用的单个参数,包含两种形式,即,any可以匹配任意参数,eq(v)可以匹配值等于变量v的参数。
[0074]
reaction:表示方法的行为,包含两种形式,即,return(v)返回变量v值,throw(v)抛出变量v指代的异常。
[0075]
例如,对于如下的stub code,
[0076]
var sha1=digestutils.sha1hex(

bar

);
[0077]
when(user.getpasswordhash()).thenreturn(sha1);
[0078]
when(dao.finduser(eq(

foo

))
[0079]
.thenthrow(new timeoutexception());
[0080]
.thenreturn(user);
[0081]
基于上述目标抽象语法可知,第1、2、4、5句可以按照vardef:=v

expr进行表示,第3句可以按照stubcall:=《v,m,argmatcher*》

reaction进行表示,最终该stub code可以表示为:
[0082]
v0←”
foo”[0083]
v1←
new timeoutexception
[0084]
《dao,finduser,[eq(v0)]》

throw(v1)
[0085]
《dao,finduser,[eq(v0)]》

return(user)
[0086]
v2←″
bar

[0087]
v3←
digestutils.sha1hex(v2)
[0088][0089]
此时,该语句集合包括两个语句子集,其中,语句子集1包括{v0←”
foo”、v1←
new timeoutexception、《dao,finduser,[eq(v0)]》

throw(v1)、《dao,finduser,[eq(v0)]》

return(user)},语句子集2包括return(user)},语句子集2包括
[0090]
在一些实施方式中,初始语句群体中的每一语句集合可以相同,也可以不同。例如,初始语句群体中的每一语句集合都相同,且均不为空。又例如,初始语句群体中的部分语句集合相同且不为空,其它语句集合均为空。
[0091]
模拟对象的功能可以包括但不限于网络请求、数据库、输入、输出、文件系统等。
[0092]
步骤s12、对所述当前语句群体进行迭代处理,得到下一语句群体。
[0093]
这里,迭代处理至少包括交叉互换处理。其中,交叉互换处理是指将第一语句子集和第二语句子集进行交叉互换。第一语句子集是从第一语句集合中的至少一个语句子集中确定的。第二语句子集是从第二语句集合中的至少一个语句子集中确定的。第一语句集合
和第二语句集合是利用预设的选择算法,从当前语句群体中的至少两个语句集合中确定的。其中,选择算法可以是任意合适的能够进行选择的算法。例如,锦标赛选择法、随机等。在实施时,本领域技术人员可以根据实际需求自主确定选择算法,本技术实施例不作限定。
[0094]
在一些实施方式中,可以基于预设规则确定第一语句子集。其中,预设规则可以包括但不限于默认、随机、自定义、用户喜好、使用频率、用户操作信息等。在实施时,本领域技术人员可以根据实际需求自主设定预设规则,本技术实施例不作限定。
[0095]
例如,电子设备提供配置选项,通过该配置选项,用户可以自定义设置该第一语句子集。又例如,该第一语句子集可以是基于用户在操作界面的操作的属性信息确定的,其中,操作界面可以是电子设备显示的页面。属性信息可以包括但不限于操作的类型、操作距离、速度、位置、时长、次数等。在实施时,本领域技术人员可以根据实际需求自主设定操作的属性信息和第一语句子集之间的对应关系,本技术实施例不作限定。
[0096]
在一些实施方式中,可以基于操作的类型确定第一语句子集,即,不同的类型,对应不同的第一语句子集。例如,在操作手势为滑动操作的情况下,该第一语句子集为第一语句集合中的第三个语句子集;在操作手势为多次点击操作的情况下,该第一语句子集为第一语句集合中的第四个语句子集。
[0097]
在一些实施方式中,可以基于操作的距离实时确定第一语句子集,即,不同的操作距离对应不同的第一语句子集。例如,在滑动距离为第一距离区间的情况下,该第一语句子集为第一语句集合中的第二个语句子集;在滑动距离为第二距离区间的情况下,该第一语句子集为第一语句集合中的第三个语句子集。
[0098]
在一些实施方式中,从第二语句集合中确定第二语句子集的方式、与从第一语句集合中确定第一语句子集的方式相同。
[0099]
下一语句群体中语句集合的数量与当前语句群体中语句集合的数量相同。例如,当前语句群里中包括10个语句集合,此时,下一语句群体中也包括10个语句集合。
[0100]
步骤s13、基于第一测试用例的断言部分和所述下一语句群体,确定目标语句集合,所述目标语句集合用于定义所述模拟对象。
[0101]
这里,目标语句集合可以是下一语句群体中的一个语句集合,也可以是新的下一语句集合中的一个语句集合。其中,新的下一语句群体是对下一语句群体进行至少一次迭代处理后,得到的语句群体。
[0102]
在一些实施方式中,所述步骤s13包括步骤s131和/或步骤s132,其中:
[0103]
步骤s131、在所述下一语句群体中存在符合所述第一测试用例的所述断言部分的语句集合的情况下,将符合所述第一测试用例的所述断言部分的语句集合作为所述目标语句集合。
[0104]
这里,断言部分至少包括断言。断言是一种在程序中的一阶逻辑,目的为了表示与验证软件开发者预期的结果,当程序执行到断言的位置时,对应的断言应该为真。若断言不为真时,程序会中止执行,并给出错误信息。
[0105]
在下一语句群体中的某一个语句集合通过断言的情况下,将该语句集合作为目标语句集合。
[0106]
步骤s132、在所述下一语句群体中不存在符合所述第一测试用例的所述断言部分的语句集合的情况下,将所述下一语句群体作为新的当前语句群体,对所述新的当前语句
群体进行所述迭代处理,得到新的下一语句群体,基于所述第一测试用例的所述断言部分和所述新的下一语句群体,确定所述目标语句集合。
[0107]
这里,在下一语句群体中的每一语句集合均没有通过断言的情况下,进行下一次循环。下一次循环包括:将下一语句群体作为新的当前语句群体;对新的当前语句群体进行迭代处理,得到新的下一语句群体;在新的下一语句群体中存在符合断言的语句集合的情况下,将符合断言的语句集合作为目标语句集合,停止循环;反之,则继续下一次循环。
[0108]
步骤s14、基于所述模拟对象对所述第一测试用例进行所述单元测试。
[0109]
这里,对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义。单元的实质是指人为规定的最小的被测功能模块。例如,c语言中的单元指一个函数、java里单元指一个类、图形化的软件中单元可以指一个窗口或一个菜单等。
[0110]
在一些实施方式中,利用目标语句集合定义模拟对象,替换第一测试用例中的stub code,并利用替换stub code后的第一测试用例进行单元测试。
[0111]
在本技术实施例中,通过确定当前语句群体,所述当前语句群体中包括至少两个语句集合,每一所述语句集合中包括至少一个语句子集,每一所述语句子集包括用于定义模拟对象的行为语句和所述行为语句的至少一条依赖语句;对所述当前语句群体进行迭代处理,得到下一语句群体;基于第一测试用例的断言部分和所述下一语句群体,确定目标语句集合,所述目标语句集合用于定义所述模拟对象;基于所述模拟对象对所述第一测试用例进行所述单元测试。这样,首先,利用多个语句集合定义不同场景下的模拟对象的行为,可以提高模拟对象的适配性;其次,通过在语句子集中定义模拟对象的行为语句及其依赖语句,可以在迭代处理过程中,一并交换对应的行为语句及其依赖语句,从而可以降低产出不正确的个体的可能性,进而不仅可以减少计算开销,而且还可以提高搜索效率;然后,基于断言部分和下一语句群体得到模拟对象的目标语句集合,可以提高模拟对象的准确度和适用性;最后,使用模拟对象进行单元测试,而不必依赖于程序模块中的真实对象,实现了程序模块和依赖对象的分离,从而有助于提高软件测试效率。
[0112]
在一些实施方式中,所述步骤s11包括步骤s111至步骤s113,其中:
[0113]
步骤s111、对所述第一测试用例进行解析,得到桩代码部分。
[0114]
这里,可以按照上述分割方法对第一测试用例进行分割,得到m、s、e、a这四个部分。
[0115]
步骤s112、利用预设的抽象语法,对所述桩代码部分进行解析,生成初始语句群体。
[0116]
这里,抽象语法可以为上述目标抽象语法。在实施时,利用上述目标抽象语法,对第一测试用例中的s进行解析得到一个语句集合,将该语句集合作为初始语句群体中的一个语句集合。在一些实施方式中,初始语句群体中包括相同的至少两个语句集合,每一语句集合中包括至少一个语句子集,每一语句子集包括用于定义模拟对象的行为语句和行为语句的至少一条依赖语句。例如,初始语句群体中包括10个语句集合,每一语句集合均为对第一测试用例中的s进行解析得到的语句集合。
[0117]
步骤s113、将所述初始语句群体作为所述当前语句群体。
[0118]
在本技术实施方式中,通过对所述第一测试用例进行解析,得到桩代码部分;利用预设的抽象语法,对所述桩代码部分进行解析,生成初始语句群体;将所述初始语句群体作
为所述当前语句群体。这样,通过高级别的抽象语法对桩代码部分进行解析,可以在后续的迭代处理过程中减少搜索空间、降低计算开销。
[0119]
图2为本技术实施例提供的一种单元测试方法的实现流程示意图,如图2所示,所述方法包括步骤s21至步骤s25,其中:
[0120]
步骤s21、确定当前语句群体,所述当前语句群体中包括至少两个语句集合,每一所述语句集合中包括至少一个语句子集,每一所述语句子集包括用于定义模拟对象的行为语句和所述行为语句的至少一条依赖语句。
[0121]
这里,上述步骤s21对应于前述步骤s11,在实施时,可以参照前述步骤s11的具体实施方式。
[0122]
步骤s22、对所述当前语句群体中每一所述语句集合进行适应度评估处理,得到所述当前语句群体中每一所述语句集合的适应度。
[0123]
这里,每一语句集合的适应度可以相同,也可以不相同。在实施时,可以利用相关的适应度函数,得到该语句集合的适应度。在对语句集合进行适应度评估处理之前,可以基于语句集合生成对应的第二测试用例,在运行第二测试用例的过程中,收集运行数据。其中,运行数据可以包括以下至少之一:s中语句子集的总个数、s中已被成功执行的语句子集的个数、e中测试语句的总条数、e中被成功执行的测试语句条数、a中断言语句的总条数、满足断言语句的语句条数、每一断言语句的期望值和实际值等。
[0124]
在一些实施方式中,可以基于s中已被成功执行的语句子集的个数,确定该语句集合对应的第三适应度函数,基于该第三适应度函数,得到该语句集合的适应度。
[0125]
其中,第三适应度函数se(s)表征s的有效程度。确定第三适应度函数的方式可以包括但不限于已被成功执行的语句子集的个数、以已被成功执行的语句子集的个数为自变量的函数、已被成功执行的语句子集的个数与语句子集的总个数之间的比值、对已被成功执行的语句子集的个数与语句子集的总个数分别加权之后的比值等。在实施时,本领域技术人员可以根据实际需求选择确定第三适应度函数的方式,本技术实施例不作限定。
[0126]
在一些实施方式中,该se(s)可以通过下述公式(1-1)表示:
[0127][0128]
其中,used(s)表示已被成功执行的语句子集的个数。
[0129]
例如,s部分包括三个语句子集,已被成功执行的语句子集的格式为两个,此时,通过上述公式(1-1)可知,该se(s)为0.197。
[0130]
在一些实施方式中,可以基于第二测试用例的各个部分的适应度值,确定该语句集合的适应度。其中,每一部分的适应度值是基于对应的适应度函数得到的。
[0131]
确定语句集合的适应度的方式可以包括但不限于某一适应度值、部分适应度值的和/差/方差/均方差、部分适应度值进行加权之后的和/差/方差/均方差、每一适应度值的和/差/方差/均方差、每一适应度值分别加权之后的和/差/方差/均方差等。在实施时,本领域技术人员可以根据实际需求自主选择确定语句集合的适应度的方式,本技术实施例不作限定。
[0132]
在一些实施方式中,可以通过下述公式(1-2)得到该语句集合的适应度:
[0133]
fitness(s)=a1·
se(s)+a2·
ec(s)+a3·
a(s)
ꢀꢀꢀꢀꢀꢀ
(1-2);
[0134]
其中,se(s)表示s部分的适应度值,ec(s)表示e部分的适应度值,a(s)表示a部分的适应度值,a1~a3分别表示对应适应度值的权重值。
[0135]
在一些实施方式中,a1~a3为递增关系。例如,a1~a3可以分别为1、2、4。
[0136]
例如,假设se(s)为0.197,ec(s)为0.7,a(s)为1.058,a1~a3分别为1、2、4,此时,通过上述公式(1-2)可知,该fitness(s)为5.829。
[0137]
应理解,上述确定适应度的公式仅用于示例,在实施时,确定适应度使用的适应度函数可以增加或者删除。
[0138]
在一些实施方式中,可以基于e中已被成功执行的测试语句条数,确定该测试部分对应的第四适应度函数,基于该第四适应度函数,得到该测试部分的适应度值。
[0139]
其中,第四适应度函数ec(s)表征测试代码覆盖率。确定第四适应度函数的方式可以包括但不限于已被成功执行的测试语句条数、以已被成功执行的测试语句条数为自变量的函数、已被成功执行的测试语句条数与测试语句的总条数之间的比值、对已被成功执行的测试语句条数与测试语句的总条数分别加权之后的比值等。在实施时,本领域技术人员可以根据实际需求选择确定第四适应度函数的方式,本技术实施例不作限定。
[0140]
在一些实施方式中,该ec(s)可以通过下述公式(1-3)表示:
[0141][0142]
其中,|e|表示测试语句的总条数,|{e∈e,e被执行到}|表示被成功执行的测试语句条数。
[0143]
例如,测试部分包括10条测试语句,其中,被成功执行的测试语句条数为7条,此时,通过上述公式(1-3)可知,ec(s)为0.7。
[0144]
在一些实施方式中,可以基于a中已被满足的断言语句条数,确定该断言部分对应的第一适应度函数;基于每一断言语句的期望值和实际值,确定该断言部分对应的第二适应度函数;基于该第一适应度函数和第二适应度函数,得到该断言部分的适应度值。
[0145]
其中,第一适应度函数ac(s)表征测试断言覆盖率。第二适应度函数ad(s)表征断言之间的距离。
[0146]
确定断言部分的适应度值的方式可以包括但不限于第一适应度函数的值、第二适应度函数的值、第一适应度函数的值与第二适应度函数的值之间的和/差/乘积/比值/平方/方差/均方差、分别对第一适应度函数的值与第二适应度函数的值进行加权之后的和/差/乘积/比值/平方/方差/均方差等。在实施时,本领域技术人员可以根据实际需求自主选择确定断言部分的适应度值的方式,本技术实施例不作限定。
[0147]
在一些实施方式中,该a(s)可以通过下述公式(1-4)表示:
[0148]
a(s)=ac(s)+ad(s)
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
(1-4);
[0149]
其中,ac(s)表示第一适应度函数,ad(s)表示第二适应度函数。
[0150]
例如,第一适应度函数的值为0.6,第二适应度函数的值为0.458,此时,通过上述公式(1-4)可知,a(s)则为1.058。
[0151]
确定第一适应度函数的方式可以包括但不限于已被满足的断言语句条数、以已被满足的断言语句条数为自变量的函数、已被满足的断言语句条数与断言语句的总条数之间的比值、对已被满足的断言语句条数与断言语句的总条数分别加权之后的比值等。在实施
时,本领域技术人员可以根据实际需求选择确定第一适应度函数的方式,本技术实施例不作限定。
[0152]
在一些实施方式中,该ac(s)可以通过下述公式(1-5)表示:
[0153][0154]
其中,|a|表示断言语句的总条数,|{a∈a,a被执行到}|表示被成功执行的测试语句条数。
[0155]
例如,断言部分包括5条断言语句,其中,已被满足的断言语句条数为3条,此时,通过上述公式(1-5)可知,ac(s)为0.6。
[0156]
确定第二适应度函数的方式可以包括但不限于任一断言语句的期望值和实际值之间的距离、每一期望值和实际值之间的距离的和/差/乘积/方差/均方差、对每一期望值和实际值之间的距离分别进行加权之后的和/差/乘积/方差/均方差等。在实施时,本领域技术人员可以根据实际需求选择确定第二适应度函数的方式,本技术实施例不作限定。
[0157]
在一些实施方式中,该ad(s)可以通过下述公式(1-6)表示:
[0158][0159]
其中,|ae|表示断言语句的总条数,d(a.expected,a.actual)表示第a条断言语句的期望值和实际值之间的距离。
[0160]
在实施时,可以通过任意能够计算距离的函数来得到该距离。例如,余弦相似度、欧式距离、莱文斯坦距离等。在实施时,本领域技术人员可以根据实施需求自主选择计算距离的函数,本技术实施例不作限定。
[0161]
在一些实施方式中,该d(x,y)可以通过下述公式(1-7)表示:
[0162][0163]
其中,lev(x,y)为字符串的编辑距离函数,str(x)表示将一个复杂对象x以递归形式序列化成字符串。
[0164]
例如,断言部分包括2条断言语句,其中一条期望值为10、实际值为20,另一条期望值为“foo”、实际值为“fo”,此时,通过上述公式(1-7)可知,ad(s)为即为0.458。
[0165]
步骤s23、基于所述当前语句群体中每一所述语句集合的所述适应度,对所述当前语句群体进行迭代处理,得到下一语句群体。
[0166]
这里,迭代处理可以包括但不限于选择处理、交叉互换处理、变异处理等。其中,选择处理包括从当前语句群体中选择部分语句集合,基于该部分语句集合,确定下一语句群体中的语句集合。选择处理的方式可以是取适应度满足预设条件的语句集合。其中,预设条件可以包括但不限于最高、设定比例、设定值等。在实施时,本领域技术人员可以根据实际
需求自主确定预设条件,本技术实施例不作限定。例如,将当前语句群体中适应度最高的1%的语句集合直接作为下一语句群体中的语句集合。又例如,将当前语句群体中适应度排序前三的语句集合直接作为下一语句群体中的语句集合。还例如,将当前语句群体中适应度排序前两位的语句集合作为父母代语句集合,进行后续的交叉互换、变异等,以得到下一语句群体中的两个语句集合。
[0167]
变异处理指利用变异方式作用于语句集合中的语句。其中,变异方式可以是基于语句的类型确定的。不同的类型可以对应相同或不同的变异方式,每一类型的语句可以包括至少一种变异方式。例如,对于包含变量的语句,变异方式可以包括但不限于删除变量、替换变量的值、新建一个变量等。
[0168]
步骤s24、基于第一测试用例的断言部分和所述下一语句群体,确定目标语句集合。
[0169]
步骤s25、基于所述模拟对象对所述第一测试用例进行所述单元测试。
[0170]
这里,上述步骤s24及步骤s25分别对应于前述步骤s13至步骤s14,在实施时,可以参照前述步骤s13至步骤s14的具体实施方式。
[0171]
在本技术实施例中,通过确定当前语句群体,所述当前语句群体中包括至少两个语句集合,每一所述语句集合中包括至少一个语句子集,每一所述语句子集包括用于定义模拟对象的行为语句和所述行为语句的至少一条依赖语句;对所述当前语句群体中每一所述语句集合进行适应度评估处理,得到所述当前语句群体中每一所述语句集合的适应度;基于所述当前语句群体中每一所述语句集合的所述适应度,对所述当前语句群体进行迭代处理,得到下一语句群体;基于第一测试用例的断言部分和所述下一语句群体,确定目标语句集合,所述目标语句集合用于定义所述模拟对象;基于所述模拟对象对所述第一测试用例进行所述单元测试。这样,通过每一语句集合的适应度,对群体进行迭代处理,可以提高后代中个体的准确度,从而不仅可以减少计算开销,而且还可以提高搜索效率。
[0172]
在一些实施方式中,所述步骤s22包括步骤s221至步骤s222,其中:
[0173]
步骤s221、针对所述当前语句群体中的每一语句集合,基于所述语句集合,生成与所述语句集合对应的第二测试用例。
[0174]
这里,第二测试用例中包括至少一个部分。该至少一个部分可以包括但不限于s、e、a等。例如,将第一测试用例中的e和a分别作为第二测试用例的e和a,将该语句集合作为第二测试用例的s。
[0175]
步骤s222、针对每一第二测试用例,基于所述第二测试用例的每一部分对应的适应度函数,对对应部分进行所述适应度评估处理,得到对应部分的适应度值,并基于所述第二测试用例的每一部分的适应度值,得到所述第二测试用例对应的语句集合的适应度。
[0176]
这里,不同部分对应的适应度函数不同。每一部分对应的适应度函数可以为至少一个。
[0177]
确定语句集合的适应度的方式可以包括但不限于任一适应度值、每一适应度值的和/差/方差/均方差、每一适应度值分别加权之后的和/差/方差/均方差等。在实施时,本领域技术人员可以根据实际需求自主选择确定语句集合的适应度的方式,本技术实施例不作限定。例如,将每一适应度值中的最大值,作为该语句集合的适应度。又例如,将每一适应度值分别加权之后的和,作为该语句集合的适应度。
[0178]
在本技术实施方式中,基于每一部分对应的适应度值确定语句集合的适应度,可以提高语句集合的适应度的准确度,从而可以提高后代中个体的准确度。
[0179]
在一些实施方式中,所述步骤s222中的“基于所述第二测试用例的每一部分对应的适应度函数,对对应部分进行所述适应度评估处理”,包括步骤s241至步骤s243,其中:
[0180]
步骤s241、在所述至少一个部分包括所述桩代码部分的情况下,基于所述桩代码部分中的语句集合中已被成功执行的语句子集的个数,创建所述桩代码部分对应的适应度函数;基于所述桩代码部分对应的适应度函数,对所述桩代码部分进行所述适应度评估处理,得到所述桩代码部分的适应度值。
[0181]
这里,确定该适应度函数的方式可以包括但不限于已被成功执行的语句子集的个数、以已被成功执行的语句子集的个数为自变量的函数、已被成功执行的语句子集的个数与语句子集的总个数之间的比值、对已被成功执行的语句子集的个数与语句子集的总个数分别加权之后的比值等。在实施时,本领域技术人员可以根据实际需求选择确定该适应度函数的方式,本技术实施例不作限定。例如,通过上述公式(1-1)来表示s部分对应的适应度函数。
[0182]
步骤s242、在所述至少一个部分包括所述测试部分的情况下,基于所述测试部分中已被成功执行的测试语句条数,创建所述测试部分对应的适应度函数;基于所述测试部分对应的适应度函数,对所述测试部分进行所述适应度评估处理,得到所述测试部分的适应度值。
[0183]
这里,确定该适应度函数的方式可以包括但不限于已被成功执行的测试语句条数、以已被成功执行的测试语句条数为自变量的函数、已被成功执行的测试语句条数与测试语句的总条数之间的比值、对已被成功执行的测试语句条数与测试语句的总条数分别加权之后的比值等。在实施时,本领域技术人员可以根据实际需求选择确定该适应度函数的方式,本技术实施例不作限定。例如,通过上述公式(1-3)来表示e部分对应的适应度函数。
[0184]
步骤s243、在所述至少一个部分包括所述断言部分的情况下,基于所述断言部分中已被满足的断言语句条数,创建所述断言部分对应的第一适应度函数;基于所述断言部分中每一断言语句的期望值和实际值,创建所述断言部分对应的第二适应度函数;基于所述第一适应度函数和所述第二适应度函数,对所述测试部分进行所述适应度评估处理,得到所述断言部分的适应度值。
[0185]
这里,确定断言部分的适应度值的方式可以包括但不限于第一适应度函数的值、第二适应度函数的值、第一适应度函数的值与第二适应度函数的值之间的和/差/乘积/比值/平方/方差/均方差、分别对第一适应度函数的值与第二适应度函数的值进行加权之后的和/差/乘积/比值/平方/方差/均方差等。在实施时,本领域技术人员可以根据实际需求自主选择确定断言部分的适应度值的方式,本技术实施例不作限定。例如,通过上述公式(1-4)来确定断言部分的适应度值。
[0186]
确定第一适应度函数的方式可以包括但不限于已被满足的断言语句条数、以已被满足的断言语句条数为自变量的函数、已被满足的断言语句条数与断言语句的总条数之间的比值、对已被满足的断言语句条数与断言语句的总条数分别加权之后的比值等。在实施时,本领域技术人员可以根据实际需求选择确定第一适应度函数的方式,本技术实施例不作限定。例如,通过上述公式(1-5)来表示第一适应度函数。
[0187]
在一些实施方式中,所述步骤s243中的“基于所述断言部分中每一断言语句的期望值和实际值,创建所述断言部分对应的第二适应度函数”,包括步骤s2431至步骤s2432,其中:
[0188]
步骤s2431、针对所述断言部分中每一断言语句,利用预设的距离函数,确定所述断言语句的期望值和实际值之间的第一距离。
[0189]
这里,可以通过任意能够计算距离的函数来得到该第一距离。例如,余弦相似度、欧式距离、莱文斯坦距离等。在实施时,本领域技术人员可以根据实施需求自主选择计算距离的函数,本技术实施例不作限定。例如,通过上述公式(1-7)来计算第一距离。
[0190]
步骤s2432、基于每一所述第一距离,创建所述断言部分对应的所述第二适应度函数。
[0191]
这里,确定第二适应度函数的方式可以包括但不限于任一第一距离、每一第一距离的和/差/乘积/方差/均方差、对每一第一距离分别进行加权之后的和/差/乘积/方差/均方差等。在实施时,本领域技术人员可以根据实际需求选择确定第二适应度函数的方式,本技术实施例不作限定。例如,通过上述公式(1-6)来表示第二适应度函数。
[0192]
在本技术实施方式中,基于每一部分对应的适应度值确定对应部分的适应度值,可以提高每一部分的适应度值的准确度,从而可以提高语句集合的适应度的准确度,进而可以提高后代中个体的准确度。
[0193]
在一些实施方式中,所述下一语句群体中包括m个第三语句集合和n个第四语句集合,m和n为正整数;所述步骤s23包括步骤s231至步骤s232,其中:
[0194]
步骤s231、将所述当前语句群体中每一所述语句集合的适应度满足预设条件的m个语句集合,分别作为所述下一语句群体中的一个所述第三语句集合。
[0195]
这里,其中,预设条件可以包括但不限于最高、设定比例、设定值等。在实施时,本领域技术人员可以根据实际需求自主确定预设条件,本技术实施例不作限定。例如,将当前语句群体中适应度最高的1%的语句集合作为每一第三语句集合。
[0196]
步骤s232、对所述当前语句群体进行n/2次的迭代处理,在每一次所述迭代处理的过程中,基于所述当前语句群体,得到所述下一语句群体中的两个所述第四语句集合。
[0197]
这里,迭代处理可以包括但不限于选择处理、交叉互换处理、变异处理等。
[0198]
在一些实施方式中,所述步骤s232中的“基于所述当前语句群体,得到所述下一语句群体中的两个所述第四语句集合”,包括步骤s251至步骤s254,其中:
[0199]
步骤s251、利用预设的选择算法,从所述当前语句群体中的至少一个语句集合中确定所述第一语句集合和所述第二语句集合。
[0200]
这里,选择算法可以是任意合适的能够进行选择的算法。例如,锦标赛选择法、随机等。在实施时,本领域技术人员可以根据实际需求自主确定选择算法,本技术实施例不作限定。
[0201]
第一语句集合和第二语句集合可以相同,也可以不同。例如,随机从当前语句群体中选择l个语句集合,并利用竞标赛选择法从这l个语句集合中确定第一语句集合,并采用相同的方式确定第二语句集合,其中,l可以为不小于2的正整数。在实施时,可以采用放回抽样的抽样策略,这样使得第一语句集合和第二语句集合可能相同。
[0202]
步骤s252、将所述第一语句集合中的第一语句子集与所述第二语句集合中的第二
语句子集进行所述交叉互换处理,得到第五语句集合和第六语句集合。
[0203]
这里,可以基于预设规则从第一语句集合中确定第一语句子集。其中,预设规则可以包括但不限于默认、随机、自定义、用户喜好、使用频率、用户操作信息等。在实施时,本领域技术人员可以根据实际需求自主设定预设规则,本技术实施例不作限定。
[0204]
在一些实施方式中,从第二语句集合中确定第二语句子集的方式、与从第一语句集合中确定第一语句子集的方式相同。
[0205]
例如,第一语句集合包括语句子集1和语句子集2,第二语句集合包括语句子集3和语句子集4,其中,第一语句子集为语句子集1,第二语句子集为语句子集4,交叉互换处理后,第五语句集合包括语句子集4和语句子集2,第六语句集合包括语句子集3和语句子集1。
[0206]
步骤s253、对所述第五语句集合进行变异处理,得到变异后的第五语句集合,并将所述变异后的第五语句集合作为一个所述第四语句集合。
[0207]
这里,变异处理指利用变异方式作用于语句集合中的语句。其中,变异方式可以是基于语句的类型确定的。不同的类型可以对应相同或不同的变异方式,每一类型的语句可以包括至少一种变异方式。例如,对于包含变量的语句,变异方式可以包括但不限于删除变量、替换变量的值、新建一个变量等。
[0208]
步骤s254、对所述第六语句集合进行变异处理,得到变异后的第六语句集合,并将所述变异后的第六语句集合作为另一个所述第四语句集合。
[0209]
这里,对第六语句集合的变异处理的过程、与对第五语句集合变异处理的过程相似,在实施时,可以参照前述步骤s254的具体实施方式。
[0210]
在本技术实施方式中,通过将所述当前语句群体中每一所述语句集合的适应度满足预设条件的m个语句集合,分别作为所述下一语句群体中的一个所述第三语句集合;对所述当前语句群体进行n/2次的迭代处理,在每一次所述迭代处理的过程中,基于所述当前语句群体,得到所述下一语句群体中的两个所述第四语句集合。这样,一方面,将满足预设条件的语句集合直接作为后代,可以降低丢失最优个体的可能性;另一方面,对当前语句群体进行迭代处理得到后代,可以提高后代中个体的准确度,从而不仅可以减少计算开销,而且还可以提高搜索效率。
[0211]
在一些实施方式中,所述步骤s253中的“对所述第五语句集合进行变异处理,得到变异后的第五语句集合”,包括步骤s261至步骤s264,其中:
[0212]
步骤s261、从所述第五语句集合中的至少一条语句中确定目标语句。
[0213]
这里,目标语句的条数可以为至少一条。确定目标语句的方式可以包括但不限于默认、随机、自定义、用户喜好、使用频率、用户操作信息等。在实施时,本领域技术人员可以根据实际需求自主设定确定目标语句的方式,本技术实施例不作限定。例如,从至少一条语句中随机选择一条语句作为目标语句。
[0214]
步骤s262、基于所述目标语句的类型,从至少一种变异方式中确定目标变异方式。
[0215]
这里,每一类型的语句可以包括至少一种变异方式。确定目标变异方式的方式可以包括但不限于默认、随机、自定义、用户喜好、使用频率、用户操作信息等。在实施时,本领域技术人员可以根据实际需求自主设定确定目标变异方式的方式,本技术实施例不作限定。例如,从至少一种变异方式中随机选择一种变异方式作为目标变异方式。
[0216]
在一些实施方式中,所述步骤s262包括步骤s2621至步骤s2623中的至少之一,其
中:
[0217]
步骤s2621、在所述目标语句的类型为包含变量的情况下,所述目标变异方式包括以下至少之一:从预设的符号库中随机选择一个值作为新的变量的值、从所述符号库中随机选择一个值替换所述变量的值、删除所述变量。
[0218]
这里,符号库中的每一个值是基于第一测试用例和被测对象生成的。其中,被测对象可以包括但不限于被测类、被测函数等。
[0219]
在实施时,按照预设的解析方式,分别对第一测试用例和被测对象进行解析,生成符号库。其中,解析方式可以包括但不限于预设类型、自定义、默认、用户喜好等。在实施时,本领域技术人员可以根据实际需求自主选择解析方式,本技术实施例不作限定。
[0220]
例如,对于如下的stub code,
[0221]
var sha1=digestutils.sha1hex("bar");
[0222]
when(user.getpasswordhash()).thenreturn(sha1);
[0223]
when(dao.finduser(eq("foo"))
[0224]
.thenthrow(new timeoutexception());
[0225]
.thenreturn(user);
[0226]
可以提取用于返回值的构建的单词,作为符号库的一个值,此时,可以将“digestutils.sha1hex”、“bar”、“foo”、“timeoutexception”这四个单词作为符号库的一部分。
[0227]
由于现有的搜索方案都是从零开始,对于一些复杂的值,需要大量的搜索迭代过程。那么,通过预先构建符号库,可以给后续的搜索提供指引,提高了搜索效率,以便于更快的搜索到正确的值,从而可以降低搜索的计算量。
[0228]
对于包含变量的变异方式可以包括新增、删除、修改等。例如,随机从符号库中选择一个值baz,将该值baz作为新的变量v4的值。又例如,删除一个未经使用的变量。
[0229]
步骤s2622、在所述目标语句的类型为包含参数的情况下,所述目标变异方式包括:从所述第五语句集合中随机选择一个参数替换所述目标语句中的参数。
[0230]
例如,将目标语句v3←
digestutils.sha1hex(v2)中的参数v2更改为v4。
[0231]
步骤s2623、在所述目标语句的类型为包含行为语句的情况下,所述目标变异方式包括以下至少之一:增加新的行为语句、删除所述行为语句、调换所述行为语句与所述第五语句集合中的另一行为语句的执行顺序。
[0232]
例如,随机生成一个行为语句将该行为语句加入第五语句集合中。
[0233]
又例如,随机删除一个第五语句集合中的一个行为语句。
[0234]
应理解,上述每一类型的语句的变异方式仅用于示例,在实施时,每一类型的语句的变异方式可以增加或者删除。
[0235]
步骤s263、利用所述目标变异方式对所述目标语句进行变异处理,得到变异后的目标语句。
[0236]
例如,目标变异方式为调换行为语句与第五语句集合中的另一行为语句的执行顺序。比如,对调以下两个语句的顺序:
[0237]
《dao,finduser,[eq(v0)]》

throw(v1)
[0238]
《dao,finduser,[eq(v0)]》

return(user)
[0239]
又例如,目标变异方式为从符号库中随机选择一个值替换变量的值。比如,从符号库中随机选择“fooo”作为变量v0的值,即:将v0←”
foo”替换为v0←”
fooo”。
[0240]
步骤s264、将所述第五语句集合中的目标语句替换为变异后的目标语句,以得到所述变异后的第五语句集合。
[0241]
在本技术实施方式中,通过对不同类型的语句采用对应的目标变异方式,以得到对应的语句集合,这样,一方面,可以生成各种不同应用场景的语句集合,从而可以提高模拟对象的适用性;另一方面,通过仅对目标语句采取高度抽象的变异方式,可以减少变异处理的搜索空间,从而可以降低搜索的计算量。
[0242]
图3a为本技术实施例提供的一种单元测试系统的组成结构示意图,如图3a所示,所述系统包括输入组件31、处理组件32及输出组件33,其中:
[0243]
所述输入组件31,用于接收第一测试用例;
[0244]
所述处理组件32,用于基于第一测试用例,确定当前语句群体,所述当前语句群体中包括至少两个语句集合,每一所述语句集合中包括至少一个语句子集,每一所述语句子集包括用于定义模拟对象的行为语句和所述行为语句的至少一条依赖语句;对所述当前语句群体进行迭代处理,得到下一语句群体;基于第一测试用例的断言部分和所述下一语句群体,确定目标语句集合;基于所述模拟对象对所述第一测试用例进行所述单元测试;
[0245]
所述输出组件33,用于输出进行所述单元测试的第一测试用例。
[0246]
这里,迭代处理可以包括但不限于选择处理、交叉互换处理、变异处理等。
[0247]
在一些实施方式中,所述输入组件31还用于:接收被测对象。
[0248]
这里,被测对象可以包括但不限于被测类、被测函数等。
[0249]
所述处理组件32还用于:按照预设的解析方式,分别对第一测试用例和被测对象进行解析,生成符号库。
[0250]
这里,解析方式可以包括但不限于预设类型、自定义、默认、用户喜好等。在实施时,本领域技术人员可以根据实际需求自主选择解析方式,本技术实施例不作限定。这样,通过预先构建符号库,可以给后续的搜索提供指引,以便于更快的搜索到正确的值,从而可以降低搜索的计算量。
[0251]
图3b为本技术实施例提供的一种单元测试方法的实现流程示意图,如图3b所示,该方法包括步骤s311至步骤s317,其中:
[0252]
步骤s311、解析输入的待修复的测试用例,将其切分为m,s,e,a四个部分;
[0253]
这里,可以按照上述的分割方法对待修复的测试用例进行切分。
[0254]
步骤s312、解析输入的被测类和待修复的测试用例,构建符号库;
[0255]
步骤s313、解析待修复的测试用例的s部分,构建初始群体p0;
[0256]
这里,p0中包括相同的至少两个语句集合。在实施时,可以按照上述目标抽象语法对s部分进行表示,得到一个语句集合,将该语句集合作为p0中的一个语句集合。
[0257]
步骤s314、在pn的基础上,产生下一代的群体p
n+1

[0258]
这里,产生下一代群体的步骤包括适应度评估处理、选择处理、交叉互换处理和变异处理。
[0259]
步骤s315、判断p
n+1
中是否有符合待修复的测试用例的a部分的目标语句集合,若
有,则进入步骤s317,反之,则进入步骤s316;
[0260]
步骤s316、将p
n+1
作为pn,返回步骤s314;
[0261]
步骤s317、利用目标语句集合修复该待修复的测试用例,并对修复后的测试用例进行单元测试。
[0262]
这里,利用目标语句集合重新定义待修复的测试用例中的模拟对象。
[0263]
在一些实施方式中,所述处理组件32还用于:对所述当前语句群体中每一所述语句集合进行适应度评估处理,得到所述当前语句群体中每一所述语句集合的适应度;将所述当前语句群体中每一所述语句集合的适应度满足预设条件的m个语句集合,分别作为所述下一语句群体中的一个所述第三语句集合;对所述当前语句群体进行n/2次的迭代处理,在每一次所述迭代处理的过程中,利用预设的选择算法,从所述当前语句群体中的至少一个语句集合中确定所述第一语句集合和所述第二语句集合,将所述第一语句集合中的第一语句子集与所述第二语句集合中的第二语句子集进行所述交叉互换处理,得到第五语句集合和第六语句集合,对所述第五语句集合进行变异处理,得到变异后的第五语句集合,并将所述变异后的第五语句集合作为一个所述第四语句集合,对所述第六语句集合进行变异处理,得到变异后的第六语句集合,并将所述变异后的第六语句集合作为另一个所述第四语句集合。
[0264]
在一些实施方式中,所述处理组件32还用于:从所述第五语句集合中的至少一条语句中确定目标语句;在所述目标语句的类型为包含变量的情况下,所述目标变异方式包括以下至少之一:从预设的符号库中随机选择一个值作为新的变量的值、从所述符号库中随机选择一个值替换所述变量的值、删除所述变量,其中,所述符号库中的每一个值是基于所述第一测试用例和被测对象生成的;在所述目标语句的类型为包含参数的情况下,所述目标变异方式包括:从所述第五语句集合中随机选择一个参数替换所述目标语句中的参数;在所述目标语句的类型为包含行为语句的情况下,所述目标变异方式包括以下至少之一:增加新的行为语句、删除所述行为语句、调换所述行为语句与所述第五语句集合中的另一行为语句的执行顺序;利用所述目标变异方式对所述目标语句进行变异处理,得到变异后的目标语句;将所述第五语句集合中的目标语句替换为变异后的目标语句,以得到所述变异后的第五语句集合。
[0265]
在一些实施方式中,所述处理组件32还用于:针对所述当前语句群体中的每一语句集合,基于所述语句集合,生成与所述语句集合对应的第二测试用例,所述第二测试用例中包括至少一个部分;针对每一第二测试用例,基于所述第二测试用例的每一部分对应的适应度函数,对对应部分进行所述适应度评估处理,得到对应部分的适应度值,并基于所述第二测试用例的每一部分的适应度值,得到所述第二测试用例对应的语句集合的适应度。
[0266]
在一些实施方式中,所述处理组件32还用于:在所述至少一个部分包括所述桩代码部分的情况下,基于所述桩代码部分中的语句集合中已被成功执行的语句子集的个数,创建所述桩代码部分对应的适应度函数;基于所述桩代码部分对应的适应度函数,对所述桩代码部分进行所述适应度评估处理,得到所述桩代码部分的适应度值;在所述至少一个部分包括所述测试部分的情况下,基于所述测试部分中已被成功执行的测试语句条数,创建所述测试部分对应的适应度函数;基于所述测试部分对应的适应度函数,对所述测试部分进行所述适应度评估处理,得到所述测试部分的适应度值;在所述至少一个部分包括所
述断言部分的情况下,基于所述断言部分中已被满足的断言语句条数,创建所述断言部分对应的第一适应度函数;针对所述断言部分中每一断言语句,利用预设的距离函数,确定所述断言语句的期望值和实际值之间的第一距离;基于每一所述第一距离,创建所述断言部分对应的第二适应度函数;基于所述第一适应度函数和所述第二适应度函数,对所述测试部分进行所述适应度评估处理,得到所述断言部分的适应度值。
[0267]
图3c为本技术实施例提供的一种生成下一语句群体的实现流程示意图,如图3c所示,该方法包括步骤s321至步骤s327,其中:
[0268]
步骤s321、确定pn中的每一语句集合的适应度;
[0269]
步骤s322、将适应度最高的1%的语句集合作为p
n+1
中的语句集合;
[0270]
步骤s323、使用锦标赛选择法,从pn中选出两个语句集合,分别作为父代(对应于前述第一语句集合)和母代(对应于前述第二语句集合);
[0271]
步骤s324、交叉互换父代和母代中的语句子集,产生两个新的子代(对应前述第五语句集合和第六语句集合);
[0272]
步骤s325、对两个新的子代进行变异处理,得到两个变异后的子代(对应于前述两个第四语句集合),将得到的两个子代加入p
n+1

[0273]
步骤s326、判断迭代次数是否到达预设值,若是,则进入步骤s327,反之,则进入步骤s323;
[0274]
这里,预设值为其中,x表示pn中语句集合的个数,y表示pn适应度最高的1%的语句集合的个数。
[0275]
步骤s327、结束当前流程。
[0276]
在本技术实施例中,首先,利用多个语句集合定义不同场景下的模拟对象的行为,可以提高模拟对象的适配性;其次,通过在语句子集中定义模拟对象的行为语句及其依赖语句,可以在迭代处理过程中,一并交换对应的行为语句及其依赖语句,从而可以降低产出不正确的个体的可能性,进而不仅可以减少计算开销,而且还可以提高搜索效率;然后,基于断言部分和下一语句群体得到模拟对象的目标语句集合,可以提高模拟对象的准确度和适用性;最后,使用模拟对象进行单元测试,而不必依赖于程序模块中的真实对象,实现了程序模块和依赖对象的分离,从而有助于提高软件测试效率。
[0277]
基于前述的实施例,本技术实施例提供一种单元测试装置,该装置包括所包括的各单元、以及各单元所包括的各模块,可以通过计算机设备中的处理器来实现;当然也可通过具体的逻辑电路实现;在实施的过程中,处理器可以为中央处理器(cpu)、微处理器(mpu)、数字信号处理器(dsp)或现场可编程门阵列(fpga)等。
[0278]
图4为本技术实施例提供的一种单元测试装置的组成结构示意图,如图4所示,所述装置40包括第一确定模块41、迭代模块42、第二确定模块43和测试模块44,其中:
[0279]
所述第一确定模块41,用于确定当前语句群体,所述当前语句群体中包括至少两个语句集合,每一所述语句集合中包括至少一个语句子集,每一所述语句子集包括用于定义模拟对象的行为语句和所述行为语句的至少一条依赖语句;
[0280]
所述迭代模块42,用于对所述当前语句群体进行迭代处理,得到下一语句群体;其中,所述迭代处理包括对从第一语句集合中的至少一个语句子集中确定的第一语句子集和
从第二语句集合中的至少一个语句子集中确定的第二语句子集进行交叉互换处理,所述第一语句集合和所述第二语句集合分别是从所述至少两个语句集合中确定的,所述下一语句群体中语句集合的数量与所述当前语句群体中语句集合的数量相同;
[0281]
所述第二确定模块43,用于基于第一测试用例的断言部分和所述下一语句群体,确定目标语句集合,所述目标语句集合用于定义所述模拟对象;
[0282]
所述测试模块44,用于基于所述模拟对象对所述第一测试用例进行所述单元测试。
[0283]
在一些实施方式中,所述迭代模块42,还用于:对所述当前语句群体中每一所述语句集合进行适应度评估处理,得到所述当前语句群体中每一所述语句集合的适应度;基于所述当前语句群体中每一所述语句集合的所述适应度,对所述当前语句群体进行所述迭代处理,得到所述下一语句群体。
[0284]
在一些实施方式中,所述下一语句群体中包括m个第三语句集合和n个第四语句集合,m和n为正整数;所述迭代模块42,还用于:将所述当前语句群体中每一所述语句集合的适应度满足预设条件的m个语句集合,分别作为所述下一语句群体中的一个所述第三语句集合;对所述当前语句群体进行n/2次的迭代处理,在每一次所述迭代处理的过程中,基于所述当前语句群体,得到所述下一语句群体中的两个所述第四语句集合。
[0285]
在一些实施方式中,所述迭代模块42,还用于:利用预设的选择算法,从所述当前语句群体中的至少一个语句集合中确定所述第一语句集合和所述第二语句集合;将所述第一语句集合中的第一语句子集与所述第二语句集合中的第二语句子集进行所述交叉互换处理,得到第五语句集合和第六语句集合;对所述第五语句集合进行变异处理,得到变异后的第五语句集合,并将所述变异后的第五语句集合作为一个所述第四语句集合;对所述第六语句集合进行变异处理,得到变异后的第六语句集合,并将所述变异后的第六语句集合作为另一个所述第四语句集合。
[0286]
在一些实施方式中,所述迭代模块42,还用于:从所述第五语句集合中的至少一条语句中确定目标语句;基于所述目标语句的类型,从至少一种变异方式中确定目标变异方式;利用所述目标变异方式对所述目标语句进行变异处理,得到变异后的目标语句;将所述第五语句集合中的目标语句替换为变异后的目标语句,以得到所述变异后的第五语句集合。
[0287]
在一些实施方式中,所述迭代模块42,还用于以下至少之一:在所述目标语句的类型为包含变量的情况下,所述目标变异方式包括以下至少之一:从预设的符号库中随机选择一个值作为新的变量的值、从所述符号库中随机选择一个值替换所述变量的值、删除所述变量;其中,所述符号库中的每一个值是基于所述第一测试用例和被测对象生成的;在所述目标语句的类型为包含参数的情况下,所述目标变异方式包括:从所述第五语句集合中随机选择一个参数替换所述目标语句中的参数;在所述目标语句的类型为包含行为语句的情况下,所述目标变异方式包括以下至少之一:增加新的行为语句、删除所述行为语句、调换所述行为语句与所述第五语句集合中的另一行为语句的执行顺序。
[0288]
在一些实施方式中,所述迭代模块42,还用于:针对所述当前语句群体中的每一语句集合,基于所述语句集合,生成与所述语句集合对应的第二测试用例,所述第二测试用例中包括至少一个部分;针对每一第二测试用例,基于所述第二测试用例的每一部分对应的
适应度函数,对对应部分进行所述适应度评估处理,得到对应部分的适应度值,并基于所述第二测试用例的每一部分的适应度值,得到所述第二测试用例对应的语句集合的适应度。
[0289]
在一些实施方式中,所述第二测试用例中的至少一个部分包括以下至少之一:桩代码部分、测试部分、断言部分;所述迭代模块42,还用于以下至少之一:在所述至少一个部分包括所述桩代码部分的情况下,基于所述桩代码部分中的语句集合中已被成功执行的语句子集的个数,创建所述桩代码部分对应的适应度函数;基于所述桩代码部分对应的适应度函数,对所述桩代码部分进行所述适应度评估处理,得到所述桩代码部分的适应度值;在所述至少一个部分包括所述测试部分的情况下,基于所述测试部分中已被成功执行的测试语句条数,创建所述测试部分对应的适应度函数;基于所述测试部分对应的适应度函数,对所述测试部分进行所述适应度评估处理,得到所述测试部分的适应度值;在所述至少一个部分包括所述断言部分的情况下,基于所述断言部分中已被满足的断言语句条数,创建所述断言部分对应的第一适应度函数;基于所述断言部分中每一断言语句的期望值和实际值,创建所述断言部分对应的第二适应度函数;基于所述第一适应度函数和所述第二适应度函数,对所述测试部分进行所述适应度评估处理,得到所述断言部分的适应度值。
[0290]
在一些实施方式中,所述迭代模块42,还用于:针对所述断言部分中每一断言语句,利用预设的距离函数,确定所述断言语句的期望值和实际值之间的第一距离;基于每一所述第一距离,创建所述断言部分对应的所述第二适应度函数。
[0291]
在一些实施方式中,所述第二确定模块43,还用于以下至少之一:在所述下一语句群体中存在符合所述第一测试用例的所述断言部分的语句集合的情况下,将符合所述第一测试用例的所述断言部分的语句集合作为所述目标语句集合;在所述下一语句群体中不存在符合所述第一测试用例的所述断言部分的语句集合的情况下,将所述下一语句群体作为新的当前语句群体,对所述新的当前语句群体进行所述迭代处理,得到新的下一语句群体,基于所述第一测试用例的所述断言部分和所述新的下一语句群体,确定所述目标语句集合。
[0292]
在一些实施方式中,所述第一确定模块41,还用于:对所述第一测试用例进行解析,得到桩代码部分;利用预设的抽象语法,对所述桩代码部分进行解析,生成初始语句群体,所述初始语句群体中包括相同的至少两个语句集合,每一所述语句集合中包括至少一个语句子集,每一所述语句子集包括用于定义模拟对象的行为语句和所述行为语句的至少一条依赖语句;将所述初始语句群体作为所述当前语句群体。
[0293]
以上装置实施例的描述,与上述方法实施例的描述是类似的,具有同方法实施例相似的有益效果。对于本技术装置实施例中未披露的技术细节,请参照本技术方法实施例的描述而理解。
[0294]
需要说明的是,本技术实施例中,如果以软件功能模块的形式实现上述的喷淋控制方法,并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本技术实施例的技术方案本质上或者说对相关技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机、服务器、或者网络设备等)执行本技术各个实施例所述方法的全部或部分。而前述的存储介质包括:u盘、移动硬盘、只读存储器(read only memory,rom)、磁碟或者光盘等各种可以存储程序代码的介质。这样,本技术实施例不限制
于任何特定的硬件和软件结合。
[0295]
对应地,本技术实施例提供一种电子设备,该电子设备包括存储器和处理器。所述存储器,用于存储有可在处理器上运行的计算机程序。所述处理器用于执行所述计算机程序时实现上述实施例中提供的方法中的步骤。
[0296]
对应地,本技术实施例提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述实施例中提供的方法中的步骤。
[0297]
对应地,本技术实施例提供一种计算机程序产品,所述计算机程序产品包括存储了计算机程序的非瞬时性计算机可读存储介质,所述计算机程序被计算机读取并执行时,实现上述方法中的部分或全部步骤。该计算机程序产品可以具体通过硬件、软件或其结合的方式实现。在一个可选实施例中,所述计算机程序产品具体体现为计算机存储介质,在另一个可选实施例中,计算机程序产品具体体现为软件产品,例如软件开发包(software development kit,sdk)等等。
[0298]
需要说明的是,图5为本技术实施例中电子设备的一种硬件实体示意图,如图5所示,该电子设备500的硬件实体包括:处理器501、通信接口502和存储器503,其中:
[0299]
处理器501通常控制电子设备500的总体操作。
[0300]
通信接口502可以使电子设备通过网络与其他终端或服务器通信。
[0301]
存储器503配置为存储由处理器501可执行的指令和应用,还可以缓存待处理器501以及电子设备500中各模块待处理或已经处理的数据(例如,图像数据、音频数据、语音通信数据和视频通信数据),可以通过闪存(flash)或随机访问存储器(random access memory,ram)实现。处理器501、通信接口502和存储器503之间可以通过总线504进行数据传输。
[0302]
这里需要指出的是:以上存储介质、计算机程序产品和设备实施例的描述,与上述方法实施例的描述是类似的,具有同方法实施例相似的有益效果。对于本技术存储介质和设备实施例中未披露的技术细节,请参照本技术方法实施例的描述而理解。
[0303]
应理解,说明书通篇中提到的“一个实施例”或“一实施例”意味着与实施例有关的特定特征、结构或特性包括在本技术的至少一个实施例中。因此,在整个说明书各处出现的“在一个实施例中”或“在一实施例中”未必一定指相同的实施例。此外,这些特定的特征、结构或特性可以任意适合的方式结合在一个或多个实施例中。应理解,在本技术的各种实施例中,上述各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本技术实施例的实施过程构成任何限定。上述本技术实施例序号仅仅为了描述,不代表实施例的优劣。
[0304]
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。
[0305]
在本技术所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。以上所描述的设备实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,如:多个单元或组件可以结合,或
可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,所显示或讨论的各组成部分相互之间的耦合、或直接耦合、或通信连接可以是通过一些接口,设备或单元的间接耦合或通信连接,可以是电性的、机械的或其它形式的。
[0306]
上述作为分离部件说明的单元可以是、或也可以不是物理上分开的,作为单元显示的部件可以是、或也可以不是物理单元;既可以位于一个地方,也可以分布到多个网络单元上;可以根据实际的需要选择其中的部分或全部单元来实现本实施例方案的目的。另外,在本技术各实施例中的各功能单元可以全部集成在一个处理单元中,也可以是各单元分别单独作为一个单元,也可以两个或两个以上单元集成在一个单元中;上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
[0307]
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:移动存储设备、只读存储器(read only memory,rom)、磁碟或者光盘等各种可以存储程序代码的介质。
[0308]
或者,本技术上述集成的单元如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本技术实施例的技术方案本质上或者说对相关技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机、服务器、或者网络设备等)执行本技术各个实施例所述方法的全部或部分。而前述的存储介质包括:移动存储设备、rom、磁碟或者光盘等各种可以存储程序代码的介质。
[0309]
以上所述,仅为本技术的实施方式,但本技术的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本技术揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本技术的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1