2013-04-01 127 views
13

考虑下面的测试套件:运行ScalaTest测试并行

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") 
    } 

} 

我怎么能并行(通过SBT)运行测试?理想情况下,我想执行的顺序产生在stdout以下几点:

before 
1a 
2a 
2b 
1b 
after 

回答

18

使用ParallelTestExecution-P命令行参数的Runner,使他们并行运行:

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

注意-P是必需的。从来源:

如果您在命令行上-PRunnerDistributorSuite是你与-s指定通过。 Runner将设置 上一个线程池执行任何Suite s并行传递给Distributorput方法。

它也将在隔离运行测试,所以beforeafter将在每个线程中运行。有关ParallelTestExecutionRunner的文档,请参阅更多内容。

在SBT,使用该标志,将它添加到build.sbt

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

谢谢,这就是我一直在寻找。我希望在全部和全部运行之前,我可以每运行一次,但这足够接近。作为参考,我将此添加到我的* build.sbt *:'testOptions in Test + = Tests.Argument(“ - P”)' – earldouglas

+0

非常有用,谢谢 - 补充说,答案。 –

+0

任何想法如何使用'-c'选项来改变线程的数量? – earldouglas