一种基于知识库的CPS模型等价模输入变异测试方法

文档序号:31121708发布日期:2022-08-13 01:24阅读:101来源:国知局
一种基于知识库的CPS模型等价模输入变异测试方法
一种基于知识库的cps模型等价模输入变异测试方法
技术领域
1.本发明涉及软件测试领域,尤其涉及一种基于知识库的cps模型等价模输入变异测试方法。


背景技术:

2.cps(信息物理系统)作为计算进程和物理进程的统一体,是集成计算、通信与控制与一体的智能系统。simulink是cps领域的多域仿真以及基于模型的设计工具。它支持系统级设计、仿真、自动代码生成以及嵌入式系统的连续测试和验证。
3.测试cps开发工具非常重要,因为cps在智能电网、自动驾驶汽车系统、医疗监控、工业控制系统、自动驾驶航空电子设备等关键领域都作为事实上的行业标准。但正式验证整个simulink工具链会非常昂贵,所以目前的技术主要有随机模型生成测试用例运行检测bug,以及利用差分测试检测bug等。
4.针对simulink开发工具,通过新型的变异手段测试工具链的bug。已有技术在检测bug过程中都具有一定的缺陷。具体缺陷如下:变体差异性不足:检测simulink工具链bug的两种技术都存在一定的缺陷。测试需要已有的测试用例和测试预言作为基准。但测试预言的获取较为困难,成本太高。利用emi变异能够一定程度上缓解这个问题,但目前已有的emi变异方法变异幅度太小,只有对僵尸区域的部分模块的删除并保证数据类型或输出一致性等前提下加入或替换块,导致变体差异性不足。变异操作的范围越小会导致差分测试可能永远也无法检测出某些隐藏部件的bug。
5.变体可靠性不足:本发明希望在变异过程中添加大量内容丰富变体,这种想法的实现源于深度学习模型的随机生成。由于simulink语言没有公布的正式语言规范,深度学习模型生成只能够从种子模型中学习simulink模型的部分规范并从零开始随机生成。从头依次生成的序列可能会产生很大的偏差。基于时序生成的rnn类的深度学习模型也不能够很好的处理simulink模型文本的长依赖问题,因此以往的模型可靠性相对较差。


技术实现要素:

6.根据现有技术存在的问题,本发明公开了一种基于知识库的cps模型等价模输入变异测试方法,具体包括如下步骤:
7.采用simulink软件标记测试用例中的所有种类模块的分步区域;
8.建立深度学习模型,该模型包括编码器、解码器和采样机制,将正确运行的测试用例作为种子模型,将预处理和编码后的种子模型输入至深度学习模型中,使用深度学习模型的反向传播特性进行训练,训练完成后的深度学习模型具有生成有效的测试用例的能力;
9.对测试用例进行变异时包括基础变异和变异操作,其中基础变异时:对测试用例的所有模块的数据类型和样本时间潜在的冲突问题进行完善,再进行生成操作;获取测试用例的嵌套僵尸区域和非僵尸区域,随机选择多个非僵尸区域的模块段输入至训练好的深
度学习模型中,对模块段进行续写生成能够正确运行的simulink测试用例,将生成的测试用例单独存储在知识库中,其中知识库中测试用例数量随着变异次数的增长而增长;变异操作时:遍历嵌套僵尸区域,删除以子系统为单位划分的嵌套僵尸区域中的部分模块,并在此子系统内部添加由知识库中随机选择的测试用例,遍历所有区域后获得变体测试用例;
10.对simulink软件进行测试:设置定量的变异次数,对变体测试用例与其原simulink测试用例进行差分测试,编译和运行测试用例,获取测试用例中每个模块的输入输出值,对比变体测试用例与原simulink测试用例的所有输入输出值,如果产生差异,则记录该差异信息,否则完成测试过程。
11.获取分步区域时首先获取所有模块的执行覆盖率,从而判断符合条件的变异模块,将其定义为僵尸块,将僵尸块所在的区域作为等价模输入的变异区域,对模块的层次结构进行分类,剔除位于顶层的僵尸块获得中间区域僵尸块,将中间区域作为嵌套僵尸区域。
12.进一步的,采用python语言和tensorflow框架建立深度学习模型。
13.进一步的,对种子模型进行预处理时:获取测试用例的文本序列,删除文本序列中的默认配置信息、默认参数序列、空格、注释和位置信息,再交错模块与连接线信息;对种子模型进行编码时:将常见关键字和参数名的单词映射到数字,其余的本文序列的每个字符分别映射到数字,最终得到由数字表示的编码后的文本序列。
14.对模块的数据类型和样本时间潜在的冲突问题进行完善时:对每个模块前添加一个类型转换模块注释每个模块的类型,从而防止变异改变模块的数据类型推断结果;标记产生信号模块的样本时间参数,目的使变异满足等价的条件。
15.对模块段进行续写生成能够正确运行的simulink测试用例时:获取该部分模块并写入新文件,通过simulink软件的文件保存特性得到mdl格式的模块段,读取该mdl文件的文本序列并输入完成训练的深度学习模型中,利用深度学习模型的采样机制生成新的测试用例并单独存储在知识库中。
16.进行变异操作时:遍历每一个嵌套僵尸区域,随机选择区域中的僵尸块,判断该僵尸块是否为if条件块或子系统模块,并不进行删除操作,对于其他的嵌套僵尸区域块进行随机删除,保存其被删除模块的前后连接信息,随机加载知识库中的模型,在该区域内添加整个模型的所有模块和连线,连接模型的首尾模块到被删除模块的前后连接位置上;重复以上操作,直至所有嵌套僵尸模块处理完成,获得变体测试用例。
17.进行变异操作时:遍历每一个嵌套僵尸区域,随机选择区域中的僵尸块,判断该僵尸块是否为if条件块或子系统模块,这样的模块不予删除,对于其他的嵌套僵尸区域块进行随机删除,保存其被删除模块的前后连接信息;随机加载知识库中的模型,在该区域内添加整个模型的所有模块和连线,并将首尾与被删除模块的前后模块相连;重复以上操作,直至所有嵌套僵尸模块处理完成,获得变体测试用例。
18.由于采用了上述技术方案,本发明提供的一种基于知识库的cps模型等价模输入变异测试方法,该方法通过深度学习获取随机测试用例作为潜在的可变知识,增加了变体测试用例的多样性和随机性;通过嵌套僵尸区域添加大量测试用例模块的方法解决了变体测试用例与原simulink测试用例差异性过小的问题,拓展了变体的差异性,最终获取到更加可靠和多样的变体测试用例,从而提高了差分测试检测cps软件bug的可能性。
附图说明
19.为了更清楚地说明本技术实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
20.图1为本发明方法的流程图;
21.图2为本发明中对测试用例进行变异过程的示意图。
具体实施方式
22.为使本发明的技术方案和优点更加清楚,下面结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚完整的描述:
23.如图1所示的一种基于知识库的cps模型等价模输入变异测试方法,具体包括如下步骤:
24.s1:获取嵌套僵尸区域:区分僵尸块与普通模块是通过模块在数据流的执行过程中是否对最终结果产生影响所决定的,采用simulink软件的执行覆盖率功能来确定一个测试用例所有模块中僵尸块的数量和区域。对僵尸块以外的模块我们暂时不做处理,测试用例具有子系统和嵌套子系统的层次结构,根据这个特点对僵尸块进行分类。剔除位于顶层的僵尸块获得中间区域僵尸块,将中间区域作为嵌套僵尸区域。
25.s2:建立并训练深度学习模型:包括三个步骤:
26.s21:建立深度学习模型:使用python语言和tensorflow框架建立深度学习模型,采用经典的transformer深度学习模型,深度学习模型的结构包括编码器、解码器和采样机制。
27.编码器由n层相同的自注意力机制层堆叠而成,其中每个自注意力机制层由位置编码机制、多头注意力机制和全连接前馈网络组成。位置编码机制使用相对位置表示来模拟mdl文本序列x={x1,

,x
l
,

,xn}之间的成对关系。位置编码公式如下:
[0028][0029][0030]
其中,pos表示标记在x中的位置,thres表示阈值,i是向量中每个标记的索引,d
model
是向量的维数。多头注意力机制允许模型并行训练自注意力机制,使模型能够关注mdl文本序列的不同方面。随后,多个自注意力机制层被顺序连接在一起,公式如下所示:
[0031][0032][0033][0034]
[0035][0036]
z=multihead(q,k,v)=concat(head1...headh)
·
wo[0037]
这里的w
x
表示输入转换为向量的权重矩阵,q,k和v分别代表自注意力机制的查询向量、键向量以及值向量。另外,每一个wi都是q,k,v线性变换的矩阵,而wo表示多头注意力机制的权重矩阵。随后,多头注意力机制的输出信息通过残差连接和归一化网络层以及前馈神经网络层进行调整,作为编码器的最终输出s。这些公式可以表示如下:
[0038]
l=layernorm(x+z)
[0039]
ffn(l)=max(0,l
·
w1+b1)
·
w2+b2[0040]
s=layernorm(l+ffn(l))
[0041]
其中,w1和w2是编码器的权重矩阵,layernorm是归一化函数,b1和b2是编码器的偏置矩阵。
[0042]
解码器对编码期间获得的隐藏层向量进行解码。解码器由位置编码机制、多头注意机制、全连接前馈网络和softmax层组成。解码器的位置编码机制、多头注意机制和全连接前馈网络与编码器。随后,基于softmax层计算当前状态下的下一个代码标记的概率,公式如下:
[0043][0044]
其中wf是全连接层的权重矩阵,s
de
是解码器的全连接层输出,是解码器的偏置矩阵。
[0045]
采样机制设置为:选择一段文本序列作为种子序列输入深度学习模型,深度学习模型采样出基于该文本序列的下一个词,将种子序列与采样的词连接起来作为下一次深度学习模型的输入。按照这样的方式依次采样下一个词。同时,设置一些停止序列采样的限制,例如(1)文本序列的词的总数超过5000个时停止;(2)在生成的括号符合结构规范的情况下停止生成。检验采样得到的完整序列是不是一个有效的测试用例,如果是,就将其作为采样机制的结果,如果不是,则重新采样。
[0046]
s22:对测试用例进行预处理和编码:我们获取测试用例的mdl格式的文本序列,该格式由simulink软件直接生成,作为保存测试用例的格式。对测试用例的预处理和编码过程,详细步骤为:(1)删除blockdefaults{...}和annotationdefaults{...};(2)删除除了system{...}以外的所有的其他模型参数,如配置默认值,图形界面默认值,以确保模型可以被编译;(3)然后进行删除空白,将长块名转换为短块名,删除任何注释和位置信息;(4)为了让生成的模型中块与线的信息联系更紧密,我们在mdl文件中交错块和连接线信息,使得每对连接的块被定义后能随之得到它们的连接信息;(5)编码采用混合编码制度,将常见关键字和参数名映射到词,其余映射到字符。
[0047]
s23:对深度学习模型进行训练
[0048]
输入预处理和编码后的测试用例到深度学习模型,利用tensorflow框架的反向传播能力对深度学习模型参数进行训练,经过定长的训练轮次,最终保存训练好的深度学习模型参数。
[0049]
如图2所示,s3:对测试用例进行变异:
[0050]
对测试用例进行基础变异有两步骤:(1)通过对每个模块前添加一个类型转换模块注释每个模块的模块类型,防止变异改变模块的数据类型推断结果;(2)对产生信号的模块的样本时间参数进行标记,目的使变异满足等价的条件。
[0051]
基础变异后,获取测试用例中的嵌套僵尸区域和非僵尸区域,随机选择一部分非僵尸区域的模块段输入至训练好的深度学习模型中,对模块段进行续写生成能够正确运行的simulink测试用例。详细步骤为:(1)获取该部分模块写入新文件;(2)通过simulink软件的文件保存功能得到mdl格式的模块段;(3)读取该mdl文件的文本序列输入训练好的深度学习模型,利用深度学习模型的采样机制生成新的测试用例,单独存储到知识库中。
[0052]
对于嵌套僵尸区域的变异的具体操作为:(1)遍历每一个嵌套僵尸区域,随机选择区域中的僵尸块,判断该僵尸块是否为if条件块或子系统模块,这样的模块不予删除,对于其他的嵌套僵尸区域块进行随机删除,保存其被删除模块的前后连接信息;(2)随机加载知识库中的模型,在该区域内添加整个模型的所有模块和连线,并将首尾与被删除模块的前后模块相连;(3)重复以上操作,直至所有嵌套僵尸模块处理完成,获得变体测试用例。
[0053]
s4:对simulink软件进行测试:
[0054]
设置定量的变异次数,变异次数根据时间和服务器计算能力而定。对变体测试用例与其原simulink测试用例进行差分测试。差分测试需要注意的是:(1)在相同的服务器环境下,采取相同的默认设置,使用simulink软件的编译和执行功能编译和运行测试用例;(2)测试过程中发现两者测试用例的输出信号产生了不同的结果,即可认为这是一个工具链的bug。更正式地说,对于程序base和其emi变体mutant,以及程序参数m,我们希望产生相同的执行结果,即
[0055]
[base(m)]=[mutant1(m)]=[mutant
...
(m)]=[mutantn(m)]
[0056]
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,根据本发明的技术方案及其发明构思加以等同替换或改变,都应涵盖在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1