在Android Studio中将集成测试与单元测试分开

12

我正在尝试在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中定义的现有单元测试一起运行。


1
你最终解决了这个问题吗?我遇到了类似的Java错误和测试类未找到的错误,即使我按照链接进行操作。 - user484691
@Philio,你解决了这个问题吗?如果是,请发布您的答案。 - Jared Burrows
在build.gradle文件的哪个位置添加这段代码以将新的src目录添加到项目中?是在末尾还是在“android”块内部?这是项目build.gradle还是app build.gradle?它会自动显示在IDE中吗?我知道你没有完成,但我正在尝试解决这个问题,我甚至无法让integrationTest目录显示在Android Studio中。 - sak
我认为你已经接近成功了。虽然我不是Android开发者,但关键缺失的一步是将编译后的类添加到集成测试的类路径中。有趣的是,在构建的另一个部分中,你已经检索了编译后的类:在androidJavadocs任务中。尝试使用该语法替换Java项目中看到的sourceSets.main.output - Peter Ledbrook
@PeterLedbrook 我认为你是对的,最近我也做了这种分离。 - MartinTeeVarga
显示剩余7条评论
2个回答

5
@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
}

当我这样做时,我收到警告:“Android Gradle插件无法识别SourceSet 'integrationTest'。也许您拼错了什么? 受影响的模块:app” - funkybro

1

我曾在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

如果标准命名(java、resources)下的文件夹位于src/integration中,IntelliJ IDEA将捕获这些文件夹。


不幸的是,这仅适用于Java插件,而不适用于Android应用程序或库插件。 - Rule

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接