概覽
自定義步驟類型使用戶可通過以下方式擴展現有步驟:
- 配置步驟屬性的值,並確定步驟用戶可以修改哪些屬性
- 添加新的步驟屬性來存儲自定義數據,可以選擇性地將這些數據記錄到測試結果中
- 定義要在執行主模塊之前或之后調用的代碼
- 創建接口,使用戶在編輯時可以配置自定義步驟屬性
設計完善的步驟類型可以加快序列開發、減少調試工作、使開發人員能夠共享標准化代碼,並可以在多個測試站和獨立組之間實現一致性。但是,自定義步驟類型可能需要大量時間來計划、編程、調試、部署和維護。
在閱讀本文之前,請確保您熟悉創建自定義步驟類型的過程。關於此過程的詳細信息,請參考《創建波形自定義步驟類型》教程。
內容
- 選擇使用自定義步驟類型的時機
- 定義自定義步驟類型的要求
- 管理步驟類型數據
- 子步驟可用於配置自定義步驟類型功能
選擇使用自定義步驟類型的時機
在開始設計自定義步驟類型之前,應考慮其他可能更適合新功能的方法。
在以下情況下,不建議創建或修改自定義步驟類型:
- 新功能會影響所有或許多類型的步驟。 在這種情況下,請考慮使用引擎回調,它將在每個步驟之前或之后執行。
- 希望提供現有步驟的基本配置,但是不需要新的功能或屬性。 在這種情況下,請創建包含步驟更改的步驟模板。
- 希望提供可以在編輯時使用的工具或實用程序。 在這種情況下,請使用自定義工具菜單項來調用自定義代碼。
可在以下情況下創建或修改步驟類型:
- 相應功能無法在內置步驟類型中實現。
- 相應功能需要修改在現有步驟類型實例中無法修改的屬性,
- 相應功能要求必須在調用測試代碼之前或之后執行操作,例如設置步驟或分析結果。
- 希望借助用戶界面簡化配置步驟的用戶體驗。
- 希望與其他組、公司或客戶共享功能。
步驟模板與自定義步驟類型
在序列中開發和配置步驟,然后將這些步驟拖放到“插入選板”(Insertion Palette)的“模板列表”(Templates List)中,即可創建步驟模板。TestStand會將步驟實例的副本保存為模板,將步驟模板拖放到新序列中即可進行復用來快速創建新序列。
步驟模板和自定義步驟類型之間的區別在於,模板只能通過現有步驟類型來創建,並且模板僅包含與原始步驟類型相同的功能。相對於步驟模板,自定義步驟類型在修改或重新設計方面具有更大的靈活性。對於添加到“模板列表”(Templates List)的步驟,只能配置原始步驟類型的開發人員啟用的設置。相比之下,新自定義步驟類型可用於創建具有全新行為的全新步驟。同樣,對步驟模板的更改僅影響該步驟未來的實例,而不會更改該步驟的現有實例。
使用步驟模板有一個好處,若要以相同的方式復用同一步驟,可以避免多次自定義步驟設置。例如,如果要將IVI電源設置為5 V,然后再設置為3.3 V,並計划在整個序列中多次執行此步驟,那么在最初使用並配置步驟后創建兩個步驟模板可以節省時間。但是,如果需要在運行測試代碼之前先配置電源的步驟,創建自定義步驟類型則是一種更好的方法。
步驟模板 |
自定義步驟類型 |
|
|
定義自定義步驟類型的要求
設計自定義步驟類型時,請考慮框架開發人員和測試開發人員各自的職責。 框架開發人員的職責是開發工具和構建塊,而測試開發人員的職責是使用這些工具來實現實際的測試代碼。
設計自定義步驟類型時,您需要履行框架開發人員的職責,請務必從最終用戶和測試開發人員的角度審視所開發的步驟類型的功能。
確定自定義步驟類型的要求時,請遵循以下准則
- 定義自定義步驟類型的范圍。 思考測試開發人員將使用自定義步驟類型執行哪些任務。 此范圍應足夠大,能夠處理這些用例,但范圍過大會使步驟類型的目的不明確。
- 根據步驟類型的范圍,定義步驟類型需要的數據以及存儲數據的方式。
- 定義步驟類型的所有實例應實現的所有功能。 確保在步驟屬性中定義此功能所需的所有數據。
- 定義哪些數據可由用戶編輯,哪些數據應記錄到報表或數據庫中。
- 思考將來可能會需要的功能或配置,並確保這些項目的實現方式可使步驟類型的更新順利傳遞到所有實例。
管理步驟類型數據
自定義步驟類型將數據存儲在多個屬性和設置中,這些屬性和設置可用於配置步驟類型實例的行為,以及管理步驟類型功能所需的數據。其中包括:
- 內置類型屬性,存在於所有步驟類型中,無法在相應類型的實例中進行修改。
- 默認值屬性,用於定義新步驟實例的狀態,可在相應類型的實例中進行修改。
- 為步驟類型定義的自定義屬性。
內置類型屬性
內置步驟類型屬性存在於所有步驟類型中,用戶無法在相應步驟類型的實例中修改這些設置。 此外,對這些屬性的值所做的更改都將傳遞到相應步驟類型的所有實例。
示例:所有步驟類型都定義了一個說明表達式,該表達式顯示在步驟實例旁邊的“步驟”(Steps)窗格中。 此屬性存在於所有步驟類型中,但每種步驟類型的相應值均單獨設置。 此值無法在步驟類型的實例中進行修改。
訪問步驟類型的內置屬性:
- 使用“查看”(View) »“類型”(Types)菜單或快捷鍵Ctrl + T導航到類型視圖
- 右鍵單擊步驟類型,然后選擇“屬性…”(Properties…),啟動屬性窗口
步驟類型屬性對話框
此對話框中的大多數設置均為默認值,下一部分將介紹這些內容。 內置屬性包括:
- 圖標 — 步驟的圖標,位於<TestStand Public>/Components/Icons文件夾中
- 步驟說明表達式 — 步驟說明,顯示在步驟類型實例的步驟窗格中
- 版本設置 — 用於解決類型沖突
- 項目名稱表達式(菜單選項卡)— 定義插入選板中步驟的名稱
創建自文檔化說明
由於相應說明無法在步驟實例中配置,因此您可以作為步驟類型開發人員對說明進行定義,從而幫助用戶創建自文檔化步驟。 說明字段由一個表達式指定,該表達式可用於創建顯示重要步驟屬性的動態說明。 當用戶更改步驟類型實例中的這些屬性值時,說明將更新,使用戶可以快速瀏覽步驟狀態,而無需導航至步驟設置窗格。
示例:下圖第二步中的“步驟說明”更具有描述性,提供的文檔更佳。 此說明使用以下表達式來定義說明:
"Calibrate Channels: " + Str(Step.minChannel) + " - " +Str(Step.maxChannel)
如果用戶配置了minChannel和maxChannel步驟屬性,則此表達式會將說明配置為動態更新。
步驟說明示例
步驟屬性默認值
開發步驟類型時,可以為所有用戶可配置步驟設置配置默認值。 此外,這些屬性可配置為在步驟實例中禁用,從而使設置的默認值無法被修改。 與內置屬性一樣,默認值也在步驟屬性窗口中進行定義。 但是,所有默認值設置都包含“默認”一詞,它可能存在於設置名稱中或配置默認值的設置選項卡中。
示例:狀態表達式屬性用於確定步驟結果。 此屬性存在於所有步驟類型中,每種步驟類型均設置為默認值。 在某些步驟類型中,例如“數值邊界測試”,狀態表達式在步驟類型中被禁用,因此無法在單個數值邊界測試步驟中對表達式進行編輯
設計自定義步驟類型時,可以禁用在步驟類型的實例之間不會變化的任意屬性。 如此可以更好地控制步驟類型用戶修改行為的方式。但是,限制用戶編輯步驟設置可能會影響靈活性,因此您應僅禁用確定用戶始終不需要修改的設置。
請記住,即使禁用在步驟實例中編輯步驟屬性默認值的功能,以后對這些默認值所做的更改也不會傳遞到步驟類型的實例。關於如何解決此問題的更多信息,請查看《更新和維護步驟類型》。
更新默認值時的注意事項
不應使用這些屬性的值來定義步驟類型開發人員可能需要更新的步驟類型功能。 例如,請勿使用步驟的“Post”表達式來實現步驟類型特定功能。 如果需要在步驟類型的未來版本中更新此功能,將無法確保步驟的所有實例都將更新。 而是應在步驟前或步驟后的子步驟中實現此功能。
自定義屬性
除內置屬性外,還可以定義特定於步驟類型的自定義屬性。 這些屬性可用於存儲與步驟類型功能具體相關的數據。
示例:數值邊界測試步驟包含一個“Limits.High”屬性,這是數值邊界步驟類型的獨有屬性。 該類型將此屬性的默認值定義為11,用戶可以修改其創建的每個實例中的該值。
創建自定義步驟屬性:
- 使用“查看”(View) »“類型”(Types)菜單或快捷鍵Ctrl + T導航到類型視圖
- 展開步驟類型項。
- 右鍵單擊“父”(Parent)屬性或“<Right click to insert field>”條目來添加新屬性
如果在步驟類型的結果容器中定義了屬性,則該屬性將包含在結果集合中。 然后,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還可以在序列文件中保留所使用的每個步驟類型的副本,幫助管理步驟的復用。如果在部署序列文件時未使用類型選板文件,序列文件仍將包含步驟類型的副本。
框架開發人員創建的步驟類型通常會分發給多個測試開發人員使用。 由於步驟類型具有許多關聯的文件,因此這可能會帶來一定的挑戰。 為了幫助管理步驟類型文件,請使用以下目錄存儲步驟類型的文件
- 類型選板文件包含類型定義<TestStand Public>/Components/TypePalettes/
- 子步驟代碼模塊文件<TestStand Public>/Components/StepTypes/[typeName]
- 自定義圖標<TestStand Public>/Components/Icons/[typeName]
通過使用這些目錄,可將必要的文件分發到任何測試開發人員系統上的TestStand Public目錄。 如果在新的類型選板文件中定義了類型,則可以對TestStand進行配置,在類型選板文件名中添加“Install_”前綴,自動導入類型選板。 關於此方法的詳細信息,請查看“類型選板文件”幫助主題
避免重命名或更改步驟屬性的數據類型
如果需要更改自定義屬性的類型,可以使用新類型創建另一個屬性,並保留使用先前類型的屬性。如果更改了屬性的名稱或數據類型,TestStand會將步驟實例中的屬性值替換為該屬性的默認值。除了使用新類型創建新屬性外,還可以向步驟類型添加邏輯,用於處理步驟同時使用舊屬性和新屬性的情況。例如,當TestStand將邊界值實現為表達式時,它會添加兩個新的布爾屬性,用於指定使用舊的數值邊界屬性。UseLowExpr和UseHighExpr屬性用於確定步驟是計算舊的數值邊界還是新的表達式邊界。