2013-08-18 10 views
5

Possiedo un servizio Web Scalatra che viene eseguito con Jetty incorporato. Mi piacerebbe ora piace scrivere test di integrazione che:Avvio dell'applicazione Scala in SBT per test di integrazione

  • avviare il servizio (utilizzando il metodo principale dell'applicazione)
  • eseguire i test di guida (l'interfaccia HTTP)
  • arrestare il servizio.

Questo dovrebbe essere attivato da un comando SBT.

Come devo fare questo?

risposta

2

È possibile scrivere tali test di integrazione su framework di test BDD come Spec. Il progetto Unfiltered ha molti esempi che dovrebbero funzionare per altri framework Web come Scalatra.

Per esempio, dare un'occhiata a ServerSpec:

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

Sta iniziando un server di prova di cui setup e colpendolo con spedizione nella specifica. La parte chiave è implementata in unfiltered.spec.jetty.Served trait, come descritto: avvio e arresto del servizio. C'è anche la versione Specs2: unfiltered.specs2.jetty.Served.

Un altro trucco che è possibile utilizzare è sbt-revolver, che è il mio plug-in preferito durante lo sviluppo di un sito Web, utilizzato in particolare con JRebel. Questo plugin può caricare il tuo server web in background. Non ho provato il test insieme, ma potrebbe funzionare se non è necessario modificare il lato server durante il test.

1

Scalatra offre una DSL per scrivere test. È disponibile il supporto per specs2 e scalatest.

By default per il test verrà utilizzato un molo incorporato. Se si desidera fornire il proprio server, è possibile riutilizzare l'implementazione EmbeddedJettyContainer e sovrascrivere start, stop e servletContextHandler.

start verrà chiamato prima dell'esecuzione dei test, che consente di avviare il server se necessario. stop viene chiamato dopo i test. servletContextHandler è necessario per aggiungere i tuoi servlet usando addServlet(..).

Questo è dall'integrazione 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 { } 

In alternativa è possibile fornire il proprio Container implementazione.