本頁面說明如何在 Tradefed 中編寫新的測試執行程式。
背景
如果您想瞭解 Tradefed 架構中的測試執行器位置,請參閱「測試執行器的結構」。
這並非編寫新測試執行工具的必要條件,測試執行工具可以獨立編寫。
最低要求:實作介面
要符合 Tradefed 測試執行器的最低標準,您必須實作 IRemoteTest 介面,具體來說是 run(TestInformation testInfo, ITestInvocationListener listener)
方法。
此方法是在使用測試執行器時由控管工具叫用的方法,與 Java Runnable 類似。
該方法的每個部分都會視為測試執行程式執行作業的一部分。
回報測試執行工具的結果
基本介面的 run
方法可讓您存取 ITestInvocationListener
類型的事件監聽器物件。這個物件是將結構化結果從測試執行器回報給測試套件的重要關鍵。
回報結構化結果時,測試執行工具會具備下列屬性:
- 回報所有執行的測試、測試所需時間,以及各個測試是否通過、失敗或處於其他狀態的適當清單。
- 回報與測試相關的指標 (如適用),例如安裝時間指標。
- 適合大多數基礎架構工具,例如顯示結果和指標等。
- 通常比較容易偵錯,因為執行作業的追蹤記錄會更精細。
不過,回報結構化結果並非必要;測試執行程式可能只想評估整個執行作業的狀態為「通過」或「失敗」,而不需要任何實際執行作業的詳細資料。
您可以在事件監聽器上呼叫下列事件,通知 harness 目前的執行進度:
- testRunStarted:通知一組相關的測試案例開頭。
- testStarted:通知測試案例開始。
- testFailed/testIgnored:通知測試案例的狀態變更。系統會將未變更狀態的測試案例視為通過。
- testEnded:通知測試案例結束。
- testRunFailed:通知測試案例群組執行作業的整體狀態為失敗。測試執行結果可以是「通過」或「失敗」不受測試案例結果影響,這取決於執行作業的預期結果。舉例來說,執行多個測試案例的二進位檔可能會回報所有通過的測試案例,但會附帶錯誤的結束碼 (原因可能為任何原因:例如遺漏檔案)。
- testRunEnded:通知測試案例群組結束。
維護並確保回呼的正確順序是測試執行器實作者的責任,例如確保在使用 finally
子句的例外狀況中,會呼叫 testRunEnded
。
測試案例回呼 (testStarted
、testEnded
等) 為選用項目。測試執行作業可能沒有任何測試案例。
您可能會注意到這個事件結構是來自一般 JUnit 結構。這是為了讓開發人員能夠大致瞭解基本知識。
回報測試執行器的記錄
如要自行編寫 Tradefed 測試類別或執行器,則必須實作 IRemoteTest,並透過 run()
方法取得 ITestInvocationListener
。這個事件監聽器可用於記錄檔案,如下所示:
listener.testLog(String dataName, LogDataType type_of_data, InputStreamSource data);
使用裝置進行測試
上述的最低介面可讓您執行非常簡單的測試,並不需要任何特定資源,例如 Java 單元測試。
如要進行裝置測試的下一個步驟,測試編寫人員需要使用下列介面:
- IDeviceTest 可讓您接收代表測試中裝置的
ITestDevice
物件,並提供可與該物件互動的 API。 - IBuildReceiver 可讓測試取得在建構供應商步驟中建立的
IBuildInfo
物件,其中包含與測試設定相關的所有資訊和構件。
測試執行器通常對這些介面感興趣,目的是取得與執行作業相關的構件 (例如額外檔案),並取得要在執行期間鎖定的受測試裝置。
使用多部裝置進行測試
換購支援可同時在多部裝置上執行測試。這在測試需要外部互動的元件時很實用,例如手機和手錶配對。
如要編寫可使用多部裝置的測試執行器,您必須實作 IMultiDeviceTest,以便接收 ITestDevice
對 IBuildInfo
的對應,其中包含裝置表示法及其相關建構資訊的完整清單。
介面中的 setter 一律會在 run
方法之前呼叫,因此可以安全地假設在呼叫 run
時,結構會可供使用。
測試瞭解其設定
某些測試執行器實作可能需要瞭解整體設定的相關資訊,才能正常運作,例如有關叫用的部分中繼資料,或是先前執行過 target_preparer
的中繼資料。
為達成此目標,測試執行工具可以存取所屬的 IConfiguration
物件,並在該物件中執行。詳情請參閱設定物件說明。
針對測試執行程式實作,您需要實作 IConfigurationReceiver 來接收 IConfiguration
物件。
彈性測試執行工具
如果測試執行程式具有精細的控制項,則可提供靈活的測試執行方式,例如 JUnit 測試執行程式可個別執行每項單元測試。
這樣一來,較大的測試套件和基礎架構就能利用精細控制功能,使用者也能透過篩選功能執行部分測試執行器。
ITestFilterReceiver 介面說明瞭篩選支援功能,可讓您接收應執行或不應執行的測試的 include
和 exclude
篩選器組合。
我們的慣例是,如果測試符合一或多個「包含」篩選器,且不符合任何「排除」篩選器,就會執行。如果沒有提供包含篩選器,只要測試不符合任何排除篩選器,就應執行所有測試。