【问题标题】:How to run specifications sequentially如何按顺序运行规范
【发布时间】:2013-02-15 06:15:42
【问题描述】:

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

class DocumentSpec extends mutable.Specification with BeforeAfterExample {
  sequential

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

  // examples
  // ...
}

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

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

【问题讨论】:

    标签: scala specs2


    【解决方案1】:

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

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

    parallelExecution in Test := false
    

    【讨论】:

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

    如果您想在 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 在 cmets 中正确提到的,这将使测试在 single 规范中按顺序运行!其他规范可能仍会并行运行。

    【讨论】:

    • 您知道,在我的工作场所,我们仍然不确定这是否真的按顺序运行测试,或者它是否甚至阻止它们并行运行。
    • 奇怪...它对我和许多其他人都有效。如果你能想出一个例子,当你的测试没有通过这个方法调用按顺序执行时,你应该向 spec2 报告一个错误。
    • 确实如此。请参阅 Specs2 的创建者 Eric 的回复,stackoverflow.com/questions/8026866/parallel-execution-of-tests
    • "sequential" 在单个规范中串行运行示例。其他规范可能仍会并行运行,因此如果您有其他具有共享夹具的规范,您可能会看到这种情况并行发生。
    • @jsears 没错。我会更新答案以反映这一点。
    【解决方案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 )
    )
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-23
      • 1970-01-01
      相关资源
      最近更新 更多