如何在测试时按顺序运行子项目测试(包括设置方法)

Chr*_*ian 5 scala sbt

编辑4横向规则下面的大多数文本与真正的问题没有任何关系.一开始我觉得分叉是问题所在,但事实并非如此.

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

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

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

但顺序是:

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

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

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


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

一个项目内的测试按顺序进行; 如果我为一个项目运行测试,这很有效.

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

  1. 项目A的jvm是分叉的,并且它的测试被执行
  2. 项目B的jvm是分叉的并且它的测试被执行
  3. ...

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

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

  concurrentRestrictions in Test := Seq(
    Tags.limit(Tags.ForkedTestGroup, 1)
  )
Run Code Online (Sandbox Code Playgroud)

但它没有用.在启动测试任务后,直接从我的安装方法打印以下内容(在打印任何测试日志之前):

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
Run Code Online (Sandbox Code Playgroud)

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

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)
)
Run Code Online (Sandbox Code Playgroud)

使用分叉对我来说很重要,但是如上所述.

我在Windows 7上使用sbt 0.13.0.

编辑我创建了一个带有示例构建的要点.

EDIT2文档中说:

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

所以这应该在理论上有效.这是一个错误吗?如果没有,我怎么能设法做到这一点?

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

小智 8

嗯.琐碎的答案转换为评论.听起来你问的是在另一个问题中得到解决的同一个问题(见评论).答案似乎是

parallelExecution in ThisBuild := false
Run Code Online (Sandbox Code Playgroud)

我找到了另一篇建议的博文

parallelExecution in Global := false
Run Code Online (Sandbox Code Playgroud)

是答案."全局"答案还表明,会关闭编译等并行执行,但这可能不如运行测试重要.


Tod*_*wen 5

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

concurrentRestrictions in Global += Tags.limit(Tags.Test, 1)
Run Code Online (Sandbox Code Playgroud)

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

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