我有一個運行嵌入式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實現。