使用android分离gradle上的独立集成测试任务

use*_*191 5 testing android gradle android-gradle-plugin

我想运行在默认测试运行中要排除的路径中具有"集成"字的测试,但我想在一个单独的任务中一起运行它们.目前我有一个基本的测试配置:

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

    integrationTest.setRoot('src/test')
}

...

androidTestCompile 'junit:junit:4.11'
androidTestCompile 'com.jayway.android.robotium:robotium-solo:5.1'
androidTestCompile files('libs/android-junit-report-1.5.8.jar')
androidTestCompile 'com.squareup:fest-android:1.0.8'
androidTestCompile 'org.robolectric:robolectric:2.3'

integrationTestCompile 'junit:junit:4.11'
integrationTestCompile 'com.jayway.android.robotium:robotium-solo:5.1'
integrationTestCompile files('libs/android-junit-report-1.5.8.jar')
integrationTestCompile 'com.squareup:fest-android:1.0.8'
integrationTestCompile 'org.robolectric:robolectric:2.3'

...

androidTest {
    include '**/*Test.class'
    exclude '**/espresso/**/*.class'
    exclude '**/integration/**'
}

task integrationTest(type: Test) {
    include '**/integration/**'
}
Run Code Online (Sandbox Code Playgroud)

这会在AS中同步gradle时导致错误:

Warning: project ':ProjectName': Unable to resolve all content root directories
Details: java.lang.NullPointerException: null
Run Code Online (Sandbox Code Playgroud)

但如果我删除了IntegrationTest任务,它就不会发生.此外,在任务存在的情况下,我可以运行'integrationTest'任务,但这会导致另一个错误:

Error:Could not determine the dependencies of task ':ProjectName:integrationTest'.
A base directory must be specified in the task or via a method argument!
Run Code Online (Sandbox Code Playgroud)

Dav*_*ave 1

这并不完全明显,但此错误是由于未testClassesDir在任务定义中定义而导致的。

task integrationTest(type: Test) {
    include '**/integration/**'
    testClassesDir = file('build/intermediates/classes')
}
Run Code Online (Sandbox Code Playgroud)

Java 插件的Gradle 用户指南中描述了类似的内容,但它并没有完全转化为 Android 插件。我还没有弄清楚所有细节,但我会在弄清楚后更新这个答案。