Maven 为什么故障保护插件需要集成测试和验证目标?

Maven 为什么故障保护插件需要集成测试和验证目标?,maven,integration-testing,maven-failsafe-plugin,Maven,Integration Testing,Maven Failsafe Plugin,我有下一个pom.xml ... maven故障保护插件 2.6 集成测试 集成测试 验证 ${failsafeArgLine} **/dmg/*IT.java ${skipTests} ... 问题是,当我执行验证目标时,即使测试失败,构建每次都是成功的 当我开始集成测试时,集成测试根本不会运行 为什么failsafe插件需要集成测试和验证目标?在Maven failsafe插件参考中,您可以找到为什么构建总是成功的简单答案 如果没有验证,则根本不会检查目标测试结果(但会执行),因此故障保

我有下一个pom.xml


...
maven故障保护插件
2.6
集成测试
集成测试
验证
${failsafeArgLine}
**/dmg/*IT.java
${skipTests}
...
问题是,当我执行验证目标时,即使测试失败,构建每次都是成功的

当我开始集成测试时,集成测试根本不会运行


为什么failsafe插件需要集成测试和验证目标?

在Maven failsafe插件参考中,您可以找到为什么构建总是成功的简单答案


如果没有验证,则根本不会检查目标测试结果(但会执行),因此故障保护插件需要集成测试目标来运行测试,并通过验证来“验证”其结果。

在Maven中,有两种类型的测试运行器插件,Surefire和failsafe,它们都有不同的用途。(我在这里提到Surefire是因为我觉得它有助于解释和对比构建中不同类型的失败。)

Surefire

Surefire是为预部署测试(如单元和组件测试)设计的插件。如果任何测试失败,Surefire将保证返回失败(从而破坏您的构建)。 您希望在预部署测试中出现这种行为,因为如果您的测试失败,您希望尽早使构建失败,并且由于单元和组件测试没有(或不应该)任何外部依赖性,因此在那里使构建失败是安全的

故障保护

Failsafe是为部署后测试(如功能测试和冒烟测试)设计的插件。 Failsafe,顾名思义,通过始终返回成功退出代码(正如您在构建中所经历的那样),安全地处理故障。 这背后的原因是,对于部署后测试,您不希望测试失败立即破坏构建,因为您可能已经启动了基础架构,或者将一些测试数据植入了系统,这需要在构建失败之前进行清理。 因此,故障保护将故障检查分为
Failsafe:verify
目标,该目标发生在
verify
阶段

如果您在没有参数的情况下运行Maven(假设正常的
jar
生命周期),您会注意到
集成测试
验证
之间的一个阶段被调用,
集成后测试
。这是一个阶段,设计用于拆除为运行测试而注入系统的任何基础设施或测试数据

。。。集成前测试、集成测试、集成后测试、验证。。。
集成测试之前的阶段
集成前测试
是为上述播种和基础设施创建而设计的

总而言之,对于预部署测试,您希望尽早使构建失败,因此
surefire
通过退出失败来保证这一点

而对于部署后测试,通常存在外部依赖关系,需要在构建失败之前进行清理。例如,在Kubernetes中,您可能希望发布部署回滚,因此
failsafe:integration
始终返回生成成功,以确保您可以通过使用
failsafe:verify
检查状态,在生成失败之前执行清理


(目前接受的答案只是引用了手册,没有解释为什么有两个命令,并且存在差异,这就是为什么我觉得需要这个答案。)

您使用的是什么maven failsafe插件的极端旧版本。目前的版本是2.17…此外,包括是不必要的,因为这些是默认值。这包括是必要的,因为我只需要运行它是在dmg包,谢谢你。。。我不知道版本),但验证阶段不包括集成测试阶段吗?为什么我要写这两个?规范说验证是在集成测试之后进行的…插件没有自己的
生命周期
。它被配置为执行
目标
。那些
目标
被绑定到
阶段
阶段
位于
默认生命周期
中。这样maven就知道哪个
目标是第一个。为什么需要两个
目标
因为两个人比一个人好。我可能需要执行测试,然后运行一些例程来发布结果,即使测试失败。我没有定义
verify
执行,它已经完成了。
failsafe:integration-test runs the integration tests of an application.
  failsafe:verify verifies that the integration tests of an application passed.