我有提供网络服务的webapp。我想用SoapUI执行JUnit测试,以检查此服务是否正常运行。
但是要测试Web服务,必须将应用程序部署到我的Tomcat 7服务器上。
我不知道如何配置Maven进行 war ,然后将其部署到tomcat(理想情况是:为此运行单独的tomcat实例),然后运行JUnit测试。
我将不胜感激。
我正在使用Maven 2.2.1
最佳答案
关于如何使用Maven处理这种类型的集成测试,有很多想法。
我应该指出,当您将应用程序部署到应用程序服务器时,您不再处于单元测试的 Realm 。因为整个应用程序都部署在一个容器中,所以您正在测试这两个组件的集成。
现在,使用JUnit运行集成测试没有什么问题(尽管您可能会遇到一些限制,例如,单元测试不应该考虑单个测试的顺序-假设您编写正确,所以JUnit不会强制执行此操作保证执行的任何顺序...在Java 1.7之前,执行顺序是由类中的测试方法的顺序意外暗示的,但它不是JUnit契约(Contract)的一部分...有些人转向其他测试框架来进行集成测试,例如TestNG,如果他们发现JUnit的单元测试重点正在阻碍他们的测试开发)
要记住的关键点是,Maven生命周期使用test
阶段执行单元测试。
关于集成测试,关于使用Maven处理测试的正确方法,有两种(半)思想流派。
学校1-故障安全和integration-test/verify
这个思想流派使用package
之后的阶段来启动容器,运行集成测试,拆除容器,最后检查测试结果并在测试失败的情况下使构建失败。
永远不要运行mvn integration-test
,因为它不会在您每次想输入mvn integration-test
的时候真正地撕毁容器,而实际上您想输入mvn verify
的东西(哦,看,它也更短更容易输入...奖励)
因此,您可以执行以下操作:
pre-integration-test
绑定(bind)到fork
阶段=true
integration-test
阶段post-integration-test
阶段verify
阶段。 对于额外的布朗尼点,您可以使用绑定(bind)到
validate
阶段的build-helper-maven-plugin:reserve-network-port以确保测试服务器在未使用的网络端口上启动,然后针对测试资源使用资源过滤将端口传递给测试,或使用通过的系统属性通过systemPropertyVariables使端口号可用于测试。优点
run-its
)。 缺点
IT
开始/结束,而Maven知道使用Surefire运行以Test
开始/结束的测试以及使用Failsafe运行以IT
开始/结束的测试,但您的IDE可能不会。此外,您的IDE不会为您启动容器,因此您必须手动进行大量工作才能真正实际运行测试。 mvnDebug -Dmaven.failsafe.debug=true verify
学校2-独立模块
这种思想流派将集成测试移至依赖于
war
模块的单独模块中,并将war
复制到测试资源中,例如使用绑定(bind)到dependency:copy-dependencies
阶段的 generate-test-resources
加上要测试的Tomcat7依赖项。测试用例本身使用embedded mode启动Tomcat7容器
优点
缺点
war
阶段时才重建package
Artifact ,因此,在使用IDE时,您至少需要定期运行mvn clean package
来刷新测试中的代码。 war
模块的构建,因此您最终可能会释放损坏的war
Artifact ,然后使集成测试模块的反应堆构建失败。有人通过在src/it
中包含集成测试模块并使用Maven Invoker插件运行测试来解决此问题,尽管这样做提供的IDE集成效果较差,所以我不建议这样做。 School 2.5-故障保护,测试用例启动自己的Tomcat7服务器
这是两种方法的一种混合。
您使用Failsafe执行测试,但是测试本身负责启动和停止要测试的Tomcat7容器。
优点
缺点
希望以上内容可以帮助您了解所拥有的选项。可能还有其他调整,但总体而言,以上内容被认为是目前与Maven进行集成测试的最佳实践。