EDIT4水平线下方的大部分文字与真正的问题没有任何关系。一开始我认为分叉是问题所在,但事实并非如此。
我正在尝试运行聚合子项目的所有测试。在子项目中的所有测试之前应该运行一个设置方法,在子项目中的测试之后应该运行一个清理方法。
在为聚合项目运行测试任务时,我期望以下序列
- 项目A的setup方法被调用
- 执行项目 A 的测试
- 项目 A 的清理方法被调用
- 项目B也一样
但顺序是:
- 项目 A 和 B 的 setup 方法被调用
- 执行项目 A 的测试
- 执行项目 B 的测试
- 项目 A 和 B 的清理方法被调用
可以在此处找到具有此行为的构建脚本。
如何解决此问题以获得预期的序列?
我正在使用分叉在我的子项目中运行测试。对于每个子项目,mongo db 在测试之前启动并在测试之后停止。
一个项目中的测试按顺序运行;如果我为单个项目运行测试,这很有效。
但是,如果我为项目根(包含子项目的聚合)运行任务测试,我希望分叉的 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。
编辑我用示例构建创建了一个要点。
EDIT2在文档中它说:
通过设置Tags.ForkedTestGroup标签的限制来控制允许同时运行的forked JVM的数量,默认为1
所以这在理论上应该是可行的。这是一个错误吗?如果没有,我怎么能做到这一点?
EDIT3看起来分叉不是问题。问题是所有子项目都会立即调用设置方法。