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控件-概述了如何使用UI控件開發TestStand UI應用。
- TestStand UI控件API參考幫助-介紹UI控件API中的類。
- UI開發最佳實踐-介紹使用UI控件和API的最佳操作方法。
可將TestStand UI控件想象為TestStand引擎API之上的一個軟件層。這些控件對用戶界面中的許多常用功能包裝起來,例如打開序列、運行測試、顯示測試進度等。TestStand UI控件功能豐富,且包含自身的API。盡管本文檔的范圍並不涵蓋用戶界面控件的功能,但應指出的是,這些控件所提供的功能是建立在TestStand引擎API的基礎之上。
適配器API
適配器API能夠為TestStand中包含的不同適配器提供專用的類。通常,在核心API中使用適配器或模塊類時,可使用適配器API來獲取適配器特有的信息或功能。此時,對象將會被強制轉換為合適的適配器API類。例如,可使用LabVIEWModule類訪問用於LabVIEW步驟中的模塊對象的LabVIEW特有屬性和方法。

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

使用SyncManager和同步服務器API在代碼中創建並訪問TestStand同步對象
該API適用於開發與TestStand測試同時運行且需訪問執行狀態信息的應用程序,例如,狀態監控應用程序。
關於可用的類的詳細信息,詳見同步服務器API參考主題。
