gradle-android-test-plugin+robolectric+espresso

2014-04-28T00:00:00+00:00 Android Java robolectric

https://groups.google.com/forum/#!topic/robolectric/xsOpEwtdTi4 にあるように元はJake Wharton氏が開発されていてdeprecatedになっていたgradle-android-test-pluginをrobolectric開発チームによってメンテされるようになった模様

てな訳でgradle-android-test-pluginを使いつつの、robolectricでの単体テスト及びespressoによるUIテストをやってみる

構造

├── app
│   ├── build.gradle
│   ├── lib
│   │   └── espresso-1.1-bundled.jar
│   └── src
│       ├── androidTest (espressoテスト)
│       │   └── java
│       │       └── sample
│       │           └── test
│       │               └── espresso
│       │                   └── MainActivityTest.java
│       ├── main
│       │   ├── AndroidManifest.xml
│       │   ├── assets
│       │   ├── java
│       │   │   └── sample
│       │   │       └── test
│       │   │           └── MainActivity.java
│       │   └── res (省略)
│       └── test (robolectricテスト)
│           └── java
│               └── sample
│                   └── test
│                       └── unit
│                           └── MainActivityTest.java
├── build.gradle
├── libraries
│   └── sample_library (省略)
└── settings.gradle

な感じの構成を作った。んでrobolectricテストなところはgradle-android-test-plugin+Robolectricでテストで書いてるのと同じなのでここでは記載しない。あとespressoテストに関してもEspressoを使ったUIテストで記載しているのとまったく同じなので省略する

すると必然的に修正する必要があるのはapp/build.gradleだけって事になるので

ちなみにのちのちでやることになるけど、gradle wrapperが必要になるのでgradle wrapperタスクを動かしてgradlewを出力させておく

build.gradle

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath "com.android.tools.build:gradle:0.9.+"
        // org.robolectric.gradleなgradle-android-test-pluginを使うように
        classpath "org.robolectric.gradle:gradle-android-test-plugin:0.9.+"
    }
}

allprojects {
    repositories {
        mavenCentral()
        maven {
            url "https://oss.sonatype.org/content/repositories/snapshots/"
        }
    }
}

app/build.gradle

apply plugin: "android"
apply plugin: "android-test"

dependencies {
    // ※robolectricテストに関わるのはtestCompileに入れる事。入れないとrobolectricテストはできてもandroidTestができなくなる

    compile project(":libraries:sample_library")
    compile "com.actionbarsherlock:actionbarsherlock:4.4.0@aar"

    androidTestCompile files("lib/espresso-1.1-bundled.jar")

    testCompile("junit:junit:4.11") {
        exclude module: "hamcrest-core"
    }

    testCompile("org.robolectric:robolectric:2.3-SNAPSHOT") {
        exclude module: "classworlds"
        exclude module: "maven-artifact"
        exclude module: "maven-artifact-manager"
        exclude module: "maven-error-diagnostics"
        exclude module: "maven-model"
        exclude module: "maven-plugin-registry"
        exclude module: "maven-profile"
        exclude module: "maven-project"
        exclude module: "maven-settings"
        exclude module: "nekohtml"
        exclude module: "plexus-container-default"
        exclude module: "plexus-interpolation"
        exclude module: "plexus-utils"
        exclude module: "wagon-file"
        exclude module: "wagon-http-lightweight"
        exclude module: "wagon-http-shared"
        exclude module: "wagon-provider-api"
    }
}

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.3"

    //enforceUniquePackageName false

    packagingOptions {
        exclude "LICENSE.txt"
        exclude "META-INF/LICENSE"
        exclude "META-INF/LICENSE.txt"
        exclude "META-INF/NOTICE"
    }

    defaultConfig {
        testInstrumentationRunner "com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner"
    }
}

// このandroidTestはsrc/testとsrc/androidTest等に関わる部分かと思われるのでrobolectricテストに関してespressoテストが作用しないようにする
androidTest {
    include "**/*Test.class"
    exclude "**/espresso/*.class"
}

あとは普通に

gradle clean test connectedAndroidTest

で動かせば良い。testでコケるとconnectedAndroidTestまでは作用しない

んまぁてな感じでgradle-android-test-pluginを使いつつのrobolectricテスト及びUIテストを動かすのも出来るって事で

ちなみにandroidのgradle build toolsのバージョンが最近のだとconnectedInstrumentTestではなくconnectedAndroidTestになっているので(instrumentTest Configurationも無い)

余談: Jenkinsでビルドしよう

前述した通りにgradle wrapperを使えば簡単にJenkins側でビルドする事も出来る模様なので、それもついでにやってみた

まず上記のプロジェクトをgitリポジトリにぶっこんでおいて

んな感じでビルドプロジェクトでgitリポジトリを設定しておく。でビルドするにあたっては

./gradlew clean test connectedAndroidTest

的な感じのビルドスクリプトでシェルスクリプト実行で上記を指定すれば良い。もしくはGradle Pluginがあるのでそれを使ってビルドする等の方法も取れる。もしgradlewが無いような場合等はこっちの方法を取れば良いはず

でなんだかんだで設定してビルドすると

っていうようにJenkinsでandroidなプロジェクトのビルドが出来るようになると

angular.jsをやってみる (24) - ng-non-bindable - Espressoを使ったUIテスト