两者(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>
它们之间的主要区别是什么?是否存在特定情况,其中一个应优先于其他集成测试?
答案 0 :(得分:5)
用例确实不同。您可以将maven-invoker-plugin
视为Failsafe插件的特定子集,旨在用于测试您的自定义Maven插件,尽管它的用法可能更广泛。
maven-failsafe-plugin
与maven-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可以将它们与单元测试区分开来。所以,你正在编写测试代码。
你是对的,它的主要用例不是用于运行集成测试。它的设计是为了在构建期间调用其他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插件进行测试。