Android用の新しいIde内でgradleを使用してプロジェクトビルドでRobolectricを使用しようとしています:Android studio、しかし奇妙な問題に直面しています。すべてのライブラリを正しくインポートし、 「src」内に「test」フォルダーを作成しましたが、実際には、テストを実行するたびに、ideは「クラスが見つかりません:「com.example.myandroidproject.test」と言っています。何が間違っていますか?何かを変更する必要があります。 gradle.buildにありますか?これが私のディレクトリ構造です:
Src/testは自動的に使用されないため、これがそのままでは機能しない可能性があります。このソースセットをコンパイルし、適切な依存関係を設定して実行するテストタスクを自動的に作成する必要があります。
将来的にはこれをサポートする予定ですが、現時点では手動で行う必要があります。
@Aldo Borrero、ついに誰かがRobolectricとGradleを使用して「AndroidStudio」でAndroidプロジェクトをテストする方法を見つけたようです。この回答を見てください Robolectric with Gradle
更新:squareのメンバーは、GradleとAndroid Studio、この機能はv2のRobolectricと統合されますが、ここでプラグインを入手できます: Gradle Androidテストプラグイン
さまざまなアプローチを組み合わせてAndroid studio&robolectric&espresso。このサンプルプロジェクトのセットアップで終了しました https://github.com/nenick/Android-gradle-template ==
ここに、さまざまなアプローチの説明があります。
例があります https://github.com/robolectric/deckard-gradle robolectricメンテナによってサポートされています。これはプラグインに基づいています https://github.com/robolectric/gradle-Android-test-plugin 。ただし、これには、 https://github.com/robolectric/gradle-Android-test-plugin/issues/17 で報告されている依存関係の汚染に関する欠点があり、エスプレッソテストのコンパイル時間と実行時間が遅くなります。
buildscript {
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
classpath 'com.Android.tools.build:gradle:0.10.+'
classpath 'org.robolectric.gradle:gradle-Android-test-plugin:0.10.+'
}
}
apply plugin: 'Android'
apply plugin: 'Android-test'
Android {
defaultConfig {
testInstrumentationRunner "com.google.Android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner"
}
}
androidTest {
include '**/*Test.class'
exclude '**/espresso/**/*.class'
}
dependencies {
androidTestCompile('junit:junit:4.11')
androidTestCompile('org.robolectric:robolectric:2.3-SNAPSHOT')
androidTestCompile 'com.jakewharton.espresso:espresso:1.1-r2'
}
例を https://github.com/stephanenicolas/Quality-Tools-for-Android で示しますが、かなり古く、いくつかの欠点もありました。再コンパイルされ、Android studioの動作がおかしくなります。アプリケーションモジュールのソースにエスプレッソテストモジュールの(ルートソース)のフラグが付けられます。これは機能しますが、直感的ではありません。
dependencies {
androidTestCompile 'com.jakewharton.espresso:espresso:1.1-r2'
}
Android {
sourceSets {
main {
manifest.srcFile '../AndroidSample/AndroidManifest.xml'
Java.srcDirs += ['../AndroidSample/src/main/Java']
resources.srcDirs = ['../AndroidSample/res']
res.srcDirs = ['../AndroidSample/res']
}
}
defaultConfig {
testInstrumentationRunner "com.google.Android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner"
}
}
プラグインが存在します https://github.com/novoda/gradle-Android-test-plugin これにより、robolectricテストを個別のパッケージに入れることができます。このプロジェクトのセットアップは私にとって素晴らしい働きをします:
- MyProject
|- app (with espresso tests)
|- - build.gradle (app)
|- robolectric (unit tests)
|- - build.gradle (robo)
dependencies {
androidTestCompile 'com.jakewharton.espresso:espresso:1.1-r2'
}
Android {
defaultConfig {
testInstrumentationRunner "com.google.Android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner"
}
}
buildscript {
repositories {
mavenCentral()
maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
}
dependencies {
classpath 'com.Android.tools.build:gradle:0.9.+'
classpath "com.novoda:gradle-Android-test-plugin:0.9.8-SNAPSHOT"
}
}
Android {
projectUnderTest ':AndroidSample'
}
apply plugin: 'Java'
apply plugin: 'Android-test'
dependencies {
testCompile 'junit:junit:4.11'
testCompile 'org.mockito:mockito-core:1.9.5'
testCompile 'com.squareup:fest-Android:1.0.+')
testCompile ('org.robolectric:robolectric:2.3-SNAPSHOT')
}
このプロジェクトセットアップをセットアップしようとすると、いくつかの落とし穴があるので、実際の例から始めてください: https://github.com/nenick/Android-gradle-template
ここに示したすべてのソリューションをテストしましたが、すべてに何かが欠けています(gradle/gradleプラグインのバージョンはサポートされていません、ライブラリプロジェクトはサポートされていません、Androidスタジオとの統合はありませんなど)。将来はそうではないかもしれませんが、今日はそうです。
私が見つけた最善の方法は、単体テストを自分で構成することです。 build.gradleファイルに数行の設定を追加する必要があります。説明は次の記事にあります: http://tryge.com/2013/02/28/Android-gradle-build/ 。私は作者ではないので、ここの内容を直接コピーすることはできないと思います。
その記事に加えて、Android Studioで単体テストフォルダーをソースフォルダー(オートコンプリートなど)として表示するように構成する場合は、次の小さなダーティハックを適用してIDEに次のように思わせることができます。単体テストはinstrumentationTestフォルダーにあります。もちろん、実際のインストルメンテーションテストは混乱するため、それらがない場合にのみ機能します。
build.gradle
// the unit test source set as described in the article
sourceSets {
unitTest {
Java.srcDir file('src/test/Java')
resources.srcDir file('src/test/resources')
}
}
Android {
// tell Android studio that the instrumentTest source set is located in the unit test source set
sourceSets {
instrumentTest.setRoot('src/test')
}
}
dependencies {
// your unit test dependencies as described in the article
unitTestCompile files("$project.buildDir/classes/release")
unitTestCompile 'junit:junit:4.11'
unitTestCompile 'com.google.Android:android:4.1.1.4'
unitTestCompile 'org.robolectric:robolectric:2.1.1'
// duplicate these dependencies in the instrumentTestCompile scope
// in order to have the integration in Android Studio (autocompletion and stuff)
instrumentTestCompile 'junit:junit:4.11'
instrumentTestCompile 'org.robolectric:robolectric:2.1.1'
}
// the rest of the config as described in the article
Android Studio0.2.6およびAndroid gradleプラグイン0.5でテスト済み。
Gradle Androidユニットテストプラグイン は私にとって最良のオプションです。
Jake Whartonによって開発された、次の標準になると思います(おそらく、GoogleがAndroid Studio)でRobolectricのすぐに使えるサポートをリリースするまで)。
build.gradle
ファイルを追加することで、ライブラリをインポートできます。
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.Android.tools.build:gradle:0.X.+'
classpath 'com.squareup.gradle:gradle-Android-test-plugin:0.9.+'
}
}
...
apply plugin: 'Android-test'
...
dependencies {
testCompile 'junit:junit:4.10'
testCompile 'org.robolectric:robolectric:2.1.+'
testCompile 'com.squareup:fest-Android:1.0.+'
}
更新:このライブラリは、gradleプラグインバージョン0.8以降非推奨になりました
私は多くのシナリオをテストしました( http://tryge.com/2013/02/28/Android-gradle-build/ や http://www.peterfrieseなど)。 de/Android-testing-with-robolectric / )しかし、Robolectricチームによって提供されたソリューションのみが私のために機能しました。セットアップでは、ビルドシステムとしてgradleを使用した1つのAndroidプロジェクトで、インストルメント化されたロボレクトリックテストを使用します。
http://robolectric.org/getting_started/ および https://github.com/robolectric/deckard-gradle のソースを参照してください。
buildscript {
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
classpath 'com.Android.tools.build:gradle:0.9.2'
classpath 'org.robolectric.gradle:gradle-Android-test-plugin:0.9.4'
}
}
allprojects {
repositories {
mavenCentral()
}
}
apply plugin: 'Android'
apply plugin: 'Android-test'
Android {
packagingOptions {
exclude 'LICENSE.txt'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE'
}
compileSdkVersion 19
buildToolsVersion "19.0.3"
defaultConfig {
minSdkVersion 18
targetSdkVersion 18
versionCode 2
versionName "1.0.0-SNAPSHOT"
testInstrumentationRunner "com.google.Android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner"
}
buildTypes {
release {
runProguard false
}
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
res.srcDirs = ['res']
}
androidTest {
setRoot('src/test')
}
}
}
androidTest {
include '**/*Test.class'
exclude '**/espresso/**/*.class'
}
dependencies {
repositories {
mavenCentral()
maven {
url 'https://oss.sonatype.org/content/repositories/snapshots/'
}
}
// Espresso
androidTestCompile files('lib/espresso-1.1.jar', 'lib/testrunner-1.1.jar', 'lib/testrunner-runtime-1.1.jar')
androidTestCompile 'com.google.guava:guava:14.0.1',
'com.squareup.dagger:dagger:1.1.0',
'org.hamcrest:hamcrest-integration:1.1',
'org.hamcrest:hamcrest-core:1.1',
'org.hamcrest:hamcrest-library:1.1'
androidTestCompile('junit:junit:4.11') {
exclude module: 'hamcrest-core'
}
androidTestCompile('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'
}
androidTestCompile 'com.squareup:fest-Android:1.0.+'
}
apply plugin: 'idea'
idea {
module {
testOutputDir = file('build/test-classes/debug')
}
}