AndroidのUIテスト(Spoon+Robotium)としてスクリーンショットを撮れるようにしてみた。

###テストとしてスクリーンショットを撮れるようにした

Android開発してて、いい加減テストをしたほうが良さげなので、テストコードを作成しようと思う。（イマゴロだけど・・・

まずはスクリーンショット撮れたら便利じゃね？ということで色々調査した結果、[Spoon](http://square.github.io/spoon/)を採用した。
採用理由として、画像保存を端末内ではなく、テストの実行環境に保存してくれる。CIとか考えると便利。Square製というのも決め手の一つ。
Spoonの補助として、[Robotium](https://code.google.com/p/robotium/)を画面遷移とか、データ入力用に採用した。

###開発環境

Android Studio v0.8.14
Mac OS X v10.10

###実際にやってみた

ライブラリの設定

```groovy:app/build.gradle
buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'com.stanfy.spoon:spoon-gradle-plugin:0.10.0'
    }
}

apply plugin: 'android-sdk-manager'
apply plugin: 'com.android.application'
apply plugin: 'spoon'

android {
    compileSdkVersion 20
    buildToolsVersion "20.0.0"

    defaultConfig {
        applicationId "com.github.shiraji.myapplication"
        minSdkVersion 15
        targetSdkVersion 20
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    androidTestCompile 'com.jayway.android.robotium:robotium-solo:5.2.1'
    androidTestCompile 'com.squareup.spoon:spoon-client:1.1.0'
}

```

Android Studioで簡単に起動したかったので、Spoonプラグインも導入した。
Spoonプラグインの設定のdependenciesはこのファイルに記載する。

実際にテストするActivityはHello WorldのレイアウトにEditTextを追加したもの。

```activity_main.xml
<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:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <TextView android:text="@string/hello_world" android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/edit_test_view"
        android:layout_below="@+id/textView"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

</RelativeLayout>

```

それでは実際のテストコード

```java:MainActivityTest.java
public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {

    private Solo mSolo;

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

    @Override
    protected void setUp() throws Exception {
        mSolo = new Solo(getInstrumentation(), getActivity());
        super.setUp();
    }

    @Override
    protected void tearDown() throws Exception {
        mSolo.finishOpenedActivities();
        super.tearDown();
    }

    public void testMainActivity() {
        Spoon.screenshot(getActivity(), "start");
        mSolo.enterText((EditText)getActivity().findViewById(R.id.edit_test_view), "しらじ");
        Spoon.screenshot(getActivity(), "after_edit");
    }
}
```

setUpでRobotiumのSoloインスタンスを生成し、tearDownで開いた全アクティビティーをfinishしている。
testMainActivityが実際のテストで、起動直後にSpoonでスクリーンショットを撮影し、EditTextにしらじと入力し、再度スクリーンショットを撮影した。
スクリーンショットのタグ名はファイル名と同じ扱いなので、スペースなどは入力不可。

起動方法はSpoonプラグインを使っているので、Android StudioでGradle Tasksから実行すると

```
> Could not find class: apple.awt.CGraphicsEnvironment
```

こんな感じのエラーが出る。ただし、コマンドラインで./gradlew spoonDebugTestをするとしっかり動いてくれる。
調査しようかと思ったけど、別にコマンドで動くんだからそっち使えよってことで、気がむいたら調べる。

最終的に結果ファイルはapp/build/spoon以下に生成される。

こんな感じのgifファイルも含まれています。
![testMainActivity.gif](https://qiita-image-store.s3.amazonaws.com/0/20058/c4acb63d-3f8f-45e3-93e9-76c045f3a709.gif)


実際に動かしたテストケースを端末別に、テストケースごとに保存してくれる。

![スクリーンショット 2014-11-08 23.00.29.png](https://qiita-image-store.s3.amazonaws.com/0/20058/120c99e8-cd22-80a8-7030-bd1ff6d03f49.png)

ログも取得できる。

![スクリーンショット 2014-11-08 23.00.47.png](https://qiita-image-store.s3.amazonaws.com/0/20058/f0957d51-0050-1b2c-41e7-26c41acb11fb.png)

イマゴロだけど、夢が広がりだした。