2013-08-18 8 views
5

Ich habe einen Scalatra- Webservice, der mit Embedded Jetty läuft. Ich würde jetzt gerne Integrationstests schreiben, die:Scala-Anwendung in SBT für Integrationstest starten

  • den Dienst starten (die Hauptmethode der Anwendung)
  • die Tests ausführen (Fahr der HTTP-Schnittstelle)
  • den Dienst beenden.

Dies sollte alles durch einen SBT-Befehl ausgelöst werden.

Wie soll ich vorgehen?

Antwort

2

Sie könnten solche Integrationstests auf BDD-Testframeworks wie Specs schreiben. Unfiltered Projekt hat viele solche Beispiele, die für andere Web-Frameworks wie Scalatra funktionieren sollten.

Nehmen wir zum Beispiel einen Blick auf ServerSpec:

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

Es beginnt in setup spezifiziert einen Testserver und es mit Versand in der Spezifikation zu treffen. Der Schlüsselteil ist in unfiltered.spec.jetty.Served trait implementiert, was Sie beschrieben haben: Starten und Stoppen des Dienstes. Es gibt auch Specs2 Version: unfiltered.specs2.jetty.Served.

Ein weiterer Trick, den Sie verwenden könnten, ist sbt-revolver, die mein Lieblings-Plugin bei jeder Web-Entwicklung, vor allem in Verbindung mit JRebel verwendet. Dieses Plugin kann Ihren Webserver im Hintergrund laden. Ich habe den Test nicht zusammen probiert, aber es könnte funktionieren, wenn Sie die Serverseite während des Tests nicht ändern müssen.

1

Scalatra bietet eine DSL zum Schreiben von Tests. Es gibt Unterstützung für specs2 und scalatest.

By default Ein eingebetteter Jetty wird zum Testen verwendet. Wenn Sie Ihren eigenen Server bereitstellen möchten, können Sie die Implementierung EmbeddedJettyContainer wiederverwenden und start, stop und servletContextHandler außer Kraft setzen.

start wird aufgerufen, bevor Sie die Tests ausführen, mit denen Sie Ihren Server bei Bedarf starten können. stop wird nach den Tests aufgerufen. servletContextHandler ist erforderlich, um Ihre Servlets mit addServlet(..) hinzuzufügen.

Dies ist aus der spec2 Integration:

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 { } 

Alternativ können Sie Ihre eigene Container Implementierung zur Verfügung stellen kann.