概覽
本文討論了設計和開發TestStand用戶界面應用程序的最佳實踐:
- 介紹TestStand提供的即用型組件
- 說明如何利用TestStand架構來構建可擴展且可維護的測試系統
內容
- TestStand用戶界面的架構
- 管理不同用戶的需求
- 在UI外實現的功能
- 在用戶界面和其他組件之間進行通信
TestStand用戶界面的架構
TestStand使用模塊化架構設計,利用具有單一用途的獨立組件,使得整個系統的開發和維護更加簡單直接。
用戶界面是模塊化TestStand架構中一個獨立組件
用戶界面組件為開發人員和測試操作員提供了相應機制,用於在測試系統中創建和運行序列。在模塊化架構中,用戶界面(UI)和底層TestStand應用程序之間應存在清晰的界限。這種架構具有以下優點:
- 能夠與使用多種不同用戶界面的測試系統無縫交互。 例如,測試開發人員可以使用序列編輯器來開發序列,而測試操作員可以使用操作員界面來執行測試和查看結果。
- 對UI進行更改,而沒有更改測試行為的風險。
TestStand用戶界面與TestStand引擎API通信以執行其各種功能,例如獲取測試執行的狀態、創建和編輯序列以及配置設置。TestStand還提供了一組用戶界面控件和單獨的UI API,讓您可以快速創建自己的TestStand用戶界面。
TestStand用戶界面(UI)控件
TestStand用戶界面(UI)控件是一組ActiveX控件,這些控件實現了應用程序顯示、執行和調試測試序列所需的常用功能。這些ActiveX控件顯著減少了用戶界面與TestStand API交互以處理用戶界面任務所需的源代碼數量。使用“屬性(Properties)”頁面或調用可用的屬性和方法,可配置這些控件。有關如何在LabVIEW、CVI、C#或VB.NET中使用TestStand UI控件的更多信息,請參見TestStand UI控件幫助主題。
管理器控件和可見控件
TestStand UI控件提供了兩組用戶界面控件:管理器控件和可見控件。
管理器控件調用TestStand API來執行各種任務,例如加載文件,啟動執行以及檢索順序和執行信息。當發生應用程序事件時(例如當用戶登錄時、執行到達斷點時,或者用戶更改他們正在查看的文件或順序時),管理器控件也會通知您。管理器控件在運行時不可見。
可見控件向用戶顯示信息,例如顯示當前執行狀態的執行視圖控件。可見控件還允許用戶與UI交互,例如使用按鈕控件執行測試。 可見控件必須連接到管理器控件,從而確定其運作方式。 這種連接通過使用管理器控件的連接方法來實現。連接控件時,管理器控件會自動處理用於管理可見控件行為的內部邏輯。 您可以建立視圖連接、列表連接、命令連接和信息源連接,具體取決於所連接的管理器控件和可見控件的類型以及可見控件的期望行為。
將可視TestStand UI控件連接到管理器控件以定義其行為。
有關在各種編程環境中使用TestStand UI控件的更多詳細信息,請參閱TestStand用戶界面控件幫助主題。 您還可以使用連接UI控件演示來查看可創建的可用連接的行為。
此外,您還可以將編程環境中本地提供的控件與TestStand UI控件結合使用。使用本地控件時,可以使用用戶界面API直接與管理器控件進行通信,從而實現與TestStand相關的功能。有關編寫直接調用TestStand API的應用程序的更多信息,請參考使用原生控件構建TestStand UI的示例。
簡化和全功能用戶界面應用程序示例
TestStand提供了幾個示例和組件,可用於幫助構建用戶界面。參考用戶界面示例,有利於開始開發自定義用戶界面。TestStand還附帶了多種用戶界面組件,這些組件能夠實現在這些用戶界面應用程序中使用的常見功能,您可以在自己的應用程序中復用這些用戶界面。
TestStand附帶了使用支持編程語言的簡化和全功能用戶界面應用程序示例,此類編程語言包括LabVIEW、LabVIEW NXG、Labwindows™/CVI™、C#和VB.net。TestStand提供了以每種受支持編程語言編寫的示例源代碼。您可以參考此源代碼,以便開始開發自定義用戶界面,也可以按原樣使用它們。
簡化用戶界面最大程度地減少了顯示內容,不包含菜單欄,其目的是供測試操作員在已部署的測試系統上作為用戶界面使用。而全功能用戶界面則顯示了更多信息,添加了菜單欄,並提供了調試功能。 全功能用戶界面還具備編輯器模式,可用於創建和修改測試序列,例如TestStand序列編輯器。
在學習如何使用TestStand UI控件進行開發時,簡化用戶界面示例是一個很好的起點。 對於LabVIEW、LabWindows/CVI或C#實現,可以使用下方的指南查看源代碼及其工作方式的詳細說明:
管理不同用戶的需求
在為測試系統開發用戶界面時,務必要考慮將與應用程序進行交互的所有用戶的目標和需求。 測試系統用戶通常可以分為以下幾類角色:
- 框架開發人員 — 設計測試框架組件,包括定制的用戶界面、過程模型和步驟類型。
- 測試開發人員 — 在框架開發人員實現的框架內創建測試序列。
- 技術員 — 對在生產環境中運行測試時出現的各種問題進行故障分析。
- 測試操作員 — 設置測試單元並在生產環境中運行測試。
在為測試系統用戶規划和設計適當的用戶界面時,您扮演的是框架開發人員的角色。 借助TestStand UI控件,您可以根據用戶的需求完全自定義用戶界面。例如,測試操作員可能只需要啟動測試並查看結果。 但測試開發人員則需要完全的訪問權限來創建和編輯序列文件。
您可以為測試開發人員提供全功能用戶界面,該界面允許創建和編輯序列文件,例如TestStand提供的全功能UI示例或序列編輯器。 對於測試操作員,可以設計一個簡化用戶界面,其中僅顯示一個用於開始測試的按鈕以及一個顯示測試結果的顯示控件,從而確保操作員可以成功運行測試。 向操作員提供較復雜的UI可能會導致出現問題,因為這需要操作員事先接受其他培訓,且由於可用功能過多,操作時更容易出錯。
通過使用TestStand UI控件來開發UI,您將能夠從全功能UI無縫遷移到簡化UI。這兩種UI均基於TestStand引擎、序列、過程模型和其他組件而構建,並且會共用這些組件。
全功能UI(例如序列編輯器)和簡化操作員UI可以利用相同的測試代碼無縫交互
除了創建單獨的用戶界面,還可以使用TestStand用戶管理來自定義在單個用戶界面應用程序中提供的功能。 在不同角色執行相同測試的情況下,這種方法更適用。 例如,負責分析失敗測試故障的技術人員將需要訪問診斷數據,如執行和/或測試報告的視圖,而這些數據通常不會向操作員顯示。 為技術人員提供單獨的UI應用程序會出現問題,因為他們無法從單獨的應用程序訪問當前的執行信息。 要解決這個問題,可以創建一個單獨的用戶界面,為更高級用戶提供更多視圖。 例如,可以使用ctrl + shift + alt + insert將TestStand全功能用戶界面更改為編輯器模式,讓高級用戶獲得更改序列的權限。
全功能UI示例可以在操作員模式或編輯器模式下執行
為TestStand用戶管理器定義用戶時,TestStand UI控件會根據當前用戶的權限自動啟用或禁用其狀態。使用Engine.CurrentUserHasPrivilege TestStand API方法,可根據用戶的權限定義自定義行為,例如隱藏或顯示用戶界面的某些部分。有關定義用戶和權限的更多信息,請參閱管理用戶幫助主題。
在UI外實現的功能
在開發TestStand用戶界面時,務必明確區分在UI中實現的功能以及在測試系統其他組件中實現的功能。 本節概述了常見的測試系統功能以及在TestStand架構中實現這些功能的情況。
在前端回調中實現初始化代碼
在許多情況下,測試系統需要在測試開始執行之前執行操作。例如,您可能需要初始化測試硬件並驗證硬件是否已校准,或者檢查用戶權限以初始化用戶界面。
要處理這些功能,可以在前端回調序列文件中使用LoginLogout序列。 此序列默認在TestStand啟動時由TestStand UI應用程序管理器控件執行,並且默認向用戶顯示登錄對話框。 向此序列添加功能具有以下好處:
- 所有TestStand用戶界面和序列編輯器均會調用相同的LoginLogout序列,這樣,您就可以定義能從任何UI訪問的功能並防止出現重復的代碼
- 您可以更改其他代碼的行為,而無需更改用戶界面。
除了LoginLogout序列之外,還可以在前端回調中定義其他序列,以便在其他情況下實現調用的功能。 對於這些其他序列,需要使用Engine.CallFrontEndCallbackEx()方法將代碼添加到用戶界面,以便在需要時調用序列。 使用這個方法,無需管理對序列文件的引用,因為TestStand會自動加載和卸載前端回調,所以非常方便。
使用工具菜單訪問附加應用程序
測試系統通常使用與測試一起工作的獨立工具或應用程序。 例如,可以啟動數據庫配置實用程序或分析應用程序。 您無需將這些功能構建為用戶界面應用程序的模塊,而是可以通過植入獨立工具來模塊化系統,並通過自定義工具菜單項提供對相應的訪問。 通過“工具(Tools)”»“自定義(Customize)”菜單,可從序列編輯器自定義工具菜單。在自定義對話框中,可以添加新的工具菜單項並配置其行為。
創建自定義工具,向實現工具菜單的任何用戶界面提供更多功能
所做的更改將保存到單獨的配置文件中,因此所有用戶界面都將顯示您創建的自定義條目。 如需更多信息,請參考自定義工具菜單對話框幫助主題。
使用過程模型定義序列入口點
用戶界面需要為用戶提供一種開始執行序列的方法,但重要的是,UI不能直接與任何序列文件耦合。 要允許用戶開始測試,可以創建一個按鈕來調用當前已加載序列的執行入口點,包括直接運行序列或使用過程模型入口點(例如 Single Pass 和 Test UUTs)。 用戶界面不應包含序列執行之前或之后執行的功能,此功能應通過過程模型實現。
過程模型還可以定義配置入口點,用戶可以使用這些入口點配置過程模型設置。確保任何模型設置都是從這些入口點配置,而不是直接通過用戶界面配置。通過將功能構建到過程模型中,這些功能可在任何TestStand用戶界面應用程序和序列編輯器中使用。
有關使用過程模型的更多信息,請參閱TestStand過程模型定制的最佳實踐文檔。
在用戶界面和其他組件之間進行通信
盡管將用戶界面與測試系統的其他組件(例如測試序列文件和過程模型)分離開很重要,但用戶界面必須與這些組件有效通信。 本節介紹了可用於在這些組件之間進行通信且同時仍保持這種模塊化的方法。
序列和用戶界面之間的通信
在執行測試時,測試系統必須向操作員提供反饋,表明執行的當前狀態,例如正在運行的測試或當前的測試結果。通常,可以使用TestStand UI控件來顯示此信息,例如執行視圖和報告視圖。通過連接到管理器控件,這些控件將隨時更新以顯示由引擎管理的當前執行狀態。
在某些情況下,可能需要顯示有關測試的更多具體信息。 執行序列或代碼模塊必須將此信息傳遞到用戶界面進行顯示,或指示用戶界面采取措施。為了在不引入耦合的情況下傳達此信息,可以使用UI消息來實現通信。使用序列文件屬性或UI變量作為通信方式的替代方法,在序列文件和用戶界面之間創建了不必要的依賴關系。例如,從序列更新全局文件,然后在用戶界面中檢查其狀態,這樣會在全局文件和UI之間引入耦合。 首選UI消息有兩個原因:
- UI和序列文件的獨立性 — 用戶界面應始終與序列文件一起運行,反之亦然。 通過使用UI消息,在同時運行序列文件和用戶界面時,不要求序列文件中存在某些屬性。 使用UI消息:
- 用戶界面可以執行不實現某些消息的序列(用戶界面中的處理代碼根本不會執行)。
- 發布自定義消息的序列可以在並非專為處理自定義消息而構建的UI中執行(用戶界面會忽略UI消息)。
- 可維護性 — UI消息避免了對序列文件屬性或UI變量的依賴,這意味着開發人員需要維護的序列文件和用戶界面都更少。
有關使用UI消息的更多信息,請參閱《使用TestStand用戶界面消息(UI消息)》
UI消息的類型
UI消息包含了表明消息用途的消息ID。 TestStand定義了多個UI消息ID,這些ID定義了由引擎自動發送或由TestStand用戶界面控件自動處理的消息。 例如,消息ID UIMsg_EndExecution(值4)在執行結束后由引擎發送。 管理器控件將許多這些UI消息顯示為單獨的事件;在這種情況下,可以定義ApplicationManager EndExecution事件的處理程序,而不是直接使用UI消息事件處理程序。
其他UI消息由默認過程模型發布,例如UIMsg_ModelState_Identified(值:32),過程模型會在識別待測設備的序列號之后發布此消息。 此外,還可以使用Thread.PostUIMessageEx TestStand API方法,從代碼模塊、測試序列或過程模型中發布預定義或自定義的UIMessage。
UIMessageCodes幫助主題中提供了UI消息ID或事件代碼的列表。
您可以自行定義用於自定義操作(例如更新圖表和直方圖中的數據)的UIMessage。定義自定義UIMessage時,請從UIMsg_UserMessageBase事件代碼開始指定唯一的事件代碼。發布自定義UIMessage時,傳遞已定義的事件代碼和要顯示的數據。UI消息提供了用於數值、字符串或ActiveX數據的數據字段,可以在調用postUIMessageEx方法時指定這些字段。在定義處理程序以響應用戶界面中的UI消息時,此數據會作為參數在事件回調中顯示。
要定義用戶界面如何處理UI消息,請為以下兩個程序管理器事件中的其中一個添加事件回調,從而將操作員界面配置為在處理UI消息時運行用戶定義的代碼:
- UImessage事件 — 每當應用程序管理器處理任何UI消息時,都會觸發此事件。 指定的事件回調將在任何默認UI消息處理操作之前執行。 在回調中將取消輸出事件參數設置為“True”,可覆蓋默認事件操作。
- UserMessage事件 — 僅針對自定義UI消息(消息ID為10000或更大數字的UI消息)觸發此事件。
有關為用戶界面定義事件處理程序的信息,請參閱TestStand幫助中的處理事件主題。
從用戶界面到執行測試的通信
在某些情況下,需要將信息從用戶界面傳達到測試序列。 但是,序列和UI之間的通信應始終由序列發起,從而確保序列處於可修改其數據的狀態。 為此,該序列可以發布帶有自定義代碼的UI消息,以此表明它已准備好進行通信。發布UIMessage時,將同步參數設置為“True”,以便等到用戶界面處理該消息后再執行。用戶界面處理UIMessage時,它會檢索SequenceContext對象並寫入或讀取某些變量,例如過程模型局部變量。
在許多情況下,UI並不是用戶指定測試相關數據的最佳位置。 例如,如果數據與過程模型中的任務有關,最好修改或創建配置入口點,以便從默認菜單訪問該入口點。