本頁說明如何在 Tradefed 中編寫新的測試執行器。
背景
如要瞭解測試執行器在 Tradefed 架構中的位置,請參閱「測試執行器的結構」。
這並非編寫新測試執行器的必要條件;測試執行器可以獨立編寫。
最低要求:實作介面
如要符合 Tradefed 測試執行器資格,最基本的要求是實作 IRemoteTest 介面,更具體來說是 run(TestInformation testInfo, ITestInvocationListener listener)
方法。
使用測試執行器時,架構會叫用這個方法,類似於 Java Runnable。
該方法的每個部分都視為測試執行器執行作業的一部分。
從測試執行器回報結果
基本介面中的 run
方法可存取 ITestInvocationListener
類型的監聽器物件。這個物件是將測試執行器的結構化結果回報給架構的關鍵。
透過回報結構化結果,測試執行器具有下列屬性:
- 回報所有執行的測試、測試時間,以及個別測試是否通過、失敗或其他狀態。
- 與測試相關的報表指標 (如適用),例如安裝時間指標。
- 適用於大多數基礎架構工具,例如顯示結果和指標等。
- 由於執行作業的追蹤記錄更精細,因此通常更容易偵錯。
也就是說,您可以選擇是否要回報結構化結果;測試執行器可能只想評估整個執行的狀態是「通過」或「失敗」,而不需要實際執行的任何詳細資料。
可以在監聽器上呼叫下列事件,將執行作業的目前進度通知給測試架構:
- 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
物件, 其中包含與測試設定相關的所有資訊和構件。
測試執行器通常會對這些介面感興趣,以便取得與執行作業相關的構件 (例如額外檔案),並取得執行作業期間的目標測試裝置。
使用多部裝置測試
Tradefed 支援同時在多部裝置上執行測試。測試需要外部互動的元件時,這項功能非常實用,例如手機和手錶配對。
如要編寫可使用多部裝置的測試執行器,您需要實作 IMultiDeviceTest,這樣才能接收 ITestDevice
對應至 IBuildInfo
的對映,其中包含裝置表示法完整清單及其相關聯的建構資訊。
介面的設定程式一律會在 run
方法之前呼叫,因此可以放心假設 run
呼叫時結構會可用。
測試會留意設定
部分測試執行器實作項目可能需要整體設定的相關資訊,才能正常運作,例如呼叫的某些中繼資料,或是先前執行的 target_preparer
等。
為達成此目的,測試執行工具可以存取其所屬的 IConfiguration
物件,以及執行該物件的環境。詳情請參閱設定物件說明。
如要實作測試執行器,您需要實作 IConfigurationReceiver,才能接收 IConfiguration
物件。
彈性測試執行器
如果測試執行器能精細控管測試,就能彈性執行測試,例如 JUnit 測試執行器可個別執行每項單元測試。
這樣一來,較大的架構和基礎架構就能運用這項精細控制項,使用者也能透過篩選部分執行測試人員。
如需篩選器支援的說明,請參閱 ITestFilterReceiver 介面,這個介面可接收應執行或不應執行的測試適用的 include
和 exclude
篩選器組合。
我們的慣例是,測試會執行 IFF,只要符合一或多個 include 篩選器,且不符合任何 exclude 篩選器。如未提供任何納入篩選條件,只要測試不符合任何排除篩選條件,就應執行所有測試。