読者です 読者をやめる 読者になる 読者になる

ほげほげ(仮)

仮死状態

AndroidStudio + Robolectric + Guardによる自動実行

Android

JakeWharton/gradle-android-test-plugin がDEPRECATEDになってたのですが、いつの間にかrobolectric本家がfork(robolectric/gradle-android-test-plugin)してたので使い方をまとめおきます。

robolectric/deckard-gradle をシンプルにした感じです。

設定

プロジェクト/build.gradle

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.9.+'
        // 追加
        classpath 'org.robolectric.gradle:gradle-android-test-plugin:0.9.+'
    }
}

...

プロジェクト/app/build.gradle

apply plugin: 'android'
// プラグイン
apply plugin: 'android-test'

android {
    ....

    sourceSets {
        // testディレクトリを指定
        androidTest {
            setRoot('src/test')
        }
    }
}

dependencies {
    repositories {
        mavenCentral()
        maven {
            // 2.3を使うためにリポジトリ追加
            url 'https://oss.sonatype.org/content/repositories/snapshots/'
        }
    }
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:19.+'

    // テストで使用する依存ライブラリ
    androidTestCompile('junit:junit:4.11')
    androidTestCompile('org.robolectric:robolectric:2.3-SNAPSHOT')
}

Tool->Android->Sync Project with Grale FilesでGradle設定を反映させる

テストコードのディレクトリ作成

プロジェクト/app/src/test/javaを作成する

サンプルテスト

@Config(emulateSdk = 18)
@RunWith(RobolectricTestRunner.class)
public class MainActivityTest {
    @Test
    public void sample() {
        Activity activity = Robolectric.buildActivity(MainActivity.class).create().get();
        assertThat(activity, is(notNullValue()));
    }
}

@Config(emulateSdk = 18)はtargetSdkVersionが19だとRobolectric does not support API level 19, sorry!っていうエラーを出すのでそれの対策です。(Robolectric does not support API level - Stack Overflow

robolectric/gradle-android-test-plugin のREADMEに書いてあるTestRunnerのカスタマイズは今回はrobolectric:2.3-SNAPSHOTを使ってるので不要です。2.2以前を使ってる場合は必要になってきます。

もし、java.lang.IllegalArgumentExceptionが出る場合はJavaのバージョンがJava8かもしれません。JAVA_HOMEのバージョンをJava6にしましょう。(これにハマりました)

実行

$ ./gradlew clean test

で実行できます。

プロジェクト/app/build/test-report/index.htmlにテストレポートが出力されます。

日本語のテストメソッド

日本語のテストメソッドを使ってる場合エラーになると思います。その時はgradlewファイルの10行目付近を次のようにします。

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS="-Dfile.encoding=UTF-8"

Guardによる自動実行

Guard等々についてはググってください…

gemインストール

STAR-ZERO/guard-gradle-android-testを使います。

$ gem install guard-gradle-android-test

Guardfile

Guardfile作成

$ guard init gradle-android-test

Growlのgemとか入れてnotification :growlって書いておくと実行後に通知されます。

通知に関してはGuard本家のほうを見てください。

監視

$ guard

クラス単位での実行方法が分からず、ファイルが変更されるたびに全部テストが実行されちゃいます…

まとめ

ちゃんとテスト書かないと…

あと、JakeWharton/gradle-android-test-plugin がDEPRECATEDになってしまって、作ったGuardプラグインがムダになってしまったと思ったのですが、変更なしで使えるのでよかった(おまけ程度のgemですが…)

追記

Android StudioからRobolectricのテストを直接実行する - ほげほげ(仮) を書きました