在Android Studio中分离集成测试和单元测试



我正在尝试在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的解决方案,例如:

    • http://selimober.com/blog/2014/01/24/separate-unit-and-integration-tests-using-gradle/
    • https://blog.safaribooksonline.com/2013/08/22/gradle-test-organization/

    但我一直没能弄清楚如何让它与安卓工作室一起工作。mainmain.output的各种组合以及玩依赖关系似乎都不起作用,我得到了如下错误:

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

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

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

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

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

src/integrationTest/java
src/integrationTest/res

添加新文件夹的sourceSets:

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
}

我在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、resources),那么IntelliJ的想法会选择它们。

最新更新