EDIT4 横向规则下面的大多数文字与真正的问题没有任何关系。一开始我觉得分叉是问题,但事实并非如此。
我正在尝试运行聚合子项目的所有测试。在子项目中的所有测试之前,应该运行设置方法,并且在子项目中的测试之后应该运行清理方法。
在为聚合项目运行测试任务时,我期望以下序列
但序列是:
可以找到具有此行为的构建脚本here。
如何解决此问题以获得预期的序列?
我正在使用分叉来运行子项目中的测试。 对于每个子项目,mongo db在测试之前启动并停止 经过测试。
一个项目内的测试按顺序进行;如果我为一个项目运行测试,这很有效。
但如果我为项目root(包含子项目的聚合)运行任务 test , 我希望分叉的jvms顺序启动,即
但看起来jvms是并行启动的;这不是我想要的。
我尝试了以下内容(根据文档,应该已经设置为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标记的限制来控制允许同时运行的分叉JVM的数量,默认为1
所以这应该在理论上有效。 这是一个错误吗?如果没有,我该怎么办?
EDIT3 看起来分叉不是问题。问题是为所有子项目立即调用设置方法。
答案 0 :(得分:8)
嗯。琐碎的答案转换为评论。听起来你问的是在另一个问题中得到解决的同一个问题(见评论)。答案似乎是
parallelExecution in ThisBuild := false
我找到另一篇建议的博客文章
parallelExecution in Global := false
成为答案。 “全局”的答案还表明,关闭编译之类的事情会关闭并行执行,但这可能不如运行测试重要。
答案 1 :(得分:3)
从sbt 0.12开始,您可以使用此设置连续运行所有子项目中的所有测试任务:
concurrentRestrictions in Global += Tags.limit(Tags.Test, 1)
(Tags.Test
是所有测试任务的内置语义标记。)
请参阅SBT手册中的Parallel-Execution。
答案 2 :(得分:1)
还有另一种方法可以阻止并行执行。您可以使不同项目的测试任务相互依赖:
test in Project2 := (test in Project2).dependsOn(test in Project1).value
parallelExecution in Test in Project2 := false