Подтвердить что ты не робот

Android-проект с Robolectric и Gradle (студия Android)

Я пытаюсь использовать Robolectric в сборке проекта с помощью gradle внутри новой студия Ide для android: Android, но у меня возникла странная проблема: я правильно импортировал все библиотеки и создал "тест" "папка внутри" src ", факт состоит в том, что всякий раз, когда я запускаю тесты, идеал продолжает говорить" Class not found: "com.example.myandroidproject.test", что я делаю неправильно? Мне нужно что-то изменить в gradle.build? здесь моя структура каталогов:

enter image description here

4b9b3361

Ответ 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')
    }
}