一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

基于蜕变测试的自监督深度学习型缺陷定位方法与流程

2021-10-29 22:55:00 来源:中国专利 TAG:缺陷 定位 学习型 深度 监督


1.本发明涉及缺陷定位领域,特别涉及一种向无标签数据集的、自监督的深度学习型缺陷定位。


背景技术:

2.软件,作为一种具有高度内在复杂性的纯粹的抽象知识产品,难免出错。尽管现实中投入了大量的人力物力来尽力降低软件的脆弱性,但是bug还是无可避免地存在于一切具有规模的软件之中。因此,调试也就成为了贯穿软件开发和维护过程始终的一个关键部分,并且也确实需要大量劳动力和相当多的时间。为了减轻这一负担,学术界已经设计出了很多自动缺陷定位的技术来帮助开发者更高效地寻找bug。在这一领域最近的研究中,深度学习型缺陷定位(deep

learning

based fault localization,简称dlfl)凭借其很好的定位效果获得了较多的关注。dlfl以当下流行的监督型深度学习模型作为它的内核,能够有效识别和消化潜藏在程序执行信息中的模式,并进一步利用学到的模式来评估每一行语句的可疑值,表示每一行语句对程序失效所负有的责任。因此,dlfl相较于其他一些前沿的缺陷定位方法(例如基于频谱的缺陷定位),不仅能给出更好的效果,而且还具备更强的泛化能力。
3.图1展示了dlfl的基本流程。给定一个包含n行代码的目标程序(即缺陷定位的对象,含缺陷的程序)p,一个包含了m个测试用例[t1,t2,

,t
m
]的测试用例集,以及必须在dlfl开始前预备好的测试预言[o1,o2,

,o
m
],其中o
i
存储着p在t
i
上运行的预期输出。在批量执行(batch execution)的步骤中,全部的测试用例被逐个输入给目标程序用于执行。测试用例t
i
的执行输出被拿来和与之对应的测试预言o
i
作比较,从而获取到执行结果y
i
,用以表示程序的执行是否失效。与此同时,涉及到哪些语句(本发明中使用“语句”代表一行代码)有被执行到的运行时信息被相关工具收集、汇总,得到x
i
,留待后续调查。接下来,dlfl使用匹配成对的执行结果(即,通过或失效)和运行时信息(即,语句覆盖),(x
i
,y
i
),i∈{1,2,

,m},将前者作为标签,后者作为样本,借助于深度学习网络来内化样本和标签之间的联系,训练模型。更进一步,dlfl使用训练好的模型评估每行语句的可疑值(即,该行代码包含bug的可能性大小),计算出[s1,s2,

s
n
],其中s
i
衡量第i个语句含有缺陷的可能性。在最后一步中,dlfl对全部的语句按可疑值从大到小排序,输出所有语句的排名列表[l1,l2,

,l
n
],其中l
i
指向第i可疑的语句所在的代码行号。
[0004]
但是,正如图1中虚线框所标注的,标签是dlfl能运转的一项必要条件。换句话说,dlfl内部的监督学习神经网络需要大规模有标签数据集。这一事实,使得dlfl仅能应用于那些测试预言能轻易获得的情况。没有了标签,深度学习模型也就无法得知哪些样本会导致程序失效、什么样的样本不会导致程序失效,从而也就不能学习到运行时信息和程序行为之间的关联。而事实上,测试预言缺失的问题在实际工作中是经常存在的,比如数值计算型软件和机器学习算法。通常情况下,准确或精确的测试语言往往根本不可能获得,或是虽然可能但却耗费巨大。于是,监督学习的这项前置要求便使得这样一个高效的技术在许多
场景下都不可行或难以实践。


技术实现要素:

[0005]
针对现有技术存在的上述问题,本发明的目的是:解决深度学习型缺陷定位在无标签数据集上的适用性问题,使其能应用到数据集缺少标签的情况。
[0006]
为解决上述技术问题,本发明采用如下技术方案:基于蜕变测试的自监督深度学习型缺陷定位方法,包括如下步骤:
[0007]
s101:根据先验知识,构建目标程序p的蜕变关系mr;
[0008]
s102:获取测试用例集t,并根据mr的要求,从所述测试用例集t中挑出全部共m

组源测试用例s={s1,s2,

,s
m

},其中s
i
={s
i1
,s
i2
,

}表示第i组源测试用例,s
ij
表示s
i
中的第j个测试用例,并用每一个源测试用例组s
i
为mr生成相应的后续测试用例组f
i
={f
i1
,f
i2
,

},这里,一组相对应的源测试用例和后续测试用例被视为最小测试单元,即一个蜕变测试组mtg,第i个mtg内包含的测试用例为s
i
∪f
i

[0009]
s103:每个mtg中的全部测试用例被逐个输入给目标程序p用于执行,从中采集每个mtg内各个源测试用例和后续测试用例的执行输出以及执行过程中的语句覆盖矩阵以及执行过程中的语句覆盖矩阵表示执行第i组源测试用例组中第j个源测试用例所获得的覆盖向,表示执行第i组后续测试用例组中第j个测试用例所获得的覆盖向量;如果将或统一用代表,那么其内的元素表示第k个语句是否在测试用例c的执行中被覆盖到了,覆盖时取1,未覆盖时取0,这里k的取值范围是[1,n],n是缺陷程序代码语句总数;
[0010]
s104:对于每个mtg,将测试用例组s
i
∪f
i
和相应的执行输出o
i
作为参数使用mr进行检验,判断mr是否被违反,得到该mtg的测试结果最终得到由m

行测试结果组成的违反向量这里用m={m1,m2,

,m
m

}代表全部m

个mtg,m
i
代表第i个mtg;
[0011]
s105:将每个mtg的覆盖矩阵进行转换得到与违反向量y
(m)
对齐的覆盖矩阵x
(m)

[0012]
s106:使用s105得到的覆盖矩阵x
(m)
和s104得到的违反向量y
(m)
分别作为样本和标签对dlfl模型进行训练,得到训练好的模型f;
[0013]
s107:对于目标程序p构建如下n
×
n的单位矩阵x作为辅助覆盖矩阵:
[0014][0015]
其中每一行代表一个虚拟测试用例在n个语句上的覆盖情况,并且i个虚拟测试用
例只覆盖第i个语句;
[0016]
s108:将所述辅助覆盖矩阵x输入模型f得到可疑值向量其中包含了缺陷程序p的n行代码中每一行的可疑值即
[0017]
作为改进,所述s105中将每个mtg的覆盖矩阵进行转换得到与违反向量y
(m)
对齐的覆盖矩阵x
(m)
,使用如下公式:
[0018][0019][0020]
其中,表示表示第k个语句是否在测试用例c的执行中被覆盖到了;将s
i
∪f
i
中的每一个测试用例在第k个语句处的覆盖情况进行逻辑或运算,便能得到第i个mtg在该语句处总体上的覆盖情况全部n个语句的覆盖情况构成该mtg下的覆盖向量最后,全部m

个覆盖向量构成m
′×
n的覆盖矩阵x
(m)

[0021]
相对于现有技术,本发明至少具有如下优点:
[0022]
本发明方法一方面,使用蜕变关系取代了测试用例,用它来描述程序的预期行为,另一方面,它通过检查预定义的蜕变关系是否有被违反,定义了蜕变标签。通过这两方面的调整,深度学习型缺陷定位便能够在原本无标签的数据集上正常工作。
[0023]
本发明方法,结合蜕变测试将dlfl方法从监督学习扩展为自监督学习,使得有标签数据集不再是应用dlfl的必要条件。
[0024]
本发明方法,一方面,使用蜕变关系取代了测试用例,用它来描述程序的预期行为,另一方面,它通过检查预定义的蜕变关系是否有被违反,定义了蜕变标签。通过这两方面的调整,深度学习型缺陷定位便能够在原本无标签的数据集上正常工作。
附图说明
[0025]
图1为dlfl的工作流程。
[0026]
图2为覆盖矩阵(样本)和失效向量(标签)。
[0027]
图3为dlfl的深度学习模型。
[0028]
图4为辅助覆盖矩阵。
[0029]
图5为本发明方法的基本流程图。
具体实施方式
[0030]
下面对本发明作进一步详细说明。
[0031]
dlfl是利用含有多个隐层的人工智能神经网络,学习出能够识别到对程序失效负有潜在责任的语句的定位模型。具体来说,dlfl把从执行测试用例集收集到的信息作为输入,然后利用神经网络学习语句行为和程序失效间的复杂非线性关系,训练模型之后,训练好的模型被用于评估每行语句含有缺陷的可疑值,得出所有语句按可疑值降序的排序列
表。本节只将展示这一过程中的必要细节。
[0032]
从每一个测试用例的执行中收集到的信息分为两个部分,运行时信息和执行结果,更准确一点说应该是覆盖信息(即是否被覆盖)和测试结果(即是否失效)。
[0033]
在对程序就某个测试用例上的一次完整的执行完成之后,那些被执行过至少一次语句就称为被该测试用例覆盖到了,剩下那些没有被执行到的则称为未被覆盖。全部语句的覆盖状态组成了一个二值向量,其中取1意味着被覆盖到了的状态,取0则表示为被覆盖。
[0034]
测试结果表示程序是否运行正确。通常情况下,测试结果是通过对程序输出与同测试用例相匹配的测试预言进行比较而得到的。如果两者不相同,则称为失效,如果相同则视为通过。出于要在缺陷语句和失效结果间建立关联的目的,本发明中用1表示失效,用0表示通过。
[0035]
总之,一个含有n行语句的目标程序,以及一个包含m个测试用例的测试用例集,能够产生的覆盖向量和测试结果如图2所示,其中x
ij
=[test caseicoversj

th statement],y
i
=[test case i results in failure]。[
·
]称为艾佛森括号,它本质上是一个值域为{0,1}的函数,如果方括号内的条件满足则取1,不满足则取0)。全部的覆盖向量组成了覆盖矩阵(即训练样本),全部的测试结果构成了失效向量(即训练标签)。
[0036]
图3主要呈现了dlfl中的深度学习过程。正如图中所展示的,本发明将引入讲述三种具有代表性的dlfl技术,它们也正是本实验中所用到的。它们分别是使用卷积神经网络的cnn

fl、使用循环神经网络的rnn

fl和使用多层感知机的mlp

fl。这三种神经网络有着同样的接口,即,它们都有着一个包含有n个结点的输入层和一个只含1个结点的输出层。在训练过程中,它们都从覆盖矩阵中逐行读入样本输入,更新网络权重,使得网络的输出与失效向量中的标签之间的差异损失降到最低。这样,覆盖信息和测试结果之间的复杂非线性关系就能被学习到了。于是,dlfl便能生成一个完成训练的模型,也就是一个基于概率的分类器。给定一个任意的覆盖向量,它能预测该覆盖情况有多大可能会引发程序失效。
[0037]
要用训练好的模型判断可疑值,dlfl首先需要构建一个辅助的覆盖矩阵作为测试集。图4展示了这一辅助覆盖矩阵的结构。它由n个虚拟测试用例的覆盖信息组成,其中每一个测试用例都覆盖着独特的一行语句。将它送到训练好的模型中做预测,便能计算出任意单行语句导致程序失效的可能性,亦即,每行语句,一旦被覆盖到了,有多大可能性导致程序失效。这一概率评估实质上和语句包含缺陷的可疑值是等价的。因此,将模型对辅助覆盖矩阵的预测作为可疑值向量,反映每行语句的缺陷程度。最后,dlfl按可疑值对全部语句进行排序,生成一个依照优先级排序的待调试的语句清单。
[0038]
蜕变测试(metamorphic testing,简称mt)是对软件测试领域中测试预言缺失问题的一种实用的解决方案。如何应用mt在测试预言缺失的情况下判断程序的功能在特定输入下运转正确。
[0039]
首先,给定一个程序和一个测试用例。目标是检查程序的功能实现,判断它是否至少能在给定的单个测试用例下运转正确。在蜕变测试中,首先需要识别出至少一条mr,也就是程序的一个属性,功能完整性的一项必要基础。在mt的过程中会需要用到若干彼此相关联的测试用例,每一个测试用例都在mr中扮演着不同的角色。它们中的一部分是源(source)测试用例,这些是原本的测试用例集所提供的;剩下的部分是后续(follow

up)测试用例,它们是在mt的过程中生成出来的。将给定的那单个测试用例作为源测试用例,于是
可以根据mr中所定义的不同角色间的关联生成出后续测试用例。如果这些测试用例的输入输出揭示除了对mr的违反,那么就能得到结论,程序失效了,否则程序通过了。因为源测试用例和后续测试用例总是以一个整体存在和使用,它们被合称为一个蜕变测试组(metamorphic testing group,简称mtg)。补充说明一点:只要mr需要,一个mtg内部是可以存有多个源测试用例的。
[0040]
基于蜕变测试的自监督深度学习型缺陷定位方法,包括如下步骤:
[0041]
s101:根据先验知识,构建目标程序p的蜕变关系mr;此处所述的蜕变关系mr是本领域技术人员针对目标程序根据先验知识构建的,是不需要付出创造性劳动即可完成的,为了便于理解,此处给出几个本领域技术人员在构建mr时要遵循的规则:
[0042]
此处所述的蜕变关系mr是本领域技术人员针对目标程序根据先验知识构建的,往往只能具体问题具体分析。一般而言,为了能够构建出实际有效的mr,需要遵循以下几个原则:
[0043]
a)正确性。mr必须反映程序功能的正确行为,换言之,如果程序功能实现正确,那么必然展现出mr中所规约的性质。
[0044]
b)易于生成后续测试用例。引入蜕变测试技术是为了低成本解决测试预言缺失的问题,而如果基于mr生成后续测试用例这一过程的复杂度过高,那么即使最终能够解决问题,也没能达到低成本这一目标,甚至得不偿失。
[0045]
c)优先选取变化元素多或表达式复杂的mr。一般而言,mr的表现形式越复杂,那么其对程序功能行为的规约便越严格,从而错误检测能力越高,更容易暴露出程序的缺陷。
[0046]
d)优先选择可产生唯一后续测试用例的mr。此项准则要求mr中不能存有随机变量,从而使得,一旦源测试用例被确定下来,后续测试用例也能被唯一确定。该准则的作用是简化后续mr验证的过程,有利于实现自动化。
[0047]
优先选择适用范围广的mr。不同的mr所能接受的源测试用例是不同的。如果某个mr只能在为数不多的几种源测试用例配置下生成后续测试用例,那么能够通过它产生的数据很少,因而实用价值很低。
[0048]
s102:首先获取测试用例集t,其中每个测试用例均为目标程序p可接受的一种输入,存储形式是文本文件,在进行mr相关操作时则会文本文件中解析出具有概括性的数据【该过程属于现有技术,此处不再赘述】。然后,根据mr的要求,从所述测试用例集t中挑出全部共m

组源测试用例s={s1,s2,

,s
m

},其中s
i
={s
i1
,s
i2
,

}表示第i组源测试用例,s
ij
表示s
i
中的第j个测试用例,并用每一个源测试用例组s
i
为mr生成相应的后续测试用例组f
i
={f
i1
,f
i2
,

},这里,一组相对应的源测试用例和后续测试用例被视为最小测试单元,即一个蜕变测试组mtg,第i个mtg内包含的测试用例为s
i
∪f
i

[0049]
这里举例说明s102中用每一个源测试用例组s
i
为mr生成相应的后续测试用例组f
i
={f
i1
,f
i2
,

}的过程如下:
[0050]
以求最大值的max缺陷程序为例,设mr的表达式为max(a,b) max(c,d)>

max(

b,

a)

max(

d,

c)且式中a≠b,其中等式左边各项构成源测试用例组{(a,b),(c,d)},等式右边各项构成后续测试用例组的{(

b,

a),(

d,

c)},该mr对源测试用例的要求是a≠b。现已挑选出一个符合要求的源测试用例组s
i
={(2,5),(3,7)},欲得到相应的后续测试用例组,首先需要将s
i
代入mr表达式,得到max(2,5) max(3,7)>

max(

b,

a)

max(

d,

c)。于是根
据式中各变量与源测试用例的映射关系可以得到a=2、b=5、c=3、d=7。将这些变量的取值代入等式,max(2,5) max(3,7)>

max(

5,

2)

max(

7,

3),即可得到等式右侧所包含的后续测试用例组f
i
={(

5,

2),(

7,

3)}。
[0051]
s103:每个mtg中的全部测试用例被逐个输入给目标程序p用于执行,从中采集每个mtg内各个源测试用例和后续测试用例的执行输出以及执行过程中的语句覆盖矩阵以及执行过程中的语句覆盖矩阵表示执行第i组源测试用例组中第j个源测试用例所获得的覆盖向,表示执行第i组后续测试用例组中第j个测试用例所获得的覆盖向量;如果将或统一用代表,那么其内的元素表示第k个语句是否在测试用例c的执行中被覆盖到了,覆盖时取1,未覆盖时取0,这里k的取值范围是[1,n],n是缺陷程序代码语句总数。[
·
]称为艾佛森括号,它本质上是一个值域为{0,1}的函数,如果方括号内的条件满足则取1,不满足则取0)。
[0052]
本发明中的采集执行输出o
i
和语句覆盖矩阵的方法为现有技术,具体的:采集执行输出的方法由两步组成,第一步是程序输出重定向,将程序输出到stdout的内容重定向至文件得到原始输出,第二步是将原始输出中有用的数据整理出来。采集语句覆盖矩阵的方法同样由两步组成,第一步是使用诸如emma、gcov、jacoco这种覆盖率工具采集程序运行的原始覆盖信息,第二步是将原始覆盖信息中有用的数据整理出来,语句得到覆盖矩阵。
[0053]
这里举例说明,所述s102中将测试用例组s
i
∪f
i
和相应的执行输出o
i
作为参数使用mr进行检验的过程如下:继续上文中基于缺陷程序max的例子,现有s
i
={(2,5),(3,7)},f
i
={(

5,

2),(

7,

3)},下面分两种情况讨论,展示mr检验可能得到的两种结果。
[0054]
a)将o
i
代入mr表达式max(a,b) max(c,d)>

max(

b,

a)

max(

d,

c),得到5 7>

(

2)

(

3),进一步简化可得12>5这一真命题,说明原表达式在o
i
的取值之下成立,从而得出结论,第i组mtg没有违反mr。
[0055]
b)将o
i
代入mr表达式max(a,b) max(c,d)>

max(

b,

a)

max(

d,

c),得到5 3>

(

5)

(

7),进一步简化可得8>12这一假命题,说明原表达式在o
i
的取值之下不成立,从而得出结论,第i组mtg违反了mr。
[0056]
s104:对于每个mtg,将测试用例组s
i
∪f
i
和相应的执行输出o
i
作为参数使用mr进行检验,判断mr是否被违反,得到该mtg的测试结果最终得到由m

行测试结果组成的违反向量这里用m={m1,m2,

,m
m

}代表全部m

个mtg,m
i
代表第i个mtg。
[0057]
s105:将每个mtg的覆盖矩阵进行转换得到与违反向量y
(m)
对齐的覆盖矩阵x
(m)

[0058]
具体使用如下公式:
[0059][0060][0061]
其中,表示表示第k个语句是否在测试用例c的执行中被覆盖到了(见s103中定义);将s
i
∪f
i
中的每一个测试用例在第k个语句处的覆盖情况进行逻辑或运算,便能得到第i个mtg在该语句处总体上的覆盖情况全部n个语句的覆盖情况构成该mtg下的覆盖向量最后,全部m

个覆盖向量构成m
′×
n的覆盖矩阵x
(m)

[0062]
s106:使用s105得到的覆盖矩阵x
(m)
和s104得到的违反向量y
(m)
分别作为样本和标签对dlfl模型进行训练,得到训练好的模型f;
[0063]
s107:对于目标程序p构建如下n
×
n的单位矩阵x作为辅助覆盖矩阵
[0064][0065]
其中每一行代表一个虚拟测试用例在n个语句上的覆盖情况,并且i个虚拟测试用例只覆盖第i个语句。如此设置之后,下一步便能借助于该矩阵充分利用模型f所学习到的非线性关系,独立地评估每行语句对违反mr所负责任的相对大小。
[0066]
s108:将所述辅助覆盖矩阵x输入模型f得到可疑值向量其中包含了缺陷程序p的n行代码中每一行的可疑值即
[0067]
实施例1:假设待测程序是sqrt(x),它的功能是,对于任意的输入x,输出它的平方根,此外假设给定的测试用例是x=2。在这一简单情景中便明显存在着测试语言缺失问题,因为,一方面的确切取值难以通过手算得出来,另一方面,还不能依赖于现有计算器,毕竟其实没法确认那些计算器提供的开方功能是否真的正确。所以,需要求助于蜕变测试。可以获知,平方根众多的数学性质里包含这一项,即现在将它用作一条mr。那么,根据mr的要求,除了x=2这一源测试用例之外,还需要生成一个随机数y作为一项后续测试用例,比如说y=7,这时另一项后续测试用例也就定了下来,z=x
·
y=14。于是现在只要对sqrt(2)与sqrt(7)的乘积和sqrt(14)作比较就能判断目标程序的实现是否正确。若两者不相等,则程序失效,反之通过。
[0068]
输入:由n=12行代码组成的缺陷程序p如下所示,程序的功能是输出两个实数中的最大值。其中第5行是缺陷的实际位置;
[0069][0070]
由m=2个测试用例构成的测试用例集t={t1,t2},用例输入及预期输出如下表所示。
[0071]
编号输入预期输出t12 22t23 13
[0072]
输出:缺陷程序p的n行代码中每一行的可疑值
[0073]
s101:根据与该程序相关的领域知识,构建出mr:将输入的两个数交换位置,最大值不变。将原程序的功能接口表示为max:(x,y)

z,即,输入两个实数x和y,调用程序max(x,y)得到两者中的最大值z。则,mr可表示为max(x,y)=max(y,x)。
[0074]
s102:根据mr的要求,从原本的测试用例集t中挑出全部共m

=2组源测试用例s={s1,s2},其中s1={s
11
},s
11
=(2,2),s2={s
21
},s
21
=(3,1)。并用每一个源测试用例组s
i
为mr生成相应的后续测试用例组,得到f1={(2,2)},f2={(1,3)}。一组相关的源测试用例和后续测试用例被视为最小测试单元,即一个蜕变测试组(简称mtg),第1个mtg内包含的测试用例为{(2,2),(2,2)},第2个mtg内包含的测试用例为{(3,1),(1,3)}。
[0075]
s103:将全部的测试用例被逐个输入给p用于执行,从中采集每个mtg内各个源测试用例和后续测试用例的执行输出以及执行过程中的语句覆盖矩阵,分别得到试用例和后续测试用例的执行输出以及执行过程中的语句覆盖矩阵,分别得到和详细取值如下。
[0076]
o1={2,2}
[0077]
o2={1,3}
[0078][0079][0080]
s104:对于每个mtg,将测试用例组s
i
∪f
i
和相应的测试输出o
i
作为参数使用mr进行检验,判断mr是否被违反,得到该mtg的测试结果最终得到违反向量具体推导过程和结果如下。
[0081][0082][0083]
s105:对于每个mtg,根据现有覆盖矩阵进行如下转换
[0084][0085]
最终得到与违反向量y
(m)
对齐的覆盖矩阵
[0086][0087]
详细取值如下。
[0088][0089]
s106:使用深度神经网络学习如下模型
[0090]
f:x
(m)

y
(m)
[0091]
得到训练好的模型f。
[0092]
本例中,采用无偏置的多元回归线性模型y=f(x)=x
·
w,学习到模型权重如下。
[0093]
w=[0 0 0 0 1 0 0 0 0 0 0 0]
t
[0094]
s107:构建如下辅助覆盖矩阵作为测试集
[0095][0096]
s108:将辅助覆盖矩阵x输入模型f得到可疑值向量其中包含了缺陷程序p的n行代码中每一行的可疑值,即具体推导过程和结果如下。
[0097][0098]
可见,第5行代码对应的可疑值为1,剩余代码为0,而实际上第5行代码正是缺陷所在,所以缺陷定位成功。
[0099]
最后说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明技术方案的宗旨和范围,其均应涵盖在本发明的权利要求范围当中。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献

  • 日榜
  • 周榜
  • 月榜