4. 测试用例设计方法与虚拟调试适配

传统软件测试中的等价类划分、边界值分析、状态迁移测试和场景法,在虚拟调试环境中依然有效,但它们的输入对象、观察窗口和判定依据发生了根本变化。传统测试面对的是函数、接口或界面,输入是离散参数,输出是返回值或页面状态;虚拟调试面对的是PLC程序、机器人控制器、驱动器和仿真模型构成的闭环系统,输入是信号时序,输出是设备动作、状态字和过程数据。因此,方法本身要保留,但用例的构造方式必须围绕信号和状态重新组织。

等价类与边界值:从参数区间转向信号时序区间

等价类划分在虚拟调试中不再只针对一个数值参数,而是针对一组相关信号的取值组合。例如某输送线工位,入口光电传感器 B1、到位传感器 B2、启动按钮 Start 和急停 EStop 共同决定工位是否允许进料。有效等价类可以定义为:EStop=1(未拍下)、B1 在 0→1 后 B2 在 200ms 内变为 1、Start=1。无效等价类则包括急停拍下、B2 超时未到、Start 在 B1 之前已为 1 等。这里的关键是:等价类不再是一个数值范围,而是一组带时间约束的信号组合。

边界值分析同样要迁移到时间维度和信号跳变沿。以 B2 到位检测为例,若程序设定 200ms 内必须检测到上升沿,则边界用例应覆盖 199ms、200ms、201ms 三个时刻,并额外覆盖“刚好在 200ms 时抖动一次”的情况。虚拟调试中,时间边界往往比数值边界更容易触发故障,因为仿真时钟和控制器扫描周期之间存在离散化误差。建议在用例中明确写出信号名、目标值、相对触发时刻和允许误差,例如:

用例 BV-04-01
信号: B2_Arrive
触发: B1 上升沿后 200ms
期望: 输送线保持运行, 状态字 M10.3=1
容差: ±1 个 PLC 扫描周期 (假设 10ms)
异常判定: 若 201ms 仍未置位, 程序应进入等待超时分支

状态迁移:以状态机为骨架组织用例

虚拟调试中的设备大多具有明确的状态机,例如“空闲—进料—定位—加工—出料—故障”。状态迁移测试的核心是覆盖所有合法迁移和关键非法迁移。合法迁移用例验证正常工况:从空闲态收到启动信号后进入进料态,到位后进入定位态,定位完成进入加工态。非法迁移用例则验证异常工况:在加工态直接触发急停,系统应进入故障态并切断输出;在故障态未复位时再次按启动,系统应保持故障态而不是重新运行。

构造状态迁移用例时,建议为每个迁移定义四元组:当前状态、触发事件、目标状态、可观察输出。例如:

当前状态触发事件目标状态可观察输出
空闲Start 上升沿进料输送电机 Q0.0=1
进料B2 上升沿定位定位气缸 Q0.1=1
定位定位到位 300ms加工主轴 Q0.2=1, 状态字=3
加工EStop 下降沿故障所有输出=0, 故障字=0x01
故障Reset 上升沿且 EStop=1空闲故障字=0, 允许重新启动

这张表本身就是一组可执行的用例骨架。在虚拟调试中,每个迁移都可以通过仿真信号注入来触发,并通过 PLC 变量表或 HMI 状态字观察结果。需要注意的是,状态迁移用例必须考虑“同一事件在不同状态下产生不同结果”的情况,例如 Start 在空闲态是合法启动,在加工态则应被忽略或触发报警。

场景法:把正常与异常工况串成完整任务链

场景法适合覆盖跨工位、跨设备的连续过程。一个典型正常场景是:上料机器人抓取工件→输送线送入→视觉定位→加工完成→下料机器人取走。异常场景则包括:抓取失败、输送卡料、视觉超时、加工中急停、下料位满等。虚拟调试的优势在于,这些场景可以在不损坏真实设备的前提下反复运行,并且可以精确控制每个信号的时序。

设计场景用例时,建议按“主场景+扩展场景”组织。主场景只包含最顺利的路径,扩展场景则从主场景的某个步骤分叉,注入异常。例如主场景在第 3 步“视觉定位”处,扩展场景 A 注入“视觉结果超时 500ms”,期望系统进入等待重试;扩展场景 B 注入“视觉结果错误”,期望系统进入废料剔除分支。这样既能保证正常工况覆盖,又能系统性地覆盖异常工况。

虚拟调试用例设计:信号时序 + 状态迁移 + 场景覆盖 信号时序层 B1 入口光电 0→1 t=0ms 触发 B2 到位光电 0→1 t=200ms 期望 Start 启动按钮 0→1 t=0ms 之前已置位 EStop 急停 1→0 任意时刻注入 边界值用例 199ms / 200ms / 201ms ±1 扫描周期容差 状态迁移层 空闲 进料 定位 加工 故障 Start B2 到位 EStop EStop Reset 迁移四元组 当前状态 → 触发事件 → 目标状态 → 可观察输出 场景覆盖层 主场景:正常工况 上料→输送→定位→加工→下料 扩展 A:视觉超时 500ms 无结果 → 等待重试 扩展 B:视觉错误 结果错误 → 废料剔除 扩展 C:加工中急停 EStop → 故障态 → 复位 扩展 D:下料位满 满料信号 → 暂停进料 覆盖判定 正常路径 + 异常分支 全部状态迁移至少执行一次 驱动 组合

虚拟调试适配的三个关键调整

第一,时间成为一等输入。传统用例只关心“输入什么值”,虚拟调试用例必须关心“在什么时刻输入、持续多久、与其它信号相差多少”。例如急停信号在加工开始后 50ms 注入和在加工完成后 50ms 注入,系统响应完全不同。建议在用例中统一使用相对时间轴,以某个基准信号(如 Start 上升沿)为 t=0,其余信号标注相对时刻。

第二,观察对象从返回值变为过程变量。虚拟调试中,用例的判定依据通常是 PLC 变量表中的状态字、HMI 上的报警文本、仿真模型中的位置和速度曲线。设计用例时,应提前指定“观察点”,例如 M10.3 表示输送运行、DB1.DBW2 表示当前状态机编号、Q0.2 表示主轴输出。没有明确观察点的用例,在虚拟调试中很难自动判定通过或失败。

第三,异常工况要主动注入而非等待发生。真实设备上异常往往难以复现,虚拟调试则可以通过信号强制、时序偏移、数值篡改等方式主动制造异常。例如将 B2 到位信号延迟到 250ms 再置位,或将视觉结果强制写为错误码,观察程序是否进入预期的异常处理分支。这种“主动注入”能力,是虚拟调试用例设计相比传统测试最大的优势。

在虚拟调试中,建议为每个用例标注“信号注入方式”:是手动强制、脚本定时置位,还是通过仿真模型自然产生。手动强制适合快速验证单个迁移,脚本定时置位适合回归测试,仿真模型自然产生则最接近真实工况但耗时较长。三种方式可以混合使用,但同一用例中应保持一致,避免时序基准混乱。

用例设计检查要点

  • 每个等价类是否对应一组明确的信号组合,而不是单个数值?
  • 边界值是否覆盖了时间边界和信号抖动边界?
  • 状态迁移表是否覆盖了所有合法迁移和至少一条非法迁移?
  • 场景用例是否包含主场景和至少三个异常扩展场景?
  • 每个用例是否指定了观察点和判定阈值?
  • 异常注入方式是否明确,是否可重复执行?