5

我有一个使用嵌入式 Jetty 运行的 Scalatra Web 服务。我现在想编写以下集成测试:

  • 启动服务(使用应用程序的main方法)
  • 运行测试(驱动 HTTP 接口)
  • 停止服务。

这都应该由 SBT 命令触发。

我该怎么办?

4

2 回答 2

2

您可以在 Specs 等 BDD 测试框架之上编写此类集成测试。未经过滤的项目有许多这样的示例,它们应该适用于其他 Web 框架,例如 Scalatra。

例如,看看ServerSpec

"A Server" should {
  "respond to requests" in {
    http(host as_str) must_== "test"
  }
  ....
}

它正在启动中指定的测试服务器setup并使用规范中的 Dispatch 来访问它。关键部分在unfiltered.spec.jetty.Servedtrait中实现,它执行您描述的操作:启动和停止服务。还有 Specs2 版本:unfiltered.specs2.jetty.Served.

您可以使用的另一个技巧是sbt-revolver,这是我在进行任何 Web 开发时最喜欢的插件,尤其是与 JRebel 结合使用。这个插件可以在后台加载你的网络服务器。我没有一起尝试过测试,但是如果您在测试期间不必更改服务器端,它可以工作。

于 2013-08-18T22:07:45.780 回答
1

Scalatra 提供了一个 DSL 来编写测试。支持specs2scalatest

默认情况下,嵌入式 Jetty 将用于测试。如果你想提供自己的服务器,你可以重用EmbeddedJettyContainer实现和覆盖startstopservletContextHandler

start将在执行测试之前调用,这允许在需要时启动您的服务器。stop在测试后调用。servletContextHandler使用 .添加您的 servlet 是必需的addServlet(..)

这是来自 spec2 集成:

trait BaseScalatraSpec extends SpecificationStructure with FragmentsBuilder with ScalatraTests {
  override def map(fs: =>Fragments) = Step(start()) ^ super.map(fs) ^ Step(stop())
}

trait ScalatraTests extends EmbeddedJettyContainer with HttpComponentsClient { }

或者,您可以提供自己的Container实现。

于 2013-08-19T16:03:00.380 回答