編寫 Tradefed 測試運行程序

本頁面介紹如何在 Tradefed 中撰寫新的測試運行程式。

背景

如果您對測試運行程式在 Tradefed 架構中的位置感到好奇,請參閱測試運行程式的結構

這不是編寫新測試運行程式的先決條件;測試運行程式可以單獨編寫。

最低要求:實現介面

獲得 Tradefed 測試運行程序資格的最低限度是實現IRemoteTest 接口,更具體地說, run(TestInformation testInfo, ITestInvocationListener listener)方法。

此方法是工具在使用測試運行器時呼叫的方法,類似於 Java Runnable。

該方法的每個部分都被視為測試運行器執行的一部分。

測試運行者的報告結果

基本介面中的run方法提供對ITestInvocationListener類型的偵聽器物件的存取。該物件是從測試運行器向工具報告結構化結果的關鍵。

透過報告結構化結果,測試運行程序具有以下屬性:

  • 報告所有運行的測試的正確清單、它們花費了多長時間以及它們是否單獨通過、失敗或其他一些狀態。
  • 報告與測試相關的指標(如果適用),例如安裝時間指標。
  • 適合大多數基礎設施工具,例如顯示結果和指標等。
  • 通常更容易調試,因為有更精細的執行追蹤。

也就是說,報告結構化結果是可選的;測試運行者可能只想評估整個運行的狀態為“通過”或“失敗”,而不需要任何實際執行的詳細資訊。

可以在偵聽器上呼叫下列事件來通知工具目前的執行進度:

  • 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過濾器集。

我們的約定是,如果測試與一個或多個包含過濾器匹配且不與任何排除過濾器匹配,則執行測試。如果沒有給出包含過濾器,則只要它們不符合任何排除過濾器,就應該執行所有測試。