如果没有找到测试,如何使gradle不标记构建失败

JBT*_*JBT 5 gradle

正如标题所说,如果没有找到测试,我怎样才能让测试任务失败呢?当我在--tests多子项目项目中使用命令行选项时遇到了这个问题.例如,下面的命令将运行子项目A中的FooTest类中的所有测试:
gradle test --tests com.foo.bar.FooTest

但是,此命令因以下情况而失败:

Execution failed for task ':B:test'.
> No tests found for given includes: [com.foo.bar.FooTest]
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我知道下面的内容会成功.但即使有test任务,它是否有可能成功?键入测试任务名称的时间超过了,这有点烦人test.

gradle :A:test --tests com.foo.bar.FooTest

M.R*_*uti 10

您描述的行为是当前的 Gradle 行为,Gradle 论坛上已经有一张票,请参阅https://discuss.gradle.org/t/multi-module-build-fails-with-tests-filter/25835

根据此票证中描述的解决方案,您可以执行类似的操作来禁用“failIfNoTest”默认行为:

在您的根项目构建中(或者更好:在Gradle USER_HOME 目录中的InitScript中,以使此行为可用于所有本地项目)

gradle.projectsEvaluated {
    subprojects {
        // TODO: filter projects that does not have test task...
        test {
            filter {
                setFailOnNoMatchingTests(false)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,如果给定的测试不存在于所有子项目中,则可以执行以下命令而不会出现错误:

gradle test --tests com.foo.bar.FooTest
Run Code Online (Sandbox Code Playgroud)


Olg*_*zek 1

看来目前只有这样的解决方法是可能的:

test {
    afterSuite { desc, result ->
        if (!desc.parent) {
            if (result.testCount == 0) {
                throw new IllegalStateException("No tests were found. Failing the build")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经向 Gradle 提交了一个问题,将其作为一个简单的配置选项引入:https ://github.com/gradle/gradle/issues/7452