如何按顺序运行规范

时间:2013-02-28 21:27:55

标签: scala specs2

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

class DocumentSpec extends mutable.Specification with BeforeAfterExample {
  sequential

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

  // examples
  // ...
}

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

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

3 个答案:

答案 0 :(得分:35)

我想你在使用SBT?如果是,请查看文档:{​​{3}}

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

parallelExecution in Test := false

答案 1 :(得分:30)

如果要在规范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
    }
  }
} 

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

答案 2 :(得分:3)

同时有一个更好的解决方案(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 )
)

我还没有测试过每个子项目是否可以覆盖它,因此子项目可以并行运行测试。