只有在运行单元测试时才能运行自定义gradle任务

时间:2015-12-02 14:44:33

标签: android android-studio gradle

如何设置gradle以运行特定的自定义复制任务,仅在运行单元测试时?

修改

我想按下构建时运行这些任务,i。 e仅在包含单元测试执行的构建的风格中。

3 个答案:

答案 0 :(得分:3)

我终于在this documentation的帮助下找到了解决方案,它提供了在buildtestrelease等期间运行的所有任务。简洁的方式。因此,通过创建任务cleanpreBuild取决于我的copyTask我可以确保每次清理或构建项目时都运行复制任务。

但是因为我不希望在构建或清理过程中运行它,但是当我只运行测试时想要运行它,我确定了一个编译释放单元测试源的任务,称为compileReleaseUnitTestSources,但只是提到它在build.gradle中作为

compileReleaseUnitTestSources.dependsOn(myCopyTask)

实际上不起作用,因为gradle会发出一个错误,说它无法找到任务compileReleaseUnitTestSources,因为某些任务尚未可用。而是将它封装在afterEvaluate块中,我们可以确保在评估完所有任务后执行此块,这样我们现在就可以访问该任务了,所以最后我将它添加到了我的build.gradle

afterEvaluate {
    compileReleaseUnitTestSources.dependsOn(copyResDirectoryToClasses)
}

这里提到的所有答案都使用dependsOn关键字将我的任务附加到在一般构建/测试执行期间运行的另一个任务,但没有一个提到如何解决gradle无法解决的问题即使您确定这些任务可用并在构建/测试执行期间运行,也能找到任务。

答案 1 :(得分:2)

你必须设置一个“customCopyTask”,然后让单独测试的“test-task”依赖于像这样的“customCopyTask”

task customCopyTask(type: Copy) {
    from sourceSets.test.resources
    into sourceSets.test.output.classesDir
}
test.dependsOn customCopyTask

答案 2 :(得分:1)

你可以让一些任务完成另一个任务,在这种情况下,只有在调用另一个任务之后,此任务才会运行。这可以这样做:

task runUnitTest << {
    println 'running tests'
}

task copyTestResults << {
    println 'copying results'
}

//make copyTestResults finalize runUnitTest
runUnitTest.finalizedBy copyTestResults

您可以在官方user guide中了解相关信息。

此外,如果您的单元测试可能是最新的,并且您不想在这种情况下运行复制任务,则可以检查测试任务状态并跳过复制任务,如下所示:

task copyTestResults {
    doFirst {
        //chtck anothe task status and skip this one if it didn't actually work
        if (!tasks.getByName("runUnitTest").getState().didWork) {
            throw new StopExecutionException();
        }
    }
    doLast{
        println 'copying results'
    }
}

或者,如果您只需要在单元测试之前运行copy-task,请通过设置dependsOn属性来使测试任务依赖于copy-task,并使用数字og examples {读取它{3}}