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

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

コマンドラインからのテスト  |  Android デベロッパー  |  Android Developers
コマンドラインから直接テストを作成および実行する方法を学びます。

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

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

$ ./gradlew app:clean $ ./gradlew app:connectedAndroidTest

一部のテストクラスだけを実行するには?

テストクラス 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

メソッドを指定することもできます。

$ 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

ここからが本題です。

-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

この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")); } } }

テストクラス

テストクラスでは、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); }

app/build.gradle

app/build.gradleにMyTestRunnerを登録します。

android { ... defaultConfig { ... testInstrumentationRunner "jp.example.myapp.MyTestRunner"

コマンドライン

コマンドラインで実行します。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

参考記事

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