我有一个运行嵌入式Jetty的Scalatra Web服务。我现在想写集成测试:在SBT中启动Scala应用程序进行集成测试
- 启动服务(使用应用程序的主要方法)
- 运行测试(驱动HTTP接口)
- 停止服务。
这应该全部由SBT命令触发。
我应该怎么办?
我有一个运行嵌入式Jetty的Scalatra Web服务。我现在想写集成测试:在SBT中启动Scala应用程序进行集成测试
这应该全部由SBT命令触发。
我应该怎么办?
您可以在规范等BDD测试框架之上编写这样的集成测试。 Unfiltered项目有许多这样的例子,应该为Scalatra等其他Web框架工作。
例如,看一看ServerSpec:
"A Server" should {
"respond to requests" in {
http(host as_str) must_== "test"
}
....
}
它开始了在setup
指定的测试服务器,并在说明书中使用调度击中它。关键部分在unfiltered.spec.jetty.Served
trait中实现,您所描述的是:启动和停止服务。还有Specs2版本:unfiltered.specs2.jetty.Served
。
您可以使用的另一个技巧是sbt-revolver,这是我最喜欢的插件在进行任何web开发时,特别是与JRebel一起使用的。这个插件可以在后台加载你的web服务器。我还没有尝试过一起测试,但如果在测试过程中不需要更改服务器端,它可以工作。
Scalatra提供了一个DSL来编写测试。有支持specs2和scalatest。
By default嵌入式Jetty将用于测试。如果您想提供自己的服务器,则可以重新使用EmbeddedJettyContainer
实施并覆盖start
,stop
和servletContextHandler
。
start
将在执行测试之前被调用,它允许在需要时启动服务器。在测试后调用stop
。要使用addServlet(..)
添加您的servlet,需要使用servletContextHandler
。
这是从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实现。