EspressoでGoogleInstrumentationTestRunnerを使った時に全部のテストを回したくない

Espresso: https://code.google.com/p/android-test-kit/wiki/Espresso

AndroidをEspressoでテストするときにGoogleInstrumentationTestRunnerを指定すると思います。 このときに今書いているテストだけを実行したくなったりすると思うのでその方法を書いておきます。

まず新しくGoogleInstrumentationTestRunnerを継承した自分用のTestRunnerを書きます。

// MyInstrumentationTestRunner.java
public class MyInstrumentationTestRunner extends GoogleInstrumentationTestRunner {

    private static final String ARGUMENT_TEST_CLASS = "class";

    @Override
    public void onCreate(Bundle arguments) {
        if(!BuildConfig.TEST_CLASS.isEmpty()){
            arguments.putString(ARGUMENT_TEST_CLASS, BuildConfig.TEST_CLASS); // ここで指定
        }
        arguments.putString("disableAnalytics", "true"); // ついでにトラッキングもOFF
        super.onCreate(arguments);
    }
}

次にbuild.gradleで自分のクラスを指定して、buildConfigを追加します。

# build.gradle
android {
    defaultConfig {
        testInstrumentationRunner "yourpackage.MyInstrumentationTestRunner"
        buildConfigField "String", "TEST_CLASS", project.hasProperty('testClass') ? "\"${testClass}\"" : "\"\""
    }
}

これで以下のように実行すれば個別のテストクラスを実行できます

./gradlew connectedAndroidTest -PtestClass=yourpackage.MyActivityTest

ただ、上記の場合、testClass=hoge でテストクラス名を間違えてもSuccessになっちゃうので、そういう時にFailさせたいと思うのですが、TestRunner内でFailさせる方法がどうしても分からなかったので以下のように設定しました

public class MyInstrumentationTestRunner extends GoogleInstrumentationTestRunner {

    private static final String ARGUMENT_TEST_PACKAGE = "package";
    private static final String ARGUMENT_TEST_CLASS = "class";

    @Override
    public void onCreate(Bundle arguments) {
        if(!BuildConfig.TEST_CLASS.isEmpty()){
            String className = BuildConfig.TEST_CLASS;

            try {
                // クラスを動的に取りに行って
                Class.forName(className);
                arguments.putString(ARGUMENT_TEST_CLASS, className);
            } catch (ClassNotFoundException e) {
                // テストクラスがなければ、Failするクラスを読み込む
                FailableTest.isFail = true;
                FailableTest.message = className + " Class Not Found";
                arguments.putString(ARGUMENT_TEST_CLASS,  FailableTest.class.getName());

                e.printStackTrace();
            }
        }
        arguments.putString("disableAnalytics", "true");
        super.onCreate(arguments);
    }
}
public class FailableTest extends TestCase {

    public static boolean isFail = false;
    public static String message = "Failed";

    public void testFailable() {
        // すべてのテストを実行した時にFailしないように通常は isFail = false
        assertFalse(message, isFail);
    }
}

ARGUMENT_TEST_CLASS や、その他の指定方法は androidのソースを引っ張ってきて android/frameworks/base/test-runner/src/android/test/InstrumentationTestRunner.java を参照して下さい

検索しても情報出てこなさすぎだったんですが、みんなテスト書いてるんですかね