![TestStand工业自动化测试管理(典藏版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/333/43738333/b_43738333.jpg)
5.3.2 运行时(RunState)属性
RunState容器中包含很多子属性,序列执行过程中的实时信息都存储在RunState中,这也是它的名称由来。在图5-10所示变量窗格中(先不关注“Object Reference”对象引用数据类型),很多子属性是非常直观的,如“IsProcessModel”表示当前执行序列是否属于过程模型,“Tracing”表示是否使能了追踪功能,“SequenceFailed”表示序列状态,子属性保存了序列执行时的状态,读者可以逐个查看,这里不再逐一介绍。其中,RunState.SequenceFile、RunState.Sequence、RunState.Step包含的信息较多,它们分别代表序列文件、序列和步骤。
![](https://epubservercos.yuewen.com/48B856/23020650909763706/epubprivate/OEBPS/Images/42745_104_1.jpg?sign=1739039672-0Sbub4vV29D6IkLazMRF5AHHhSRgoIyE-0-73afe3b93eb4957d16bb25a6af20a582)
图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包含的子属性
![](https://epubservercos.yuewen.com/48B856/23020650909763706/epubprivate/OEBPS/Images/42745_105_1.jpg?sign=1739039672-0F41sM4Xc4zfPsFyWfttPbX0r76WbhFJ-0-fd324f8214e9e83843766180501fbddb)
2.RunState.Sequence
RunState.Sequence代表的是一个序列对象,它表示当前正在被执行的序列,包括了局部变量、参量、序列中的所有步骤。RunState.Sequence其实是RunState.SequenceFile.Data.Seq序列数组中某个序列元素的运行时拷贝,它保存了序列执行的实时信息,例如某个变量在执行过程中被更新了,那么在RunState.Sequence的子属性RunState.Sequence.Locals中就立刻保存了该变量的最新值。RunState.Sequence包含的子属性列举在表5-2中。
表5-2 RunState.Sequence包含的子属性
![](https://epubservercos.yuewen.com/48B856/23020650909763706/epubprivate/OEBPS/Images/42745_105_2.jpg?sign=1739039672-Yfn0jvIyQsF2QUFHEmUfhErwr6ldVo8N-0-83bab50c35d049bf6fb83c620413f817)
续表
![](https://epubservercos.yuewen.com/48B856/23020650909763706/epubprivate/OEBPS/Images/42745_106_1.jpg?sign=1739039672-vE2iTFXFJcZUWW1kWxI4koiSEY4DPaQD-0-4d2eef381731b83abc22202c064e8cb9)
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,在序列未执行时,它甚至是不可见的。
![](https://epubservercos.yuewen.com/48B856/23020650909763706/epubprivate/OEBPS/Images/42745_106_2.jpg?sign=1739039672-j2WDKgOHfUcg6E1G2XcWODrmDkQnSuVi-0-a9f7a8ddf5f25fcd7c4e0e8be31de07f)
图5-11 RunState容器中包含的动态属性
以RunState.Main属性为例,它指向最少嵌套的序列,并且必须不是过程模型中的序列。假如创建了客户端序列文件且使用了过程模型,那么RunState.Main一般是指客户端序列文件的主序列。在序列未执行或处于编辑状态时,RunState.Main值为空;而序列执行时,TestStand将主序列的上下文信息(Sequence Context数据类型)作为对象引用传递给它,此时动态属性就有了实际意义且可以被访问了,它包含了主序列的所有当前信息,如图5-12所示。
![](https://epubservercos.yuewen.com/48B856/23020650909763706/epubprivate/OEBPS/Images/42745_107_1.jpg?sign=1739039672-ukkwA510YAIpu6KXGUsdnDtb2hLfQanv-0-330dc03faad7432d049a80bd0ff9839d)
图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,它表示客户端序列文件对象引用,只有通过过程模型执行序列时该属性才存在。
![](https://epubservercos.yuewen.com/48B856/23020650909763706/epubprivate/OEBPS/Images/42745_108_1.jpg?sign=1739039672-TCjmAZtiZmhANQ7aXVxrz0cANgBweZAx-0-70bcd3dbace1d57d3fa8359b5c75abee)
图5-13 Audio Test步骤设置“Pre-Expression”
![](https://epubservercos.yuewen.com/48B856/23020650909763706/epubprivate/OEBPS/Images/42745_108_2.jpg?sign=1739039672-bNi2GkmxpwyP3khnHiXTWOcvLAkhLFnD-0-b08772cd8ab2a379c13cb126fb3aaff8)
图5-14 Video Test步骤的先决条件设置
![](https://epubservercos.yuewen.com/48B856/23020650909763706/epubprivate/OEBPS/Images/42745_108_3.jpg?sign=1739039672-ODkpq06ZpUUHJstHIn9ycmfYX0BcdFHn-0-e80c5e48ea8b3de7b2b0f70663f053c9)
图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所示。
![](https://epubservercos.yuewen.com/48B856/23020650909763706/epubprivate/OEBPS/Images/42745_109_1.jpg?sign=1739039672-fgl0S0Cy1fRKDj53Ahd6yTUvpQ5aU2eC-0-6cc6caa4de173153e44e399eb912655a)
图5-16 主序列
(7)执行菜单命令“ConfigureResult Processing”,在弹出的对话框中,确认“Report”栏中“Enabled”选项是选中的,且报表格式是“XML”(这是完成TestStand 2013安装时的默认配置),如图5-17所示。
![](https://epubservercos.yuewen.com/48B856/23020650909763706/epubprivate/OEBPS/Images/42745_109_3.jpg?sign=1739039672-wcXODJsxe1DDVxO4yPJ3reEzgKzn79Sf-0-65595f6f92b9bd70edb021c21856b30b)
图5-17“Result Processing”对话框中报表栏的设置
(8)保存序列文件,通过菜单命令“ExecuteSingle Pass”执行序列。在序列执行完成后会生成XML报表,注意观察报表中Audio Test步骤和Video Test步骤的结果,如图5-18所示。
![](https://epubservercos.yuewen.com/48B856/23020650909763706/epubprivate/OEBPS/Images/42745_109_5.jpg?sign=1739039672-4z9GGQBJ8EfM6inKaQCSnic43NshP7cN-0-373e8089f1045622ff3cfb73b6b761bd)
图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所示的警示窗口;如果确认表达式没有问题,就可以忽略该警示。
![](https://epubservercos.yuewen.com/48B856/23020650909763706/epubprivate/OEBPS/Images/42745_110_3.jpg?sign=1739039672-x5aFkP9XcT5KwTLdfb2gGnaus2awqupy-0-bb344669a7b7ef6cd8f8aa2459ae739a)
图5-19 表达式评估警示窗口
在范例资源的第5章练习中,例程<Exercises>\Chapter 5\Step Property and RunState Property-solution.seq完成的是上面的练习,读者可以运行该范例并观察结果。