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

标签 maven tomcat junit maven-2 tomcat7

我有提供网络服务的 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 (哦,看,它更短更容易打字......奖金)

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

  • 绑定(bind) tomcat7:runpre-integration-test相与 fork =true
  • 绑定(bind) failsafe:integration-testintegration-test
  • 绑定(bind) tomcat7:shutdownpost-integration-test
  • 绑定(bind)故障安全:验证到 verify阶段。

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

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

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

  • 学校 2 - 单独的模块

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

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

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

  • 缺点
  • war神器只有在您通过 package 时才会重建因此,您至少需要运行 mvn clean package在使用 IDE 时定期刷新被测代码。
  • 集成测试的失败不会破坏 war 的构建模块,所以你最终可以释放一个损坏的 war Artifact ,然后使集成测试模块的 react 器构建失败。有些人通过在 src/it 中加入集成测试模块来解决这个问题。并使用 Maven Invoker Plugin 来运行测试......尽管这提供了较差的 IDE 集成,所以我不推荐该行。
  • 很难从 Maven 获得综合的测试覆盖率报告。
  • 必须在测试用例中自己编写容器启动/停止的代码。

  • School 2.5 - Failsafe 测试用例启动他们自己的 Tomcat7 服务器

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

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

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

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


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

    关于Maven - 在 JUnit 测试之前将 webapp 部署到 tomcat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16935290/

    相关文章:

    eclipse - Tomcat STDOUT 在 Eclipse 中作为错误

    java - JUnit 测试具有多个(不同)参数的预期异常

    eclipse - JUnit 中的编码 : Gradle vs Eclipse

    google-app-engine - App Engine + 模块 + Maven 的开发工作流程

    maven - 如何将包发布到 GitHub 包存储库?

    java - 为 Tomcat 定制 WAR 部署

    maven - 色相由于缺少Thrift类而无法构建。

    java - WAR 文件给我内存不足错误

    java - 在外部 Tomcat 容器中加载文件与 Bootrun

    android - JUnit,安卓 : What's a good level of detail in automated tests?