4. 测试用例设计基础
在Simulink控制模型的测试中,测试用例设计方法并不是独立于模型之外的一套纸面技巧,它必须落到具体的信号、参数、状态和判断逻辑上。等价类划分、边界值分析和决策表这三种经典方法,在Simulink环境里分别对应着不同的建模对象和测试切入点。理解这种映射关系,才能把“设计用例”从抽象概念变成可执行的测试动作。
等价类划分:映射到信号范围与参数区间
等价类划分的核心思想是把输入域划分为若干子集,认为同一子集中任意一个输入对被测对象产生的行为是等价的。在Simulink控制模型中,输入域通常表现为信号幅值范围、参数取值区间或工作模式枚举。例如一个电机转速控制器,其参考转速输入可能被划分为:负转速区、零速区、低速区、中速区、高速区、超速区。每个区间就是一个等价类,测试时只需从每个类中选取一个代表值。
在Simulink中实现等价类划分,最直接的方式是使用Signal Builder或Signal Editor构造分段信号,或者用From Workspace模块加载预先定义的输入序列。对于参数类输入,则可以通过MATLAB脚本批量修改模型参数并运行仿真。例如,将转速参考值设为-500、0、300、1500、3000、6000 rpm,分别覆盖六个等价类。每个代表值运行一次仿真,观察控制器输出是否落在预期范围内。
需要注意的是,等价类划分在Simulink中有一个特殊之处:控制模型往往存在内部状态和模式切换。同一个输入幅值,在系统处于不同初始状态时可能落入不同的等价类。因此,划分等价类时不能只看输入信号本身,还要考虑模型的工作模式。例如,一个带有使能端的控制器,使能信号为0和1时,相同的转速输入可能对应完全不同的行为。此时,等价类应当定义为“使能=1且转速在低速区”这样的组合条件,而不是单纯的转速区间。
边界值分析:映射到阈值、饱和与切换点
边界值分析关注的是等价类边界及其邻近值。在Simulink控制模型中,边界通常出现在以下几种位置:信号限幅的上下限、死区边界、饱和模块的拐点、状态机切换阈值、PID输出限幅值、以及比较模块的参考值。这些边界是缺陷最容易暴露的地方,因为模型在边界两侧的行为可能发生突变。
以一个带限幅的PI控制器为例,输出限幅为[-10, 10]。边界值分析要求测试-10、-10+ε、-10-ε、10-ε、10、10+ε等值。在Simulink中,可以通过在仿真过程中注入阶跃信号或斜坡信号,使控制器输出逐渐逼近限幅边界,然后观察限幅模块是否在正确的位置起作用。更精确的做法是使用Test Sequence模块或MATLAB脚本,在特定时刻强制设置输入值,使控制器输出恰好落在边界附近。
边界值分析在Simulink中还有一个重要应用场景:状态机切换。例如,一个模式切换逻辑规定“当温度超过80°C时进入冷却模式”。那么测试用例应当包括79.9°C、80.0°C、80.1°C三个点。在Simulink中,可以用Stateflow或MATLAB Function模块实现该逻辑,然后通过Signal Editor构造温度信号,在80°C附近设置密集的采样点,观察模式切换是否准确、是否存在抖动或延迟。
决策表:映射到条件组合与逻辑分支
决策表适合描述多个条件组合下的动作选择。在Simulink控制模型中,决策表最直接的映射对象是Stateflow状态图、逻辑子系统以及带有多个条件输入的Switch模块。例如,一个空调控制器的决策逻辑可能依赖三个条件:温度是否高于设定值、湿度是否高于阈值、是否处于节能模式。三个条件组合出8种情况,每种情况对应不同的压缩机、风机和加湿器动作。
在Simulink中实现决策表测试,可以先用Stateflow绘制状态转移图,然后用Test Sequence模块或Signal Editor构造覆盖所有条件组合的输入序列。对于每个组合,记录输出动作是否符合决策表预期。如果模型使用Truth Table模块,则可以直接在模块中定义决策表,然后通过仿真验证每个规则是否被正确触发。
决策表测试的关键在于条件组合的覆盖。在Simulink中,可以使用Coverage工具中的“条件覆盖”和“决策覆盖”指标来检查是否所有条件组合都被执行。例如,对于三个布尔条件,完整的条件组合覆盖需要8个测试用例。如果某些组合在仿真中从未出现,Coverage报告会显示未覆盖的条件分支,提示需要补充测试用例。
三种方法在Simulink中的协同使用
在实际测试中,三种方法往往需要协同使用。等价类划分帮助确定测试的宏观范围,边界值分析聚焦于风险最高的临界点,决策表则处理多条件组合的逻辑分支。以一个典型的Simulink控制模型为例:输入信号先经过等价类划分确定代表值,然后在每个代表值附近用边界值分析补充临界点,最后用决策表覆盖模式切换和逻辑分支。这样形成的测试用例集,既覆盖了输入空间的主要区域,又抓住了边界和逻辑组合这两个缺陷高发区。
从方法到用例:一个可执行的映射示例
下面以一个简化的Simulink温度控制器为例,说明三种方法如何转化为具体测试用例。模型输入为温度测量值T(单位°C),输出为加热器功率P(0~100%)。控制逻辑为:T < 18时P=100;18 ≤ T ≤ 25时P=50;T > 25时P=0。同时,当T > 30时触发报警。
等价类划分:将T划分为低温区(<18)、舒适区(18~25)、高温区(>25)、报警区(>30)。代表值可选10、22、28、35。
边界值分析:在18、25、30三个边界附近取17.9、18.0、18.1、24.9、25.0、25.1、29.9、30.0、30.1。
决策表:条件为“T<18”“18≤T≤25”“T>25”“T>30”,动作包括P=100、P=50、P=0、报警。组合后形成完整的规则表。
在Simulink中,可以用Signal Editor构造上述温度序列,运行仿真后记录P和报警信号。通过Coverage工具检查是否所有条件分支都被执行。如果发现某个边界值附近的输出与预期不符,则说明模型在该边界处存在缺陷,需要进一步检查比较模块的容差设置或状态机的切换条件。
三种方法在Simulink中的映射,本质上就是把测试设计中的“输入域”“边界”“条件组合”这些抽象概念,对应到模型中的信号源、参数、比较模块、状态机和逻辑分支上。只有把方法落到具体的模块和信号上,测试用例才具有可执行性,覆盖率指标才有实际意义。