scala 如何按顺序运行规格

uqjltbpv  于 2022-12-04  发布在  Scala
关注(0)|答案(3)|浏览(130)

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

class DocumentSpec extends mutable.Specification with BeforeAfterExample {
  sequential

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

  // examples
  // ...
}

在每个示例(按顺序执行)之前和之后创建和删除数据库。在只有一个规范与数据库一起工作之前,所有事情都按预期工作。因为规范是并行执行的,所以它们会相互干扰并失败。
我希望我能够通过指示specs2顺序运行有副作用的测试,同时保持无副作用的测试并行运行来避免这种情况。

at0kjp5o

at0kjp5o1#

我想您正在使用SBT?如果是,请查看文档:http://www.scala-sbt.org/release/docs/Detailed-Topics/Parallel-Execution
相关的SBT设置为parallelExecution。将此设置添加到项目定义中:

Test / parallelExecution := false
cdmah0mi

cdmah0mi2#

如果你想连续运行specs 2中的一个Specification,只需在Specification的开头添加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
    }
  }
}

**更新:**正如在注解中正确提到的,这将使测试在一个 * 单一 * 规范中顺序运行!其他规范可能仍然并行运行。

bq9c1y66

bq9c1y663#

同时还有一个更好的解决方案(http://www.scala-sbt.org/release/docs/Parallel-Execution.html):
SBT0.12.0引入了用于限制超出通常排序声明的任务并发的通用基础结构。
此配置将按顺序运行所有测试,如果它们在子项目中也是如此:

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

我还没有测试是否可以被每个子项目覆盖,以便子项目可以并行运行其测试。

相关问题