我有提供网络服务的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的东西(哦,看,它也更短更容易输入...奖励)

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

  • tomcat7:run pre-integration-test 绑定(bind)到fork阶段=true
  • failsafe:integration-test绑定(bind)到integration-test阶段
  • tomcat7:shutdown绑定(bind)到post-integration-test阶段
  • 绑定(bind)故障安全:验证到verify阶段。

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

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

  • 缺点
  • 很难从IDE运行测试。所有集成测试都以IT开始/结束,而Maven知道使用Surefire运行以Test开始/结束的测试以及使用Failsafe运行以IT开始/结束的测试,但您的IDE可能不会。此外,您的IDE不会为您启动容器,因此您必须手动进行大量工作才能真正实际运行测试。
  • 调试测试可能需要附加两个调试器,例如一个用于调试在容器中运行的应用程序,另一个用于debug the test cases
    mvnDebug -Dmaven.failsafe.debug=true verify
    
  • 将您的测试耦合到Maven构建过程。

  • 学校2-独立模块

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

    测试用例本身使用embedded mode启动Tomcat7容器

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

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

  • School 2.5-故障保护,测试用例启动自己的Tomcat7服务器

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

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

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

  • 缺点
  • 必须在测试用例中编写容器的启动/停止代码


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

    10-06 14:01
    查看更多