【发布时间】:2013-09-24 13:27:09
【问题描述】:
EDIT4 水平线下方的大部分文字与真正的问题没有任何关系。一开始我认为分叉是问题所在,但事实并非如此。
我正在尝试运行聚合子项目的所有测试。在子项目中的所有测试之前应该运行一个设置方法,在子项目中的测试之后应该运行一个清理方法。
在为聚合项目运行测试任务时,我期望以下顺序
- 项目A的setup方法被调用
- 已执行项目 A 的测试
- 项目 A 的清理方法被调用
- 项目 B 也是如此
但是顺序是:
- 项目 A 和 B 的设置方法被调用
- 已执行项目 A 的测试
- 已执行项目 B 的测试
- 项目 A 和 B 的清理方法被调用
可以在here 找到具有此行为的构建脚本。
如何解决这个问题以获得我的预期序列?
我正在使用分叉在我的子项目中运行测试。 对于每个子项目,mongo db 在测试之前启动并停止 测试后。
一个项目中的测试按顺序运行;如果我为单个项目运行测试,这很有效。
但如果我为项目根(包含子项目的聚合)运行任务 test, 我希望按顺序启动分叉的 jvm,即
- 项目 A 的 jvm 已分叉并执行其测试
- 项目 B 的 jvm 已分叉并执行其测试
- ...
但看起来 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 看起来分叉不是问题。问题是所有子项目都会立即调用设置方法。
【问题讨论】:
-
为什么项目必须按顺序进行测试?是不是因为只有一个 mongodb 资源,这会阻止它们被并行使用(命名空间冲突、资源锁或其他什么)?
-
是的,你不能为 mongo 实例使用相同的端口。
-
是否有必要将mongo测试分散到多个子项目中?
-
是的,有必要。