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

时间:2016-10-13 01:11:43

标签: maven integration-testing maven-plugin maven-failsafe-plugin maven-invoker-plugin

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

唯一的区别是我可以看到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>                 

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

1 个答案:

答案 0 :(得分:5)

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

故障安全插件

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

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

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

  

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

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

示例是在pre-integration-test中设置和启动Web服务器,测试integration-test中的HTTP调用,最后在post-integration-test中停止Web服务器。

请注意,在这种情况下,集成测试是用Java编写的,并且位于src/test/java内。有a naming convention可以将它们与单元测试区分开来。所以,你正在编写测试代码。

Invoker插件

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

  

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

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

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

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

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