【问题标题】:Separating integration tests from unit tests in Android Studio在 Android Studio 中将集成测试与单元测试分开
【发布时间】:2014-12-28 22:20:51
【问题描述】:

我正在尝试在 Android Studio 0.9 中分离出集成测试。

我在构建文件中添加了以下内容:

sourceSets {
    integrationTest {
        java.srcDir file('src/integrationTest/java')
    }
}

task integrationTest(type: Test) {
    testClassesDir = sourceSets.integrationTest.output.classesDir
    classpath = sourceSets.integrationTest.runtimeClasspath
}

我遇到了几个问题:

  1. 该任务将运行,但它没有可用的其余项目文件,因此我收到有关缺少类的错误。我发现了一些特定于 Java 的解决方案,例如:

    但我无法弄清楚如何让它与 Android Studio 一起工作。 mainmain.output 的各种组合以及玩弄依赖项似乎都不起作用,我收到如下错误:

    Error:(33, 0) Could not find property 'main' on SourceSet container..
    

    这很有意义,因为 android 插件定义了自己的源集,但这些也不起作用。

  2. IDE 无法将该目录识别为测试源目录。出于测试目的,我将源集名称更改为androidTest,它正确地获得了绿色文件夹图标,并且测试与androidTest中已经定义的现有单元测试一起运行。

【问题讨论】:

  • 你有没有让这个工作?即使在点击链接后,我也收到了类似的 java 错误和 test class not found 错误。
  • 最后我无法让它们以令人满意的方式作为单独的测试套件工作,我只使用了一个测试套件。
  • 感谢您的更新。我根本无法在我的 SDK 模块中执行测试。有什么我想念的吗。我试图执行一个测试,但我不断收到 class not found 错误。
  • 我刚刚添加了一个额外的源目录,这是我的构建文件:github.com/Philio/disqus-android/blob/master/disqus/…
  • @Philio 你搞定了吗?如果是这样,请发布您的答案。

标签: android unit-testing gradle android-studio integration-testing


【解决方案1】:

@sm4 的答案确实适用于 Java 模块(apply plugin: 'java'),但不幸的是不适用于 Android 应用程序(apply plugin: 'com.android.application')或 Android 库模块(apply plugin: com.android.library)。

但我找到了解决方法:
为您的集成测试创建文件夹:

src/integrationTest/java
src/integrationTest/res

为您的新文件夹添加源集:

sourceSets {
    integrationTest {
        java {
            srcDir file('src/integrationTest/java')
        }
        res {
            srcDir file('src/integrationTest/res')
        }
    }
}

在纯 Java 模块中,java 文件夹现在会变成绿色,res 文件夹图标会改变。在 Android 应用程序/库模块中它不会。

现在创建一个与 sourceSet 中配置的文件夹同名的产品风味,它可以工作了!

productFlavors {
    integrationTest {
    }
}

然后在上面放一颗樱桃:

configurations {
    integrationTestCompile.extendsFrom testCompile
}

【讨论】:

  • 当我这样做时,我收到警告:The SourceSet 'integrationTest' is not recognized by the Android Gradle Plugin. Perhaps you misspelled something? Affected Modules: app
【解决方案2】:

我已经在 Gradle 中完成了这种分离,但是对于纯 Java 项目,而不是 Android。您没有在源集中指定类路径,我认为这是问题所在。这是build.gradle的相关部分:

sourceSets {
    integration {
        java {
            compileClasspath += main.output + test.output
            runtimeClasspath += main.output + test.output
            srcDir file('src/integration/java')
        }
        resources {
            srcDir 'src/integration/resources'
        }
    }
}

configurations {
    integrationCompile.extendsFrom testCompile
    integrationRuntime.extendsFrom testRuntime
}

task integrationTest(group: "verification", type: Test) {
    testClassesDir = sourceSets.integration.output.classesDir
    classpath = sourceSets.integration.runtimeClasspath
}
integrationTest.dependsOn testClasses

如果src/integration 下的文件夹具有标准名称(java、资源),IntelliJ idea 会选择它们。

【讨论】:

  • 不幸的是,这仅适用于 java 插件,不适用于 android 应用程序或库插件
猜你喜欢
  • 2012-01-01
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
  • 2013-02-23
  • 2010-09-21
相关资源
最近更新 更多