2013-04-03 14 views
10

Sto lavorando con alcune classi che (per qualche motivo) possono essere utilizzate solo una volta all'interno di una singola VM. I miei test case funzionano se li eseguo individualmente (fork := true) nelle mie impostazioni sbt.Come eseguire il fork del jvm per ogni test in sbt

Se eseguo più di uno di questi test, falliscono con un'eccezione che deve essere eseguita da un executor thread che rifiuta un'attività (è molto probabile che sia chiusa). Sarebbe molto dispendioso in termini di tempo per scoprire quali sono le cause del problema e anche se trovo il problema, potrei non essere in grado di risolverlo (non ho accesso al codice sorgente).

Attualmente sto usando il framework di test specs2, ma qualsiasi framework di test che utilizza sbt sarebbe accettabile.

C'è qualche framework di test per sbt che è in grado di eseguire ogni test in una forcella jvm?

Pensieri o idee su possibili altre soluzioni sono ovviamente benvenute.

risposta

7

Si scopre che questo è abbastanza facile da raggiungere. La documentazione è sufficiente e può essere trovato alla Testing - Forking tests

// Define a method to group tests, in my case a single test per group 
def singleTests(tests: Seq[TestDefinition]) = 
    tests map { test => 
    new Group(
     name = test.name, 
     tests = Seq(test), 
     runPolicy = SubProcess(javaOptions = Seq.empty[String])) 
    } 

// Add the following to the `Project` settings 
testGrouping in Test <<= definedTests in Test map singleTests 
+0

quale versione di SBT fa questo lavoro su? Sto usando 0.13.1 e non sto avendo fortuna. Il mio caso d'uso è che sto eseguendo un'applicazione play2 e ho alcuni oggetti complementari che voglio inizializzare con i dati di configurazione su ogni vm run (ogni test) e sicuramente non lo fanno con questa soluzione. Grazie! – Jordan

+0

Penso che sbt 0.12, il collegamento indica comunque una versione più recente. – EECOLOR

+2

Ah, sembra che nella mia versione di sbt sia necessario eseguire 'testGrouping in Test << ....' – Jordan

1

Utilizzando la sintassi non deprecato:

testGrouping in Test := (definedTests in Test).value map { test => 
    Tests.Group(name = test.name, tests = Seq(test), runPolicy = Tests.SubProcess(
    ForkOptions(
     javaHome.value, 
     outputStrategy.value, 
     Nil, 
     Some(baseDirectory.value), 
     javaOptions.value, 
     connectInput.value, 
     envVars.value 
    ))) 
} 
Problemi correlati