【问题标题】:What is the best way to run integration tests using a web server?使用 Web 服务器运行集成测试的最佳方式是什么?
【发布时间】:2013-05-11 08:39:05
【问题描述】:

正如标题所说,考虑到您不想为每个特定测试启动/停止测试服务器,我对使用 Jetty Web 服务器测试应用程序的最佳方法感兴趣。

据我所知,解决方法如下:

  1. 如果您使用 Maven 或 Gradle 等构建工具,您可以在 *.pom*.gradle 文件中进行。

    • 这样做的缺点是您必须以与通常在应用程序中不同的方式创建测试服务器。
  2. 创建一个测试套件并使用@BeforeClass@AfterClass 注释在测试Suite 之前/之后启动/停止服务器。

    • 这里的缺点是指定要运行的测试的“丑陋”方式。您还必须指定添加到套件的测试,它不应该在套件之外运行(避免重复运行测试)。我认为 Junit 还没有完全做好这方面的准备。
  3. 在测试开始时以静态方式创建和启动服务器,并使用ShutDown 机制挂接到 JVM 并在所有测试完成后自动停止服务器。这似乎是最好的解决方案,因为这种机制已经在 J​​etty 中可用,但是

    • 缺点是您无法控制服务器的停止。它实际上是在一个完全不同的线程中完成的,甚至在构建工具之外(我为此使用 Gradle)

【问题讨论】:

    标签: java testing junit jetty gradle


    【解决方案1】:

    对于我们在码头本身的几乎所有测试,我们都做了 #2。创建嵌入式服务器并部署应用程序、servlet 或任何你喜欢的东西真的很容易。这不仅为您提供了运行自动化测试的能力,而且还提供了一种在 IDE 中简单地调试应用程序的方法,而无需 ide 的所有工具开销。因此,从 Jetty 的角度来看,我们非常喜欢创建您的测试套件以及在该测试中根据需要启动和停止服务器。我们有测试用例,我们在其中启动多个服务器并测试它们之间的会话到期时间,在其他情况下,我们启动一个服务器并使用我们的异步 jetty-client 对其进行 10k 客户端连接。只需运行一个完整的 jetty 构建,就可以启动和停止数百个 jetty 服务器实例。

    并非每个应用程序都可以这样连接,有些应用程序有外部数据库要求等,但即使这样,您也经常能够针对 derby 等内存数据库编写单元测试,这是划分测试的绝佳方法.如果您绝对需要一个运行测试的环境,那么许多人对 maven、jetty-maven-plugin 和 selenium 之类的东西的组合很幸运,但我通常将这些视为更多功能测试或验收测试场景,实际的单元测试应该是在junit测试的上下文中完成......至少是imo。

    【讨论】:

    • 如何指定要在套件中运行的测试?在套件上使用@SuiteClasses 注释,还是动态方法?此外,当您从 IDE 运行 junit 测试时,除了套件之外,实际测试也将再次运行。您如何忽略实际测试,以免再次运行?感谢您的回答!
    • 在 jetty 中,我们的测试只是简单地用 @Test 注释并遵循 FooTest.class 的命名约定,然后我们使用 maven surefire 插件在正常构建期间运行它们。在 Eclipse 等 IDE 中,您可以根据需要只运行单个测试,也可以运行测试目录。如果您有两次运行的测试,我会说这是 IDE 本身的配置问题。
    • 可能是我不够明确。当我说套件时,我指的是org.junit.runners.Suite。如果使用此注解创建测试,则必须指定 org.junit.runners.Suite.SuiteClasses 注解,其中包括要添加到 org.junit.runners.Suite 的测试类。只要指定的测试类只是普通的 junit4 测试类,它们就会运行,即使它们是从 maven 运行的。 Maven 不知道这些测试类是在 org.junit.runners.Suite 注释中定义的,并且也会由该 junit 运行器运行。
    • 所以我指的不是简单的 junit 测试类,它们内部有测试方法,可以用@Test 注释。我想有单独的junit测试类并将它们包装在org.junit.runners.Suite', in order to be able to start/stop jetty before/after the org.junit.runners.Suite`中。这样,您可以启动服务器一次,运行套件中的所有测试,然后停止服务器。此外,您可以运行其他套件。主要原因是整体测试的速度。启动/停止服务器,需要时间。
    • 哦,那么您可以执行他们在此处提到的操作:stackoverflow.com/questions/11762801/… 但实际上在每个类或每个测试实例上启动和停止码头并不耗时,尽管部署您的应用程序可能是按照你提到的方式去做更有意义。无论如何,只需将 Surefire 配置为仅运行套件,而不是 *Test 类。
    【解决方案2】:

    我们使用Build Pipeline Plugin 使用 Jenkins 构建管道。第一个工作开始构建并创建一个包含所有编译代码的工件,包括一个 WAR 文件和所有编译的测试代码。

    然后,启动下游作业,将 WAR 文件部署到实时 Tomcat 服务器。

    随后,我们有一项针对实时 Tomcat 服务器运行集成测试(从上游构建的测试工件中获取测试)的作业。

    除此之外还有更多,但这是大意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-16
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 2017-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多