編寫 Tradefed 測試執行器

本頁面說明如何在 Tradefed 中編寫新的測試執行程式。

背景

如果您想瞭解 Tradefed 架構中的測試執行器位置,請參閱「測試執行器的結構」。

這並非編寫新測試執行工具的必要條件,測試執行工具可以獨立編寫。

最低要求:實作介面

要符合 Tradefed 測試執行工具的最低標準,您必須實作 IRemoteTest 介面,具體來說就是 run(TestInformation testInfo, ITestInvocationListener listener) 方法。

這個方法是測試執行程式使用時由測試套件呼叫的方法,類似於 Java Runnable。

該方法的每個部分都會視為測試執行程式執行作業的一部分。

回報測試執行程式的結果

基本介面中的 run 方法可存取 ITestInvocationListener 類型的監聽器物件。這個物件是將結構化結果從測試執行程式回報給測試套件的重要關鍵。

透過回報結構化結果,測試執行程式具有下列屬性:

  • 回報所有執行的測試、測試所需時間,以及個別測試是否通過、失敗或處於其他狀態的適當清單。
  • 回報與測試相關的指標 (如適用),例如安裝時間指標。
  • 適合大多數基礎架構工具,例如顯示結果和指標等。
  • 通常比較容易偵錯,因為執行作業的追蹤記錄會更精細。

不過,回報結構化結果並非必要;測試執行器可能只想評估整個執行作業的狀態為「通過」或「失敗」,而不需要任何實際執行作業的詳細資料。

您可以在事件監聽器上呼叫下列事件,通知 harness 目前的執行進度:

  • testRunStarted:通知一組相關聯的測試案例開始執行。
    • testStarted:通知測試案例開始。
    • testFailed/testIgnored:通知測試案例的狀態變更。系統會將未變更狀態的測試案例視為通過。
    • testEnded:通知測試案例結束。
  • testRunFailed:通知測試案例群組執行作業的整體狀態為失敗。測試執行結果可以是「通過」或「失敗」不受測試案例結果影響,這取決於執行作業的預期結果。舉例來說,執行多個測試案例的二進位檔可能會回報所有通過的測試案例,但會附帶錯誤的結束碼 (原因可能為任何原因:例如遺漏檔案)。
  • testRunEnded:通知測試案例群組結束。

維護並確保回呼的正確順序是測試執行程式實作者的責任,例如確保在使用 finally 子句的例外狀況中,會呼叫 testRunEnded

測試案例回呼 (testStartedtestEnded 等) 為選用項目。測試執行作業可能會在沒有任何測試案例的情況下發生。

您可能會注意到,這個事件結構的靈感來自一般 JUnit 結構。這麼做是為了讓開發人員熟悉基本概念。

回報測試執行器的記錄

如果您要編寫自己的 Tradefed 測試類別或執行程式,請實作 IRemoteTest,並透過 run() 方法取得 ITestInvocationListener。這個事件監聽器可用於記錄檔案,如下所示:

    listener.testLog(String dataName, LogDataType type_of_data, InputStreamSource data);

使用裝置進行測試

上述最基本介面可讓您執行非常簡單的測試,這些測試是隔離的,且不需要任何特定資源,例如 Java 單元測試。

如要進行裝置測試的下一個步驟,測試編寫人員需要使用下列介面:

  • IDeviceTest 可讓您接收代表測試中裝置的 ITestDevice 物件,並提供可與該物件互動的 API。
  • IBuildReceiver 可讓測試取得在建構提供者步驟中建立的 IBuildInfo 物件,其中包含與測試設定相關的所有資訊和構件。

測試執行程式通常會使用這些介面,取得與執行作業相關的構件,例如額外檔案,並取得在執行期間指定的測試裝置。

使用多部裝置進行測試

Tradefed 支援同時在多部裝置上執行測試。這在測試需要外部互動的元件時很實用,例如手機和手錶配對。

如要編寫可使用多部裝置的測試執行器,您必須實作 IMultiDeviceTest,這樣才能接收 ITestDeviceIBuildInfo 的對應項目,其中包含裝置表示法的完整清單,以及相關聯的版本資訊。

介面中的 setter 一律會在 run 方法之前呼叫,因此可以安全地假設在呼叫 run 時,結構會可供使用。

測試能瞭解自身設定

部分測試執行程式實作項目可能需要整體設定資訊才能正常運作,例如叫用作業的某些中繼資料,或是先前執行的 target_preparer 等。

為達成這項目標,測試執行工具可以存取所屬的 IConfiguration 物件,並在該物件中執行。詳情請參閱設定物件說明。

針對測試執行程式實作,您需要實作 IConfigurationReceiver 來接收 IConfiguration 物件。

彈性測試執行工具

如果測試執行程式具有精細的控制項,則可提供靈活的測試執行方式,例如 JUnit 測試執行程式可個別執行每項單元測試。

這樣一來,較大的測試套件和基礎架構就能利用精細控制功能,使用者也能透過篩選功能執行部分測試執行程式。

ITestFilterReceiver 介面說明瞭篩選支援功能,可讓您接收 includeexclude 篩選器組合,用於應執行或不應執行的測試。

我們的慣例是,如果測試符合一或多個「包含」篩選器,且不符合任何「排除」篩選器,就會執行。如果未提供包含篩選條件,只要測試不符合任何排除篩選條件,就應執行所有測試。