基于数据流需求模型的测试用例生成方法

2023-11-21 14:12虞砺琨陈华南王小丽
电子设计工程 2023年22期
关键词:控制流接收数据测试用例

黄 晨,于 倩,虞砺琨,陈华南,王小丽

(1.北京轩宇信息技术有限公司,北京 100190;2.北京控制工程研究所,北京 100190)

航天嵌入式软件功能算法复杂度高、涉及数据多,功能正确性与应用场景、上下文紧密关联,传统的需求分析方式难以清晰展示复杂功能逻辑、数据关联关系,用例设计的质量依赖于人员经验,存在大量重复性工作[1]。基于模型的测试方法[2],依据需求规格说明建立测试模型,模型的语义和语法定义严格,抽象程度高,所生成的测试用例集来自于模型中的数据流、对象流、消息流等形成的路径集合,具有输入数据和预期输出结果,可以满足嵌入式软件测试标准和要求[3-6]。当前模型测试中的覆盖准则和方法主要围绕模型结构、路径的覆盖策略开展[6-7],与数据流相关的功能需求需要验证数据值与执行逻辑的对应关系及正确性。当前针对数据流的测试基于程序的控制流图CFG 开展,主要关注程序中变量的定义、使用之间的关联[8]。基于程序代码的分析技术涉及大量表达式和变量,生成数据的消耗非常大,文献引入了基于蚁群算法[9-11]、神经网络算法[12]、遗传算法[13-14]等多种测试数据生成方法来提升数据生成效率。

文中从星载嵌入式软件数据特性出发,选取活动图模型作为需求建模语言,对比控制流、数据流对象的语义模型,说明适用功能场景、用例数据上的差异性,针对数据流对象需求模型,提出了一种基于路径数据覆盖的测试数据生成方法,并选取一个典型功能模型验证方法的有效性。

1 需求模型及用例设计

1.1 模型及图元语义

系统建模语言(Systems Modeling Language,SysML)是标准的面向对象的建模语言,使用活动图、状态机图、序列图着重表现系统的动态行为[15-16]。活动图图元有活动节点和活动边,使用活动节点和活动边对操作之间的流对象进行建模,既能够表示控制流,也能够表示对象流。

控制流用虚线表示,用于对一个节点流向另一个节点的情况进行建模。当一个动作或活动节点结束执行时,控制流将马上传递到下一个动作或者活动节点,类似于控制流程,对象是前一个活动的输出,后一个活动的输入。控制流强调软件执行一串活动、动作的过程情况,控制流对象是软件的活动、动作。

对象流用实线表示,包括数据流和信号流两种。数据流的对象是一个活动的输入或输出,表示一种数据流关系。信号流将一个信号发送、信号接收与一个对象相连接,表示向该对象发送、该对象接收一个信号。数据流强调数据从一个活动、动作流向下一个活动、动作的数据变化,数据流对象是软件活动、动作所产生的数据。

1.2 典型模型及应用场景

以指令接收功能为例,如图1 和图2 所示,具体说明控制流、数据流对象模型的差异性、功能场景适用性。

图1 控制流模型

图2 数据流模型

图1 表示软件接收到数据指令后的一系列动作、行为。软件从接收到启动接收指令后,开始接收数据。如果数据接收完成或者接收数据超时,则处理接收到数据;如果接收数据未完成,则继续接收数据。控制流模型中经常会出现环路。

图2 表示对接收到数据进行校验和处理。软件对接收到的数据进行校验,如果校验和正确,则组包正确应答数据包;如果校验和错误,则组包错误应答数据包。应答包组包完成后,发送该数据包。

采用等价类划分的方法对上述控制流和数据流模型开展用例设计。图1 的控制流模型测试用例有三个:

用例1,对应路径(1)-(2)-(3)-(4)-(6)-(7)。输入:a.接收到启动接收指令;b.接收数据正常。预期结果:输出接收数据状态为“接收数据完成”。

用例2,对应路径(1)-(2)-(3)-(4)-(5)-(3)-(4)-(6)-(7)。输入:a.接收到启动接收指令;b.接收数据超时(数据包长度字段大于实际接收到数据包字节数)。预期结果:输出接收数据状态为“接收数据超时”。

用例3,对应路径(1)-(2)-(3)-(4)-(5)-(3)-(4)-(6)-(7)。输入:a.接收到启动接收指令;b.接收数据超时(接收数据过程中,暂停一段时间,继续接收数据)。预期结果:输出接收数据状态为“接收数据超时”。

用例2 和用例3 具有相同的测试路径,均存在环路(3)-(4)-(5)-(3)-(4),但是步骤b 的测试场景(输入数据)有所不同。

图2 的数据流模型测试用例有两个:

用例1,对应路径(1)-(2)-(3)-(6)。输入:接收到校验和正确的串口数据。预期结果:输出“正确应答数据包”。

用例2,对应路径(1)-(4)-(5)-(6)。输入:接收到校验和错误的串口数据。预期结果:输出“错误应答数据包”。

采用控制流建立模型时,重点关注测试需求设计中来自于外部事件触发的执行动作、逻辑是否正确。针对动作执行序列、状态转换过程等功能,一般建立控制流模型。

采用数据流建立模型时,重点关注数据值对执行逻辑的影响。针对数值计算、数据采集与转换等关注于数据处理的功能,一般建立数据流模型。

2 用例数据生成

针对数据流模型,测试用例的覆盖性和充分性决定于测试输入数据能否有效覆盖模型中的全部有效路径。

根据数据流模型中图元的语义,对模型结构进行解析,将其转换为有向图,计算可执行路径;根据路径上变量类型和输入域、输出域范围、表达式类型及测试覆盖要求,求解表达式中变量数据值,作为测试用例的数据。数据流模型计算转换过程如图3 所示。

图3 计算转换过程

2.1 数据流模型

根据需求模型中数据对象的变化过程进行建模,判定节点上为判定表达式,动作节点上为赋值表达式。

2.2 模型结构解析与计算

根据模型图元及属性对结构进行解析,建立数据流模型中图元与有向图的映射关系,活动、动作节点对应有向图的节点,数据流对应有向图的边,确定有向图的初始节点、终止节点等基本属性。采用深度优先搜索遍历有向图,考虑节点是否有父节点、是否有子节点、父节点名称、相邻节点、是否遍历终止节点等情况,计算得到可执行路径的集合。

2.3 数据表达式求解

2.3.1 变量基本属性

模型中涉及的所有变量都需要进行基本属性定义,基本属性有变量名、输入/输出、变量类型(静态、动态)、数据类型(整形、单精度浮点型、双精度浮点、结构体等)、有效范围、离散/连续、步长、初值。

对于模型变量类型,静态变量表示初值可观,数值来自于外部设定;动态变量表示初值无法直接观测,数值由模型中表达式求解所得。

2.3.2 表达式类型及测试覆盖要求

将模型中的表达式分为两种类型和四种子类型。类型有判定表达式和赋值表达式;子类型有逻辑表达式、关系表达式、条件表达式、算术表达式。表达式子类型不同,生成数据的覆盖要求不同,要求如图4 所示。

图4 表达式类型及数据覆盖要求

数据覆盖要求如下:

1)等价类数据:有效等价类数据为有效取值范围内的典型或者任意数据;无效等价类数据为有效取值范围外的典型或者任意数据。

2)边界值数据:高端边界值考虑有效取值范围内等于边界值,稍小于边界值,有效取值范围外稍大于边界值;低端边界值考虑有效取值范围内等于边界值,稍小于边界值,有效取值范围外稍大于边界值。

3)修正条件判定数据:数据集合应满足每个输入输出至少出现一次,每一个判定中的每一个条件必须能够独立影响一个判定的输出,即在其他条件不变的前提下仅改变这个条件的值,而使判定结果改变的数据。4)初始数据:算术表达式变量的初始值。5)指定数据:算术表达式的指定数据值。

2.3.3 表达式求解

建立路径上表达式组的集合,依据每类表达式所需满足的数据覆盖要求求解表达式组。算法实现过程如图5 所示。

图5 表达式组求解过程

2.4 用例数据

根据测试用例设计要求对测试数据进行分组,形成测试用例集。确定某个或多个静态变量的数值变化规律作为用例前提条件,测试用例可包括多个步骤,每个步骤包括输入数据和输出数据,一个用例中多个步骤之间的输入数据值应有所不同。

3 实例验证

选取星载嵌入式软件某数据处理功能建立数据流对象模型,该功能属于算法类功能,模型中涉及多个输入数据排列组合的表达式,设计测试用例时考虑输入数据的覆盖情况。

依据输入文件,建立活动图数据流模型作为功能需求模型,生成满足路径和数据覆盖的测试用例集。功能需求模型如图6 所示。

图6 数据处理功能模型

1)变量定义

根据变量基本属性对图6 中的模型变量进行定义,共定义九个变量:

①In_A[N]、In_B[N]、In_C[N]:输入,静态,整型,有效范围0/1,离散,步长无,初值无;

②t_Cal[N]、t_P[N]:输入,动态,整型,有效范围0/1,离散,步长无,初值无;

③N:输入,静态,整型,有效范围6,离散,步长无,初值无;

④i:输入,静态,整型,有效范围0~N-1,离散,步长1,初值0;

⑤num:输入,静态,整型,有效范围3,离散,步长无,初值3;

⑥g_Flag:输出,静态,整型,有效范围0/1,离散,步长无,初值无。

2)变量操作说明

FOR 表示依次遍历某个变量中指定范围的数据;SUM 表示计算指定范围内数值的和。

3)生成路径集合

对需求模型进行解析,图5 中的数据流用编号进行标识,生成全部路径六条,可执行路径三条,删除不可执行三条路径。路径集合为:①路径1:(1)-(2)-(3)-(5)-(6)-(8)-(9),可执行;②路径2:(1)-(2)-(3)-(5)-(7)-(8)-(9),可执行;③路径3:(1)-(2)-(4)-(8)-(10),可执行;④路径4:(1)-(2)-(3)-(5)-(6)-(8)-(10),不可执行;⑤路径5:(1)-(2)-(3)-(5)-(7)-(8)-(10),不可执行;⑥路径6:(1)-(2)-(4)-(8)-(9),不可执行。

4)生成表达式组集合

根据表达式类型建立每条路径上的表达式组集合,求解生成表达组的输入数据集合,在三条可执行路径上共生成六组表达式集合,选取可执行路径1和3 上表达式组进行说明,如图7 所示。

图7 表达式组示例

5)测试用例集生成

①路径1(1)-(2)-(3)-(5)-(6)-(8)-(9)表达式组

当In_A 有且仅有四个1 时,生成15 组数据;当In_A 有且仅有五个1 时,生成6 组数据;当In_A 有且仅有六个1 时,生成1 组数据。

满足等价类数据覆盖要求,形成三个测试用例,具体如表1-3 所示。测试用例1 考虑当In_A 有且仅有四个1 的情况;测试用例2 考虑当In_A 有且仅有五个1 的情况;测试用例3 考虑当In_A 有且仅有六个1 的情况。

表1 测试用例1

表2 测试用例2

表3 测试用例3

③路径3(1)-(2)-(4)-(8)-(10)表达式组

在In_A有且仅有两个1,In_B、In_C输入值有解情况下,生成15 组数据;在In_A 有且仅有一个1,In_B、In_C 输入值有解的情况下,生成六组数据;在In_A 全0,In_B、In_C 输入值有解的情况下,生成一组数据。

满足等价类数据覆盖要求,形成三个测试用例。

4 结论

文中选取活动图模型作为需求建模语言,活动图中控制流和数据流对象在适用功能场景、用例数据方面具有差异,控制流强调软件执行一串活动、动作的过程情况;数据流强调从一个活动、动作流向下一个活动、动作的数据变化。建立数据流对象模型,设定变量类型、有效范围等基本属性,对模型解析后得到可执行路径及表达式组,可求解生成满足测试覆盖要求的数据及测试用例集,这种方法将测试重点放在测试需求分析及建模上,既能有效缩短用例设计时间又同时保证生成测试用例的充分性,大幅提升测试效率。

基于模型的自动化测试方法,在提升需求分析能力的同时保证测试充分性,后续结合领域软件特征及用例设计要求,继续研究典型需求建模方法,推进模型测试在航天领域的工程化应用。

猜你喜欢
控制流接收数据测试用例
冲激噪声背景下基于幅度预处理的测向新方法*
抵御控制流分析的Python 程序混淆算法
工控系统中PLC安全漏洞及控制流完整性研究
抵御控制流分析的程序混淆算法
基于SmartUnit的安全通信系统单元测试用例自动生成
低复杂度多输入多输出雷达目标角度估计方法
基于混合遗传算法的回归测试用例集最小化研究
单片机模拟串口数据接收程序的实现及优化
基于依赖结构的测试用例优先级技术
基于控制流隐藏的代码迷惑