2013-02-28 14 views
18

Desidero creare alcune specifiche che interagiscono con il database.Come eseguire le specifiche in sequenza

class DocumentSpec extends mutable.Specification with BeforeAfterExample { 
    sequential 

    def before() = {createDB()} 
    def after() = {dropDB()} 

    // examples 
    // ... 
} 

Il database viene creato e rilasciato prima e dopo ogni esempio (che viene eseguito in sequenza). Everithing funziona come previsto finché non esiste una sola specifica che funzioni con il database. Poiché le specifiche sono eseguite in parallelo, interferiscono e falliscono.

Spero di essere in grado di evitarlo istruendo le specifiche2 per eseguire i test con gli effetti collaterali sequenzialmente mantenendo i test senza effetti collaterali da eseguire in parallelo. È possibile?

risposta

29

Suppongo che stia usando SBT? In tal caso, consultare la documentazione: http://www.scala-sbt.org/release/docs/Detailed-Topics/Parallel-Execution

La relativa impostazione SBT è parallelExecution. Aggiungi questo alla tua definizione del progetto:

parallelExecution in Test := false 
+2

Sì, sto usando SBT. Ma non è naturale specificare le impostazioni della suite di test all'interno dello script di costruzione. Inoltre, "parallelExecution in Test: = false" garantisce che tutti i test vengano eseguiti in modo sequenziale mentre è necessario "eseguire i test con gli effetti collaterali sequenzialmente mantenendo i test senza effetti collaterali da eseguire in parallelo". Forse usare il db separato per ogni test db sarebbe una soluzione. – Jeriho

+2

O più semplice, metti i test in un progetto distinto e ridefinisci 'parallelExecution' solo per questo progetto. –

27

Se si desidera eseguire singola specifica in modo sequenziale specs2 basta aggiungere sequential chiamata di metodo, all'inizio della vostra specifica. Per esempio:

class MyTest extends Specification { 
    // Set sequential execution 
    sequential 

    // This tests will be executed sequentially 
    "my test" should { 
    "add numbers" in { 
     (1 + 1) should be equalTo 2 
    } 

    "multiply numbers" in { 
     (2 * 2) should be equalTo 4 
    } 
    } 
} 
+5

Sai, sul mio posto di lavoro, siamo * ancora * non sicuri che questo esegua effettivamente i test in ordine sequenziale, o addirittura impedisca loro di funzionare in parallelo. – 2rs2ts

+1

Strano ... Ha funzionato per me e per molte altre persone. Se riesci a trovare un esempio quando i test non vengono eseguiti in sequenza con questa chiamata di metodo, dovresti probabilmente segnalare un bug a spec2. –

+0

Lo fa. Guarda la risposta di Eric, il creatore di Specs2, https://stackoverflow.com/questions/8026866/parallel-execution-of-tests –

3

Intanto c'è una soluzione migliore (http://www.scala-sbt.org/release/docs/Parallel-Execution.html):

SBT 0.12.0 introduce un'infrastruttura generale per limitare la concorrenza compito al di là delle solite dichiarazioni di ordinazione.

Questa configurazione verranno eseguiti tutti i test sequenziale, anche se sono in sottoprogetti:

concurrentRestrictions in Global := Seq(
    Tags.limit(Tags.CPU, 2), 
    Tags.limit(Tags.Network, 10), 
    Tags.limit(Tags.Test, 1), 
    Tags.limitAll(15) 
) 

non ho testato se questo può essere sostituita da ogni sotto-progetto, in modo che il sotto-progetto può eseguire i suoi test in parallelo.

Problemi correlati