本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
建立 IDT 測試案例可執行檔
您可以透過下列方式,在測試套件資料夾中建立和放置測試案例可執行檔:
-
對於使用
test.json
檔案中的引數或環境變數來判斷要執行哪些測試的測試套件,您可以建立整個測試套件的單一測試案例可執行檔,或測試套件中每個測試群組的測試可執行檔。 -
對於您想要根據指定命令執行特定測試的測試套件,您可以在測試套件中為每個測試案例建立一個可執行的測試案例。
身為測試寫入器,您可以判斷哪種方法適合您的使用案例,並據以建構您的測試案例可執行檔。請確定您在每個test.json
檔案中提供正確的測試案例可執行路徑,且指定的可執行檔正確執行。
當所有裝置準備好執行測試案例時,IDT 會讀取下列檔案:
-
所選測試案例
test.json
的 會決定要啟動的程序,以及要設定的環境變數。 -
測試套件
suite.json
的 決定要設定的環境變數。
IDT 會根據 test.json
檔案中指定的命令和引數啟動必要的測試可執行程序,並將所需的環境變數傳遞給程序。
使用 IDT 用戶端 SDK
IDT 用戶端SDKs可讓您使用 API 命令,簡化在測試可執行檔中編寫測試邏輯的方式,您可以使用該命令與 IDT 和受測裝置互動。IDT 目前提供下列 SDKs:
-
適用於 Python 的 IDT 用戶端 SDK
-
IDT Client SDK for Go
-
適用於 Java 的 IDT 用戶端 SDK
這些 SDKs位於
資料夾中。建立新的測試案例可執行檔時,您必須將要使用的 SDK 複製到包含測試案例可執行檔的資料夾,並在程式碼中參考 SDK。本節提供可在測試案例可執行檔中使用的可用 API 命令的簡短描述。<device-tester-extract-location>
/sdks
裝置互動
下列命令可讓您與受測裝置通訊,而不必實作任何其他裝置互動和連線管理功能。
ExecuteOnDevice
-
允許測試套件在支援 SSH 或 Docker shell 連線的裝置上執行 Shell 命令。
CopyToDevice
-
允許測試套件將本機檔案從執行 IDT 的主機機器複製到支援 SSH 或 Docker shell 連線之裝置上的指定位置。
ReadFromDevice
-
允許測試套件從支援 UART 連線的裝置序列連接埠讀取。
注意
由於 IDT 不會管理使用內容中的裝置存取資訊所建立之裝置的直接連線,我們建議您在測試案例可執行檔中使用這些裝置互動 API 命令。不過,如果這些命令不符合您的測試案例要求,則您可以從 IDT 內容擷取裝置存取資訊,並使用它從測試套件直接連線至裝置。
若要進行直接連線,請分別擷取 中的資訊,device.connectivity
以及受測裝置和資源裝置resource.devices.connectivity
的欄位。如需使用 IDT 內容的詳細資訊,請參閱 使用 IDT 內容。
IDT 互動
下列命令可讓您的測試套件與 IDT 通訊。
PollForNotifications
-
允許測試套件檢查來自 IDT 的通知。
GetContextValue
和GetContextString
-
允許測試套件從 IDT 內容擷取值。如需詳細資訊,請參閱使用 IDT 內容。
SendResult
-
允許測試套件向 IDT 報告測試案例結果。此命令必須在測試套件中每個測試案例的結尾呼叫。
主機互動
下列命令可讓您的測試套件與主機機器通訊。
PollForNotifications
-
允許測試套件檢查來自 IDT 的通知。
GetContextValue
和GetContextString
-
允許測試套件從 IDT 內容擷取值。如需詳細資訊,請參閱使用 IDT 內容。
ExecuteOnHost
-
允許測試套件在本機機器上執行命令,並讓 IDT 管理測試案例可執行生命週期。
啟用 IDT CLI 命令
run-suite
命令 IDT CLI 提供多種選項,可讓測試執行器自訂測試執行。若要允許測試執行器使用這些選項來執行自訂測試套件,請實作對 IDT CLI 的支援。如果您未實作支援,測試執行器仍然可以執行測試,但某些 CLI 選項將無法正常運作。為了提供理想的客戶體驗,建議您在 IDT CLI 中為 run-suite
命令實作下列引數的支援:
timeout-multiplier
-
指定大於 1.0 的值,該值將在執行測試時套用至所有逾時。
測試執行器可以使用此引數來增加他們想要執行的測試案例的逾時。當測試執行器在其
run-suite
命令中指定此引數時,IDT 會使用它來計算 IDT_TEST_TIMEOUT 環境變數的值,並在 IDT 內容中設定config.timeoutMultiplier
欄位。若要支援此引數,您必須執行下列動作:-
讀取 IDT_TEST_TIMEOUT 環境變數以取得正確計算的逾時值,而不是直接使用
test.json
檔案的逾時值。 -
從 IDT 內容擷取
config.timeoutMultiplier
值,並將其套用至長時間執行的逾時。
如需因逾時事件而提早結束的詳細資訊,請參閱指定結束行為。
-
stop-on-first-failure
-
指定如果 IDT 遇到失敗,應停止執行所有測試。
當測試執行器在其
run-suite
命令中指定此引數時,IDT 會在遇到失敗時立即停止執行測試。不過,如果測試案例平行執行,則這可能會導致非預期的結果。若要實作支援,請確定如果 IDT 遇到此事件,您的測試邏輯會指示所有執行中的測試案例停止、清除臨時資源,並向 IDT 報告測試結果。如需在故障時提早結束的詳細資訊,請參閱 指定結束行為。 group-id
和test-id
-
指定 IDT 應僅執行選取的測試群組或測試案例。
測試執行器可以將這些引數與其
run-suite
命令搭配使用,以指定下列測試執行行為:-
在指定的測試群組內執行所有測試。
-
在指定的測試群組內執行一系列的測試。
若要支援這些引數,測試套件的測試協調器必須在測試協調器中包含一組特定的
RunTask
和Choice
狀態。如果您不使用自訂狀態機器,則預設的 IDT 測試協調器會包含您所需的狀態,而且您不需要採取其他動作。不過,如果您使用的是自訂測試協調器,則使用 狀態機器範例:執行使用者選取的測試群組做為範例,在您的測試協調器中新增所需的狀態。 -
如需 IDT CLI 命令的詳細資訊,請參閱 偵錯並執行自訂測試套件。
寫入事件日誌
測試執行時,您可以將資料傳送至 stdout
和 stderr
,以將事件日誌和錯誤訊息寫入主控台。如需主控台訊息格式的相關資訊,請參閱主控台訊息格式。
當 IDT 完成執行測試套件時,此資訊也可在 資料夾的 test_manager.log
檔案中取得
。<devicetester-extract-location>
/results/<execution-id>
/logs
您可以設定每個測試案例,將日誌從其測試執行寫入至位於
資料夾中<device-tester-extract-location>
/results/execution-id
/logs
的檔案,包括測試中裝置的日誌。若要執行此操作,請從 IDT 內容中擷取日誌檔案的路徑<group-id>
_<test-id>
testData.logFilePath
,在該路徑建立檔案,然後寫入您想要的內容。IDT 會根據正在執行的測試案例自動更新路徑。如果您選擇不建立測試案例的日誌檔案,則不會產生該測試案例的檔案。
您也可以設定文字可執行檔,視需要在
資料夾中建立其他日誌檔案。建議您為日誌檔案名稱指定唯一的字首,以免您的檔案遭到覆寫。<device-tester-extract-location>
/logs
向 IDT 報告結果
IDT 會將測試結果寫入 awsiotdevicetester_report.xml
和
檔案。這些報告檔案位於 。 suite-name
_report.xml
兩個報告都會擷取測試套件執行的結果。如需 IDT 用於這些報告之結構描述的詳細資訊,請參閱 檢閱 IDT 測試結果和日誌<device-tester-extract-location>
/results/<execution-id>
/
若要填入
檔案的內容,您必須在測試執行完成之前使用 suite-name
_report.xmlSendResult
命令向 IDT 報告測試結果。如果 IDT 找不到測試的結果,則會發出測試案例的錯誤。下列 Python 摘錄顯示將測試結果傳送至 IDT 的命令:
request-variable
= SendResultRequest(TestResult(result
)) client.send_result(request-variable
)
如果您未透過 API 報告結果,IDT 會在測試成品資料夾中尋找測試結果。此資料夾的路徑會存放在 IDT 內容中testData.testArtifactsPath
存檔的 中。在此資料夾中,IDT 會使用第一個依字母順序排序的 XML 檔案做為測試結果。
如果您的測試邏輯產生 JUnit XML 結果,您可以將測試結果寫入成品資料夾中的 XML 檔案,以直接將結果提供給 IDT,而不是剖析結果,然後使用 API 將結果提交給 IDT。
如果您使用此方法,請確定您的測試邏輯準確摘要測試結果,並以與檔案相同的格式格式化結果
檔案。IDT 不會對您提供的資料執行任何驗證,但以下情況除外:suite-name
_report.xml
-
IDT 會忽略
testsuites
標籤的所有屬性。反之,它會從其他報告的測試群組結果計算標籤屬性。 -
必須至少有一個
testsuite
標籤存在於 中testsuites
。
由於 IDT 在所有測試案例使用相同的成品資料夾,且不會在測試執行之間刪除結果檔案,因此如果 IDT 讀取不正確的檔案,此方法也可能會導致錯誤報告。建議您在所有測試案例使用與產生 XML 結果檔案相同的名稱,以覆寫每個測試案例的結果,並確保 IDT 可以使用正確的結果。雖然您可以使用混合方法在測試套件中報告,也就是說,對於某些測試案例使用 XML 結果檔案,並透過 API 為其他人提交結果,但不建議使用此方法。
指定結束行為
將您的文字可執行檔設定為一律以結束碼 0 結束,即使測試案例報告失敗或錯誤結果亦然。僅使用非零結束碼來表示測試案例未執行,或測試案例可執行檔無法將任何結果傳達給 IDT。當 IDT 收到非零結束碼時,它會標記測試案例發生錯誤,導致無法執行。
IDT 可能會請求或預期測試案例在下列事件完成之前停止執行。使用此資訊來設定您的測試案例可執行檔,以偵測測試案例中的每個事件:
- Timeout (逾時)
-
當測試案例執行的時間超過
test.json
檔案中指定的逾時值時,便會發生。如果測試執行器使用timeout-multiplier
引數指定逾時乘數,則 IDT 會使用乘數計算逾時值。若要偵測此事件,請使用 IDT_TEST_TIMEOUT 環境變數。當測試執行器啟動測試時,IDT 會將 IDT_TEST_TIMEOUT 環境變數的值設定為計算的逾時值 (以秒為單位),並將變數傳遞至測試案例可執行檔。您可以讀取變數值來設定適當的計時器。
- 中斷
-
當測試執行器中斷 IDT 時發生。例如,按 Ctrl+C。
由於終端機會將訊號傳播到所有子程序,因此您只需在測試案例中設定訊號處理常式,即可偵測中斷訊號。
或者,您可以定期輪詢 API,以檢查
PollForNotifications
APICancellationRequested
回應中的布林值。當 IDTCancellationRequested
收到中斷訊號時,它會將布林值設定為true
。 - 第一次失敗時停止
-
當與目前測試案例平行執行的測試案例失敗,且測試執行器使用
stop-on-first-failure
引數指定 IDT 應在遇到任何失敗時停止時,便會發生。若要偵測此事件,您可以定期輪詢 API,以檢查
PollForNotifications
APICancellationRequested
回應中的布林值。當 IDT 遇到故障,且設定為在第一次故障時停止時,它會將CancellationRequested
布林值設定為true
。
當這些事件發生時,IDT 會等待 5 分鐘,讓任何目前正在執行的測試案例完成執行。如果所有執行中的測試案例未在 5 分鐘內結束,IDT 會強制其每個程序停止。如果 IDT 未在程序結束前收到測試結果,則會將測試案例標記為已逾時。最佳實務是,您應該確保測試案例在遇到其中一個事件時執行下列動作:
-
停止執行正常測試邏輯。
-
清除任何臨時資源,例如受測裝置上的測試成品。
-
向 IDT 報告測試結果,例如測試失敗或錯誤。
-
結束。