一尘不染

Maven-在JUnit测试之前将WebApp部署到tomcat

tomcat

我有提供网络服务的webapp。我想用SoapUI执行JUnit测试,以检查此服务是否正常运行。
但是要测试Web服务应用程序,必须将其部署到我的Tomcat 7服务器上。

我不知道如何配置Maven进行战争,然后将其部署到tomcat(理想情况是:为此运行单独的tomcat实例),然后运行JUnit测试。
我将不胜感激。

我正在使用Maven 2.2.1


阅读 355

收藏
2020-06-16

共1个答案

一尘不染

关于如何使用Maven 处理这种类型的 集成测试 ,有很多想法。

我应该指出,当您将应用程序部署到应用程序服务器时,您不再处于单元测试的领域。由于整个应用程序都部署在容器中,因此您正在测试这两个组件的集成。

现在,使用JUnit运行 集成测试 没有什么问题(尽管您可能会遇到一些限制,例如, 单元测试 不应该考虑单个测试的顺序-
假设您编写正确,所以JUnit 不会 强制执行 此操作保证执行的任何顺序…在Java
1.7之前,执行顺序是由类中的测试方法的顺序意外暗示的,但是它不是JUnit合同的一部分…有些人转向其他测试框架来进行 集成
测试,例如TestNG,如果他们发现JUnit 的 单元测试重点 正在阻碍他们的测试开发)

要记住的关键点是,Maven生命周期使用test阶段来执行 单元 测试。

关于 集成 测试,关于使用Maven处理测试的正确方法,有两种(半)思想流派。

学校1-故障安全和 integration-test/verify

这个想法使用了以下阶段package来启动容器,运行集成测试,拆除容器,最后检查测试结果并在测试失败的情况下使构建失败。

再也离不开你mvn integration-test因为不会正确地推倒容器,你觉得你想输入的任何时候mvn integration- test你真的想类型mvn verify(哦,看,这是短,也更容易输入…奖金)

因此,您可以执行以下操作:

对于额外的布朗尼点,您可以使用绑定到该阶段的build-helper-maven-plugin:reserve-network-
port
validate以确保测试服务器在未使用的网络端口上启动,然后对测试资源使用资源过滤以通过测试移植到测试,或使用通过systemPropertyVariables传递的系统属性使端口号可用于测试。

优点

  • 清理Maven版本
  • 如果测试失败,则无法发布项目
  • run-its如果测试太慢而无法运行每个构建,则可以将集成测试移到单独的配置文件中(按惯例称为)。

缺点

  • 很难从IDE运行测试。所有集成测试都开始/结束IT,而Maven知道运行从TestSurefire开始/结束的测试以及IT以Failsafe 开始/结束的测试,而您的IDE可能没有。另外,您的IDE不会为您启动容器,因此您必须手动进行大量工作才能真正手动运行测试。
  • 调试测试可能需要附加两个调试器,例如,一个调试器用于调试在容器中运行的应用程序,另一个调试器用于调试测试用例

    mvnDebug -Dmaven.failsafe.debug=true verify
    
  • 将您的测试耦合到Maven构建过程。

学校2-独立模块

这种思路将集成测试移到依赖于该war模块的单独模块中,并war使用(例如,dependency:copy- dependencies绑定到generate-test- resources与要测试的Tomcat7依赖项耦合的阶段)将集成测试复制到测试资源中。

测试用例本身使用嵌入式模式启动Tomcat7容器

优点

  • 测试可以在IDE中运行
  • 集成测试与单元测试分开,因此要求IDE运行所有测试不会启动较慢的测试

缺点

  • war,如果你走过去的神器只是重建package阶段,因此,你需要至少运行mvn clean package定期使用IDE时刷新被测代码。
  • 集成测试的失败不会破坏war模块的构建,因此您最终可能会释放出损坏的war工件,然后使集成测试模块的反应堆构建失败。有些人通过在其中包含集成测试模块src/it并使用Maven Invoker插件来运行测试来解决此问题,尽管这提供了较差的IDE集成,所以我不建议这样做。
  • 很难从Maven获得合并的测试覆盖率报告。
  • 必须在测试用例中编写容器的启动/停止代码。

School 2.5-使用测试案例启动他们自己的Tomcat7服务器的故障保护

这是两种方法的一种混合。

您使用Failsafe执行测试,但是测试本身负责启动和停止要测试的Tomcat7容器。

优点

  • 不必在Maven pom中配置服务器启动/停止
  • IDE可以安全地运行所有测试(尽管集成测试可能会比较慢,并且您可能不希望运行它们,但是除非测试失败,否则它们不会全部失败)
  • 更容易从IDE调试测试(只需附加一个进程,IDE通常通过提供特殊的测试运行程序使调试调试容易)

缺点

  • 必须对容器进行编码,以便在测试用例中自行启动/停止

希望以上内容可以帮助您了解所拥有的选项。可能还有其他调整,但总体上,以上内容被认为是目前与Maven进行集成测试的最佳实践。

2020-06-16