【问题标题】:How to run subprojects tests (including setup methods) sequentially when testing测试时如何顺序运行子项目测试(包括设置方法)
【发布时间】:2013-09-24 13:27:09
【问题描述】:

EDIT4 水平线下方的大部分文字与真正的问题没有任何关系。一开始我认为分叉是问题所在,但事实并非如此。

我正在尝试运行聚合子项目的所有测试。在子项目中的所有测试之前应该运行一个设置方法,在子项目中的测试之后应该运行一个清理方法。

在为聚合项目运行测试任务时,我期望以下顺序

  • 项目A的setup方法被调用
  • 已执行项目 A 的测试
  • 项目 A 的清理方法被调用
  • 项目 B 也是如此

但是顺序是:

  • 项目 A 和 B 的设置方法被调用
  • 已执行项目 A 的测试
  • 已执行项目 B 的测试
  • 项目 A 和 B 的清理方法被调用

可以在here 找到具有此行为的构建脚本。

如何解决这个问题以获得我的预期序列?


我正在使用分叉在我的子项目中运行测试。 对于每个子项目,mongo db 在测试之前启动并停止 测试后。

一个项目中的测试按顺序运行;如果我为单个项目运行测试,这很有效。

但如果我为项目根(包含子项目的聚合)运行任务 test, 我希望按顺序启动分叉的 jvm,即

  1. 项目 A 的 jvm 已分叉并执行其测试
  2. 项目 B 的 jvm 已分叉并执行其测试
  3. ...

但看起来 jvm 是并行启动的;这不是我想要的。

我尝试了以下方法(根据文档,它应该已经设置为 1):

  concurrentRestrictions in Test := Seq(
    Tags.limit(Tags.ForkedTestGroup, 1)
  )

但它没有用。直接启动测试任务后,如下 从我的设置方法打印(在打印任何测试日志之前):

startupDb, thread name = pool-4-thread-5 
startupDb, thread name = pool-4-thread-7 
startupDb, thread name = pool-4-thread-2 
startupDb, thread name = pool-4-thread-6 
startupDb, thread name = pool-4-thread-8
startupDb, thread name = pool-4-thread-3 
startupDb, thread name = pool-4-thread-9

这些是我的测试相关设置:

parallelExecution in Test := false,
testOptions in Test += Tests.Setup( () => MongoTest.startupDb() ),
testOptions in Test += Tests.Cleanup( () => MongoTest.shutdownDb() ),
fork in Test := true,
concurrentRestrictions in Test := Seq(
  Tags.limit(Tags.ForkedTestGroup, 1)
)

使用分叉对我来说很重要,但方式如上所述。

我在 Windows 7 上使用 sbt 0.13.0。

编辑我用sample build 创建了一个要点。

EDIT2在documentation 中写道:

通过设置Tags.ForkedTestGroup标签的限制来控制允许同时运行的fork JVM数量,默认为1

所以理论上这应该可行。 这是一个错误吗?如果没有,我该如何做到这一点?

EDIT3 看起来分叉不是问题。问题是所有子项目都会立即调用设置方法。

【问题讨论】:

标签: scala sbt


【解决方案1】:

嗯。琐碎的答案转换为评论。听起来您在问在另一个问题中已解决的相同问题(请参阅 cmets)。答案似乎是

parallelExecution in ThisBuild := false

我发现另一篇建议的博客文章

parallelExecution in Global := false

作为答案。 “全局”答案还建议关闭并行执行,例如编译,但这可能不如运行测试重要。

【讨论】:

【解决方案2】:

从 sbt 0.12 开始,您可以使用此设置使所有子项目中的所有测试任务串行运行:

concurrentRestrictions in Global += Tags.limit(Tags.Test, 1)

(Tags.Test 是所有测试任务的内置语义标签)。

请参阅:SBT 手册中的Parallel-Execution。

【讨论】:

    【解决方案3】:

    还有另一种方法可以防止并行执行。您可以使不同项目的测试任务相互依赖:

    test in Project2 := (test in Project2).dependsOn(test in Project1).value
    parallelExecution in Test in Project2 := false
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      相关资源
      最近更新 更多