我有提供网络服务的 webapp。我想使用 SoapUI 执行 JUnit 测试以检查此服务是否正常工作。
但是要测试 Web 服务应用程序必须部署到我的 Tomcat 7 服务器。
我不知道如何配置 maven 来构建 war ,然后将它部署到 tomcat(理想情况下:为此运行单独的 tomcat 实例),然后运行 JUnit 测试。
我将不胜感激任何帮助。
我正在使用 Maven 2.2.1
最佳答案
关于如何使用 Maven 处理这种类型的集成测试,有许多流派。
我应该指出,当您将应用程序部署到应用程序服务器时,您不再处于单元测试领域。因为整个应用程序都部署在一个容器中,所以您正在测试这两个组件的集成。
现在使用 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
相与 fork
=true
integration-test
相post-integration-test
相verify
阶段。 对于额外的布朗尼积分,您可以使用 build-helper-maven-plugin:reserve-network-port绑定(bind)到
validate
阶段以确保测试服务器在未使用的网络端口上启动,然后对测试资源使用资源过滤将端口传递到测试或使用通过 systemPropertyVariables 传递的系统属性。使端口号可用于测试。好处
run-its
)。 缺点
IT
而 Maven 知道在 Test
开始/结束运行测试使用 Surefire 和运行测试开始/结束于 IT
使用 Failsafe,您的 IDE 可能不会。此外,您的 IDE 不会为您启动容器,因此您必须手动执行大量工作才能实际手动运行测试。 mvnDebug -Dmaven.failsafe.debug=true verify
学校 2 - 单独的模块
这种思想流派将集成测试移到一个单独的模块中,该模块依赖于
war
模块并复制 war
使用例如进入测试资源 dependency:copy-dependencies
绑定(bind)到 generate-test-resources
阶段加上 Tomcat7 依赖项进行测试。测试用例本身使用 embedded mode 启动 Tomcat7 容器
好处
缺点
war
神器只有在您通过 package
时才会重建因此,您至少需要运行 mvn clean package
在使用 IDE 时定期刷新被测代码。 war
的构建模块,所以你最终可以释放一个损坏的 war
Artifact ,然后使集成测试模块的 react 器构建失败。有些人通过在 src/it
中加入集成测试模块来解决这个问题。并使用 Maven Invoker Plugin 来运行测试......尽管这提供了较差的 IDE 集成,所以我不推荐该行。 School 2.5 - Failsafe 测试用例启动他们自己的 Tomcat7 服务器
这是两种方法的一种混合。
您使用 Failsafe 来执行测试,但测试本身负责启动和停止您要测试的 Tomcat7 容器。
好处
缺点
我希望以上内容可以帮助您了解您拥有的选项。可能还有其他调整,但总的来说,以上被认为是目前与 Maven 集成测试的最佳实践。
关于Maven - 在 JUnit 测试之前将 webapp 部署到 tomcat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16935290/