TestStand API编程:在SequenceFile中操作Sequence和Step
TestStand API编程:在SequenceFile中操作Sequence和Step
一、Sequence 介绍
在TestStand测试框架中,Sequence
(序列)是构成测试流程的核心单元。一个Sequence
包含一系列按顺序执行的Step
(步骤),用于定义具体的测试逻辑。每个Sequence
有唯一的名称和索引,可通过TestStand API进行动态创建、修改和执行。Sequence
支持参数传递、流程控制(如分支、循环)以及与外部模块(如C#、Python代码)的交互,是实现自动化测试逻辑的基础。
二、Step 介绍
Step
(步骤)是Sequence
的最小执行单元,用于定义具体的操作(如仪器控制、数据采集、逻辑判断等)。每个Step
包含以下关键属性:
- Step Type:指定步骤的类型(如
Action
、SequenceCall
、Loop
等)。 - Module Name:执行步骤时调用的模块名称(如C#程序集名称)。
- Entry Point:模块中具体的方法或函数名。
- Parameters:步骤执行时所需的输入/输出参数。
通过TestStand API,可以动态创建Step
、设置属性,并将其添加到Sequence
中,实现灵活的测试流程编排。
三、获取SequenceFile中的Sequence
核心思路
通过SequenceFile
对象的方法获取序列列表,支持按索引或名称检索。
代码示例
using NationalInstruments.TestStand.Interop.API;var engine = new Engine();// 加载序列文件
var sequenceFile = engine.GetSequenceFileEx("YourSequenceFile.seq");// 方法1:通过索引获取序列(索引从0开始)
var sequenceIndex = 0;
var sequence = sequenceFile.GetSequence(sequenceIndex);// 方法2:通过名称获取序列
var sequenceName = "MyTestSequence";
var namedSequence = sequenceFile.GetSequenceByName(sequenceName);// 输出序列名称
Console.WriteLine($"Sequence Name: {sequence.GetName()}");
四、向SequenceFile中添加Sequence
核心思路
使用InsertSequenceEx
方法插入新序列,需指定序列类型和名称。
C#代码示例
using NationalInstruments.TestStand.Interop.API;var engine = new Engine();// 加载序列文件
var sequenceFile = engine.GetSequenceFileEx("YourSequenceFile.seq");// 插入新序列
var sequenceIndex = 0;
var sequence = engine.NewSequence();
// 设置序列属性,如Name:
sequence.Name = "YourSequenceName";
sequenceFile.InsertSequenceEx(sequenceIndex, // 序列索引sequence // 序列
);
五、获取SequenceFile中的Step
核心思路
先获取目标Sequence
,再通过Sequence
对象的Steps
集合访问步骤。
C#代码示例
using NationalInstruments.TestStand.Interop.API;
var engine = new Engine();
var sequenceFile = engine.GetSequenceFileEx("YourSequenceFile.seq");// 获取序列,以MainSequence为例
var targetSequence = sequenceFile.GetSequenceByName("MainSequence");// 方法1:通过步骤索引获取Step
var stepIndex = 0;
var firstStep = targetSequence.GetStep(stepIndex, StepGroups.StepGroup_Main);// 方法2:通过步骤名称获取Step
var stepName = "InitializeInstrument";
var namedStep = targetSequence.GetStepByName(stepName, StepGroups.StepGroup_Main);// 获取Step列表
var steps = Enumerable.Range(0, targetSequence.GetNumSteps(StepGroups.StepGroup_Main)).Select(i => targetSequence.GetStep(i, StepGroups.StepGroup_Main)).ToList()
六、向SequenceFile中添加Step
核心思路
通过Sequence
对象的Steps.Add
方法动态添加步骤,需指定步骤类型和模块信息。
C#代码示例
using NationalInstruments.TestStand.Interop.API;
var engine = new Engine();
var sequenceFile = engine.GetSequenceFileEx("YourSequenceFile.seq");// 获取序列,以MainSequence为例
var targetSequence = sequenceFile.GetSequenceByName("MainSequence");// 创建新步骤,Action为StepType
var step = engine.NewStep("","Action");
step.Name = "NewStep";// 插入Step
var stepIndex = 0;
targetSequence.InsertStep(step, stepIndex, StepGroups.StepGroup_Main);
下面是StepType
列表,具体含义请参考steptypes:
StepType_Action –(Value: "Action")
StepType_Break –(Value: "NI_Flow_Break")
StepType_CallExecutable –(Value: "CallExecutable")
StepType_Case –(Value: "NI_Flow_Case")
StepType_Continue –(Value: "NI_Flow_Continue")
StepType_DoWhile –(Value: "NI_Flow_DoWhile")
StepType_Else –(Value: "NI_Flow_Else")
StepType_ElseIf –(Value: "NI_Flow_ElseIf")
StepType_End –(Value: "NI_Flow_End")
StepType_For –(Value: "NI_Flow_For")
StepType_ForEach –(Value: "NI_Flow_ForEach")
StepType_Goto –(Value: "Goto")
StepType_If –(Value: "NI_Flow_If")
StepType_Label –(Value: "Label")
StepType_LimitLoader –(Value: "LimitLoaderStep ")
StepType_MessagePopup –(Value: "MessagePopup")
StepType_MultiNumericMeasurement –(Value: "NI_MultipleNumericLimitTest")
StepType_NumericMeasurement –(Value: "NumericLimitTest")
StepType_PassFailTest –(Value: "PassFailTest")
StepType_PropertyLoader –(Value: "NI_VariableAndPropertyLoader")
StepType_PropertyLoaderEx –(Value: "NI_PropertyLoader")
StepType_Select –(Value: "NI_Flow_Select")
StepType_SequenceCall –(Value: "SequenceCall")
StepType_Statement –(Value: "Statement")
StepType_StreamLoop –(Value: "NI_Flow_StreamLoop")
StepType_StringMeasurement –(Value: "StringValueTest")
StepType_SweepLoop –(Value: "NI_Flow_SweepLoop")
StepType_Wait –(Value: "NI_Wait")
StepType_While –(Value: "NI_Flow_While")
七、设置Step的RunMode
在 TestStand 进行脚本编辑时,经常需要对 Step 的 RunMode 进行设置,以下是使用 Api 设置 RunMode 的具体过程:
using NationalInstruments.TestStand.Interop.API;
var engine = new Engine();
var step = engine.NewStep("", stepType);// 设置为Skip,该Step不执行
step.SetRunModeEx("Skip");
// 设置为Normal,该Step执行
step.SetRunModeEx("Normal");
八、添加Sequence并使用Step调用
完整流程示例
using NationalInstruments.TestStand.Interop.API;
var engine = new Engine();
var sequenceFile = engine.GetSequenceFileEx("YourSequenceFile.seq");// 插入Sequence
var index = sequenceFile.NumSequences;
sequenceFile.InsertSequenceEx(index, sequence);// 获取MainSequence
var mainSequence = sequenceFile.GetSequenceByName("MainSequence");
var stepIndex = mainSequence.GetNumSteps(StepGroups.StepGroup_Main);// 创建Step
var stepType = "SequenceCall";
var step = engine.NewStep("", stepType);
step.Name = sequence.Name;// 设置Step属性
var property = step.Module.AsPropertyObject();
property.SetValBoolean("UseCurFile", 0, true);
property.SetValString("SeqName", 0, sequence.Name);// 插入Step
mainSequence.InsertStep(step, stepIndex, StepGroups.StepGroup_Main);
九、总结
通过TestStand API操作SequenceFile
中的Sequence
和Step
,可以实现以下能力:
- 动态生成测试流程,无需手动编辑序列文件。
- 批量管理序列和步骤,提升自动化测试脚本的灵活性。
- 结合C#等编程语言,实现复杂的测试逻辑与外部系统集成。
注意事项:
- 操作前需确保TestStand引擎已正确初始化,并获取
Engine
对象引用。 - 步骤的模块路径和入口点需与实际部署的程序集一致,避免运行时错误。
- 建议在代码中添加异常处理,捕获
COMException
等可能的运行时异常。
通过以上实践,可充分发挥TestStand API的可编程能力,构建高效、可扩展的自动化测试解决方案。