10

我正在尝试通过仪器测试和通过 Robolectric 的单元测试来运行 Espresso(使用Double Espresso )。到目前为止,我所拥有的主要是基于deckard-gradle示例。

注意: Gradle 1.10

buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:0.10.4'
    classpath 'org.robolectric.gradle:gradle-android-test-plugin:0.10.0'
  }
}

apply plugin: 'android'
apply plugin: 'android-test'

android {
  compileSdkVersion 19
  buildToolsVersion '19.0.3'

  defaultConfig {
    packageName = 'com.example.app'
    minSdkVersion 9
    targetSdkVersion 19
    versionCode 1
    versionName '1.0.0'
    testInstrumentationRunner "com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner"
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
  }

  buildTypes {
    debug {
      debuggable = true
      runProguard = false
    }

    release {
      debuggable = false
      runProguard = true
    }
  }

  sourceSets {
    androidTest {
      setRoot('src/test')
    }
  }

  packagingOptions {
    exclude 'LICENSE.txt'
  }
}

androidTest {
  include '**/*Test.class'
  exclude '**/espresso/**/*.class'
  maxHeapSize = "2048m"
}

repositories {
  mavenCentral()
}

dependencies {
  compile 'com.android.support:support-v4:19.1.0'

  androidTestCompile('com.jakewharton.espresso:espresso:1.1-r3')
  androidTestCompile('com.jakewharton.espresso:espresso-support-v4:1.1-r3') {
    exclude group: 'com.android.support', module: 'support-v4'
  }

  androidTestCompile('junit:junit:4.11') {
    exclude module: 'hamcrest-core'
  }
  androidTestCompile('org.robolectric:robolectric:2.3') {
    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.8'
}

我的目录结构如下,其中com.example.app.espresso需要运行 asconnectedAndroidTestcom.example.app.dataas test

源代码
|- 调试
|- 主要
|- 发布
|- 测试
   |- 爪哇
      |- com
         |- 例子
            |- 应用
               |- 浓缩咖啡
                  |- HomeActivityTest.java
               |- 数据
                  |- 数据测试.java
   |- 资源
      |- 数据输入.json

因此,当我运行时gradle clean test,我收到错误,无法识别HomeActivityTest.java.

运行时gradle clean connectedAndroidTest,出现错误,无法识别DataTest.java( FailedToCreateTests.testSuiteConstructionFailed) 中的 JUnit4 注释。

如果我取出任何一部分(依赖项和来源),另一部分可以独立工作,但不能将所有内容都包含在一起。

注意:我尝试在本地导入 Espresso jar(没有 Double Espresso),deckard-gradle 这样做的方式相同,直到我support-v4在 Espresso 测试中使用库中的任何内容(com.jakewharton.espresso:espresso-support-v4似乎解决了这个问题,对于本地 jar 没有其他选择) ),然后它爆炸成FailedToCreateTests.testSuiteConstructionFailed.

有没有人让这个结构工作?有没有办法从每个目标中排除源路径?

任何解决方案(全部或部分)将不胜感激。

4

3 回答 3

5

这是因为 Double Espresso 工件作为 .aar 文件分发,并且 Robolectric 为运行测试而生成的编译任务不依赖于解包 .aar 文件的任务,这些文件是 androidTestCompile 依赖项配置的一部分。

由于您通常不会将 espresso 测试作为运行单元测试的任务的一部分来运行,因此您可以安全地将 espresso 测试从 Robolectric 插件生成的编译任务中排除。为此,我将 Robolectric 插件生成的编译任务的依赖项添加到我的 build.gradle 中,以修改源属性。下面的示例代码。确保在必要时修改 robolectric 生成的编译任务的名称(在我的示例中为“compileTestDebugJava”)和您的 espresso 测试的“排除”。

tasks.whenTaskAdded { theTask ->
    if ("compileTestDebugJava".toString().equals(theTask.name.toString())) {
        def cleanupTask = "touchUpRobolectricSourceSet"
        project.task(cleanupTask) << {
            FileTree tree = fileTree(dir: 'src/test/java')
            tree.exclude '**/espresso/**/*.java'

            theTask.source = tree
        }
        theTask.dependsOn(cleanupTask)
    }
}
于 2014-07-11T20:58:17.787 回答
1

最终,我放弃了使用 Double Espresso 的想法,转而采用 Deckard-gradle 采用的方法 - 手动导入 Espresso jar 的 ( espresso,testrunnertestrunner-runtime)。

似乎 Double Espresso 所做的不仅仅是将罐子包装成 aar 并托管它们,或者它们是 aar 的事实会导致问题。有兴趣知道为什么。

为了避免保留本地依赖项,我将 Espresso jar 上传到 Maven 存储库,将它们以菊花链方式连接(espresso取决于testrunner-runtimetestrunner-runner取决于testrunner)并在 POM 中包含所有第三方依赖项(Guava、Hamcrest、Dagger 等)。如果您没有托管的 Maven 存储库,您可以使用 GitHub 作为您的存储库:https ://stackoverflow.com/a/14013645/818393 。

诚然,这不是最好的解决方案,但它确实有效。

于 2014-06-03T02:44:32.720 回答
0

我遇到了同样的问题,似乎是 Dagger 1.2 的错(作为 Jake 的双份浓缩咖啡的依赖项包含在内)。如果您包含普通的 1.1 库,它应该可以工作。

(此处为完整主题:https ://groups.google.com/forum/#!topic/robolectric/xeLrnCAsq5Q )

于 2014-06-02T09:11:48.620 回答