Android-проект с Robolectric и Gradle (студия Android)
Я пытаюсь использовать Robolectric в сборке проекта с помощью gradle внутри новой студия Ide для android: Android, но у меня возникла странная проблема: я правильно импортировал все библиотеки и создал "тест" "папка внутри" src ", факт состоит в том, что всякий раз, когда я запускаю тесты, идеал продолжает говорить" Class not found: "com.example.myandroidproject.test", что я делаю неправильно? Мне нужно что-то изменить в gradle.build? здесь моя структура каталогов:
![enter image description here]()
Ответы
Ответ 1
Это вряд ли будет работать из коробки, поскольку src/test не будет использоваться автоматически.
Вам нужно будет создать тестовую задачу автоматически, которая компилирует эти исходные наборы, устанавливает правильные зависимости и запускает их.
Мы намерены поддерживать это в будущем, но сейчас вам нужно будет сделать это вручную.
Ответ 2
@Алдо Борреро, наконец, кажется, что кто-то нашел способ протестировать проекты Android под "Android Studio" с использованием Robolectric и Gradle.
Пожалуйста, взгляните на этот ответ Robolectric с Gradle
Обновление:
Ребята из Square выпустили плагин, чтобы Robolectric работал из коробки с помощью Gradle и Android Studio, эта функция будет интегрирована с Robolectric в v2, между тем вы можете захватить плагин здесь: Gradle Плагин для тестирования Android
Ответ 3
Я попробовал разные оценки, чтобы объединить студию андроида и robolectric и эспрессо. Я закончил этот пример установки проекта 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, что приводит к медленному тестированию времени и времени выполнения esspresso.
build.gradle snippet, который объединяет все
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, но он сильно устарел и также имеет некоторые недостатки. Он будет перекомпилировать
и делает андроид-студию очень странным. Он помещает источники модуля приложения в качестве (корневого источника) тестового модуля эспрессо. Это работает, но не интуитивно.
build.gradle фрагмент для эспрессо-модуля
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"
}
}
сперва robolectric
Существует плагин https://github.com/novoda/gradle-android-test-plugin, который позволяет нам вводить robolectric тесты в пакет sperate. Этот проект
настройка работает для меня отлично:
- MyProject
|- app (with espresso tests)
|- - build.gradle (app)
|- robolectric (unit tests)
|- - build.gradle (robo)
build.gradle(app + espresso) snippet
dependencies {
androidTestCompile 'com.jakewharton.espresso:espresso:1.1-r2'
}
android {
defaultConfig {
testInstrumentationRunner "com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner"
}
}
build.gradle(robo) фрагмент
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
Ответ 4
Я тестировал все представленные здесь решения, и у них все что-то не хватает (версия плагина gradle/gradle не поддерживается, проект библиотеки не поддерживается, нет интеграции с Android-студией и т.д.). В будущем это может быть неверно, но сегодня.
Лучший способ, который я нашел, - сконфигурировать модульные тесты самостоятельно. Вам нужно будет добавить несколько строк конфигурации в файл build.gradle. Пояснения приведены в следующей статье: http://tryge.com/2013/02/28/android-gradle-build/. Поскольку я не автор, я не думаю, что могу прямо копировать содержимое здесь.
В дополнение к этой статье, если вы хотите настроить Android Studio на просмотр папки unit test в качестве исходной папки (автозаполнение и прочее), вы можете применить следующий небольшой грязный взломать, и пусть среда IDE считает, что модульные тесты расположенный в папке InstrumentTest. Конечно, это будет бесполезно с вашими реальными инструментальными тестами, поэтому оно работает только в том случае, если у вас их нет.
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 Studio 0.2.6 и android gradle 0.5.
Ответ 5
Gradle Плагин для тестирования модулей Android - лучший вариант для меня.
Разработанный Джейком Уортоном, я предполагаю, что это будет следующий стандарт (возможно, пока Google не выпустит бесплатную поддержку Robolectric в Android Studio).
Вы можете импортировать библиотеку, добавив в свой файл 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
Ответ 6
Я тестировал множество сценариев (например, http://tryge.com/2013/02/28/android-gradle-build/ и http://www.peterfriese.de/android-testing-with-robolectric/), но только решение, предоставленное командой Robolectric, сработало для меня. Установка использует инструментальные и робоэлектрические тесты в одном проекте Android с gradle в качестве системы сборки.
См. 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')
}
}