如何按顺序运行规格说明书

34
我希望创建一些与数据库相互操作的规范。
class DocumentSpec extends mutable.Specification with BeforeAfterExample {
  sequential

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

  // examples
  // ...
}

每个示例(按顺序执行)之前和之后都会创建和删除数据库。一切都如预期的那样工作,直到只有一个规范使用数据库。因为规范是并行执行的,它们会相互干扰并失败。
我希望通过指示specs2在保持无副作用测试并行运行的同时,按顺序运行具有副作用的测试来避免这种情况。这是可能的吗?
3个回答

45

4
是的,我正在使用SBT。但在构建脚本中指定测试套件的设置并不自然。此外,“parallelExecution in Test:= false”确保所有测试都按顺序运行,而我需要“以顺序方式运行具有副作用的测试,同时保持无副作用的测试并行运行”。也许为每个数据库测试使用单独的数据库是一个解决方案。 - Jeriho
2
或者更简单的方法是将这些测试放在一个独立的项目中,并仅为该项目重新定义“parallelExecution”。 - Régis Jean-Gilles

42

如果你想要按顺序运行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正确提到的那样,这将使测试在一个规范中顺序运行!其他规范仍然可以并行运行。

7
你知道,在我的工作场所,我们仍然不确定这个程序是否按顺序运行测试,或者它是否完全防止了并行运行。 - 2rs2ts
1
奇怪...它对我和许多其他人都有效。如果您能提供一个例子,说明在使用此方法调用时测试未按顺序执行,那么您应该向spec2报告错误。 - Ivan Mushketyk
是的。请参考 Specs2 的创建者 Eric 的回答,https://dev59.com/O2sz5IYBdhLWcg3wQFYq - Raymond Chenon
1
“sequential” 在单个规范中以串行方式运行示例。其他规范仍可以并行运行,因此如果您有其他具有共享固定装置的规范,则可能会并行进行。 - jsears
@jsears 没错。我会更新答案以反映这一点。 - Ivan Mushketyk

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 )
)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接