本頁介紹如何撰寫不需要裝置的主機端測試,例如在 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
。