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

gok*_*ess 5 integration-testing maven maven-failsafe-plugin

我有下一个pom.xml

<project>
   ...
     <plugin>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.6</version>
            <executions>
                <execution>
                    <id>integration-test</id>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                    <configuration>
                        <argLine>${failsafeArgLine}</argLine>
                        <includes>
                            <include>**/dmg/*IT.java</include>
                        </includes>
                        <skipTests>${skipTests}</skipTests>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    ...
</project>
Run Code Online (Sandbox Code Playgroud)

问题是,当我取消验证目标时,即使存在测试失败,构建也每次都成功.

当我取消集成测试目标时,集成测试根本就没有运行

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

Fil*_*iOs 9

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

failsafe:integration-test runs the integration tests of an application.
  failsafe:verify verifies that the integration tests of an application passed.
Run Code Online (Sandbox Code Playgroud)

如果没有验证目标,则根本不会检查测试结果(但它们会被执行),因此failafe插件需要集成测试目标才能运行测试,并验证"验证"其结果.

  • 该插件没有自己的`lifecycle`。它被配置为执行“目标”。这些“目标”与“阶段”相关。“阶段”位于“默认生命周期”中。这样,行家就知道哪个“目标”先行。为什么需要两个目标?因为两个胜过一个。即使测试失败,我可能也需要执行测试,然后运行一些例程来发布结果。我没有定义`verify`执行,并且已经完成了。 (2认同)

Elv*_*ker 9

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

万无一失

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

故障保护

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

如果您在不带参数的情况下运行 Maven(假设正常jar生命周期),您会注意到integration-test和之间的一个阶段verify,称为post-integration-test。此阶段旨在拆除您可能已注入系统以运行测试的任何基础设施或测试数据。

... pre-integration-test, integration-test, post-integration-test, verify, ...
Run Code Online (Sandbox Code Playgroud)

之前的阶段integration-test是pre-integration-test为上述播种和基础设施创建而设计的。

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

然而,在部署后测试中,通常存在需要在构建失败之前清理的外部依赖项。例如,在 Kubernetes 中,您可能想要回滚部署,因此failsafe:integration始终返回构建成功,以保证您可以在构建失败之前通过检查状态来执行清理failsafe:verify。

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