7

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

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

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

  • 项目A的setup方法被调用
  • 执行项目 A 的测试
  • 项目 A 的清理方法被调用
  • 项目B也一样

但顺序是:

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

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

如何解决此问题以获得预期的序列?


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

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

但是,如果我为项目根(包含子项目的聚合)运行任务测试,我希望分叉的 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。

编辑我用示例构建创建了一个要点。

EDIT2文档中它说:

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

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

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

4

3 回答 3

8

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

parallelExecution in ThisBuild := false

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

parallelExecution in Global := false

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

于 2013-09-23T18:15:33.863 回答
5

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

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

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

请参阅: SBT 手册中的并行执行

于 2015-12-22T01:26:22.413 回答
2

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

test in Project2 := (test in Project2).dependsOn(test in Project1).value
parallelExecution in Test in Project2 := false
于 2014-12-29T14:29:59.910 回答