4.3.1 合格/失败测试
在序列中,最重要的步骤就是测试(Tests),有四种类型的测试步骤:Pass/Fail Test、Numeric Limit Test、Multiple Numeric Limit Test、String Value Test,它们将决定产品是否测试通过。在实际项目中,每个测试步骤对应的就是具体的测试项目,它们的区别在于关键属性的数据类型不同,分别是布尔型、数值型、数值型、字符串型。为了方便掌握测试步骤的使用方法,笔者事先创建了一个动态链接库文件Tests.dll,该DLL中有四个输出函数,其函数原型如图4-17所示,它的源代码位于<Exercises>\Chapter 4\Tests\Tests DLL Project。
首先介绍合格/失败测试步骤,由于代码模块是DLL,所以在插入面板中,适配器类型选择为C/C++DLL,如图4-18所示。
图4-17 测试步骤调用的DLL函数原型
图4-18 模块适配器类型选择为DLL
图4-19 合格/失败测试步骤的数据空间
新创建序列文件并保存,然后在主序列中添加合格/失败测试步骤,选中该步骤之后,观察变量窗格中Step属性,它包含了当前步骤的所有数据,除了Step.Result.Error、Step.Result.Status这些所有步骤类型都包含的基本属性,它的比较重要的属性有Step.Result.PassFail、Step.DataSource(在TestStand中,属性下面可以包含子属性,通过圆点来表示属性之间的层次关系),如图4-19所示。
在步骤设置窗格中,合格/失败测试步骤有两个特定配置页:模块(Module)和数据源(Data Source),如图4-20所示。
模块页面用于声明代码模块,如图4-20所示。在“Module”下拉框右侧单击浏览按钮,选择代码模块Tests.dll。在TestStand中第一次调用代码模块时,如果代码模块目录不在TestStand的搜索路径列表中且使用的不是绝对路径,则TestStand会弹出提示文件没有找到的对话框,要求用户选择路径方式,如图4-21所示。一般情况下,除非是特殊系统目录下的文件,否则都会选择第三种方式——“使用相对路径”。这样,一旦序列文件和代码模块一起打包到其他计算机或整体移动位置时,序列文件也能正确地加载代码模块,不会出现文件丢失的问题。
图4-20 合格/失败测试步骤设置窗格
图4-21 提示文件没有找到的对话框
选择好DLL文件之后,在“Function”栏中会自动枚举出该DLL所有的输出函数,这里选择“PassFailTest”函数。由于PassFailTest函数有一个int返回值,在“Value Expression”栏中手动输入“Step.Result.PassFail”,其含义是将代码模块的输出传递给该属性,如图4-22所示。
图4-22 合格/失败测试步骤特定配置页(模块)
接下来查看数据源页面,TestStand依据数据源决定测试是否通过。对于合格/失败步骤,一般保持默认的表达式“Step.Result.PassFail”,如图4-23所示。
图4-23 合格/失败测试步骤特定配置页(数据源)
在范例资源的第4章练习中,附有例程<Exercises>\Chapter 4\Tests\PassFailTest.seq,它所完成的就是上述工作,读者可以通过菜单命令“ExecuteSingle Pass”运行该范例并观察结果。
注意:在本章中,因为要了解并掌握TestStand中重要步骤类型的使用方法,笔者特意附上了较多的练习例程。这些例程本身很简单,建议读者对照书中内容逐个完成,并测试运行效果。
反复运行这个步骤,会发现它的状态有时是合格,有时却是失败。稍微分析一下这个过程:首先数据源是Step.Result.PassFail,然后模块页面中代码模块的返回值传递给了Step.Result.PassFail,因此代码模块的返回值会影响数据源,数据源继而影响步骤状态。由于函数PassFailTest随机地返回“0”或“1”,所以步骤状态也就时而合格,时而失败。这里给数据源下一个定义:会对步骤的状态产生决定作用的数据。在合格/失败测试步骤中,上述逻辑可以用下面一段伪码表示:
在正常运行模式下,所有测试步骤类型的共同之处在于:①正常执行完后,其状态为合格或失败,没有中间状态;②有数据源;③会调用代码模块。
关于代码模块路径的问题,这里多探讨一下。当第一次加载任何一个代码模块时,TestStand会弹出提示文件没有找到的对话框,要求选择该文件的路径方式。但是如图4-24所示,该对话框会根据当前序列文件是否已保存到确切路径而有所不同:如果是新建的序列文件并且未保存,该对话框中只有两个选项;只有当新建的序列文件保存到某个具体路径下,该对话框中才会有第三个选项——使用相对路径。因为新建的序列文件在未保存之前是没有一个确切的路径的,当给测试步骤声明代码模块时,TestStand无法计算序列文件和代码模块之间的相对路径关系,所以强烈建议用户先保存序列文件,然后调用代码模块时在提示文件没有找到的对话框中选择第三种方式——使用相对路径。
图4-24 提示文件没有找到的两种情况
但是,即使保存了序列文件,仍有可能在文件没有找到对话框只出现两个选项。
情况一:序列文件的路径为E:\PassFailTest.seq,代码模块的路径为E:\Tests DLL Project\Tests.dll。序列文件所在的目录“E:”是代码模块所在目录“E:\Tests DLL Project”的上一级目录。这种情况下,提示文件没有找到的对话框中有三个选项,可以使用相对路径。
情况二:序列文件的路径为E:\Temp\PassFailTest.seq,代码模块的路径为E:\Tests DLL Project\Tests.dll。序列文件所在的目录“E:\Temp”并非代码模块所在目录“E:\Tests DLL Project”的上一级目录,这种情况下,提示文件没有找到的对话框中只有两个选项。
所以一般建议将序列文件所在目录置于代码模块的上一级目录中,这样规范化之后利于维护代码模块的相对路径关系。当然,如果有些代码模块(如DLL)是第三方开发的且只能在固定的目录下,这时在提示文件没有找到的对话框中只有两个可选项的情况下,除非是特殊系统目录下的文件,否则选择第一种方式——将包含文件的目录添加到搜索路径列表中。这样,一旦文件不在原来声明的位置,TestStand会自动去搜索路径中寻找。建议在“Module”栏中手动输入相对路径关系,如情况二中,序列文件和DLL之间的相对路径是“..\Tests DLL Project\Tests.dll”,如图4-25所示。这样即使序列文件不在代码模块的上一级目录中,把整个更上层的目录整体打包或复制,也能保证代码模块正确加载。
图4-25 构建相对路径