4

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

据我所知,这些是解决方案:

  1. 如果您使用 Maven 或 Gradle 之类的构建工具,则可以在*.pomor*.gradle文件中执行此操作。

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

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

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

2 回答 2

5

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

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

于 2013-05-16T13:06:35.777 回答
1

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

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

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

还有更多的东西,但这是一般的想法。

于 2013-05-16T15:28:27.963 回答