2013-04-01 16 views
13

Dato il seguente suite di test:test Run ScalaTest in parallelo

class ParallelizeMe extends FunSuite with BeforeAndAfterAll { 

    override def beforeAll() = println("before")    
    override def afterAll() = println("after")    

    test("test 1") {           
    println("1a") 
    Thread.sleep(3000)          
    println("1b")           
    } 

    test("test 2") {           
    println("2a") 
    Thread.sleep(1000)          
    println("2b") 
    } 

} 

Come posso eseguire i test (tramite SBT) in parallelo? Idealmente, voglio l'ordine di esecuzione per produrre il seguente su stdout:

before 
1a 
2a 
2b 
1b 
after 

risposta

18

Usa ParallelTestExecution e un argomento -P riga di comando per la Runner per farli funzionare in parallelo:

import org.scalatest.{ParallelTestExecution, BeforeAndAfterAll, FunSuite} 
class ParallelizableSpec extends FunSuite with BeforeAndAfterAll with ParallelTestExecution { 
    ... 
} 

Si noti che -P è richiesto. Dalla fonte:

Se si include -P sulla riga di comando, Runner passerà un Distributor al Suite s specificata con -s. Runner imposta in un pool di thread per eseguire qualsiasi Suite s passato al metodo Distributor in parallelo.

Sarà anche eseguire i test in isolamento, così before e after verrà eseguito in ciascun filo. Vedi di più nei documenti per ParallelTestExecution e Runner.

In SBT, per usare la bandiera, aggiungere questo al build.sbt:

testOptions in Test += Tests.Argument("-P") 
+3

Grazie, questo è quello che stavo cercando. Vorrei poterlo fare prima di Tutti e dopo Tutti corriamo solo una volta ciascuno, ma questo è abbastanza vicino. Per riferimento, ho aggiunto questo al mio * build.sbt *: 'testOptions in Test + = Tests.Argument (" - P ")' – earldouglas

+0

Molto utile, grazie - ha aggiunto quello alla risposta. –

+0

Qualche idea su come usare l'opzione '-c' per cambiare il numero di thread? – earldouglas

Problemi correlati