【Android】Android Studio + Gradle + Robolectric!でテストをしよう

Robolectric
※2014/07/09更新: plugin更新による変更を反映。サンプル更新は少々おまちください(汗

概要

Androidの開発と言ったらAndroid Studio + Gradleで決まりだよね。(会社含め自分の周りはそんな流れになってます。)

Androidのテストって言ったらRobolectricだよね?Roblectric使うメリットは以前の記事で書いてますが、テストの主流はRobolectricになっていると思います。(テスト書かないと。)

導入

導入は「遂に!」gradle android test pluginがAndroid Gradleの0.9に対応してくれました。とても簡単に導入できます。

作成したサンプルはこちらにあります。

Gradleファイル追記

手順

  1. project/build.gradleに追記
  2. app/build.gradleに追記
  3. testディレクトリ作成
  4. Gradle用TestRunner作成
  5. サンプルテストクラス作成
  6. テスト実行

1. project/build.gradleに追記

classpathにorg.roblectric.gradle~を追加します。

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.12.+'
        classpath 'org.robolectric:robolectric-gradle-plugin:0.11.+'
    }
}

2. app/build.gradleに追記

下記3つのことをします。

  1. android-testプラグインを追加
  2. testプロジェクト用にライブラリ追加
  3. Androidテストの設定追加

サンプルは次です。

apply plugin: 'android'
// 1.test plugin
apply plugin: 'robolectric'

android {
    android {
        lintOptions {
            abortOnError false
        }
    }
    compileSdkVersion 19
    buildToolsVersion "19.1.0"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}
dependencies {
    compile 'com.android.support:appcompat-v7:+'
    compile 'com.android.support:support-v4:+'

    compile 'com.google.android.gms:play-services:+'
    compile fileTree(dir: 'libs', include: ['*.jar'])

    // 2. test-libs
    androidTestCompile 'junit:junit:4.10'
    androidTestCompile 'org.robolectric:robolectric:2.3+'
    androidTestCompile 'com.squareup:fest-android:1.0.+'
}

// 3. test settings
robolectric {
    // configure the set of classes for JUnit tests
    include '**/*Test.class'
    exclude '**/espresso/**/*.class'

    // configure max heap size of the test JVM
    maxHeapSize = "2048m"
}

3. testディレクトリ作成

テスト用のディレクトリはAndroid pluginにより定義されており、src/testとなります。

※画像が変更できてませんが、【src/test】ディレクトリです。

4. Gradle用TestRunner作成

robolectric-gradle-plugin 0.11から不要になりました!!!!参考

Robolectricに入っているTestRunnerはGradleに対応していないため、自分でRobolectricTestRunnerを継承したクラスを作る必要があります。(今回はRobolectricGradleTestRunnerというクラス名にします)

TestRunnerは決められた場所(パッケージ名直下)に作成する必要があります。サンプルだとorg.yohei.robolectricsample/RobolectricGradleTestRunnerになります。

public class RobolectricGradleTestRunner extends RobolectricTestRunner {
    /**
     * Creates a runner to run [email protected] testClass}. Looks in your working directory for your AndroidManifest.xml file
     * and res directory by default. Use the [email protected] Config} annotation to configure.
     *
     * @param testClass the test class to be run
     * @throws org.junit.runners.model.InitializationError if junit says so
     */
    public RobolectricGradleTestRunner(Class<?> testClass) throws InitializationError {
        super(testClass);
    }

    @Override
    protected AndroidManifest getAppManifest(Config config) {
        String manifestProperty = System.getProperty("android.manifest");
        if (config.manifest().equals(Config.DEFAULT) && manifestProperty != null) {
            String resProperty = System.getProperty("android.resources");
            String assetsProperty = System.getProperty("android.assets");
            return new AndroidManifest(Fs.fileFromPath(manifestProperty), Fs.fileFromPath(resProperty),
                    Fs.fileFromPath(assetsProperty));
        }
        return super.getAppManifest(config);
    }
}

5. サンプルテストクラス作成

テストクラスをTestRunnerと同じディレクトリに作成します。テストクラス名は「〜Test」という名前になるようにする必要があります。(今回はSampleTestとします。)

@RunWith(RobolectricTestRunner.class)
@Config(manifest = "./src/main/AndroidManifest.xml")
public class SampleTest {

    @Before
    public void setup() {
        // setup
    }

    @After
    public void teardown() {
        // teardown
    }

    @Test
    public void testSample() {
        Assert.assertEquals("a", "a");
    }
}

テストを実行するRunnerとして4で作成したTestRunnerを設定しています。

6. テスト実行

テストの実行は下記コマンドを実行するだけです。(Macで)

$ ./gradlew clean check

実行後は{project}/{app}/build/test-report/debug/以下にレポートが作成されます。

成功時

失敗時

まとめ

やっとAndroid Studio+Gradleでテスト周りを充実させられそう。そもそもテストをほとんど書いていないのでかくようにしよう!!!

今回のサンプルはこちらにあります。