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 を参照して下さい
検索しても情報出てこなさすぎだったんですが、みんなテスト書いてるんですかね