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中要特别注意仿真步长的影响。如果步长过大,边界附近的瞬态过程可能被跳过,导致测试结果失真。建议在边界附近减小步长或使用变步长求解器,并开启过零检测。

决策表:映射到条件组合与逻辑分支

决策表适合描述多个条件组合下的动作选择。在Simulink控制模型中,决策表最直接的映射对象是Stateflow状态图、逻辑子系统以及带有多个条件输入的Switch模块。例如,一个空调控制器的决策逻辑可能依赖三个条件:温度是否高于设定值、湿度是否高于阈值、是否处于节能模式。三个条件组合出8种情况,每种情况对应不同的压缩机、风机和加湿器动作。

在Simulink中实现决策表测试,可以先用Stateflow绘制状态转移图,然后用Test Sequence模块或Signal Editor构造覆盖所有条件组合的输入序列。对于每个组合,记录输出动作是否符合决策表预期。如果模型使用Truth Table模块,则可以直接在模块中定义决策表,然后通过仿真验证每个规则是否被正确触发。

决策表测试的关键在于条件组合的覆盖。在Simulink中,可以使用Coverage工具中的“条件覆盖”和“决策覆盖”指标来检查是否所有条件组合都被执行。例如,对于三个布尔条件,完整的条件组合覆盖需要8个测试用例。如果某些组合在仿真中从未出现,Coverage报告会显示未覆盖的条件分支,提示需要补充测试用例。

三种方法在Simulink中的协同使用

在实际测试中,三种方法往往需要协同使用。等价类划分帮助确定测试的宏观范围,边界值分析聚焦于风险最高的临界点,决策表则处理多条件组合的逻辑分支。以一个典型的Simulink控制模型为例:输入信号先经过等价类划分确定代表值,然后在每个代表值附近用边界值分析补充临界点,最后用决策表覆盖模式切换和逻辑分支。这样形成的测试用例集,既覆盖了输入空间的主要区域,又抓住了边界和逻辑组合这两个缺陷高发区。

测试用例设计方法 → Simulink控制模型映射关系 等价类划分 信号幅值范围 参数取值区间 工作模式枚举 代表值选取 边界值分析 限幅上下限 死区边界 状态切换阈值 临界点±ε 决策表 多条件组合 逻辑分支选择 模式切换规则 全组合覆盖 Simulink 映射对象 Signal Editor / Builder From Workspace 模块 Saturation / Dead Zone Stateflow 状态图 Truth Table 模块 Switch / Multiport Switch Test Sequence 模块 Coverage 覆盖率分析 测试执行与观察 构造分段输入信号 覆盖各等价类代表值 边界附近密集采样 观察限幅/切换行为 遍历条件组合 验证逻辑分支正确性 记录输出与状态 对比预期结果 Coverage 报告 条件/决策/分支覆盖 未覆盖 → 补充用例 协同使用:等价类定范围 → 边界值抓临界 → 决策表覆盖组合 → Coverage 验证完整性

从方法到用例:一个可执行的映射示例

下面以一个简化的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中做边界值测试时,要注意浮点数比较的精度问题。例如判断T > 30时,如果T恰好等于30.0,由于浮点误差可能被判定为不大于30。建议在模型中使用带容差的比较逻辑,或在测试用例中明确记录实际使用的数值精度。

三种方法在Simulink中的映射,本质上就是把测试设计中的“输入域”“边界”“条件组合”这些抽象概念,对应到模型中的信号源、参数、比较模块、状态机和逻辑分支上。只有把方法落到具体的模块和信号上,测试用例才具有可执行性,覆盖率指标才有实际意义。