如何按顺序运行规范

Jer*_*iho 27 scala specs2

我想创建几个与数据库互操作的规范.

class DocumentSpec extends mutable.Specification with BeforeAfterExample {
  sequential

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

  // examples
  // ...
}
Run Code Online (Sandbox Code Playgroud)

在每个示例之前和之后(按顺序执行)创建和删除数据库.Everithing按预期工作,直到只有一个规范适用于数据库.由于规范是并行执行的,因此会干扰和失败.

我希望我能够通过指示specs2顺序运行具有副作用的测试同时保持副作用免费测试并行运行来避免这种情况.可能吗?

Rég*_*les 36

我想你在使用SBT?如果是这样,请查看文档:http://www.scala-sbt.org/release/docs/Detailed-Topics/Parallel-Execution

相关的SBT设置是parallelExecution.将其添加到项目定义中:

parallelExecution in Test := false
Run Code Online (Sandbox Code Playgroud)

  • 是的,我正在使用SBT.但是在构建脚本中指定测试套件的设置并不自然.此外,"parallelExecution in Test:= false"确保所有测试按顺序运行,同时我需要"按顺序运行带有副作用的测试,同时保持副作用免费测试并行运行".也许为每个db测试使用单独的db将是一个解决方案. (2认同)
  • 或者更简单,将测试放在一个不同的项目中,并仅为此项目重新定义`parallelExecution`. (2认同)

Iva*_*tyk 36

如果要在规范2中依次运行单个规范,只需sequential在规范的开头添加方法调用.例如:

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
    }
  }
} 
Run Code Online (Sandbox Code Playgroud)

更新:正如评论中正确提到的@jsears,这将使测试按顺序在单个规范中运行!其他规格可能仍然并行运行.

  • 你知道,在我的工作场所,我们仍然*不确定这实际上按顺序运行测试,或者它是否甚至阻止它们并行运行. (7认同)

pme*_*pme 7

同时有一个更好的解决方案(http://www.scala-sbt.org/release/docs/Parallel-Execution.html):

sbt 0.12.0 引入了一种通用基础结构,用于限制超出通常排序声明的任务并发。

此配置将按顺序运行所有测试,如果它们在子项目中也是如此:

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

我还没有测试这是否可以被每个子项目覆盖,所以子项目可以并行运行它的测试。