Maven Invoker插件与Maven Failsafe插件:哪个用于集成测试?

dc9*_*c95 2 integration-testing maven-plugin maven maven-failsafe-plugin maven-invoker-plugin

两者的文档(Failsafe,Invoker)表明它们对于运行集成测试很有用.我无法弄清楚哪一个用于集成测试.

我能看到的唯一区别是Failsafe插件专门用于运行集成测试,而Invoker插件恰好对运行集成测试很有用,但其主要目的是其他方面.但是,当我在Eclipse中创建maven-plugin时,Maven Invoker插件已经包含在POM文件中,并带有以下代码.

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-invoker-plugin</artifactId>
        <version>1.7</version>
        <configuration>
            <debug>true</debug>
            <cloneProjectsTo>${project.build.directory}/it</cloneProjectsTo>
            <pomIncludes>
                <pomInclude>*/pom.xml</pomInclude>
            </pomIncludes>
            <postBuildHookScript>verify</postBuildHookScript>
            <localRepositoryPath>${project.build.directory}/local-repo</localRepositoryPath>
            <settingsFile>src/it/settings.xml</settingsFile>
            <goals>
                <goal>clean</goal>
                <goal>test-compile</goal>
            </goals>
        </configuration>
        <executions>
            <execution>
                <id>integration-test</id>
                <goals>
                    <goal>install</goal>
                    <goal>integration-test</goal>
                    <goal>verify</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
</plugins>                 
Run Code Online (Sandbox Code Playgroud)

它们之间的主要区别是什么?是否存在特定情况,其中一个应优先于其他集成测试?

Tun*_*aki 5

用例确实不同.您可以将其maven-invoker-plugin视为Failsafe插件的特定子集,旨在用于测试您的自定义Maven插件,尽管它的用法可以更广泛.

故障安全插件

maven-failsafe-pluginmaven-surefire-plugin(实际上它们都在surefire项目下)并驾齐驱:它用于在Java代码中编写测试.Surefire和Failsafe插件之间的区别在于第一个用于编写单元测试,而另一个用于编写集成测试.

与单元测试相反,集成测试是需要存在环境的测试.环境是一个很大的术语,但它包含了测试运行所需的所有其他工具.例如,如果要根据Web服务器或数据库的存在来运行应用程序的测试,则通常是集成测试.

Maven default通过具有特定阶段在生命周期中集成此定义,以便设置测试所需的环境,运行测试并破坏环境:

Maven生命周期有四个阶段用于运行集成测试:

  • pre-integration-test 用于设置集成测试环境.
  • integration-test 用于运行集成测试.
  • post-integration-test 用于拆除集成测试环境.
  • verify 用于检查集成测试的结果.

一个例子是设置和启动Web服务器pre-integration-test,测试HTTP调用integration-test并最终停止Web服务器post-integration-test.

请注意,在这种情况下,集成测试是用Java编写的,并且位于内部src/test/java.有一个命名约定,以区别于单元测试.所以,你正在编写测试代码.

Invoker插件

你是对的,它的主要用例不是用于运行集成测试.它的设计是为了在构建期间调用其他Maven项目.当您想要针对其他Maven项目运行测试时,该特定用例非常有用.

这个插件特别方便执行其他Maven插件的集成测试.Invoker插件可用于运行一组测试项目,这些测试项目旨在断言被测插件的某些功能.

假设您正在开发一个Maven插件,并且您想测试它的行为是否正确.您可以使用Surefire插件编写测试来执行其功能的基本测试,即不需要整体运行插件的功能.

您甚至可以使用Failsafe插件编写集成测试,这将是针对Maven测试项目执行插件的完整运行并检查其输出的测试.但这很快就会变得很麻烦:使用自定义Maven插件在磁盘上创建Maven项目会更容易,让Invoker插件调用这个项目.然后,您可以测试运行是否正常.

总的来说,要测试你的Maven插件,你甚至不需要编写任何Java代码:你可以在目录中使用你的插件创建测试Maven项目,让Invoker插件调用它,并使用一个来验证事情是否正确用BeanShell或Groovy编写的post build脚本.那些是集成测试,因为它们需要一个环境来运行(主要是Maven本身),但你并没有真正编写它们.

这可能是Eclipse为您生成的原因:您创建了一个包装的Maven项目maven-plugin,因此它会引导您使用Invoker插件进行测试.