JUnit4 でテストを行うための testing-support-lib が追加されました。
前置き
概要とドキュメントなど
- Release Notes - http://goo.gl/oJBysE
- AndoidJUnitRunner Javadoc - http://goo.gl/Tct8R5
- AndroidJUnitRunner Docs - http://goo.gl/pSr8oB
- Android-Testing Github Samples - http://goo.gl/zNHuS9
- Espresso Setup Guide - http://goo.gl/WR9t36
- Espresso Documentation - http://goo.gl/jSI0xl
- Espresso-Core Javadoc - http://goo.gl/OyaHKn
- Espresso-Contrib Javadoc - http://goo.gl/gZgISI
- Espresso-Idling Javadoc - http://goo.gl/ZwVyn7
android-test-kit - Google's Testing Tools For Android - Google Project Hosting
サンプルコード
関連エントリ
Espresso 2.0 が Android support library の一部としてリリースされた - ひだまりソケットは壊れない
Espressoがsupport libraryになってAndroidでJUnit4が使えるようになったと聞いたので試してみた - みんからきりまで
続・AndroidでJUnit4を使う方法(Android SDKで正式サポートされました!) - Qiita
support packageに追加されたtesting-support-libを使ってAndroidのテストをJUnit4で書く - visible true
JUnit4 で Activity のテストを書いてみる
@@ -10,6 +10,8 @@ android { targetSdkVersion 21 versionCode 1 versionName "1.0" + // testing + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { @@ -17,9 +19,16 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + packagingOptions { + exclude 'LICENSE.txt' + } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:21.0.3' + // testing + compile 'com.android.support:support-annotations:21.0.3' + androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0' + androidTestCompile 'com.android.support.test:testing-support-lib:0.1' }
package com.wada811.android.junit4; import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; import android.test.ActivityInstrumentationTestCase2; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.notNullValue; @RunWith(AndroidJUnit4.class) public class MainActivityTest extends ActivityInstrumentationTestCase2{ private MainActivity activity; public MainActivityTest(){ super(MainActivity.class); } @Before public void setUp() throws Exception{ super.setUp(); injectInstrumentation(InstrumentationRegistry.getInstrumentation()); activity = getActivity(); } @After public void tearDown() throws Exception{ super.tearDown(); } @Test public void checkPrecondition(){ assertThat(activity, notNullValue()); assertThat(getInstrumentation(), notNullValue()); } }
参考
Getting Started - EspressoSetupInstructions - android-test-kitAndroidJUnitRunnerUserGuide - android-test-kit
テストを実行する
./gradlew connectedAndroidTest
コマンドを実行
端末もしくはエミュレータでテストを実行することができます。しかし、何故か MainActivityTest.java は実行されませんでした。
JUnit3 なテストは実行されていますが、 JUnit4 な テストは実行されないみたいです。
プロジェクトエクスプローラで右クリックから Run...
ファイルを指定して実行すれば JUnit4 なテストも実行できます。Edit Configurations... から Android Test を追加してクラスを指定して実行
クラス(ファイル)を指定して実行すれば JUnit4 なテストも実行できます。All in Module や All in Package では JUnit4 なテストは実行されませんでした。
クラスを指定しなくても JUnit4 なテストを実行したい
これは偶然なのか考えられているのかわからないけど Jake 神の ActivityRule を使うと直接クラスを指定しなくてもテストを実行できるようになります。
package com.wada811.android.junit4; import android.support.test.runner.AndroidJUnit4; import com.jakewharton.test.ActivityRule; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import static android.support.test.espresso.Espresso.*; import static android.support.test.espresso.assertion.ViewAssertions.*; import static android.support.test.espresso.matcher.ViewMatchers.*; import static org.hamcrest.Matchers.*; @RunWith(AndroidJUnit4.class) public class MainActivityTestWithRule { @Rule public final ActivityRuleEspresso 2.0 でテストを書いてみました。activityRule = new ActivityRule<>(MainActivity.class); @Test public void checkPrecondition(){ // MatcherAssert.assertThat(activityRule.instrumentation(), Matchers.notNullValue()); assertThat(activityRule.instrumentation(), notNullValue()); } @Test public void showHelloWorld(){ // Espresso.onView(ViewMatchers.withId(R.id.textView)).check(ViewAssertions.matches(ViewMatchers.withText(R.string.hello_world))); onView(withId(R.id.textView)).check(matches(withText(R.string.hello_world))); } }
クラス名を覚えるのは辛い感じなので static import でメソッド書くだけにしたい感じがあります。
ソースコードは wada811/Android-JUnit4 にあります。
Activity だけじゃなく他のテストについても増やしていきたいです。