AndroidTestをコマンドラインで実行するとき、パラメータを受け取るには

コマンドラインで実行するには

Test from the command line  |  Android Studio  |  Android Developers
How to run tests from the command line.

androidTestをターミナルで実行するには、./gradlewを使う方法、adbを使う方法があります。

./gradlewを使う方法は、全てのandroidTestを実行します。apk作成前の自動テストで使うことが多いです。

$ ./gradlew app:clean
$ ./gradlew app:connectedAndroidTestCode 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_runnberCode 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_runnberCode 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_runnberCode 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_runnberCode language: Bash (bash)

参考記事

uiautomatorのテストを実行する際にパラメータを受け取りたい
uiautomatorのテストを作成しましたが、コマンドラインより与えるパラメータの受け取り方がわかりません。 $ adb shell am instrument -w -e class com.example.etc -e loop 2 ...
タイトルとURLをコピーしました