在 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 測試。
  • 僅支援靜態連結的依附元件。CLASSPATH 中不會包含任何使用 lib 宣告的依附元件。
  • 隔離執行器只會將墊片執行器和測試 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 測試會使用與隔離主機測試相同的執行器,並提供一些特殊選項。

  • robolectric-resources 選項可讓幾個 Robolectric 專屬指令列選項傳遞至子程序,並將 android-all 的樹狀結構建構項目新增至子程序的類別路徑。雖然其他兩個選項是最佳做法,但如果要執行任何成功的機器人測試,則必須使用這個選項
  • 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