我正在开发一个大型多模块Maven项目。每个模块都有快速单元测试(使用Surefire插件),许多模块都有慢速集成测试(使用Failsafe插件)。
我想通过在构建所有模块并进行单元测试后运行所有模块的集成测试来加快“简单”构建失败(编译错误和单元测试失败)的反馈。
你能提出一个实现这个目标的好方法吗?
答案 0 :(得分:2)
在构建所有模块并进行单元测试后,从所有模块运行集成测试
为了满足这一要求,可能的解决方案是有一个额外的(可选)模块提供集成测试,也就是说,所有集成测试都应该移到这个模块,可以通过配置文件添加到默认构建中。
<profiles>
<profile>
<id>it</id>
<modules>
...
<module>it-module</module>
</modules>
</profile>
</profiles>
为了让它成为Maven Reactor构建的最后一步,这个模块也应该依赖于所有其他模块(可能它已经隐含了)。
该模块实际上是唯一提供maven-failsafe-plugin
配置和设置的模块。此外,在使用嵌入式服务器进行测试(即Jetty)的情况下,它可能会变得更有意义:服务器将仅在构建此模块期间创建和关闭,而不是在需要它的每个模块中创建和关闭,加速这个整合阶段。
作为构建的最后一个模块,您将确保仅在以前模块上没有单元测试失败的情况下才会到达它,并且仅当it
配置文件处于活动状态时(例如在CI构建期间)
答案 1 :(得分:0)
简短的回答可能是将failsafe-plugin移动到配置文件中。
由于maven本身没有default mapping for the failsafe plugin,我认为它是在你的父pom中启用的,或者(更糟糕的是)公司的父母pom。
方法是创建配置文件以启用集成测试,并仅在需要时启用该配置文件。为避免浪费,此配置文件可能会禁用surefire-tests以不重新执行它们。如果它们很快就可能不是问题。在这种情况下,重新执行它们以便开始。
我认为可以将其提取到个人资料中。我对maven配置文件的一般规则是,它们不允许更改生成的工件(它们可以,但通常会变得混乱)。在这种情况下,您添加另一个执行步骤。所以这不应该伤害。只需确保在剪切版本时启用了配置文件:)
答案 2 :(得分:0)
这是一个完全符合我想要的解决方案:使用Failsafe插件只运行集成测试,而不必将测试移出自然位置或重新编译以运行测试。
mvn install -DskipITs
mvn failsafe:integration-test
我们让Maven将项目的工件发布到本地目录中。然后我们可以将其用作第二步的存储库。在第二步中,我们将完全调用我们需要的目标,并从本地存储库中获取工件。
如果你需要单独运行单元测试,同样的事情适用于Surefire(mvn surefire:test
)。
我必须承认,我并不完全了解Maven模型,因此我认为这是有效的。互联网似乎一致认为这种事情无法完成(请参见此处的其他答案),但这绝对适合我。