​TestStand API 編程【4】


TestStand​架構​與​TestStand API


精心設計​的​模​塊​化​測試​架構​可​提供​極大​的​價值。​靈活​的​通用​架構​可​應用​到​多種​測試​系統​上,​以​延長​測試​系統​的​使用​壽命​並​降低​測試​開發​成本。​TestStand​提供​了​基於​模​塊​化​的​平台,​可​簡化​測試​系統​及​相應​測試​的​開發​過程。​TestStand​的​強大​之​處​在於​其​開放​式​架構,​用戶​可​通過​該​架構​創建​復雜​且​靈活​的​測試​解決​方案。

TestStand​引擎​提供​TestStand​組​件​所需​的​功能,​組​件​通過​TestStand API​與​引擎​進行​通信


TestStand​的​表示​層​(用戶​看到​的​內容)​和​業務​邏輯​層​(用戶​動作​背后​的​操作)​之間​存在​明確​的​分隔。​不同​層​之間​通過​TestStand API​進行​通信。​通過​這種​方法,​用戶​可​創建​通過​TestStand API​調​用​TestStand​引擎​的​附加​組​件​(例如,​創建​自​定義​用戶​界面、​動態​控制​測試​流、​在​運行​時​創建​序列​以及​開發​其他​高級​解決​方案),​從而​擴展​TestStand​的​功能。

TestStand API​架構

TestStand​引擎​是​一個​ActiveX/​COM​自動​化​服務​器,​可​通過​API​訪問​其​功能。​Microsoft​開發​的​ActiveX​應用​程序​通信​標准​提供​了​應用​程序​間​的​通信​方法。​ActiveX​基於​COM​技術,​多年​來​在​業界​得到​了​廣泛​應用。​TestStand​同樣​基於​COM,​因此​能夠​超出​ActiveX​的​生命​周期​並​在​未來​的​Windows​操作​系統​版本​上​繼續​運行。

ActiveX​采用​的是​客戶​端/​服務​器​架構。​ActiveX​服務​器​是​將​特定​功能​開放​給​遵循​ActiveX​標准​的​客戶​端的​應用​程序。​此外,​ActiveX​應用​程序​采用​的是​面向​對象​編​程​(OOP)​方法。

ActiveX​服務​器​架構​允許​任何​可​調​用​ActiveX​代碼​的​編​程​語言​(例如​LabVIEW、​LabWindows™/​CVI™、​C#、​VB .NET​或​C​+​+)​與​TestStand​引擎​進行​交互。​使用​TestStand API​編​程​時,​具體​實現​方法​取決​於​用戶​使用​的​語言。​例如:

  • LabVIEW​使用“屬性”和“調​用”節點​來​調​用​API。
  • LabWindows/​CVI​使用​儀器​驅動​wrapper​來​對​API​調​用​進行​包裝。
  • C#​或​VB .NET​使用​TestStand​提供​的​互​操作​程序​集​調​用​API。
  • TestStand​本身​也​提供​了​用於​訪問​API​的​ActiveX/​COM​適​配​器,​用戶​還​可以​通過​表達​式​直接​訪問​API。

無論​使用​哪​種​方式​訪問​API,​在​任何​環境​中​引發​的​行為​都是​相同​的,​因為​具體​功能​在​TestStand​引擎​中​實現,​與​使用​的​接口​無關。

API類

TestStand API​定義​了​多種​類​來​表示​TestStand​對象​的​類型,​例如​SequenceFile​類​或​Execution​類。​每​個​類​都​定義​了​屬性​和​方法,​可​用於​訪問​相關​數據​或​執行​操作。​例如,​SequenceFile​類​定義​了​Path​屬性​以​存儲​序列​文件​在​磁盤​中的​路徑,​還​定義​了​Save​方法​以​保存​序列​文件。

類​繼承

TestStand​中的​許多​類​通過​繼承​相互​關聯:​較​為​具體​的​類​可​繼承​通用​類​的​屬性​或​方法。​例如,​SequenceFile​類​是​PropertyObject​類​的​更​具體​版本。​TestStand API​所​定義​的​類​之間​的​繼承​關系​允許​較​具體​的​類​對象​訪問​通用​類​的​屬性​和​方法。

SequenceFile​類​繼承​了​更​通用​的​PropertyObjectFile​類​和​PropertyObject​類​的​屬性​和​方法。

 

幾乎​所有​的​TestStand API​類​都​繼承​自​PropertyObject​基​類,​該​基​類​中​包含​TestStand​對象​共享​的​常見​方法​和​屬性。​PropertyObject​類​定義​了​通用​屬性​(例如​Name​和​Numeric Format),​並​提供​了​常用​的​對象​管理​方法​(例如​復制、​設置/​獲取​值、​創建/​刪除​對象​及​操作​數​組)。​由於​大​多數​TestStand API​類​繼承​自​PropertyObject​類,​因此​可以​訪問​通用​屬性​和​方法。​例如,​您​可以​使用​PropertyObject.Clone()​方法​創建​步驟、​序列​或​序列​文件​對象。

許多​開發​環境​會​阻止​您​直接​訪問​父​類​的​屬性。​同樣​的,​在​TestStand​中,​SequenceFile​對象​無法​直接​調​用​Clone()​方法。​但​TestStand API​提供​的​強制​轉換​方法​可​允許​對象​訪問​通用​類​的​屬性​和​方法。​如需​訪問​PropertyObject​類​所​定義​的​屬性​和​方法,​可​調​用​AsPropertyObject​方法​將​對象​強制​轉換​為父​類。​例如,​如需​在​序列​文件​對象​上​訪問​Clone()​方法,​應​使用
SequenceFile.AsPropertyObject.Clone()。

關於API​繼承PropertyObject類​屬性​及​方法​的​詳細​信息,​詳​見​NI TestStand​幫助。

動態​屬性​與​內​置​屬性

TestStand​對象​有​兩​種​不同​的​屬性​類型:

  • 內​置​屬性​(API​屬性)​由​對象​的​類​定義,​適用​於​特定​類​的​所有​對象。
  • 動態​屬性​(子​屬性)​由​對象​定義,​同​一個​類​的​不同​對象​之間​可能​會​有​差異。

步驟​對象​具有​動態​屬性​(因​步驟​類型​而​異)​和​靜態​屬性​(由​TestStand API​中的​步驟​類​定義)


這​兩​種​不同​的​屬性​類型​均可​在​TestStand​表達​式​中​使用“.”操作​符​進行​訪問, 因此​很​容易​混淆。​但在​其他​編​程​語言​中​使用​API​時,​通過​直接​訪問​方法​只能​訪問​內​置​屬性,​例如​在​LabVIEW​中​使用​屬性​節點。


如需​訪問​動態​屬性,​需​使用​PropertyObject API​方法,​例如​GetValString()​和​GetValNumber(),​並​通過​LookupString​指定​動態​屬性​的​名稱:



在​某些​情況​下,​可​使用​動態​屬性​或​內​置​屬性​以​多種​方式​對​屬性​進行​訪問。​在​代碼​模​塊​中​使用​TestStand API​時,​最好​使用​內​置​屬性,​因為​內​置​屬性​可​直接​訪問,​無​需​維護​查找​字符​串。 

TestStand​對象​關系

TestStand​對象​可​包含​不同​類​中的​其他​對象,​這​稱為API​包含​(API Containment)。​例如,​SequenceFile​對象​包含​序列​文件​中​定義​的​序列​所​對應​的​Sequence​對象。​每​個​Sequence​對象​又​包含​Step​對象。

TestStand API​中的​對象​通常​包含​另外​一個​類​的​其他​對象

理解​對象​之間​的​包含​關系​有助​於​查找​具體​的​對象。​如​父​對象​包含​多個​屬於​特定​類​的​子​對象,​如果​要​查找​所需​的​子​對象,​必須​提供​屬性​名稱​或​索引。​對於​大​多數​子​對象,​可​使用​特定​的​getter​方法,​通過​父​對象​訪問​被​包含​的​對象,​getter​方法​可​接受​對象​名稱​或​索引​作為​參數。​例如,​如需​訪問​序列​文件​中的​某​個​步驟,​可​使用:

SequenceFile.getSequenceByName(“MainSequence”).GetStepByName(“RAM Test”, StepGroup_Main)

此外,​子​對象​可​通過​API​訪問​其​父​對象。​由於​子​對象​只能​有​一個​父​對象,​可​使用​屬性​直接​訪問​父​對象,​無​需​使用​getter​方法。​例如,​如需​訪問​SequenceContext​對象​的​父​對象​execution,​可​使用:

ThisContext.Thread.Execution

在​多數​情況​下,​內​置​屬性​可​用於​訪問​關系​較​遠​的​祖先​類。​例如,​可​從​Sequence Context​對象​中​直接​訪問​execution​對象:

ThisContext.Execution

 

通過​TestStand API​對象​進行​導航

除了​通過​包含​關系​進行​導航​之外,​許多​類​還​提供​了​用於​訪問​其他​相關​對象​的​屬性​或​方法。​例如,​Module​類​提供​的​Adapter​屬性​可​用於​訪問​正在​運行​的​相應​適​配​器。 

TestStand API​參考幫助​提供​了​所需​的​圖表,​來​幫助​您​確定​通過​當前​對象​訪問​目標​對象​的​方法。​下表​為​該​表格​的​一部分。
 

可​根據​對象​關系​從​sequenceContext​對象​訪問​其他​對象

 

訪問​TestStand API

根據​要​創建​的​應用​程序​類型,​有​兩​種​常見​的​訪問​API​的​方法:

  • 對於​獨立​應用​程序,​需要​創建​一個​新的​TestStand​引擎​實例​(instance)。
  • 對於​從​現有​應用​程序​中​調​用​的​代碼​模​塊​或​其他​工具,​必須​傳遞​TestStand​引擎​的​現有​引用。

 

創建​獨立​TestStand​應用​程序

如需​在​新的​應用​程序​中​使用​TestStand API,​必須​首先​創建​一個​TestStand​引擎​實例。​任何​TestStand​應用​程序​或​進程​(例如​TestStand​用戶​界面、​序列​編輯​器​或​自​定義​工具)​需要​維護​引擎​的​一個​實例,​也​稱為​單​例​(singleton),​才能​執行​任意​TestStand​功能。​引擎​將​維護​內存​中​所有​對象​的​引用、​設置/​控制​執行​並​存儲​TestStand​會話​的​上下文​數據​以及​站​點​全局​變量​和​用戶​信息。

TestStand​引擎​提供​了​創建​其他​TestStand​對象​的​方法,​以​關鍵​字“new”表示,​示例​如下:

  • Engine.NewSequenceFile()
  • Engine.NewStep()
  • Engine.NewExecution()
  • Engine.NewPropertyObject()

關於​引擎​對象​的​可用​屬性​和​方法​的​完整​列表,​詳​見“TestStand​引擎”主題。

應用​程序​完成后,​必須​先​關閉​TestStand​引擎,​然后​再​退出​應用​程序。​關閉​需要​兩​個​步驟,​以​確保​用戶​能夠​終止​任何​正在​運行​的​執行​過程,​具體​說明​見​TestStand​幫助​中的關閉​引擎主題。

NI​建議​使用​TestStand UI​控​件​開發​TestStand​應用​程序​和​用戶​界面,​以​降低​程序​的​復雜​度,​而​非​直接​創建​TestStand​引擎​對象。​TestStand UI​控​件​在​TestStand API​之上​提供​了​一個​抽象​層,​使得​獨立​TestStand​應用​程序​的​開發​變得​更加​容易。​關於​使用​UI​控​件​的​更多​信息,​見​本文​檔​的​[UI​控​件​API]​部分。


從​現有​應用​程序​調​用​代碼​模​塊​或​工具

在​從​其他​TestStand​應用​程序​中​調​用​的​代碼​模​塊​或​工具​中​使用​API​時,​可​使用​頂​層​應用​程序​所​創建​的​TestStand​引擎。​如​從​正在​執行​的​序列​(例如​代碼​模​塊)​中​調​用​代碼,​最好​使用​SequenceContext​的​輸入​參數​來​完成​操作。​相​對於​直接​傳遞​TestStand​引擎,​該​方法​更​具​優勢,​因為​通過​sequence context​不僅​可以​訪問​TestStand​引擎​對象,​還​可以​訪問​當前​執行​狀態。

SequenceContext​表示​序列​的​當前​執行​狀態,​可​提供​正在​執行​的​特定​序列​的​所有​數據​快照。​任何​線​程​中的​每​個​執行​序列​都有​自己​的​SequenceContext。

瀏覽“變量”視圖​時​看到​的​列表為Sequence Context​一​級​屬性,​其中​包括​全部​變量​類型、​當前​步驟​及​RunState​屬性。​SequenceContext​還​提供​了​許多​其他​對象​的​引用,​並​將​其​作為​內​置​屬性。

 

RunState​與​SequenceContext


RunState​屬性​和​SequenceContext​均可​用於​訪問​大​多數​同類​對象,​例如​當前​執行、​線​程、​序列​文件​以及​序列。​但​RunState​屬性​包含​這些​對象,​且​將​其​視為​動態​屬性,​而​SequenceContext​將​其​視為​內​置​屬性。

因此,​訪問​TestStand​表達​式​中的​狀態​相關​信息​時​應​使用​RunState​屬性;​SequenceContext​更​適用​於​無法​直接​訪問​動態​屬性​的​代碼​模​塊。


 SequenceContext​同時​使用​內​置​屬性​和​動態​屬性​提供​執行​狀態​信息,​而​RunState​屬性​僅​使用​動態​屬性​提供​狀態​信息。

序列​數據​的​存在​時間

執行​序列​中的​步驟​之前,​TestStand​將​為​序列​創建​運行​時​副本​(run-​time copy),​以便​為​每​個​序列​調​用​維護​單獨​的​局部​變量​和​步驟​屬性​值。​在​多數​情況​下,​通過​執行​序列​內部​的​Runstate​或​SequenceContext​訪問​對象​時,​實際​訪問​的​對象​為​運行​時​副本。​這​意味​着,​用戶​對​這些​對象​所作​的​改​動​在​執行​結束​后​將​不​復​存在。​例如,​更改​局部​變量​的​值​或​以​編​程​方式​為​參數​創建​子​屬性​均​不會​影響​磁盤​中的​序列​文件:

Locals.SetValString("RuntimeVariable",​1, "value")

繼承​自​PropertyObjectFile​類​的​對象​(如​SequenceFile​對象)​不​具有​單獨​的​運行​時​副本,​因此​通過​這些​對象​所​做的​改​動​在​執行​結束​后​仍​將​存在。​例如,​通過​SequenceFile​對象​訪問​Locals​屬性​可​創建​持續​存在​的​局部​變量。

RunState.sequencefile.GetSequenceByName("MainSequence").Locals.SetValString("PersistantVariable",​1, "value")

 

TestStand API​的​常見​應用

雖然​TestStand API​能夠​實現​所有​TestStand​功能​自動​化,​但​API​常用​於​下列​應用:

  • 創建​自​定義​屬性
  • 創建​新​序列​文件
  • 修改​現有​序列

 

創建​自​定義​屬性

可​使用​TestStand API​在​運行​時​動態​創建​自​定義​屬性,​例如,​在​特定​組​件​測試​失敗​時​向​測試​結果​添加​特定​診斷​數據,​或​向​報告​表​頭​添加​自​定義​數據。 

可​通過​多種​方式​使用​API​創建​自​定義​屬性。​對於​原生​數據​類型,​創建​新​屬性​最​簡單​的​方法​是​使用​具有​InsertIfMissing​選項​的“SetVal”方法。​例如,​可​使用​下列​表達​式​向​數值​限制​測試​步驟​添加​新​屬性:

RunState.Sequence.Main["Numeric Limit Test"].AsPropertyObject.SetValString(
"Result.extraResult",
PropOption_InsertIfMissing,
"this string is an extra result")

如需​向​報告​添加​自​定義​屬性,​必須​同時​設置​對象​的​IncludeInReport​參數,​報告​生成​器​通過​該​參數​選擇​要​記錄​的​結果​屬性:

RunState.Sequence.Main["Numeric Limit Test"].AsPropertyObject.SetFlags(
"Result.extraResult",
0,
PropFlags_IncludeInReport)

關於​使用​API​向​測試​報告​添加​數據​的​詳細​信息,​詳見Adding Custom Data to a Report范​例。

對於​較​復雜​的​屬性​(例如​容器),​需​使用​NewSubProperty()​方法​直接​創建​屬性,​該​方法​可​用於​創建​容器、​數據​類型​實例​以及​數​組。​例如,​可​使用​下列​表達​式​創建​類型​為​Error​的​新​局部​變量:

Locals.NewSubProperty("ComplexContainer.Error",PropValType_NamedType, False, "Error",​0)

關於​使用​API​創建​屬性​的​詳細​信息,​詳​見​[Creating new properties using API]​范​例。

 

創建​新​序列

如需​根據​用戶​輸入​自動​創建​序列​文件,​可​使用​TestStand API​生成​新的​序列​文件​或​創建​現有​文件​的​修改​副本。​例如,​可​創建​自​定義​工具​使​其​根據​特定​用戶​輸入​生成​初始​序列​文件,​或​對​現有​序列​文件​的​步驟​執行​特定​的​修改。

關於​使用​API​創建​新​序列​文件​的​詳細​信息,​詳見 Building a Sequence Using the API 范​例。

也可以​使用​TestStand API​開發​序列​文件​轉換​器,​生成​自​定義​文件​格式​的​序列​文件。​創建​序列​文件​轉換​器​時,​可​通過​TestStand API​根據​指定​文件​中的​數據​生成​序列​文件、​序列、​步驟​及​屬性。​用戶​可​通過​轉換​器​架構​將​上述​代碼​集成​至​TestStand,​並​直接​以​自​定義​格式​打開​文件。 

關於​使用​序列​文件​轉換​器​的​詳細​信息,​詳​見​TestStand​幫助​中的序列​文件​轉換器主題


修改​序列

可在​自​定義​工具​中​使用​TestStand API​對​現有​的​序列​文件​進行​修改。​例如,​可​創建​工具​對​由​絕對​路徑​指定​的​代碼​模​塊​進行​檢查,​並​將​其​替換​為​相對​路徑。 

詳細​信息見Creating a Sequence File Iteration Tool范​例。

 

其他​TestStand API

除了​核心​TestStand API​以外,​TestStand​的​其他​API​可​用於​擴展​性能​及​提供​額外​功能:

  • UI​控​件​API
  • 適​配​器​API
  • 同步​服務​器​API

與​核心​TestStand API​不同,​這些​API​不能​通過​表達​式​直接​訪問,​必須​通過​ActiveX​步驟​或​單獨​的​代碼​模​塊​才能​使用。


UI​控​件​API

TestStand​包含​一​組​用戶​界面​控​件,​可​用於​快速​開發​TestStand​用戶​界面。​這些​控​件​包括​用於​顯示​TestStand​數據​的​可見​控​件​(例如​步驟​視圖​或​變量​視圖)​以及​在​TestStand​用戶​界面​中​處理​與​TestStand​引擎​API​之間​大部分​通信​的​不​可見​管理​程序​控​件。

開發​獨立​的​TestStand​應用​程序​時,​NI​建議​用戶​使用​UI​控​件​來​開發​應用​程序,​而​非​直接​創建​TestStand​引擎​實例。

用戶​可​使用​UI​控​件​API​通過​管理​程序​控​件​實現​常見​的​用戶​界面​任務,​例如​打開​和​執行​序列​文件、​響應​UI​消息​及​處理​應用​程序​關閉。​UI​控​件​API​還​提供​了​用於​配置​UI​控​件​的​連接​方法。 

關於​使用​UI​控​件​和​UI​控​件​API​的​詳細​信息,​詳​見​下列​幫助​主題:


可​將​TestStand UI​控​件​想象​為​TestStand​引擎​API​之上​的​一個​軟件​層。​這些​控​件​對​用戶​界面​中的​許多​常用​功能​包裝​起來,​例如​打開​序列、​運行​測試、​顯示​測試​進度​等。​TestStand UI​控​件​功能​豐富,​且​包含​自身​的​API。​盡管​本文​檔​的​范圍​並不​涵​蓋​用戶​界面​控​件​的​功能,​但​應​指出​的是,​這些​控​件​所​提供​的​功能​是​建立​在​TestStand​引擎​API​的​基礎​之上。

 

適​配​器​API

適​配​器​API​能夠​為​TestStand​中​包含​的​不同​適​配​器​提供​專用​的​類。​通常,​在​核心​API​中​使用​適​配​器​或​模​塊​類​時,​可​使用​適​配​器​API​來​獲取​適​配​器​特有的​信息​或​功能。​此時,​對象​將會​被​強制​轉換​為​合適​的​適​配​器​API​類。​例如,​可​使用​LabVIEWModule​類​訪問​用於​LabVIEW​步驟​中的​模​塊​對象​的​LabVIEW​特有​屬性​和​方法。

使用​適​配​器​API​訪問​模​塊​或​適​配​器​類​的​適​配​器​特有​屬性​和​方法

關於​適​配​器​API​中​提供​的​類​列表,​詳見 TestStand​適​配​器​API​參考

同步​服務​器​API

同步​服務​器​API​可​提供​直接​訪問​TestStand​同步​對象​(例如,​隊列、​鎖定​或​通知)​的​方法。​要​使用​該​API,​首先​需​通過​Engine.GetSyncManager​方法​獲取​同步​管理​器​的​引用。​將​該​對象​強制​轉換​為​同步​服務​器​API​中​所​定義​的​同步​管理​器​類​之后,​可用​其​訪問​或​創建​新的​同步​對象。


使用​SyncManager​和​同步​服務​器​API​在​代碼​中​創建​並​訪問​TestStand​同步​對象

 

該​API​適用​於​開發​與​TestStand​測試​同時​運行​且​需​訪問​執行​狀態​信息​的​應用​程序,​例如,​狀態​監​控​應用​程序。

關於​可用​的​類​的​詳細​信息,​詳見同步​服務​器​API​參考主題。

 

原文地址:https://www.ni.com/zh-cn/support/documentation/supplemental/08/programming-with-the-teststand-api.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM