我有一个使用嵌入式 Jetty 运行的 Scalatra Web 服务。我现在想编写以下集成测试:
- 启动服务(使用应用程序的main方法)
- 运行测试(驱动 HTTP 接口)
- 停止服务。
这都应该由 SBT 命令触发。
我该怎么办?
我有一个使用嵌入式 Jetty 运行的 Scalatra Web 服务。我现在想编写以下集成测试:
这都应该由 SBT 命令触发。
我该怎么办?
您可以在 Specs 等 BDD 测试框架之上编写此类集成测试。未经过滤的项目有许多这样的示例,它们应该适用于其他 Web 框架,例如 Scalatra。
例如,看看ServerSpec:
"A Server" should {
"respond to requests" in {
http(host as_str) must_== "test"
}
....
}
它正在启动中指定的测试服务器setup
并使用规范中的 Dispatch 来访问它。关键部分在unfiltered.spec.jetty.Served
trait中实现,它执行您描述的操作:启动和停止服务。还有 Specs2 版本:unfiltered.specs2.jetty.Served
.
您可以使用的另一个技巧是sbt-revolver,这是我在进行任何 Web 开发时最喜欢的插件,尤其是与 JRebel 结合使用。这个插件可以在后台加载你的网络服务器。我没有一起尝试过测试,但是如果您在测试期间不必更改服务器端,它可以工作。
Scalatra 提供了一个 DSL 来编写测试。支持specs2和scalatest。
默认情况下,嵌入式 Jetty 将用于测试。如果你想提供自己的服务器,你可以重用EmbeddedJettyContainer
实现和覆盖start
,stop
和servletContextHandler
。
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实现。