在TF中編寫主機端無設備測試

本頁介紹如何撰寫不需要裝置的主機端測試,例如在 Linux GCE 實例上執行的測試。 (有關編寫需要設備的主機驅動測試的詳細信息,請參閱在 Trade Federation 中編寫主機驅動測試。)

主機端測試類型

您可以透過 Trade Federation (TF) 執行多種類型的主機端測試。

本機 (gtest) 測試

建立本機測試(gtest) 來測試平台。如果測試不需要設備,則在主機上執行;這樣測試會運行得更快。若要將此類測試配置為在測試主機上執行,請使用 TF 運行程式HostGTest

這是 TradeFed 測試配置範例:

<configuration description="Runs hello_world_test.">
    <option name="null-device" value="true" />
    <test class="com.android.tradefed.testtype.HostGTest" >
        <option name="module-name" value="hello_world_test" />
    </test>
</configuration>

測試配置在主機上執行 gtest 測試 ( hello_world_test )。範例測試配置可以自動產生。除非您的測試需要特殊設定或清理,否則您可以依靠自動測試配置產生來建立正確的 TF 測試配置。

若要設定主機端 gtest 並啟用自動測試配置生成,請在Android.bp中將host_supported設為true ,如hello_world_test

有關編寫本機測試的更多信息,請參閱添加新的本機測試範例

JAR 主機測試

JAR (Java) 主機測試(例如 JUnit)是不需要在裝置上執行的測試,並且提供 Java 專案的程式碼覆蓋率。可以使用運行器HostTest將此類測試配置為在測試主機上執行。

TradeFed 測試配置範例

<configuration description="Executes HelloWorldHostTest">
    <test class="com.android.tradefed.testtype.HostTest" >
        <option name="jar" value="HelloWorldHostTest.jar" />
    </test>
</configuration>

測試配置運行HelloWorldHostTest的主機端 JUnit 測試。請注意,上述測試配置可以自動產生。除非您的測試需要特殊設定或清理,否則請依賴自動測試配置產生來建立正確的 TradeFed 測試配置。

有關如何編寫 JAR 主機測試的更多詳細信息,請參閱JAR (Java) 主機測試頁面。

隔離 Java 主機測試

無設備 Java 測試可以在隔離環境中運行,但效能成本較低。但是,在選擇使用此環境之前需要考慮一些主要因素。

  • 這是用於 Robolectric 和 JUnit 單元測試的預設運行程序
  • Tradefed 僅支援隔離環境中的 JUnit 測試。
  • 僅支援靜態連結的依賴項。類別路徑中不包含使用lib聲明的依賴項。
  • 隔離運行程式僅將 shim 運行程式和測試 jar 放在類別路徑上。
  • 使用此運行程序執行的每個測試運行都會產生一定量的固定開銷。

Tradefed 測試配置範例(獨立)

<configuration description="Executes HelloWorldHostTest">
    <test class="com.android.tradefed.testtype.IsolatedHostTest" >
        <option name="jar" value="HelloWorldHostTest.jar" />
    </test>
</configuration>

自動產生的 Soong 設定範例

Soong 可以使用像本例這樣的聲明來自動產生配置,而不是像上面那樣手動建立測試配置。

java_test_host {
    name: "HelloWorldHostTest",

    test_options: {
        unit_test: true,
    },

    test_suites: ["general-tests"],

    srcs: ["test/**/*.java"],

    static_libs: [
        "junit",
    ],
}

機器人電動測試

Robolectric 測試使用與隔離主機測試相同的執行器,並附有一些特殊選項。

  • robolectric-resources選項允許將一些 Robolectric 特定的命令列選項傳遞到子進程中,並將android-all的樹建置新增至子進程類別路徑中。雖然其他兩個是最佳實踐,但要成功運行 Robolectric 測試,此選項是必要的
  • java-folder選項允許更改子程序使用的 Java 運行時。這是必要的,因為 Robolectric 更喜歡特定的 Java 版本,而這些版本可能與主機系統的首選 JVM 不一致。
  • exclude-paths選項允許子進程運行程式完全避免載入特定模組,這在 JAR 附帶可能導致載入錯誤的無關類別時非常有用。 java.是一種常見的排除,以避免拋出SecurityException異常。

Robolectric 設定範例

<configuration description="Executes a Sample Robolectric Test">
    <option name="java-folder" value="prebuilts/jdk/jdk9/linux-x86/" />
    <option name="exclude-paths" value="java" />
    <option name="use-robolectric-resources" value="true" />
    <test class="com.android.tradefed.testtype.IsolatedHostTest">
        <option name="jar" value="RobolectricExampleTest.jar" />
    </test>
</configuration>

Robolectric 自動產生的 Soong 設定範例

Soong 可以使用像本例這樣的聲明來自動產生配置,而不是像上面那樣手動建立測試配置。

android_robolectric_test {
    name: "HelloWorldRoboTest",
    srcs: [
        "src/**/*.java",
    ],

    // Include the testing libraries
    static_libs: [
        "mockito-robolectric-prebuilt",
        "platform-test-annotations",
        "testng",
        "truth-prebuilt",
    ],

    instrumentation_for: "HelloWorldApp",
}

Python測試

如果測試邏輯是用 Python 編寫的,請使用建置類型python_test_host建立可由 TF PythonBinaryHostTest運行的 par 檔案。

TradeFed 測試配置範例

<configuration description="Config to run atest unittests">
    <test class="com.android.tradefed.testtype.python.PythonBinaryHostTest" >
        <option name="par-file-name" value="atest_unittests" />
        <option name="test-timeout" value="2m" />
    </test>
</configuration>

測試套件設定

為了使 TF 能夠針對給定建置存取主機端測試,請將測試模組`test_suites`設定為`general-tests`

test_suites: ["general-tests"],

透過此設置,測試將打包到test_suites目標上的general-tests.zip