32

我想创建一些与数据库互操作的规范。

class DocumentSpec extends mutable.Specification with BeforeAfterExample {
  sequential

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

  // examples
  // ...
}

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

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

4

3 回答 3

44

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

相关的 SBT 设置是parallelExecution。将此添加到您的项目定义中:

parallelExecution in Test := false
于 2013-02-28T21:38:33.493 回答
40

如果您想在 specs2 中按顺序运行单个规范,只需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 在评论中正确提到的那样,这将使测试在单个规范中按顺序运行!其他规范可能仍会并行运行。

于 2014-04-19T13:56:25.900 回答
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 )
)

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

于 2016-11-04T11:35:11.777 回答