Android用のUIテスト自動化フレームワーク<Espresso>の使い方について

# Espresso
Espresso は Android用のUIテスト自動化フレームワークとなります。
https://google.github.io/android-testing-support-library/docs/espresso/

# 導入手順

### テスト端末環境セットアップ
設定メニューから開発者向けオプションを開き、以下の設定をオフにする
- ウィンドウアニメ
- トランジションアニメ
- Animator再生時間

### Espresso のダウンロード
1. 最新版 Android Support Repository をインストールしておく [(see instructions)](https://google.github.io/android-testing-support-library/downloads/index.html)
2. アプリケーションの build.gradle を開く
3. dependencies に以下を追加

```java
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
androidTestCompile 'com.android.support.test:runner:0.5'
```

### Instrumentation Runner セット
- android.defaultConfig に以下を追加

```java
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
```

記述例 :

```java
apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.1"

    defaultConfig {
        applicationId "[パッケージ名]"
        minSdkVersion 16
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"

        // Instrumentation Runner
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.1.1'

    // コンフリクト回避
    androidTestCompile 'com.android.support:support-annotations:24.1.1'

    // Espresso
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
    androidTestCompile 'com.android.support.test:runner:0.5'
}
```

> ※コンフリクト回避用に以下の記載が必要
> androidTestCompile 'com.android.support:support-annotations:24.1.1'

# テスト実施

### テストケース作成
サンプルのテストケースを作成します。
ここでは一例として、MainActivity.java に文字列"Hello World!" がセットされた TextView が正常に表示されているかをチェックするテストケースを作成します。

1. MainActivity.java に 文字列"Hello World!" をセットした TextView を追加します。
2. 以下の内容を記述した HelloWorldEspressoTest.java ファイルを src/androidTest/java/[パッケージ名]/ 直下に作成します。

```java
package [パッケージ名];

import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.LargeTest;

import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withText;

@RunWith(AndroidJUnit4.class)
@LargeTest
public class HelloWorldEspressoTest {
    @Rule
    public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule(MainActivity.class);

    @Test
    public void listGoesOverTheFold() {
        onView(withText("Hello World!")).check(matches(isDisplayed()));
    }
}
```

### テスト実行

先ほど作成したテストクラス上で右クリックを押し、メニューから Run 'HelloWorldEspressoTest' を選択しテスト実行する。
※実行するテスト端末、又はエミュレータが必要となる。

![d6a0eb785502eb4c49d5f9fa1f09b2c5.png](https://qiita-image-store.s3.amazonaws.com/0/134550/b9cc1cbd-56f8-de54-416c-d40caa7d923d.png)

### テスト結果確認

表示が緑色になっていれば成功、表示が赤色となっている場合は失敗となる。

![057c307ddd4ac48038e83bc731d6693e.png](https://qiita-image-store.s3.amazonaws.com/0/134550/5358aa97-3e8f-ab54-d6e1-d5ddf03f3fba.png)

# Espresso テストコード記述例

テストは、以下のような形で 検索→アクション実行→チェック を行います。

```java
onView(ViewMatcher) // View の検索
 .perform(ViewAction) // アクション実行
 .check(ViewAssertion);　// チェック
```

## 検索
[ViewMatcher](https://developer.android.com/reference/android/support/test/espresso/matcher/ViewMatchers.html) に条件を指定して検索を行います。

例）

- リソースIDからViewを探す

```java
onView(withId(R.id.my_view))
```

- テキストプロパティ値からTextViewを探す

```java
onView(withText("Hello World!"))
```

## アクション実行
[ViewAction](https://developer.android.com/reference/android/support/test/espresso/action/ViewActions.html) にアクションを指定します。

例）

- View へ文字列を入力後、ソフトキーボードを閉じる
 
```java
onView(withId(R.id.my_view)).perform(typeText("こんにちは"), closeSoftKeyboard());
```

- View をクリックする

```java
onView(withId(R.id.my_view)).perform(click());
```

## チェック
[ViewAssertion](https://developer.android.com/reference/android/support/test/espresso/ViewAssertion.html) に条件を指定してチェックを行います。
（matches の引数は [ViewMatcher](https://developer.android.com/reference/android/support/test/espresso/matcher/ViewMatchers.html)、戻り値は ViewAssertion）

例）

- ユーザーのスクリーンに現在表示されているかをチェック

```java
onView(withId(R.id.my_view)).check(matches(isDisplayed()));
```
- ユーザーのスクリーンに現在表示されていない事をチェック

```java
onView(withId(R.id.my_view)).check(matches(not(isDisplayed())));

```
- TextView のテキストプロパティ値をチェック

```java
onView(withId(R.id.my_view)).check(matches(withText("チェックする文字列"));
```

- View が見つからない事をチェック

```java
onView(withId(R.id.my_view)).check(doesNotExist());
```

- View が画面内に全て表示されているかをチェック

```java
onView(withId(R.id.my_view)).check(matches(isCompletelyDisplayed()));
```

# サンプル

実際のサンプルテストコードについては、テストバリエーションに応じて
Googleのサンプルプロジェクトが GitHub に登録されているので参考にして下さい。

|サンプル名|内容|
|:-----------------|:-----------------|
|[BasicSample](https://github.com/googlesamples/android-testing/tree/master/ui/espresso/BasicSample)|	Basic Espresso sample|
|[CustomMatcherSample](https://github.com/googlesamples/android-testing/tree/master/ui/espresso/CustomMatcherSample)|	Shows how to extend Espresso to match the hint property of an EditText|
|[DataAdapterSample](https://github.com/googlesamples/android-testing/tree/master/ui/espresso/DataAdapterSample)|	Showcases the onData() entry point for Espresso, for lists and AdapterViews|
|[IntentsBasicSample](https://github.com/googlesamples/android-testing/tree/master/ui/espresso/IntentsBasicSample)|	Basic usage of intended() and intending()|
|[IntentsAdvancedSample](https://github.com/googlesamples/android-testing/tree/master/ui/espresso/IntentsAdvancedSample)|	Simulates a user fetching a bitmap using the camera|
|[MultiWindowSample](https://github.com/googlesamples/android-testing/tree/master/ui/espresso/MultiWindowSample)|	Shows how to point Espresso to different windows|
|[WebBasicSample](https://github.com/googlesamples/android-testing/tree/master/ui/espresso/WebBasicSample)|	Use Espresso-web to interact with WebViews.|
|[BasicSampleBundled](https://github.com/googlesamples/android-testing/tree/master/ui/espresso/BasicSampleBundled)|	Basic sample for Eclipse and other IDEs|

# Link

Espresso ドキュメント
https://google.github.io/android-testing-support-library/docs/espresso/index.html
Espresso cheat sheet
https://google.github.io/android-testing-support-library/docs/espresso/cheatsheet/index.html

<br>