4. 测试序列与测试步骤设计

在 AutomationDesk 中,一个可执行的测试用例并不是把若干操作简单堆在一起,而是由测试序列(Test Sequence)和测试步骤(Test Step)构成的层次化结构。理解这一层次关系,是后续实现参数化、复用和控制逻辑的基础。测试序列负责组织“做什么、按什么顺序做”,测试步骤负责描述“具体怎么做、用什么参数做”。

从工程视角看,测试序列相当于一个可被调用的测试过程容器,它对外暴露输入参数和输出结果,对内则按顺序、条件或循环方式驱动若干测试步骤。测试步骤是最小可执行单元,通常对应一次信号赋值、一次测量读取、一次等待、一次断言判断或一次对被测对象的操作。二者形成“序列—步骤”的两级结构,必要时还可以在序列内部再嵌套子序列,形成多级层次。

测试序列与测试步骤的层次化组织 测试序列 TestSequence_BrakeCheck 输入参数:TargetPressure、HoldTime、Tolerance 输出结果:MeasuredPressure、Pass/Fail Step1 初始化 Step2 设定压力 Step3 等待保持 Step4 读取测量 Step5 判定 控制逻辑:顺序 / 条件 / 循环 顺序执行 Step1 → Step2 → Step3 按固定次序依次运行 适合稳定流程 条件执行 if 条件成立 → 执行分支 else → 跳过或走另一分支 适合异常处理与分支判断 循环执行 for / while 重复执行步骤组 可设定次数或终止条件 适合扫描、重复采样 参数化与复用 参数化:将 TargetPressure、HoldTime、Tolerance 作为序列输入,同一序列可被不同测试用例调用。 复用:将常用步骤组封装为子序列或步骤模板,在多个测试序列中重复引用,减少重复搭建。 调用关系:主序列 → 子序列 → 步骤,形成可维护的层次结构。

4.1 测试序列的层次化组织

层次化组织的核心思想是“高内聚、低耦合”。一个测试序列只负责完成一个明确的测试目标,例如“制动压力保持检查”或“传感器零点校准”。序列内部再按功能拆分为若干步骤组,每个步骤组完成一个子任务。这样做的直接好处是:当某个子任务需要修改时,只需改动对应步骤组,不会影响其他序列。

在 AutomationDesk 中,通常采用三级结构:测试用例(Test Case)→ 测试序列(Test Sequence)→ 测试步骤(Test Step)。测试用例是最高层,负责调用一个或多个测试序列并汇总结果;测试序列是中间层,负责组织步骤和控制逻辑;测试步骤是最底层,负责具体执行。如果某个序列被多个用例复用,可以将其提升为公共子序列,通过参数接口对外提供服务。

4.2 测试步骤的添加、排序与分组

添加测试步骤时,需要明确三件事:步骤类型、目标对象和参数。以“设定目标压力”为例,步骤类型可能是“信号赋值”,目标对象是压力设定通道,参数是目标值。添加完成后,步骤会出现在序列编辑器的步骤列表中,默认按添加顺序排列。

排序决定了步骤的执行次序。AutomationDesk 允许通过拖拽调整步骤位置,也支持在步骤属性中设置前置条件和后置条件。对于有依赖关系的步骤,例如“先初始化再设定压力”,必须保证顺序正确,否则会出现未定义行为。分组则是把功能相关的步骤归入同一个步骤组,例如“初始化组”“激励组”“测量组”“判定组”。分组不仅让结构更清晰,也便于对整组步骤统一设置循环次数或启用/禁用状态。

4.3 参数化与复用

参数化是提升测试序列通用性的关键手段。假设有一个“压力保持检查”序列,如果不做参数化,每次修改目标压力都要进入序列内部改步骤参数,既繁琐又容易出错。正确的做法是把目标压力、保持时间、允许偏差定义为序列的输入参数,步骤内部引用这些参数而不是写死数值。这样同一个序列就可以被不同测试用例调用,只需传入不同的参数组合。

TestSequence BrakePressureCheck
  Input:  TargetPressure  // 目标压力,单位 bar
  Input:  HoldTime        // 保持时间,单位 ms
  Input:  Tolerance       // 允许偏差,单位 bar
  Output: MeasuredPressure
  Output: Verdict

  Step1: InitializeChannel()
  Step2: SetPressure(TargetPressure)
  Step3: Wait(HoldTime)
  Step4: MeasuredPressure = ReadPressure()
  Step5: Verdict = Abs(MeasuredPressure - TargetPressure) <= Tolerance

复用则是在参数化基础上的进一步延伸。常用的步骤组合可以封装为子序列,例如“上电初始化”“安全停机”“数据记录”等。子序列对外只暴露必要的参数,内部实现细节被隐藏。当多个测试序列都需要“上电初始化”时,直接调用同一个子序列即可,避免重复搭建和重复维护。

4.4 顺序、条件与循环控制逻辑

顺序执行是最基本的控制逻辑,步骤按列表顺序依次执行,前一步完成后才执行下一步。它适合流程固定、无需分支的测试场景。在 AutomationDesk 中,顺序执行是默认行为,不需要额外配置。

条件执行用于根据运行时状态选择不同分支。例如,当测量值超差时,需要执行“记录异常并重试”分支;当测量值正常时,直接进入“结果判定”分支。条件执行通常通过 if/else 结构实现,判断条件可以是步骤返回值、测量结果或外部信号状态。使用条件执行时,必须确保所有分支都有明确的出口,避免出现悬空路径。

循环执行用于重复运行一组步骤,常见形式有 for 循环和 while 循环。for 循环适合已知重复次数的场景,例如对 5 个采样点依次执行测量;while 循环适合由条件控制的场景,例如“持续采集直到压力稳定或超时”。循环必须设置终止条件,否则可能造成测试挂起。在工程实践中,通常还会为循环设置最大迭代次数和超时保护。

建议:在设计控制逻辑时,优先使用顺序执行,只有在确实需要分支或重复时才引入条件和循环。控制逻辑越复杂,测试序列的可读性和可维护性越差。

4.5 一个可参考的测试序列设计示例

下面给出一个“制动压力保持检查”的测试序列设计示例,用于说明上述概念如何落地。该示例中的参数和结果均为教学假设,不代表实际被测系统的真实数据。

步骤 类型 关键参数 预期观察
Step1 初始化 动作 通道号、采样率 通道状态变为 Ready
Step2 设定压力 赋值 TargetPressure = 50 bar 压力设定值写入成功
Step3 等待保持 等待 HoldTime = 2000 ms 计时结束,压力保持稳定
Step4 读取测量 测量 MeasuredPressure 读取到实际压力值
Step5 判定 断言 Tolerance = 2 bar |实测-目标| ≤ 2 则 Pass

在这个示例中,Step2 到 Step4 可以组成一个“激励—保持—测量”步骤组,并整体放入循环中,用于对多个压力点进行扫描测试。如果某个压力点超差,可以通过条件执行记录该点并继续下一个点,而不是直接终止整个序列。这样既保证了测试覆盖率,也保留了异常信息。

注意:参数化时不要将单位混用。例如目标压力用 bar,测量值用 kPa,必须在步骤内部统一换算,否则判定结果会完全错误。建议在序列输入参数中明确标注单位,并在步骤注释中说明换算关系。

掌握测试序列与测试步骤的层次化组织方法后,后续的测试数据管理、结果分析和报告生成都会变得更加顺畅。设计时始终围绕“序列负责组织、步骤负责执行、参数负责变化、复用负责效率”这一原则,就能构建出结构清晰、易于维护的自动化测试工程。