2013-08-18 3 views
5

У меня есть веб-сервис Scalatra, который работает со встроенным Jetty. Сейчас я хотел писать интеграционные тесты, которые:Запуск приложения Scala в SBT для теста интеграции

  • запустить службу (используя основной метод применения)
  • выполнения тестов (вождение интерфейс HTTP)
  • остановить службу.

Это должно быть вызвано командой SBT.

Как мне это сделать?

ответ

2

Вы можете написать такие интеграционные тесты поверх базовых тестов BDD, как Specs. Unfiltered В проекте есть много таких примеров, которые должны работать для других веб-фреймворков, таких как Scalatra.

Например, посмотрите на 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, который является моим любимым плагином при любом веб-разработке, особенно в сочетании с JRebel. Этот плагин может загрузить ваш веб-сервер в фоновом режиме. Я не пробовал тест вместе, но он может работать, если вам не нужно менять серверную сторону во время теста.

1

Scalatra предлагает DSL для написания тестов. Существует поддержка specs2 и scalatest.

By default встроенный Jetty будет использоваться для тестирования. Если вы хотите предоставить свой собственный сервер, вы можете повторно использовать реализацию и отменять start, stop и servletContextHandler.

start будет вызываться перед выполнением тестов, что позволяет при необходимости запускать ваш сервер. stop вызывается после испытаний. servletContextHandler требуется для добавления ваших сервлетов с использованием 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 реализации.

Смежные вопросы