gradle-android-test-plugin+robolectric+espresso
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なプロジェクトのビルドが出来るようになると