AndroidプロジェクトにEspressoを導入してみた

# Espressoとは

Android の UI Testing Support Library の1つです。

# Androidプロジェクトへの適用

今回は、Espresso を使える状態までセットアップします。

## 実行環境

Ubuntu 14.04
Android Studio 1.5.1
Android SDK Tools: 24.4.1
Android SDK Platform-tools: 23.1
Android SDK Build-tools: 23.0.2
Android Support Library: 23.2.1

## プロジェクトへの適用

### app.gradleに追記(最小限)

```groovy:app.gradle(diff)
@@ -23,4 +25,7 @@ dependencies {
     compile fileTree(dir: 'libs', include: ['*.jar'])
     testCompile 'junit:junit:4.12'
     compile 'com.android.support:appcompat-v7:23.1.1'
+
+    // Android JUnit Runner
+    androidTestCompile 'com.android.support.test:runner:0.5'
+    // JUnit4 Rules (使わなければ不要)
+    androidTestCompile 'com.android.support.test:rules:0.5'
+    // Espresso core
+    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
}
```

### メモ (`compile` , `testCompile` , `androidTestCompile`)

これは何。

- compile: プロダクトコード(src/main)に必要な依存関係
- testCompile: テストコード(src/test)に必要な依存関係
- androidTestCompile: Androidテストコード(src/andoridTest)に必要な依存関係

### メモ ( ググると引っかかる `testing-support-lib:0.1` )

これは何。

Espresso のリリースノートによると以下とのことらしい。

```text:Espressoのリリースノートから抜粋
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.
```

つまり、こういうことらしい。

```groovy:app.gradle(昔)
androidTestCompile 'com.android.support.test:testing-support-lib:0.1'
```

```groovy:app.gradle(今)
androidTestCompile 'com.android.support.test:runner:0.5'
androidTestCompile 'com.android.support.test:rules:0.5'
```



# テストコードを書いてみる

## テスト対象のActivityのXML

```xml:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="jp.chibi.espressosample.MainActivity">

    <fragment
        android:id="@+id/fragment"
        android:name="jp.chibi.espressosample.MainFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:layout="@layout/fragment_main"/>

</RelativeLayout>
```
※無駄にFragmentを適用しています。

## テストコード

```java:MainActivity.java
@RunWith(AndroidJUnit4.class)
public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {

    public MainActivityTest() {
        super(MainActivity.class);
    }

    @Before
    @Override
    public void setUp() throws Exception {
        super.setUp();
        injectInstrumentation(InstrumentationRegistry.getInstrumentation());
    }

    @After
    @Override
    public void tearDown() throws Exception {
        super.tearDown();
    }

    @Test
    public void test1() {
        MainActivity activity = getActivity();
        Assert.assertNotNull(activity);

        onView(withId(R.id.fragment)).check(matches(isDisplayed()));
    }
```
一番下の行が Espresso を用いたテストの書き方になります。
`onView` に `withId` を渡して、 `check` で `isDisplayed` になっているかを確認。

ちなみに↓のように書くとFailします。

```
onView(withId(R.id.fragment)).check(matches(not(isDisplayed())));
```
今回は導入編ということで、ここまで。