如何只執行某些測試在特定的裝置上 (connectedAndroidTest)

connectedAndoidTest 預設會將所有 test 執行在所有連接的 device/emulator 上,若只想執行某些 test 在特定的 device/emulator 上要怎麼做?

只執行某些 Test

connectedAndroidTest 背後其實也是透過 am instrument 搭配 AndroidJUnitRuner 在 device/emulator 上執行測試:

am instrument -w [FLAGS] TEST_PACKAGE/RUNNER_CLASS

其中 RUNNER_CLASS 通常是 android.support.test.runner.AndroidJUnitRunner

AndroidJUnitRunner 本身支援許多跟測試篩選 (test filtering) 有關的 flag (-e KEY VALUE),例如要執行特定一個 test 可以用 -e class com.example.FooTest#testFoo

早期 connectedAndroidTest 不支援從 command line 傳入 instrumentation runner argument (也就是上面的 flag),只能先將 test app 安裝上去,再用 am instrument 執行測試。例如:

$ ./gradlew installDebugAndroidTest
$ adb shell am instrument -w -e class com.example.FooTest#testFoo \
com.example.test/android.support.test.runner.AndroidJUnitRunner

不過 Android Plugin for Gradle 從 1.3.0 版開始支援這項功能:

Android plugin for Gradle, revision 1.3.0 (July 2015)

Added support for specifying instrumentation test-runner arguments from the command line. For example:

  ./gradlew connectedCheck \
  -Pandroid.testInstrumentationRunnerArguments.size=medium \
  -Pandroid.testInstrumentationRunnerArguments.class=TestA,TestB
  

Android Plugin for Gradle Release Notes

也就是以下面的形式從 command line 提供 runner argument:

-Pandroid.testInstrumentationRunnerArguments.KEY=VALUE

所上面的例子可以改用:

$ ./gradlew connectedAndroidTest \
-Pandroid.testInstrumentationRunnerArguments.class=com.example.FooTest#testFoo

AndroidJUnitRunner 還支援其他 case filtering 的條件,包括:

  • -e class com.example.FooTest#testFoo,com.example.BarTest#testBar – 只執行一或多個 test。
  • -e class com.example.FooTest,com.example.BarTest – 只執行一或多個 class 裡所有的 test。
  • -e package com.example.foo – 只執行某個 (Java) package 裡所有的 test。
  • -e annotation com.example.MyAnnotation – 只執行有標示某個 annotation 的 test。
  • -e notAnnotation com.example.MyAnnotation,com.example.AnotherAnnotation – 排除有標示任一 annotation 的 test。
  • -e size small | medium | large – 只執行標示有 @SmallTest@MediumTest@LargeTest 的 test。

更多用法可以參考AndroidJUnitRunner 的說明

只執行在某些 Device/Emulator

connectedAndoidTest 預設會將所有 test 執行在所有連接的 device/emulator 上,若只想執行在某些 device/emulator 上要怎麼做?

就像 #66129 所描述的情節一樣,這樣的需求通常會發生在 build server 上,因為同時連接有許多不同用途的 device/emulator。但這件事有點弔詭,因為相關的討論並不多:

根據 #160929 的說法,可以透過 ANDROID_SERIAL 環境變數來指定一或多個 device/emulator (用逗號隔開),在 Android Plugin for Gradle 2.1.2 上試過是有作用的。例如:

$ ANDROID_SERIAL=emulator-5554,ABC123DEF ./gradlew connectedAndroidTest

只在 emulator-5554 (emulator) 與 ABC123DEF (device) 上執行測試。

總結

在實務上可以將上述兩種方法並用,例如:

$ ANDROID_SERIAL=emulator-5554,ABC123DEF ./gradlew connectedAndroidTest \
-Pandroid.testInstrumentationRunnerArguments.size=small

只在 emulator-5554 (emulator) 與 ABC123DEF (device) 上執行標示有 @SmallTest 的 test。

廣告

發表迴響

Please log in using one of these methods to post your comment:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s