4. 测试序列基础
TestStand 的核心执行模型建立在“序列(Sequence)”之上。一个测试程序无论规模大小,本质上都是由一个或多个序列组成的执行蓝图。理解 Sequence、Step、Step Type、Step Properties 与 Sequence Flow 这五个基础概念,是掌握 TestStand 的起点。它们之间的关系可以概括为:Sequence 是容器,Step 是执行单元,Step Type 决定 Step 的行为模式,Step Properties 定义 Step 的配置与状态,而 Sequence Flow 则控制这些 Step 的执行路径与跳转逻辑。 本章将逐一拆解这五个要素,并重点剖析它们在实际工程中的协作方式。
上图展示了 TestStand 中序列执行的核心模型。左侧是 Sequence 容器,内部包含多个 Step;Step Type 定义了每个 Step 的行为类型;Step Properties 则存储了每个 Step 的详细配置。右侧的 Sequence Flow 展示了执行引擎如何根据步骤结果(Pass/Fail)和跳转条件(如 Goto、Jump)在步骤之间移动。这张图是理解 TestStand 执行机制的总纲,下面我们将逐一深入。
4.1 Sequence:测试程序的容器与执行上下文
核心原理
Sequence 是 TestStand 中最高层级的执行单元,它包含一组有序的 Step 以及执行这些 Step 所需的上下文信息。每个序列文件(.seq)至少包含一个 MainSequence,这是测试程序启动时的默认入口。除了主序列,还可以创建子序列(Subsequence)用于封装可复用的测试逻辑,以及 Cleanup 序列用于资源清理和错误恢复。
每个 Sequence 都拥有独立的 Sequence Context,其中包含局部变量、参数、文件全局变量引用以及运行时的状态信息。这意味着同一个序列可以被多次调用,每次调用都会创建独立的上下文,互不干扰。
判断方法:如何设计序列结构
在设计序列结构时,应遵循以下原则:
- 单一职责:每个子序列只完成一个逻辑功能,例如“初始化仪器”、“测量电压”、“生成报告”。
- 层次化调用:MainSequence 负责顶层调度,通过调用子序列来组织测试流程。
- 错误隔离:将可能出错的步骤放在独立的子序列中,并配合 Cleanup 序列进行资源释放。
案例拆解:一个简单的开机自检序列
假设我们需要设计一个电源模块的测试程序。MainSequence 可以包含以下步骤:调用“初始化电源”子序列、调用“测量输出电压”子序列、调用“关闭电源”子序列。每个子序列内部再包含具体的测试步骤。这种设计使得主流程清晰,且子序列可以被其他测试程序复用。
4.2 Step:序列中的最小执行单元
核心原理
Step 是序列中的一行,是 TestStand 执行的最小单元。每个 Step 都基于一种 Step Type 创建,并拥有自己的属性(Properties)。Step 的执行结果(Passed、Failed、Done、Skipped)会直接影响 Sequence Flow 的走向。
Step 可以执行多种操作:调用外部代码(DLL、VI)、执行测试并给出 Pass/Fail 判定、控制流程(跳转、循环)、与操作员交互(弹出消息框)、或者仅仅是记录一条信息。
操作流程:创建一个 Step 并配置其属性
- 在序列编辑器中,从 Insert 菜单选择要插入的 Step Type。
- 在 Step 的 Properties 面板中,配置 Name(步骤名称)和 Description(描述)。
- 根据 Step Type 的要求,填写输入参数、输出参数、限制值等。
- 在 Post Actions 选项卡中,设置步骤执行后的动作,例如“如果失败则跳转到指定步骤”。
常见误区
4.3 Step Type:定义步骤的行为模式
核心原理
Step Type 是 TestStand 的“行为插件”。它决定了 Step 在运行时执行什么代码。TestStand 提供了多种内置 Step Type,主要分为以下几类:
| 类别 | Step Type 名称 | 典型用途 |
|---|---|---|
| 测试 | Pass/Fail Test | 执行一个测试并给出布尔结果(Pass/Fail) |
| 测试 | Numeric Limit Test | 测量数值并与上下限比较,产生 Pass/Fail |
| 动作 | Action | 调用 DLL、执行 VI、运行外部程序,无判定结果 |
| 流程控制 | Flow Control | 包含 Goto、Jump、Sequence Call 等控制逻辑 |
| 消息 | Message Popup | 弹出对话框与操作员交互 |
| 报告 | Report Text | 向测试报告写入自定义文本 |
判断方法:如何选择合适的 Step Type
选择 Step Type 的核心依据是是否需要产生测试结果。如果步骤的目的是获取一个数值并与限制比较,应使用 Numeric Limit Test。如果步骤只是执行一个动作(如切换继电器),不需要判定结果,应使用 Action。如果需要根据条件改变执行路径,应使用 Flow Control。
案例拆解:使用 Numeric Limit Test 进行电压测量
假设我们需要测量一个 5V 电源的输出电压,允许误差 ±5%。我们插入一个 Numeric Limit Test 步骤,配置其输入为从万用表读取的电压值,设置 Low Limit 为 4.75,High Limit 为 5.25。TestStand 会自动比较测量值并给出 Pass/Fail 结果,并将结果记录到报告中。
4.4 Step Properties:步骤的配置中心
核心原理
Step Properties 是附着在每一个 Step 上的数据集合。它定义了步骤的名称、执行的模块、输入输出参数、超时时间、错误处理方式以及报告生成选项。通过修改 Properties,可以在不改变 Step Type 的前提下,动态调整步骤的行为。
Properties 面板通常包含以下主要选项卡:
- General:步骤名称、描述、启用/禁用状态。
- Module:指定要调用的 DLL、VI 或代码模块。
- Parameters:定义输入参数、输出参数和返回值。
- Limits:设置测试的上下限(仅对测试类 Step Type 有效)。
- Post Actions:设置步骤执行后的跳转、循环或终止逻辑。
- Report Options:控制该步骤的结果是否显示在报告中。
操作流程:动态修改 Step Properties
在测试执行过程中,可以通过属性表达式动态修改 Step Properties。例如,可以根据上一个步骤的测量结果来调整当前步骤的限制值。在 Limits 选项卡中,将 High Limit 设置为表达式 Step.Result.Measurement + 0.5,即可实现动态限制。
常见误区
4.5 Sequence Flow:控制执行路径的引擎
核心原理
Sequence Flow 是 TestStand 执行引擎的核心机制。它决定了在每一步执行完毕后,下一步应该执行哪个 Step。默认情况下,TestStand 按顺序执行序列中的步骤,但通过 Flow Control 步骤和 Post Actions 中的跳转设置,可以实现条件分支、循环、跳转等复杂流程。
TestStand 的流程控制主要基于以下概念:
- 顺序执行:默认行为,执行完 Step N 后自动执行 Step N+1。
- 条件跳转:根据步骤结果(Pass/Fail/Done)跳转到指定步骤。
- 循环:通过 Flow Control 步骤实现 For 循环、While 循环。
- 调用:通过 Sequence Call 步骤调用子序列,执行完毕后返回调用点。
判断方法:设计流程控制逻辑
在设计流程时,应遵循“先画流程图,再写步骤”的原则。明确每个步骤的出口条件,以及失败时的处理路径。例如,对于一个需要重试的测试项,可以在 Post Actions 中设置“如果失败,则跳转到重试计数器步骤”。
案例拆解:实现一个带重试机制的测试流程
假设我们需要测试一个通信接口,允许最多重试 3 次。我们可以设计如下流程:
- Step 1:初始化重试计数器(Action,设置变量
RetryCount = 0)。 - Step 2:执行通信测试(Numeric Limit Test)。
- Step 3:判断结果(Flow Control)。如果测试通过,跳转到 Step 6(结束)。如果失败,进入 Step 4。
- Step 4:增加计数器(Action,
RetryCount += 1)。 - Step 5:判断计数器是否小于 3(Flow Control)。如果小于 3,跳转回 Step 2 重试;否则进入 Step 6。
- Step 6:结束测试。
这个流程展示了 Sequence Flow 的核心价值:通过跳转和条件判断,实现灵活的测试策略。