コマンドラインで実行するには
androidTestをターミナルで実行するには、./gradlewを使う方法、adbを使う方法があります。
./gradlewを使う方法は、全てのandroidTestを実行します。apk作成前の自動テストで使うことが多いです。
$ ./gradlew app:clean
$ ./gradlew app:connectedAndroidTest
Code language: Bash (bash)
一部のテストクラスだけを実行するには?
テストクラス jp.example.myapp.MyTest を実行するには、adbを使います。「am instrument」は、テストアプリを実行するだけです。あらかじめ、ビルドやインストールしておく必要があります。
$ test_package=jp.example.myapp.test
$ test_runner=androidx.test.runner.AndroidJUnitRunner
$ test_class=jp.example.myapp.MyTest
$ ./gradlew app:clean
$ ./gradlew app:installDebugAndroidTest
$ adb shell am instrument -w e class $test_class $test_package/$test_runnber
Code language: Bash (bash)
メソッドを指定することもできます。
$ test_package=jp.example.myapp.test
$ test_runner=androidx.test.runner.AndroidJUnitRunner
$ test_class=jp.example.myapp.MyTest
$ test_method=hoge1
$ adb shell am instrument -w e class ${test_class}#${hoge1} $test_package/$test_runnber
Code language: Bash (bash)
ここからが本題です。
-e フラグで、(テスト対象アプリではなく)テストアプリにKey-Valueペアを渡すことができます。
例えば、本番のテストではループ回数を50回で実行する予定ですが、テストの調整中は、ループ回数(num_tries)を3回にして、テストを早く終わらせたいことがあります。
テストクラス内の定数や変数を編集してビルドしてもいいんですが、コマンドラインからも値を渡すことができます。
コマンドラインの-eオプションで次のように指定できます。
$ test_package=jp.example.myapp.test
$ test_runner=androidx.test.runner.AndroidJUnitRunner
$ test_class=jp.example.myapp.MyTest
$ test_method=hoge1
$ adb shell am instrument -w \
e MyTest.num_tries 3 \
e class ${test_class}#${hoge1} $test_package/$test_runnber
Code language: Bash (bash)
このKey-Valueペアをテストアプリで受け取るにはどうしたらいいでしょうか?
https://developer.android.com/studio/test/command-line?hl=ja に書いてある onCreate は、InstrumentationTestRunner のメソッドで、API Level 24で非推奨になっています。現在は、AndroidJUnitRunner を使っています。
コマンドラインのパラメータを受け取るには
MyTestRunnerクラス
Project/Andoridペインの、java/jp.example.myapp(androidTest) の下に、MyTestRunnerクラスを新規作成します。このクラスのonCreateでコマンドラインからのパラメータを受取ります。そして、System.setPropertyに設定して、テストクラスで利用できるようにします。
package jp.example.myapp;
import android.os.Bundle;
import androidx.test.runner.AndroidJUnitRunner;
public class MyTestRunner extends AndroidJUnitRunner {
@Override
public void onCreate(final Bundle bundle) {
super.onCreate(bundle);
if (bundle != null) {
System.setProperty("MyTest.num_tries", bundle.getString("MyTest.num_tries", "50"));
}
}
}
Code language: Java (java)
テストクラス
テストクラスでは、System.getPropertyでパラメータを受け取ります。
package jp.example.myapp;
@RunWith(AndroidJUnit4.class)
public class MyTest {
private int numTries = 0;
@Before
public void setUp() throws Exception {
mNumTries = Integer.parseInt(System.getProperty("MyTest.num_tries"), 10);
}
Code language: Java (java)
app/build.gradle
app/build.gradleにMyTestRunnerを登録します。
android {
...
defaultConfig {
...
testInstrumentationRunner "jp.example.myapp.MyTestRunner"
Code language: Gradle (gradle)
コマンドライン
コマンドラインで実行します。test_runnerは、androidx.test.runner.AndroidJUnitRunnerではなく、新規作成したjp.example.myapp.MyTestRunnerを指定します。
$ test_package=jp.example.myapp.test
$ test_runner=jp.example.myapp.MyTestRunner
$ test_class=jp.example.myapp.MyTest
$ test_method=hoge1
$ adb shell am instrument -w \
e num_tries 3 \
e class ${test_class}#${hoge1} $test_package/$test_runnber
Code language: Bash (bash)
参考記事