并行运行 ScalaTest 测试

Posted

技术标签:

【中文标题】并行运行 ScalaTest 测试【英文标题】:Run ScalaTest tests in parallel 【发布时间】:2013-03-23 01:44:41 【问题描述】:

给定以下测试套件:

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)?理想情况下,我希望执行顺序在标准输出上产生以下内容:

before
1a
2a
2b
1b
after

【问题讨论】:

【参考方案1】:

使用ParallelTestExecution-P 命令行参数到Runner 使它们并行运行:

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

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

如果你在命令行中包含-PRunner 将传递一个 Distributor 到您使用 -s 指定的 Suites。 Runner 将设置 建立一个线程池来执行任何传递给DistributorSuites put 方法并行。

它还将单独运行测试,因此beforeafter 将在每个线程中运行。在ParallelTestExecution 和Runner 的文档中查看更多信息。

在 SBT 中,要使用该标志,请将其添加到 build.sbt:

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

【讨论】:

谢谢,这就是我想要的。我希望我可以让 beforeAll 和 afterAll 各运行一次,但这已经足够接近了。作为参考,我将其添加到我的 build.sbt 中:testOptions in Test += Tests.Argument("-P") 知道如何使用-c 选项来更改线程数吗? 似乎没有帮助;我看到一次运行 8 个测试。 -PN 是否记录在某处? 在亚军页面上:artima.com/docs-scalatest-2.0.M2/org/scalatest/tools/… 仅供参考:使用 sbt 0.13 你不能使用 -P 选项。 sbt 会自动处理并行执行。

以上是关于并行运行 ScalaTest 测试的主要内容,如果未能解决你的问题,请参考以下文章

Scalatest - 并行套件

如何在ScalaTest中按顺序运行类中的测试?

如何使用 scalatest 运行 sbt 测试?我有一个错误:对象 scalatest 不是包 org 的成员

如何在 ScalaTest / SBT 中按顺序运行测试套件?

如何让测试在 Scalatest 中始终以相同的顺序运行?

如何使用 SBT Jenkins 插件运行特定测试以进行 ScalaTest 测试