18

我正在尝试在新的 Ide for android:Android studio 中使用 gradle 在项目构建中使用 Robolectric,但我遇到了一个奇怪的问题,我已经正确导入了所有库并在“src”中创建了“test”文件夹”,事实是,每当我运行测试时,ide 总是说“找不到类:”com.example.myandroidproject.test“我做错了什么?我需要更改 gradle.build 中的某些内容?这是我的目录结构体:

在此处输入图像描述

4

6 回答 6

16

@Aldo Borrero,终于有人找到了使用Robolectric和Gradle在“Android Studio”下测试android项目的方法。请看一下这个答案Robolectric with Gradle

更新: Square 的人发布了一个插件,让 Robolectric 在 Gradle 和 Android Studio 中开箱即用,此功能将在 v2 中与 Robolectric 集成,同时您可以在此处获取插件:Gradle Android test Plugin

于 2013-06-11T07:17:59.723 回答
7

我尝试了不同的方法来结合 android studio & robolectric & espresso。我以这个示例项目设置结束https://github.com/nenick/android-gradle-template

以下是对不同方法的一些解释:

应用模块 + espresso + robolectric

有一个示例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 片段,它结合了所有

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 行为奇怪。它将应用程序模块源标记为 espresso 测试模块的(根源)。这有效但不直观。

espresso 模块的 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"
    }

}

分散机器人电动

有一个插件https://github.com/novoda/gradle-android-test-plugin使我们能够将 robolectric 测试放在一个单独的包中。这个项目设置对我很有用:

- MyProject 
|- app (with espresso tests)
|- - build.gradle (app)
|- robolectric (unit tests)
|- - build.gradle (robo)

build.gradle (app + espresso) 片段

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

于 2014-05-09T05:56:36.603 回答
5

这不太可能开箱即用,因为 src/test 不会自动使用。您需要自动创建一个测试任务来编译此源集、设置正确的依赖项并运行它。

我们打算在未来支持此功能,但现在您需要手动执行此操作。

于 2013-05-29T00:32:07.963 回答
3

我测试了这里介绍的所有解决方案,它们都缺少一些东西(不支持 gradle / gradle 插件的版本,不支持库项目,没有与 Android Studio 集成等)。未来可能不是这样,但今天是这样。

我发现最好的方法是自己配置单元测试。您需要在 build.gradle 文件中添加几行配置。解释在以下文章中: http: //tryge.com/2013/02/28/android-gradle-build/。由于我不是作者,我认为我不能直接复制过去的内容。

除了那篇文章,如果您想配置 Android Studio 以将单元测试文件夹视为源文件夹(自动完成和其他东西),您可以应用以下小脏 hack 并让 IDE 认为单元测试位于 instrumentationTest文件夹。当然,它会干扰你真正的仪器测试,所以它只有在你没有这些的时候才有效。

构建.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 测试。

于 2013-09-01T22:55:15.730 回答
2

Gradle Android 单元测试插件对我来说是最好的选择。
由 Jake Wharton 开发,我想它将成为下一个标准(可能直到谷歌在 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 以来,此库已被弃用

于 2013-08-26T12:26:24.890 回答
1

我已经测试了很多场景(比如http://tryge.com/2013/02/28/android-gradle-build/http://www.peterfriese.de/android-testing-with-robolectric/)但只有 Robolectric 团队提供的解决方案对我有用。该设置在一个使用 gradle 作为构建系统的 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')
    }
}
于 2014-04-22T11:01:40.820 回答