Java 模拟默认Maven故障保护配置的简单现代Gradle配置

Java 模拟默认Maven故障保护配置的简单现代Gradle配置,java,maven,gradle,integration-testing,Java,Maven,Gradle,Integration Testing,配置Gradle的一种简单(但现代最佳实践)方法是什么,这样我就可以运行与默认操作类似的集成测试?我读过,特别是,但它们看起来相当复杂(与Maven Failsafe相比),而且我不相信这些例子以同样的方式工作 我想要的是非常简单的: 为了便于讨论,将有一些单独的任务,我们称之为integrationTest 调用gradle test时,integrationTest任务不会运行 调用gradle integrationTest时,integrationTest任务将运行(在test任务之后

配置Gradle的一种简单(但现代最佳实践)方法是什么,这样我就可以运行与默认操作类似的集成测试?我读过,特别是,但它们看起来相当复杂(与Maven Failsafe相比),而且我不相信这些例子以同样的方式工作

我想要的是非常简单的:

  • 为了便于讨论,将有一些单独的任务,我们称之为
    integrationTest
  • 调用
    gradle test
    时,
    integrationTest
    任务不会运行
  • 调用
    gradle integrationTest
    时,
    integrationTest
    任务将运行(在
    test
    任务之后)
  • 调用
    gradle check
    时,
    integrationTest
    任务将运行(在
    test
    任务之后)
  • integrationTest
    任务与
    test
    任务具有相同的依赖项和类路径配置
  • integrationTest
    任务将使用与
    test
    任务相同的源路径(即
    src/test/java
    ),但将只运行以
    *IT
    结尾的测试(为了简化本讨论的过程)
  • test
    任务将忽略以
    *IT
    结尾的所有测试
这实际上是一个非常简单的用例。(我只是说了一些细节,这样就不会有歧义了。)我可以用两行来表示目标,用三行来表示依赖关系。既然Gradle从等式中去掉了XML的详细性,我应该可以用两行代码来配置它,对吗

说清楚点,我不想在Gradle中使用Maven故障保护。我只想将Gradle配置为与默认故障保护配置的行为方式类似,正如我在上面详述的那样

特别是用于集成测试的Gradle文档-,但它们看起来相当复杂(与Maven Failsafe相比)

您正在将插件(Maven Failsafe)与标准/普通Gradle配置进行比较。插件会抽象掉所有的底层细节,所以比较两者是不公平的。如果你看看Maven Failsafe的功能,你会发现它与Gradle一样“复杂”

(…)而且我不相信这些例子是以同样的方式工作的

用于为典型应用程序配置集成测试的文档。但是,因为您有特定的需求,所以您需要调整它们

既然Gradle从等式中去掉了XML的详细性,我应该可以用两行代码来配置它,对吗

不,因为同样,您将插件与标准/普通Gradle配置进行比较。XML与Groovy/Kotlin DSL之间的争论是好是坏,这是一个意见问题

对于您的需求,我相信我已经捕获了以下内容(未经测试):

尽管这有点冗长/笨拙,因为您希望集成测试与测试在同一个源集中。因此,上述内容可以简化为:

tasks {
    test {
        filter {
            excludeTestsMatching("IT*")
            excludeTestsMatching("*IT")
            excludeTestsMatching("*ITCase")
        }
    }
    register("integrationTest", Test::class) {
        description = "Runs integration tests."
        group = "verification"
        testClassesDirs = sourceSets.test.get().output.classesDirs
        classpath = sourceSets.test.get().runtimeClasspath
        filter {
            includeTestsMatching("IT*")
            includeTestsMatching("*IT")
            includeTestsMatching("*ITCase")
        }
        shouldRunAfter(test)
    }
}

这看起来很有希望,谢谢!如果成功的话,我会安排一笔赏金来表达我的感激之情。1.你能谈谈
注册(“integrationTest”,Test::class)
与官方文件推荐的
任务集成测试(type:Test)
的区别吗?2.使用
shouldlrunafter(test)
会保证失败的测试会在
check
任务结束前使构建失败,还是会在
check
任务结束后逐步安排集成测试?(文档建议添加
check.dependsOn integrationTest
)。3.
verification
是其他任务使用的官方、有文档记录的组吗?(1)我使用的是Kotlin DSL,而不是Groovy DSL,因此语法不同。通常,您应该支持任务配置避免API(惰性API)。(2) 否,如果您想因任何测试失败而立即使生成失败,请将
failFast
属性设置为
true
。不要将文档作为唯一的解决方案,将其用作参考,并根据您的需要进行调整。有关
dependsOn
vs
shouldlrunafter
的详细信息,请参阅
DefaultTask
的javadocs。(3) 组是一个任意字符串值,尽管插件作者通常会重用现有组。
LifecycleBasePlugin
定义验证。就我而言,我别无选择,只能使用Groovy DSL。我还不完全清楚
寄存器(“integrationTest”,Test::class)
是如何工作的,以及它是否等同于
任务integrationTest(type:Test)
。有没有可能你可以澄清一下,甚至可以展示Groovy DSL的一部分?啊,看起来Gradle对你提到的“避免配置”这件事有一个看法。我会去读它,看看它是否回答了我的问题。这是如何翻译成Groovy的,我需要一段时间才能弄清楚。问题的关键是如何以一种简单的方式配置它,但是看起来我仍然需要研究在哪里设置
failFast
,在Groovy中在哪里调用
register()
,等等。所以它仍然不简单。我会继续研究,但我希望能在Groovy中看到完整的答案。
tasks {
    test {
        filter {
            excludeTestsMatching("IT*")
            excludeTestsMatching("*IT")
            excludeTestsMatching("*ITCase")
        }
    }
    register("integrationTest", Test::class) {
        description = "Runs integration tests."
        group = "verification"
        testClassesDirs = sourceSets.test.get().output.classesDirs
        classpath = sourceSets.test.get().runtimeClasspath
        filter {
            includeTestsMatching("IT*")
            includeTestsMatching("*IT")
            includeTestsMatching("*ITCase")
        }
        shouldRunAfter(test)
    }
}