16480


uiautomatorのテストを作成しましたが、コマンドラインより与えるパラメータの受け取り方がわかりません。

[code]

    $ adb shell am instrument -w -e class com.example.etc -e loop 2 com.example.etc.test/android.support.test.runner.AndroidJUnitRunner
    
[/code]

上記は、パラメータ名"loop"、値"2"としてテスト実行しているつもりです。

[code]

    @RunWith(AndroidJUnit4.class)
    @SdkSuppress(minSdkVersion = 18)
    public class LoopTest {
        private int mLoopCnt;
        @Before
        public void before() {
            mLoopCnt = ???
        }
    }
    
[/code]

このパラメータをテストコード側で受け取るには、どのようなコードを書けばよいでしょうか。


CC BY-SA 3.0
2015-09-09T09:40:19.430
16439
2015-09-10T14:03:21.780
2015-09-09T12:01:17.653
33
7241
question
android junit uiautomator
uiautomatorのテストを実行する際にパラメータを受け取りたい


まず、`AndroidJUnitRunner`継承クラスを作成します。（`InstrumentationTestRunner`継承だとJUnit3になってしまうので）

[code]

    public class MyTestRunner extends AndroidJUnitRunner{
    
        @Override
        public void onCreate(Bundle arguments) {
            super.onCreate(arguments);
    
            if (arguments != null) {
                String loop = arguments.getString("loop", "1");
                System.setProperty("loop", loop);
            }
        }
    }
    
[/code]

コマンドラインから渡した引数は、`onCreate()`にて、`getString()`で受け取ることができます。

テストランナーからテストクラスに値を引き渡す方法として、ここでは`System.setProperty()`を使っていますが、どのような方法でも構わないです。

`build.gradle`の`defaultConfig`に次の記述を追加します。

[code]

    defaultConfig {
         ...
    　　　　testApplicationId "yourpackage.test"
         testInstrumentationRunner "yourpackage.MyTestRunner"
    }
    
[/code]

そして、`Run/Debug Configurations`から、`Android Tests`を追加します。`Specific
instrumentation runnner`に自作テストランナーを指定します。

実行すると、`Empty test suite`と言われますが、

[code]

    adb shell pm list instrumentation
    
[/code]

で確認すると、

[code]

    instrumentation:yourpackage.test/yourpackage.MyTestRunner (target=yourpackage)
    
[/code]

がインストールされていると思います。あとはコマンドラインからテストを実行します。

[code]

    @RunWith(AndroidJUnit4.class)
    public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {
        public MainActivityTest() {
            super(MainActivity.class);
        }
    
        @Test
        public void loopValueCheck() throws Exception {
            int loopValue = Integer.parseInt(System.getProperty("loop"));
            assertThat(2, is(loopValue));
        }
    }
    
[/code]

`System.getProperty()`で引数の値を受け渡して、テストに利用できます。


CC BY-SA 3.0
2015-09-10T14:03:21.780
16480
2015-09-10T14:03:21.780
5337
16439
answer