使用Web服务器运行集成测试的最佳方法是什么?

Mir*_*cea 4 java testing junit jetty gradle

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

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

  1. 如果您使用像Maven或Gradle这样的构建工具,则可以在*.pom*.gradle文件中执行此操作.

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

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

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

jes*_*ell 5

我们在码头本身的几乎所有测试都做#2.创建嵌入式服务器并部署应用程序,servlet或其他任何内容都非常容易.这使您能够运行自动化测试,而且还可以在IDE中简单地调试应用程序,而无需使用ide的所有工具开销.因此,从Jetty的角度来看,我们是创建测试套件以及在该测试中根据需要启动和停止服务器的忠实粉丝.我们有测试案例,我们在它们之间启动多个服务器并测试会话到期,其他我们启动服务器并使用我们的异步jetty-client抛出10k客户端连接.只需运行一个完整的jetty版本就会启动并停止数百个jetty服务器实例.

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