Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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

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

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

開発環境

Android Studio v0.8.14
Mac OS X v10.10

実際にやってみた

ライブラリの設定

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>

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

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

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

スクリーンショット 2014-11-08 23.00.29.png

ログも取得できる。

スクリーンショット 2014-11-08 23.00.47.png

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away