2015年7月時点でのJUnit4やEspressoを使ったAndroidアプリのテストについて

以前「[Androidのテスティングフレームワークを選定してみる](http://qiita.com/shikato/items/071a4c879b5c3f0b46f0)」という記事を書いたのですが、最近久しぶりに[Espresso](https://code.google.com/p/android-test-kit/wiki/Espresso)を使ったテストコードを書こうと思って調べていたら、Espressoが2.0から2.2になっていたりして、いつのまにやら[Testing Support Library](https://developer.android.com/tools/testing-support-library/index.html)が色々と更新されているようでした。
なので、メモがてら少しまとめてみました。 

## testing-support-libが分割された

以下の２つに分割されたようです。

* com.android.support.test:runner
* com.android.support.test:rules

[Espresso 2.1のReleaseNotesに破壊的な変更点として記述されています。](https://code.google.com/p/android-test-kit/wiki/ReleaseNotes)

``` 
Breaking Changes

test runner artifact split into two and the name changed from com.android.support.test:testing-support-lib:0.1 to com.android.support.test:runner:0.2 + com.android.support.test:rules:0.2.
```
Espresso 2.0の頃はbuild.gradleに以下のように記述していましたが、

```groovy:build.gradle
androidTestCompile 'com.android.support.test:testing-support-lib:0.1'
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0'
```

Espresso 2.1からは以下のように記述します。

```groovy:build.gradle
androidTestCompile 'com.android.support.test:runner:0.3'
androidTestCompile 'com.android.support.test:rules:0.3'
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2' 
``` 
[build.gradle](https://github.com/shikato/AndroidTestSample/blob/master/app/build.gradle)

## Espressoを使ったテストで@Testが使えるようになった

これまでのEspresso(ver 2.0以前)でテストするには、[ActivityInstrumentationTestCase2](http://developer.android.com/reference/android/test/ActivityInstrumentationTestCase2.html)を継承する必要がありました。
そのActivityInstrumentationTestCase2は[junit.framework.TestCase](http://developer.android.com/reference/junit/framework/TestCase.html)のサブクラスであり、TestCaseのサブクラスは、[AndroidJUnitRunner](http://developer.android.com/reference/android/support/test/runner/AndroidJUnitRunner.html)にJUnit3として扱われてしまうため、JUnit4の機能である@Testを使用することができませんでした。

```
@Test annotation is a replacement for the test-prefix naming convention used in JUnit3. JUnit4 test classes no longer require to extend TestCase or any of its subclasses. In fact JUnit4 tests cannot extend TestCase, otherwise AndroidJUnitRunner will treat them as JUnit3 tests.
```
[User guide for AndroidJUnitRunner](https://code.google.com/p/android-test-kit/wiki/AndroidJUnitRunnerUserGuide)

ですが、Espresso 2.1で[ActivityTestRule](http://developer.android.com/reference/android/support/test/rule/ActivityTestRule.html)が追加され、そのActivityTestRuleによって single activityのテストが可能となったため、 ActivityInstrumentationTestCase2は不要となりました。
よって、@Testなどを使えるようになりました。

ActivityTestRuleを使ったテストコードは以下のようになります。

```java:EspressoTest.java
@RunWith(AndroidJUnit4.class)
public class EspressoTest {

    private Activity mActivity;

    @Rule
    public ActivityTestRule<TopActivity> mActivityRule =
            new ActivityTestRule<>(TopActivity.class);

    @Before
    public void setUp(){
        // Activityの取得
        mActivity = mActivityRule.getActivity();
    }

    // @Testが使えるので日本語だけのテストメソッドが書けるようになった
    @Test
    public void 足し算機能の基本的な挙動() {
        // 数字入力
        onView(ViewMatchers.withId(R.id.num1)).perform(typeText("2"));
        onView(withId(R.id.num2)).perform(typeText("20"));

        // 足すボタンクリック
        onView(withId(R.id.equal_button)).perform(click());

        // 計算結果確認
        onView(withId(R.id.result)).check(matches(withText("22")));
    }
} 
```
[EspressoTest.java](https://github.com/shikato/AndroidTestSample/blob/master/app/src/androidTest/java/org/shikato/androidtestsample/android/EspressoTest.java)

## WebViewがサポートされた
Espresso 2.2からWebViewをテストできるようになりました。

```
espresso-web 2.2
New WebView support
```
[ReleaseNotes](https://code.google.com/p/android-test-kit/wiki/ReleaseNotes)

以下の記事で詳しく紹介されています。
[Espresso webview support](http://qiita.com/hotchemi/items/af00d5cf9ff230b414d2)

## さいごに
ほかにも、Intentをテストできる[espresso-intents](http://developer.android.com/reference/android/support/test/espresso/intent/rule/IntentsTestRule.html)が追加されていたりと、今回紹介した機能以外にも、便利そうな機能が色々と追加されているようです。
[ReleaseNotes](https://code.google.com/p/android-test-kit/wiki/ReleaseNotes)