掌桥专利:专业的专利平台
掌桥专利
首页

一种基于子系统和数据恢复的Simulink测试方法

文献发布时间:2023-06-19 16:12:48



技术领域

本发明涉及软件测试领域,尤其涉及一种基于子系统和数据恢复的 Simulink测试方法。

背景技术

信息物理系统开发软件被广泛应用到航空航天、汽车制造、生命健康等核心领域。为确保软件能够满足其预期的功能和质量要求,必须对其进行全面测试。大部分软件没有完整规范的编程建模语言规则,可用的工具源码,并且进行测试需要测试人员具有一定程度的相关知识和能力,传统的测试方法难以满足上述要求。最新的解决方法是采用基于等效模输入的新模型生成方案执行少量程序修改,以快速生成等效的不同模型,基于等效模输入的变异还可以通过比较两个相同配置的编译器执行导致的编译器错误。另外还存在一些研究,使用长短期记忆网络进行随机多样变体模型的生成用于软件测试。

在当前软件测试领域,最好的软件测试方法是采用了基于等效模输入的方式进行测试,采用对测试用例模型收集到的各个模块执行覆盖信息标识程序运行中逻辑上不执行的模块,并对逻辑上不执行的模块区域有针对的进行突变,对原始模型要求较高,需要大量采用成熟的随机软件模型生成方法进行随机生成的模型中筛选出符合等效模输入要求规范的小部分模型,模型的利用率较低,同时只能针对有限的具有控制逻辑的块进行操作,对模型具体的操作块要求高,且变体模型生成方式单一,生成变体的模型差异性有限

发明内容

根据现有技术存在的问题,本发明公开了一种基于子系统和数据恢复的Simulink测试方法,具体包括如下步骤:

采用随机生成方式生成测试用例,建立测试用例集,收集用于扩大测试用例集的被测试软件的第三方使用案例;

对测试用例集中的所有测试用例进行预处理操作,对运行的测试用例进行基突变;

创建一个存储测试用例集内每个测试用例中所有模块类型前后连接关系的数据库;

采用蒙特卡罗马尔科夫链方式抽样选取测试集中的测试用例,将抽到的测试用例命名为原始测试用例;

复制原始测试用例生成新测试用例并命名为变体测试用例,并对变体测试用例进行变异操作;

对原始测试用例和生成的变体测试用例进行基于等效模输入的差分测试,同时记录出现错误的软件。

进一步的,对测试用例进行预处理操作时:逐个运行测试用例,收集测试用例中每个模块的执行覆盖信息并计算覆盖率百分比,将百分比为0的模块定义为死模块,将百分比大于0的模块定义为活模块。

进一步的,变异操作包括如下方式:

在变体测试用例中随机选择一个模块,在模块前后随机加入子系统模块,在加入的子系统模块中以分叉树的形式随机加入首尾相连的新模块;

在变体测试用例中随机选择一个模块,在被选择模块前后随机加入一对可编程模块,在可编程模块中编写实现数据恢复的代码,在两个可编程模块中间随机加入首尾相连的新模块;

在变体测试用例中随机选择一个模块,在被选择的模块前后随机加入一对可编程模块,在可编程模块中编写实现数据恢复的代码,在两个可编程模块中间随机加入首尾相连的新模块或子系统,如果生成的是子系统,则在加入的子系统中以分叉树的形式随机加入首尾相连的新模块。

进一步的,在加入新模块时包括如下方式:在测试用例中将选定模块的类型名作为关键词,输入预处理生成的模块类型,连接关系数据库得到已有的模块类型,根据已有的模块类型生成新模块;

随机从当前测试用例中已有的模块里抽取类型,并生成模块类型一致的新模块;

随机从被测软件提供的模块库中生成新模块。

进一步的,对原始测试用例和变体测试用例进行差分测试时:

运行生成的变体测试用例,记录运行过程中出现的异常,在被测软件其他编译模式下运行生成变体测试用例,记录运行过程中出现的异常;比较上述两种不同模式下变体测试用例的表现是否一致并记录不一致情况,运行原始测试用例和变体测试用例,记录两个测试用例的运行时间结果和运行数据结果,比较两个测试用例的运行时间结果和运行数据结果,记录不一致情况。

进一步的,创建模块类型前后连接关系的数据库时:在数据库中创建一张数据库空表用于记录前后连接关系数据,获取每个测试集中测试用例模型内所有模块的模块类型并命名为出发块,获取每个出发块对应模块所有数据输出端口的连接模块,并将模块类型命名为到达块,将出发块信息与到达块信息一一对应作为一条记录存入数据库中。

由于采用了上述技术方案,本发明提供的一种基于子系统和数据恢复的Simulink测试方法,该方法通过对模型中任意位置生成子系统模块并在子系统模块中生成新模块、在路径中增加以两个可以实现数据恢复效果的可编程模块为开头结尾特征的新路径变异生成变体模型、以及两者结合的混合方式生成变体,可以在一定程度上增加可用于基于等效模输入测试的生成模型数量与生成模型可用于生成变体模型的变异范围,发现更多潜藏在软件中的错误,提升了测试效果。

附图说明

为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图;

图1为本发明方法的流程图;

图2为本发明中基于子系统模块变异的示意图;

图3为本发明中基于数据恢复变异的示意图;

图4为本发明中基于子系统模块与数据恢复变异的示意图。

具体实施方式

为使本发明的技术方案和优点更加清楚,下面结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚完整的描述:

如图1所示的一种基于子系统和数据恢复的Simulink测试方法,具体包括如下步骤:

在步骤S101中:建立并扩大测试测试用例集;

其中测试用例集是使用信息物理系统开发软件生成的软件模型集合。建立测试用例集的方式是采用现有成熟随机模型生成方法进行随机的测试用例生成,例如:在信息物理系统开发软件Simulink中采用SLforge方法进行随机模型生成就是其中一种,本方法包括但不仅限于此。扩大测试用例的方式是收集被测试软件的第三方使用案例。例如:在信息物理系统开发软件Simulink的官网以及软件中会公开已在各行业使用的基于Simulink开发的真实案例。

在步骤S102中:对测试用例进行预处理和基突变;

测试用例集中的所有测试用例均是预处理的对象。预处理的步骤是:逐个运行测试用例,收集测试用例中每个模块的执行覆盖信息,执行覆盖信息由已覆盖路径与可覆盖路径的数值组成。其中可覆盖路径为该模块可通过的执行路径条数,已覆盖路径为当前模型中该模块实际通过的执行路径条数。用已覆盖路径条数除以可覆盖路径条数来计算并得到覆盖率百分比,将百分比为0的模块定义为死模块,死模块的含义为该模块在被测用例中不被执行。将百分比大于0的模块定义为活模块,活模块的含义为该模块在被测用例中被执行过。基突变包含两个方面:1.修正每个被测试模型中模块的样本时间,避免出现各模块样本时间不一致的错误2.对模块类型进行注释并通过随机函数确定模块是否用于接下来模型产生新的变体的测试操作。需要说明的是,信息物理系统开发软件中自带样本时间修正的选项,在具体实施过程中,只需要激活该选项即可。模块类型的注释是在每个运行过程中无法确定数据类型的模块前加入数据类型转换模块以确定运行过程中流过每个模块的数据类型。为保证后续变体模型变异的多样性,变异操作不针对测试用例中的每个模块,而是使用随机函数随机决定该测试用例中变异可用的模块选择范围。

在步骤S103中:创建模块类型前后连接关系数据库;

具体的,创建一个数据库用于存储测试用例中各个模块与前后模块的模块类型形成记录。数据库表包含三个字段:编号、出发块和到达块,分别对应一个唯一自增的主键、出发块的模块类型以及到达块的模块类型,其中出发块设置为基于到达块的唯一约束,以确保数据库在加入数据时不会出现多组重复数据的现象。在被测软件运行测试用例时,通过编程等方式获取到该模型下的所有模块,并根据编程获取到每个模块的模块类型,使用程序代码中的数组进行模块类型存储,我们称之为到达块组。并分别根据这些块输出端口的数量进行基于编程的程序循环获取到该模块的所有输出端口所通往的另一个模块,定义为到达块,并用与出发块相同的方式获得到块的类型,将出发进行记录,到达块进行记录,并两两对应存储在新的数组中。需要注意的是,由于被测软件的语法并不是很规范,单纯这样存储模型并不可取,他会影响我们后续使用数据库进行模模块生成。所以我们需要进行一定的类型过滤与类型补全,对于复杂且标注不清晰的模块我们跳过不收集。另外进行类型补全的方式则是将该模块与被测软件的模块库中自带库里的块进行循环比较,判断是否存在命名相同的情况,如果存在,则用更加具体的库名作为该块类型的标识。最后连接数据库,并将我们前面存好的出发块与到达块组一一对应存入我们预先设置好的数据库表中。

在步骤S104中:采用蒙特卡罗马尔科夫链方式抽样选取测试用例并命名为原始测试用例;

需要说明的是,命名是指我们后续对这部分选中的测试用例的一种称谓,在实际过程中并不对上述抽样选中的测试用例进行名称或属性的改变。本方法使用的蒙特卡罗马尔科夫链与常规抽样方法中使用无异,未做其他改变。

在步骤S105中:复制原始测试用例生成新测试用例并命名为变体测试用例,对变体测试用例进行变异操作;

其中,基于原始测试用例进行复制操作,将复制出来的测试用例命名为变体测试用例,在实际操作过程中并不对变体测试用例进行模型中属性或模块的改变,仅在名称中加以区分原始测试用例。对变体测试用例进行变异操作,主要包含三个方式:

1.在变体测试用例中随机选择一个模块,在模块前后随机加入子系统模块,在加入的子系统模块中以分叉树的形式随机加入首尾相连的新模块.具体的,如图2所示,模块A21与模块E23为普通模块,在被随机选中的模块A21后加入子系统模块22,子系统模块22中以分叉树的形式随机加入了模块B221、模块 C222以及模块D223,这三个模块的模块类型没有特殊要求。

2.在变体测试用例中随机选择一个模块,在被选择模块前后随机加入一对可编程模块,在可编程模块中编写实现数据恢复的代码,在两个可编程模块中间随机加入首尾相连新模块;如图3所示,可编程模块A 31与可编程模块B 34 为插入的可编程模块,模块F 32与模块G 33代表在可编程模块中随机加入的新模块。在本方法实际操作中包括但不限于2个模块,图中仅代表可能出现的一种情况,且加入的新模块其模块类型不做具体要求。在可编程模块中编写代码,在实际模型运行过程中数据流入可编程模块A31后数据分成两个分支进行流通,其中一个分支流经模块F32、模块G33最后到达可编程模块B34,另一个分支上数据直接流入可编程模块B34。可编程模块B34最后只输出可编程模块31直接流过的数据结果,使数据流经可编程模块31与可编程模块34前后数据结果不变,形成数据恢复效果。

3.在变体测试用例中随机选择一个模块,在被选择的模块前后随机加入一对可编程模块,在可编程模块中编写实现数据恢复的代码,在两个可编程模块中间随机加入首尾相连的新模块或子系统,如果生成的是子系统,则在加入的子系统中以分叉树的形式随机加入首尾相连的新模块。本方法结合了上述方法1 与方法2,不做过多描述。

需要说明的是,上述内容中反复出现的随机加入新模块方式有以下三种,分别为:

1.从连接关系数据库中增加

2.从被测软件提供的模块库中增加

3.从当前测试用例中已有的模块增加

算法思路如下所示:

其中具体添加模块的方式:1.从连接关系数据库中添加;将每一层中当前选择模块的模块类型作为关键字出发块输入到数据库中进行查询并得到所有相关的记录集,随机从列出的记录集中取出一条记录的到达块,到达块的字段就是即将生成模块的模块类型,用这个模块类型进行新模块生成。2.从被测软件提供的模型库中加入;这里我们参考当前成熟的随机模型生成方法所采用的模块生成范围,从模型库中选出符合上述范围的模块。3.从当前正在执行的测试用例模型中随机抽取出一个模块,复制生成模块类型一致的新的模块。

在步骤S106中:对原始测试用例与变体测试用例进行差分测试;

差分测试在本方法中指常规差分测试与等效模输入测试。需要说明的是,根据差分测试特点,同一个测试用例在被测软件的不同编译模式下运行结果一致。根据等效模输入测试特点需要说明的是,两个在功能上表现相同的测试用例,在同一被测软件相同编译模式下运行其运行结果一致。综上所述,根据差分测试特点,变体测试用例分别在被测软件的不同编译模式下运行,其运行时间结果与运行数据结果等应一致,记录运行过程中出现的异常并比较测试用例在不同编译模式下出现的不一致情况。根据等效模输入特点,分别在被测软件下运行原始测试用例与对应复制生成且经过变异操作的变体测试用例,其运行结果一致,记录运行过程中的异常,并比较两个测试用例出现的不一致情况。

以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,根据本发明的技术方案及其发明构思加以等同替换或改变,都应涵盖在本发明的保护范围之内。

技术分类

06120114740662