TestStand 自定义步骤类型开发最佳实践【2】
概览
TestStand?包括?许多?内?置?步骤?类型,?这些?步骤?类型?作为?测试?序列?的?构?建?块。?除?内?置?步骤?类型?外,?用户?还?可以?在?TestStand?中?创建?自?定义?步骤?类型?来?实现?其他?功能。自?定义?步骤?类型?使?用户?可?通过?以下?方式?扩展?现有?步骤:
- 配置?步骤?属性?的?值,?并?确定?步骤?用户?可以?修改?哪些?属性
- 添加?新的?步骤?属性?来?存储?自?定义?数据,?可以?选择?性?地?将?这些?数据?记录?到?测试?结果中
- 定义?要?在?执行?主?模?块?之前?或?之后?调?用?的?代码
- 创建?接口,?使?用户?在?编辑?时?可以?配置?自?定义?步骤?属性
设计?完善?的?步骤?类型?可以?加快?序列?开发、?减少?调?试?工作、?使?开发?人员?能够?共享?标准?化?代码,?并?可以?在?多个?测试?站?和?独立?组?之间?实现?一致性。?但是,?自?定义?步骤?类型?可能?需要?大量?时间?来?计划、?编?程、?调?试、?部署?和?维护。
在?阅读?本文?之前,?请?确保?您?熟悉?创建?自?定义?步骤?类型?的?过程。?关于?此?过程?的?详细?信息,?请?参考《创建?波形?自?定义?步骤?类型》?教程。
内容
- 选择?使用?自?定义?步骤?类型?的?时机
- 定义?自?定义?步骤?类型?的?要求
- 管理?步骤?类型?数据
- 子?步骤?可?用于?配置?自?定义?步骤?类型?功能
选择?使用?自?定义?步骤?类型?的?时机
在?开始?设计?自?定义?步骤?类型?之前,?应?考虑?其他?可能?更?适合?新?功能?的?方法。
在?以下?情况?下,?不?建议?创建?或?修改?自?定义?步骤?类型:
- 新?功能?会?影响?所有?或?许多?类型?的?步骤。 在?这种?情况?下,?请?考虑?使用引擎?回调,?它?将?在?每?个?步骤?之前?或?之后?执行。
- 希望?提供?现有?步骤?的?基本?配置,?但是?不需要?新的?功能?或?属性。 在?这种?情况?下,?请?创建?包含?步骤?更改的步骤?模板。
- 希望?提供?可以?在?编辑?时?使用?的?工具?或?实用?程序。 在?这种?情况?下,?请?使用自?定义?工具?菜单项来?调?用?自?定义?代码。
可在?以下?情况?下?创建?或?修改?步骤?类型:
- 相应?功能?无法?在内?置?步骤?类型?中?实现。
- 相应?功能?需要?修改?在?现有?步骤?类型?实例?中?无法?修改?的?属性,
- 相应?功能?要求?必须?在?调?用?测试?代码?之前?或?之后?执行?操作,?例如?设置?步骤?或?分析?结果。
- 希望?借助?用户?界面?简化?配置?步骤?的?用户?体验。
- 希望?与?其他?组、?公司?或?客户?共享?功能。
下?一部分将?介绍?这些?内容。 内?置?属性?包括:
- 图?标 — 步骤?的?图?标,?位于
/?Components/?Icons文件?夹中 - 步骤?说明?表达?式 — 步骤?说明,?显示?在?步骤?类型?实例?的?步骤?窗?格中
- 版本?设置 — 用于?解决?类型?冲突
- 项目?名称?表达?式?(菜单?选项?卡)?— 定义?插入?选?板?中?步骤?的?名称
创建?自?文?档?化?说明
由于?相应?说明?无法?在?步骤?实例?中?配置,?因此?您?可以?作为?步骤?类型?开发?人员?对?说明?进行?定义,?从而?帮助?用户?创建?自?文?档?化?步骤。 说明?字?段?由?一个?表达?式?指定,?该?表达?式?可?用于?创建?显示?重要?步骤?属性?的?动态?说明。 当?用户?更改?步骤?类型?实例?中的?这些?属性?值?时,?说明?将?更新,?使?用户?可以?快速?浏览?步骤?状态,?而无?需?导航?至?步骤?设置?窗?格。
示例:下?图?第二?步?中的“步骤?说明”更?具有?描述?性,?提供?的?文?档?更?佳。 此?说明?使用?以下?表达?式?来?定义?说明:
"Calibrate Channels: " + Str(Step.minChannel) + " - " +Str(Step.maxChannel)
如果?用户?配置?了?minChannel?和?maxChannel?步骤?属性,?则?此?表达?式?会?将?说明?配置?为?动态?更新。
步骤?说明?示例
步骤?属性?默认值
开发?步骤?类型?时,?可以?为?所有?用户?可?配置?步骤?设置?配置?默认?值。 此外,?这些?属性?可?配置?为?在?步骤?实例?中?禁用,?从而?使?设置?的?默认?值?无法?被?修改。 与?内?置?属性?一样,?默认?值?也在?步骤?属性?窗口?中?进行?定义。 但是,?所有?默认?值?设置?都?包含“默认”一?词,?它?可能?存在?于?设置?名称?中?或?配置?默认?值?的?设置?选项?卡?中。
示例:状态?表达?式?属性?用于?确定?步骤?结果。 此?属性?存在?于?所有?步骤?类型?中,?每?种?步骤?类型?均?设置?为?默认?值。 在?某些?步骤?类型?中,?例如“数值?边界?测试”,?状态?表达?式?在?步骤?类型?中?被?禁用,?因此?无法?在?单?个?数值?边界?测试?步骤?中?对?表达?式?进行?编辑
设计?自?定义?步骤?类型?时,?可以?禁用?在?步骤?类型?的?实例?之间?不会?变化?的?任意?属性。 如此?可以?更好?地?控制?步骤?类型?用户?修改?行为?的?方式。?但是,?限制?用户?编辑?步骤?设置?可能?会?影响?灵活?性,?因此?您?应?仅?禁用?确定?用户?始终?不需要?修改?的?设置。
请?记住,?即使?禁用?在?步骤?实例?中?编辑?步骤?属性?默认?值?的?功能,?以后?对?这些?默认?值?所?做的?更改?也不会?传递?到?步骤?类型?的?实例。?关于?如何?解决?此?问题?的?更多?信息,?请?查看《更新?和?维护?步骤?类型》。
更新?默认?值?时?的?注意?事项
不?应?使用?这些?属性?的?值?来?定义?步骤?类型?开发?人员?可能?需要?更新?的?步骤?类型?功能。 例如,?请?勿?使用?步骤?的“Post”表达?式?来?实现?步骤?类型?特定?功能。 如果?需要?在?步骤?类型?的?未来?版本?中?更新?此?功能,?将?无法?确保?步骤?的?所有?实例?都?将?更新。 而是?应?在?步骤?前?或?步骤?后?的?子?步骤?中?实现?此?功能。
自?定义?属性
除?内?置?属性?外,?还?可以?定义?特定?于?步骤?类型?的?自?定义?属性。 这些?属性?可?用于?存储?与?步骤?类型?功能?具体?相关?的?数据。
示例:数值?边界?测试?步骤?包含?一个“Limits.High”属性,?这?是?数值?边界?步骤?类型?的?独?有?属性。 该?类型?将?此?属性?的?默认?值?定义?为?11,?用户?可以?修改?其?创建?的?每?个?实例?中的?该?值。
创建?自?定义?步骤?属性:
- 使用“查看”(View) ?“类型”(Types)菜单?或?快捷?键?Ctrl + T?导航?到?类型?视图
- 展开?步骤?类型?项。
- 右?键?单击“父”(Parent)?属性或“
”条目?来?添加?新?属性
如果?在?步骤?类型?的?结果?容器?中?定义?了?属性,?则?该?属性?将?包含?在?结果?集合?中。 然后,IncludeInReport或IncludeInDatabase标志?可?用于?将?数据?记录?到?报表?或?数据?库?中。
默认?状态?下,?用户?可以?更改?每?个?步骤?实例?的?步骤?属性?值。 但是,?如果?在?步骤?类型?中?为?步骤?属性?设置?了?共享?标志,?则?该?值?将?被?锁定?为?步骤?类型?中的?值。 与?步骤?默认?值?不同,?对?该?值?的?更新?将?传递?到?步骤?类型?的?实例。
确定?自?定义?步骤?类型?的?范围
为?步骤?属性?选择?的?数据?类型?应?由?步骤?类型?的?范围?决定。?例如,?考虑?数值?边界?测试?和?多数?值?边界?测试?步骤。 虽然?多数?值?边界?测试?可以?容纳?更多?边界?并?具有?更多?功能,?但是?也?增加?了?编辑?时?用户?界面?和?结果?记录?的?复杂?性。 更?基本?的?数值?边界?测试?的?范围?更?小,?界面?也?更?简单。?需要?的?开发?工作?更少,?除此之外,?对?测试?序列?开发?人员?而言,?范围?更?小?的?步骤?也?更易?于?使用。
在?开发?自己?的?自?定义?步骤?类型?时,?请?务必?在?定义?自?定义?属性?之前?先?定义?步骤?的?范围,?因为?所?选?的?属性?会?显著?影响?步骤?类型?的?复杂?性。
子?步骤?可?用于?配置?自?定义?步骤?类型?功能
以下?各?部分?说明?了?如何?使用?子?步骤?来?实现?以下?步骤?类型?行为:
- Runtime?功能,?应?在?主?代码?模?块?之前?或?之后?对?步骤?类型?的?所有?实例?执行
- 用户?界面,?在?编辑?测试?序列?时?查看?和?编辑?步骤?数据
- 测试?开发?人员?创建?步骤?的?新?实例?时?执行?的?功能
实现?子?步骤
子?步骤?使用?所?提供?的?TestStand?适?配?器?之一?调?用?代码?模?块。 子?步骤?无法?在?步骤?的?实例?中?修改,?对?子?步骤?设置?的?所有?更改?都?将?传递?到?步骤?类型?的?实例。
将?子?步骤?添加?到?自?定义?步骤?类型:
- 使用“查看”(View) ?“类型”(Types)菜单?或?快捷?键?Ctrl + T?导航?到?类型?视图
- 右?键?单击?步骤?类型,?然后?选择“属性…”(Properties…)
- 选择“子?步骤”(Substeps)?选项?卡。 选择?与?所需?代码?模?块?匹配?的?适?配器
- 单击“添加”(Add),?然后?选择?子?步骤?类型。 子?步骤?列表?中将?出现?一个?新?条目
- 选择?相应?条目,?然后?单击“指定?模?块”(Specify Module),?为?子?步骤?配置?代码?模?块,?方法?与?为?步骤?配置?代码?模?块?相同
多数?值?边界?测试?步骤?类型?的?步骤?后?和?编辑?子?步骤
定义?步骤?类型?的?Runtime?功能
步骤?前?和?步骤?后?子?步骤?可?用于?为?步骤?类型?定义?Runtime?功能。 在?步骤?执行?时,?这些?子?步骤?会?在?主?代码?模?块?之前?或?之后?执行。
示例:消息?弹出?步骤?类型?使用?C?代码?模?块?在?运行?时?创建?和?显示?消息?框。 此?模?块?将?在?步骤?后?子?步骤?中?调?用,
步骤?执行?顺序:?子?步骤
这些?子?步骤?可?用于?定义?适用?于?步骤?所有?实例?的?功能。 通常,?子?步骤?需要?与?步骤?类型?的?行为?相关?的?特定?数据。 在?自?定义?步骤?属性?中?定义?此?数据,?从而?确保?此?数据?在?步骤?的?所有?实例?中?均可?用。
如果?存在?多个?步骤?前?或?步骤?后?子?步骤,?则?它们?将?按照“步骤?类型?属性”(Step Type Property)?对话?框“子?步骤”(Substep)?选项?卡?上?显示?的?顺序?执行。
默认?状态?下,?测试?开发?人员?可以?为?步骤?类型?的?每?个?实例?指定?一个?代码?模?块。 如果?步骤?类型?不需要?代码?模?块,?则?应?在“禁用?属性”(Disable Properties)?选项?卡?中?为?步骤?类型?配置?禁用“指定?模?块”(Specify Module)?选项。 许多?内?置?步骤?类型?都?采用?这种?设计?方式,?例如?语?句?和?消息?弹出?步骤。
提供?长期?操作?的?视觉?反馈
TestStand?会?等待?步骤?前?或?步骤?后?子?步骤?中的?代码?执行,?然后?再?继续?下一步?操作。?如果?这些?步骤?的?代码?模?块?运行?缓慢?或?静默?运行,?TestStand?看起来?会?像是?无?响应。?为了?解决?此?问题,?可以?更改?光?标?或?使用?UI?消息?(例如?UIMsg_ProgressPercent)?来?更新?状态?栏?中的?进度?条。?
关于?如何?使用?此?方法?的?更多?信息,?请?查看《使用?UI?消息?更新?状态栏》
使用?终止?监视器
您?开发?的?代码?模?块?应?包括?并?定期?轮?询?终止?监视?器,?以便?在?用户?使用?TestStand?或?TestStand API?中的?内?置?选项?终止?或?中止?序列?执行?时?正常?应对。 如果?用户?终止?序列?执行,?借助?终止?监视?器?可以?快速?终止?相应?子?步骤。
关于?在?代码?中?实现?终止?监视?器?的?更多?信息,?请?查看《终止?监视?器?示例》
使用?步骤?前?或?步骤?后?子?步骤?代替?默认?模块
将?步骤?类型?固有?的?基本?操作?的?代码?模?块?作为?步骤?前?或?步骤?后?子?步骤?来?实现,?而不是?作为?默认?模?块。?仅?当?步骤?的?每?个?实例?可以?调?用?不同?的?代码?模?块?时,?才?使用?默认?模?块?设置。?默认?的?模?块?设置?独立?存在?于?步骤?的?每?个?实例?中,?而且?当?更改?步骤?类型?的?设置?时,?默认?状态?下,?TestStand?不会?更新?现有?的?步骤?实例。?但是,?对?子?步骤?的?更改?会?自动?影响?相应?步骤?类型?的?所有?现有?实例。
为?步骤?类型?创建?编辑?界面
编辑?子?步骤?提供?在?代码?模?块?中?实现?的?图形?用户?界面?(GUI),?用户?可以?在?编辑?时?在?其中?修改?相应?步骤?实例?的?变量?或?设置。?通常,?编辑?子?步骤?用于?配置?为?步骤?类型?定义?的?自?定义?步骤?属性。
示例:“打开?数据?库”步骤?类型?通过?编辑?子?步骤?提供?了?一个?对话?框,?使?用户?可以?配置?ConnectionString?和?DatabaseHandle?步骤?属性,?这?两?个?属性?是?数据?库?步骤?类型?的?自?定义?属性。
编辑?子?步骤?提供?了?用于?配置?步骤?设置?的?用户?界面
用户?创建?自?定义?步骤?类型?的?实例?时,?可?使用?步骤?设置?窗?格?中的?按钮?访问?编辑?子?步骤?用户?界面,?这?将?在?新?窗口?中?启动?编辑?子?步骤?UI。 不过,?像?许多?内?置?步骤?类型?一样,?也可以?直接?在?选项?卡?中?嵌入?编辑?子?步骤?用户?界面。 这种?方法?需要?额外?的?开发?工作,?并且?必须?使用.NET?语言?进行?开发,?但是?这?为?步骤?类型?的?用户?提供?了?更加?无缝?的?编辑?界面。 关于?如何?实现?嵌入式?编辑?子?步骤?界面?的?更多?信息,?请?查看《在?序列?编辑?器?中?创建?自?定义?步骤?类型?编辑?选项卡》。
?
嵌入式?编辑?界面?(上)?与?在?单独?的?窗口?中?启动?的?编辑?子?步骤?(下)?之间?的?比较
单?个?与?多个?编辑?子?步骤
一个?自?定义?步骤?类型?可以?定义?许多?属性,?如果?所有?属性?同时?向?用户?显示,?可能?会?造成?混淆。 使用?在?单独?的?窗口?中?启动?的?编辑?子?步骤?常用?方法?时,?请在?单?个?编辑?子?步骤?中?使用?组织?方法?(例如?引入?选项?卡)?将?数据?组织?到?可?管理?的?部分?中。 由于?每?个?界面?必须?独立?启动,?因此?不?建议?使用?多个?编辑?子?步骤。 例如,“打开?SQL?语?句”步骤?可?实现?带有?多个?选项?卡?的?单?个?编辑?子?步骤。
“打开?SQL?语?句”步骤?的?编辑?子?步骤?包含?两?个?选项?卡,?可?用于?对?设置?进行?分类
如果?将?嵌入式?步骤?面板?方法?用于?复杂?的?步骤?类型,?则?使用?多个?编辑?面板?的?方法?更?佳,?这?是?因为?步骤?选项?卡?上?会?清楚?地?显示?数据。?例如,“多数?值?边界?测试”步骤?包含?两?个?选项?卡,?可?用于?编辑?数值?数据?源?和?每?个?数据?源?的?边界?条件。
“边界”(Limit)?和“数据?源”(Data source)?选项?卡?分别?在?单独?的?编辑?面板?中?实现
将?编辑?子?步骤?模?态?化?到?TestStand
始终?将?编辑?子?步骤?和?其他?用户?界面?代码?模?块?模?态?化?到?TestStand,?因为?当?TestStand?调?用?编辑?子?步骤?时,?它?将?禁用?序列?编辑?器。?如果?代码?模?块?未?模?态?化,?TestStand?窗口?可能?会?隐藏?代码?模?块。?用户?可能?认为?序列?编辑?器?已?挂?起,?并?可能?尝试?终止?TestStand。
关于?如何?在?子?步骤?模?块?中?实现?模?态?化?的?更多?详细?信息,?请?参见将?对话?框?模?态?化?到?TestStand示例。
表达?式?可?用于?充分?提高?灵活性
在?编辑?子?步骤?UI?中?使用?表达?式?字?段?可?帮助?用户?与?数据?进行?灵活?交互,?并?使?用户?可以?在?属性?值?中?使用?变量?和?逻辑。 但是,?与?使用?字符?串?或?数值?控?件?相比,?使用?表达?式?控?件?需要?更多?的?投资,?并且?需要?进行?额外?的?检查?来?确保?表达?式?可?为?属性?提供?有效?值。
?
指定?设置?时,?表达?式?比?固定?值?更?灵活
定义?开发?人员?创建?步骤?实例?时?的?行为
在?许多?情况?下,?可能?需要?定义?在?测试?开发?人员?创建?新的?步骤?实例?时?出现?的?功能。 例如,?内?置?的“If”步骤?类型?使用?OnNewStep?子?步骤?来?插入?匹配?的“End”步骤。
为了?实现?这种?功能,?需要?创建?一个?编辑?子?步骤,?然后?将?该?子?步骤?重?命名?为“OnNewStep”。 这些?子?步骤?通常?使用?TestStand API?来?操作?步骤?实例?或?创建?其他?步骤?实例。
对?子?步骤?的?通用?建议
使用?参数?或?TestStand API?在?子?步骤?中?访问?数据
与?标准?代码?模?块?一样,?将?TestStand?数据?提供?给?子?步骤?的?方法?有?两?种。 可以?通过?代码?模?块?的?参数?传递?数据。 另外,?还?可以?从?代码?模?块?内?调?用?TestStand API,?直接?访问?和?更改?属性。?步骤?前?和?步骤?后?子?步骤?通常?只需要?读?取?步骤?属性?即可?确定?其?行为。?例如,?用于?设置?加热?室?的?温度?值。 但是,?编辑?子?步骤?需要?将?属性?的?当前?状态?显示?在?初始?UI?中,?而且?还?需要?一种?方法?来?更新?用户?修改?的?任何?值。
在?大?多数?情况?下,?与?使用?TestStand API?直接?访问?数据?相比,?使用?参数?传递?数据?是?一种?更好?的?方法。 使用?参数?更不?容易?出?错:?由于?属性?是在?TestStand?的?步骤?类型?设置?中?定义?的,?而不是?直接?在?代码?模?块?中?定义?的,?因此?更?容易?发现?属性?名称?或?数据?类型?中的?错误。?此外,?在?步骤?配置?中?定义?所有?属性?可?使?步骤?类型?更易?于?维护。 在?不?修改?代码?模?块?的?情况?下,?对?步骤?属性?的?任何?更改?都可以?考虑。
但是,?根据?步骤?的?状态,?当?代码?模?块?需要?动态?访问?各种?数据?时,?使用?API?直接?访问?属性?可能?很有?帮助。 在?这种?情况?下,?使用?步骤?参数?会?导致?参数?过多,?而?在?不同?情况?下,?实际?用到?的?参数?只有?一部分。
模?块?适?配?器?将?步骤?变量?读?取?或?写?入?到?代码?模?块?的?输入?和?输出?中,?并?检查?错误
在?LabVIEW?中?使用?TestStand API?访问?步骤?属性?不会?在?编辑?时?提供?参数?错误?检查?功能
编辑?时?卸?载?模块
在?为?自?定义?步骤?类型?的?子?步骤?开发?和?测试?代码?模?块?时,?请?注意,?在?执行?子?步骤?时,?TestStand?会?加?载?代码?模?块?并?将?其?保留?在?内存?中。?由于?模?块?将?保持?加?载?状态?以供?后?续?执行,?因此?这?可以?提高?性能,?但是?在?TestStand?卸?载?模?块?之前,?无法?编辑?代码?模?块。?卸?载?代码?模?块?的?方法?有?两?种:
- 选择“文件”(File)?“卸?载?所有?模?块”(Unload All Modules),?卸?载?当前?保留?在?内存?中的?任何?模?块。
- 在?子?步骤?配置?窗?格?中,?选择“编辑”(edit)?按钮,?卸?载?模?块?并?在?相应?的?开发?环境?中?打开?模块
维护?自?定义?步骤?类型?的?最佳?实践
存储?和?分?发自?定义?步骤?类型
应?考虑?如何?存储?和?分发?创建?的?自?定义?步骤,?这?一点?很?重要。?NI?建议?在?类型?选?板?文件?中?(而不是?在?序列?文件?中)?创建?所有?步骤?类型,?因为?在?加?载?序列?文件?时,?TestStand?会?在?类型?选?板?文件?中?搜索?步骤?类型?更新。?TestStand?还?可以?在?序列?文件?中?保留?所?使用?的?每?个?步骤?类型?的?副本,?帮助?管理?步骤?的?复?用。?如果?在?部署?序列?文件?时?未?使用?类型?选?板?文件,?序列?文件?仍?将?包含?步骤?类型?的?副本。
框架?开发?人员?创建?的?步骤?类型?通常?会?分发?给?多个?测试?开发?人员?使用。 由于?步骤?类型?具有?许多?关联?的?文件,?因此?这?可能?会?带来?一定?的?挑战。 为了?帮助?管理?步骤?类型?文件,?请?使用?以下?目录?存储?步骤?类型?的?文件
- 类型?选?板?文件?包含?类型?定义
/?Components/?TypePalettes/ - 子?步骤?代码?模?块?文件
/?Components/?StepTypes/?[typeName] - 自?定义?图标
/?Components/?Icons/?[typeName]
通过?使用?这些?目录,?可?将?必要?的?文件?分发?到?任何?测试?开发?人员?系统?上?的?TestStand Public?目录。 如果?在?新的?类型?选?板?文件?中?定义?了?类型,?则?可以?对?TestStand?进行?配置,?在?类型?选?板?文件?名?中?添加“Install_”前?缀,?自动?导入?类型?选?板。 关于?此?方法?的?详细?信息,?请?查看“类型?选?板?文件”帮助?主题
避免?重?命名?或?更改?步骤?属性?的?数据?类型
如果?需要?更改?自?定义?属性?的?类型,?可以?使用?新?类型?创建?另?一个?属性,?并?保留?使用?先前?类型?的?属性。?如果?更改?了?属性?的?名称?或?数据?类型,?TestStand?会?将?步骤?实例?中的?属性?值?替换?为?该?属性?的?默认?值。?除了?使用?新?类型?创建?新?属性?外,?还?可以?向?步骤?类型?添加?逻辑,?用于?处理?步骤?同时?使用?旧?属性?和?新?属性?的?情况。?例如,?当?TestStand?将?边界?值?实现?为?表达?式?时,?它?会?添加?两?个?新的?布?尔?属性,?用于?指定?使用?旧?的?数值?边界?属性。?UseLowExpr?和?UseHighExpr?属性?用于?确定?步骤?是?计算?旧?的?数值?边界?还是?新的?表达?式?边界。
本文转自:https://www.ni.com/content/ni/locales/zh-cn/support/documentation/supplemental/08/teststand-custom-step-type-development-best-practices.html