記録

記録

Android Studio + Robolectricで自動テスト

Androidでの自動テストはRobolectricというフレームワークを使うのが良いと聞いたので導入してみました。

導入方法と僕が詰まった箇所の解決法を書いておきます。
導入方法は 【Android】Android Studio + Gradle + Robolectric!でテストをしよう | Yohei Blog こちらを参考にさせて頂きました。

公式サイトは Robolectricです。

導入方法

build.gralde

project直下のbuild.gradleにclasspath 'org.robolectric~を追記します。

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

app/build.gradle

apply plugin: 'android'
//プラグイン追加
apply plugin: 'robolectric'
android{
//〜中略〜//
}

dependencies {

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

    //ライブラリを追加
    androidTestCompile('junit:junit:4.+')
    androidTestCompile('org.robolectric:robolectric:2.3+')
    androidTestCompile('com.squareup:fest-android:1.0+')

}
//robolectricの設定を追記
robolectric {
    include '**/*Test.class'
    exclude '**/espresso/**/*.class'

    maxHeapSize = "2048m" // エラーの原因かもしれない

}

テスト用クラスを作成

クラスを作成するディレクトリはapp/src/test/javaになります。
packageはメインのプロジェクトと同じにしてください。

@RunWith(RobolectricTestRunner.class)
@Config(emulateSdk = 18) //後述
public class SampleTest {
    @Before
    public void setup() {
        // setup
    }

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

    @Test
    public void sampleTest() {
        Assert.assertTrue("assert",true);
    }
}

テスト実行

~/.gradlew clean check
BUILD SUCCESSFULとなれば成功です。

1 test completed, 1 failed
:app:testDebug FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:testDebug'.
> There were failing tests. See the report at: file://~/app/build/test-report/debug/index.html

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 16.035 secs

上記のように出力された場合はテストが失敗しています。
テストレポートは{project}/app/build/test-report/debug/index.htmlで確認できます。

上手くいかない場合

パッケージorg.junitは存在しません

まず最初に、ビルド時にorg.junitは存在しませんというエラーが出ました。
app/src/test/javaディレクトリは、android studio上でNew→Folder→Java Folderという手順で作成しましたが、その際に app/build.gradleにこのように追記されていました。

    SourceSets {
        androidTest.setRoot('src/test')
        main { java.srcDirs = ['src/main/java', 'src/test/java'] }
    }

フォルダ作成時にどのような手順をとれば良いかはわかりませんが、上記をこのように変更することでビルドが通ります。

    SourceSets {
        androidTest.setRoot('src/test')
    }

too small initial heap

次に、too small initial heapというエラーが出ました。
app/build.gradleプラグイン設定でmaxHeapSizeという項目を削除したら解決しましたが、この記事を書くために再び追記してみたらエラーは出ませんでした...。謎です。

java.lang.UnsupportedOperationException

java.lang.UnsupportedOperationExceptionというエラーが出た場合はsdkがサポートされていないということなので、アノテーション@Config(emulatedSdk = 18)と記述してやれば解決します。

長くなってしまいましたが導入にかなり苦戦してしまったので、同じようなエラーで悩んでいる方の一助となれば幸いです。