我有一个多项目构建,其中包含子项目和父项目中的测试。构建被聚合,以便父项目运行子项目中的所有测试。
我对其进行了配置,以便在子项目和父项目中都没有并行执行测试,通过
parallelExecution in Test := false
但是,我有一种烦人的感觉,即跨多个项目的测试是并行运行的。在其中一个子项目的情况下,这是一个问题,因为它同时改变了测试数据库中的状态,导致测试失败。
关于如何在项目之间全局切换并行执行测试的任何想法?
我认为您可以使用 scope 跨项目应用设置ThisBuild
,例如
parallelExecution in ThisBuild := false
我不知道你是否可以将它与 scope 结合起来Test
,但这可能没有必要。
这在 1.1.0 中对我有用:
Test / parallelExecution := false
在此处查看我的答案如何在测试时按顺序运行子项目测试(包括设置方法)
还有另一种方法可以防止并行执行。您可以使不同项目的测试任务相互依赖:
test in Project2 := (test in Project2).dependsOn(test in Project1).value
parallelExecution in Test in Project2 := false
基于https://stackoverflow.com/a/27068019/1922026的另一种可能性是在根项目中定义命令别名:
.settings(addCommandAlias("test", ";s1/test;s2/test;s3/test"): _*)
其中 s1、s2 和 s3 是子项目。当您在根项目中并运行“测试”时,测试将按定义的顺序依次执行。
你也可以试试Global / parallelExecution := false
在范围内禁用并行执行的“现代”(即 sbt 1.x)等价物Test
是将以下内容添加到您的build.sbt
:
Global / concurrentRestrictions += Tags.limit(Tags.Test, 1)
对于那些不熟悉 sbt 语法的人,在上下文中您想要执行以下操作:
lazy val main = project
.in(file("."))
.settings(
name := "foo",
// more settings
// ...
Global / concurrentRestrictions += Tags.limit(Tags.Test, 1)
)
来自 sbt 文档的标签和规则部分。
ps 对 ScalaTest 来说是一个非常有用的设置,尤其是在数据库测试期间围绕设置/拆卸逻辑。修复了一些非常令人费解的非确定性错误,在启用并行执行时不可避免地会遇到这些错误。