5.3.2 运行时(RunState)属性
RunState容器中包含很多子属性,序列执行过程中的实时信息都存储在RunState中,这也是它的名称由来。在图5-10所示变量窗格中(先不关注“Object Reference”对象引用数据类型),很多子属性是非常直观的,如“IsProcessModel”表示当前执行序列是否属于过程模型,“Tracing”表示是否使能了追踪功能,“SequenceFailed”表示序列状态,子属性保存了序列执行时的状态,读者可以逐个查看,这里不再逐一介绍。其中,RunState.SequenceFile、RunState.Sequence、RunState.Step包含的信息较多,它们分别代表序列文件、序列和步骤。
图5-10 运行时(RunState)属性
1.RunState.SequenceFile
RunState.SequenceFile代表的是一个序列文件对象,它表示正在执行的序列所在的序列文件,通过它可以获取序列文件的很多信息。RunState.SequenceFile的子属性RunState.SequenceFile.Data.Seq则包含了该序列文件中的所有序列,是一个序列数组,但任何时候它一直保存的是所有序列的默认值,即序列在编辑状态时的值,即使序列中的变量、属性在执行过程中被更新,也不会反映到RunState.SequenceFile.Data.Seq中。RunState.SequenceFile还有其他子属性,列举在表5-1中。
表5-1 RunState.SequenceFile包含的子属性
2.RunState.Sequence
RunState.Sequence代表的是一个序列对象,它表示当前正在被执行的序列,包括了局部变量、参量、序列中的所有步骤。RunState.Sequence其实是RunState.SequenceFile.Data.Seq序列数组中某个序列元素的运行时拷贝,它保存了序列执行的实时信息,例如某个变量在执行过程中被更新了,那么在RunState.Sequence的子属性RunState.Sequence.Locals中就立刻保存了该变量的最新值。RunState.Sequence包含的子属性列举在表5-2中。
表5-2 RunState.Sequence包含的子属性
续表
3.RunState.Step
RunState.Step代表的是一个步骤对象,它表示当前正在执行的步骤。RunState.Step其实是RunState.Sequence中某个步骤组的步骤,只是TestStand为了方便用户的访问,将当前步骤用一个单独的属性RunState.Step表示。如果用数学中集合的概念来描述RunState.Sequence和RunState.Step之间的关系,则RunState.Step是RunState.Sequence的一个子集。RunState.Step有很多子属性,这些子属性因步骤类型而异,但都会包含Result容器,Result容器下面包含Error、Status、ReportText等通用属性,这些信息已经在前面介绍过。
4.动态属性
RunState容器中有一类特殊的属性,数据类型是“Object Reference”(对象引用),类似于C语言中的指针,对象引用默认为空(Nothing),只有在序列执行时,才会给它们分配对象引用,这时这些属性才有意义,而在序列执行结束后,TestStand又会释放对象引用,这类属性称为动态属性。如图5-11所示,其中的Engine、Root、Main、Caller、Calling Step、Report、Execution、Thread就属于动态属性,它们的数据类型都是对象引用,且除Engine以外,其他的初始值都为空。还有一个动态属性RunState.ProcessModelClient,在序列未执行时,它甚至是不可见的。
图5-11 RunState容器中包含的动态属性
以RunState.Main属性为例,它指向最少嵌套的序列,并且必须不是过程模型中的序列。假如创建了客户端序列文件且使用了过程模型,那么RunState.Main一般是指客户端序列文件的主序列。在序列未执行或处于编辑状态时,RunState.Main值为空;而序列执行时,TestStand将主序列的上下文信息(Sequence Context数据类型)作为对象引用传递给它,此时动态属性就有了实际意义且可以被访问了,它包含了主序列的所有当前信息,如图5-12所示。
图5-12 序列执行时RunState.Main动态属性的值
提示:读者目前只需要对动态属性有初步的了解,关于每个动态属性的描述说明请参考TestStand帮助文档,在索引中输入关键词“RunState Subproperties”。
【练习5-3】TestStand中的属性访问。
在本练习中,模拟测试一个多媒体器件,包含音频测试和视频测试,在某些步骤中访问步骤属性或运行时属性,并且观察这些属性如何对序列的执行产生影响。
(1)打开序列编辑器,新建一个序列文件并将其保存为<Exercises>\Chapter 5\Step Property and RunState Property.seq。
(2)在插入面板中,选择模块适配器为“None”。
(3)在主序列中添加一个数值限度测试步骤,命名为“Audio Test”。在属性配置页表达式面板的“Pre-Expression”中输入“Step.Limits.Low=-1”,其他设置保持默认,如图5-13所示。
(4)在Audio Test步骤之后添加一个数值限度测试步骤,命名为“Video Test”。在其属性配置页先决条件中输入“RunState.PreviousStep.Result.Status!="Failed"”,其他设置保持默认,如图5-14所示。
(5)在Video Test步骤之后添加If步骤,在“Conditional Expression”中输入“PropertyExists("RunState.ProcessModelClient")”,如图5-15所示。PropertyExists函数用来验证某个属性是否存在。这里要验证的属性就是RunState.ProcessModelClient,它表示客户端序列文件对象引用,只有通过过程模型执行序列时该属性才存在。
图5-13 Audio Test步骤设置“Pre-Expression”
图5-14 Video Test步骤的先决条件设置
图5-15 If步骤的条件表达式
(6)创建If步骤时,TestStand会自动添加对应的End步骤。在If&End之间添加一个消息对话框,消息表达式中输入“"You are running within a process mode\n"+"Model Path:"+RunState.Root.RunState.SequenceFile.Path”。主序列现在看起来应该如图5-16所示。
图5-16 主序列
(7)执行菜单命令“ConfigureResult Processing”,在弹出的对话框中,确认“Report”栏中“Enabled”选项是选中的,且报表格式是“XML”(这是完成TestStand 2013安装时的默认配置),如图5-17所示。
图5-17“Result Processing”对话框中报表栏的设置
(8)保存序列文件,通过菜单命令“ExecuteSingle Pass”执行序列。在序列执行完成后会生成XML报表,注意观察报表中Audio Test步骤和Video Test步骤的结果,如图5-18所示。
图5-18 Audio Test步骤和Video Test步骤的结果报表
(9)如果将Audio Test步骤中的“Pre Expression”删除,然后通过菜单命令“ExecuteSingle Pass”重新执行序列,在报表中观察“Video Test”的状态。
在步骤(3)中,Audio Test步骤的“Pre-Expression”中输入“Step.Limits.Low=-1”,这是对步骤属性的访问,并对Step.Limits.Low的值进行了更新,因此虽然Measurement值为0,但它处于上下限范围之内,Audio Test步骤的状态是“Passed”。在步骤(4)中,Video Test步骤的先决条件是前一步骤的状态不能是“Failed”,所以在将Audio Test步骤中的“Pre-Expression”删除后,Audio Test步骤的状态将变成“Failed”,那么Video Test步骤的先决条件不满足,因此它的状态将会是“Skipped”,没有被执行,这在实际测试中有时会用到。比如,前一项失败的话,后续的一系列测试可能也就没必要进行了。在步骤(5)中,If语句的条件表达式为PropertyExists("RunState.ProcessModelClient"),而步骤(8)和(9)中是通过使用过程模型执行入口点Single Pass执行序列的,因此ProcessModelClient属性是存在的,所以会有消息对话框弹出;如果换成“ExecuteRun MainSequence”,就不会弹出消息对话框了。需要注意的是,步骤(6)的消息表达式中包含了动态属性RunState.Root.RunState.SequenceFile.Path,动态属性在序列编辑状态时不可访问,如RunState.Root值为“Nothing”,因此当单击表达式语法检查按钮图标时,会弹出如图5-19所示的警示窗口;如果确认表达式没有问题,就可以忽略该警示。
图5-19 表达式评估警示窗口
在范例资源的第5章练习中,例程<Exercises>\Chapter 5\Step Property and RunState Property-solution.seq完成的是上面的练习,读者可以运行该范例并观察结果。