如何关闭多项目构建的并行执行测试?
Posted
技术标签:
【中文标题】如何关闭多项目构建的并行执行测试?【英文标题】:How to turn off parallel execution of tests for multi-project builds? 【发布时间】:2012-08-07 15:23:15 【问题描述】:我有一个多项目构建,其中包含子项目和父项目中的测试。构建被聚合,以便父项目运行子项目中的所有测试。
我对其进行了配置,以便在子项目和父项目中都没有并行执行测试,通过
parallelExecution in Test := false
但是,我有一种烦人的感觉,即跨多个项目的测试是并行运行的。对于其中一个子项目,这是一个问题,因为它同时改变了测试数据库中的状态,导致测试失败。
关于如何在项目之间全局切换并行执行测试有什么想法吗?
【问题讨论】:
【参考方案1】:我认为您可以使用范围 ThisBuild
跨项目应用设置,例如
parallelExecution in ThisBuild := false
我不知道您是否可以将其与范围 Test
结合使用,但可能没有必要。
【讨论】:
抱歉,我对 Scala 有点陌生,遇到了同样的问题 - 我应该把这条线放在哪里?到项目的哪个文件? 最简单的就是放到build.sbt
中(即使你在project/Build.scala
中有完整的配置也会用到那个文件)
谢谢!我自己想通了,太仓促而不是思考:)。无论如何谢谢你
在 build.sbt 中的任何地方?【参考方案2】:
要限制所有项目中同时执行的测试数量,请使用:
concurrentRestrictions in Global += Tags.limit(Tags.Test, 1)
见sbt documentation
见discussion
【讨论】:
【参考方案3】:这在 1.1.0 中对我有用:
Test / parallelExecution := false
【讨论】:
【参考方案4】:在这里查看我的答案How to run subprojects tests (including setup methods) sequentially when testing
还有另一种方法可以防止并行执行。您可以使不同项目的测试任务相互依赖:
test in Project2 := (test in Project2).dependsOn(test in Project1).value
parallelExecution in Test in Project2 := false
【讨论】:
这对我不起作用:我收到References to undefined settings: Project2/*:test from Project2/*:test (/Users/the21st/Work/Project2/build.sbt:36) Did you mean Project2/web-assets-test:test ?
【参考方案5】:
另一种可能性,基于https://***.com/a/27068019/1922026,是在根项目中定义命令别名:
.settings(addCommandAlias("test", ";s1/test;s2/test;s3/test"): _*)
其中 s1、s2 和 s3 是子项目。当您在根项目中并运行“测试”时,测试将按定义的顺序依次执行。
【讨论】:
【参考方案6】:你也可以试试Global / parallelExecution := false
【讨论】:
【参考方案7】:在Test
范围内禁用并行执行的“现代”(即 sbt 1.x)等效项是将以下内容添加到您的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 文档的 tags and rules 部分。
附言ScalaTest 非常有用的设置,特别是在数据库测试期间围绕设置/拆卸逻辑。修复了一些非常令人费解的非确定性错误,在启用并行执行时您将不可避免地遇到这些错误。
【讨论】:
以上是关于如何关闭多项目构建的并行执行测试?的主要内容,如果未能解决你的问题,请参考以下文章
如何在多平台多项目 Kotlin 构建中向另一个项目的测试添加依赖项
在多模块 Maven 项目中构建所有模块后,如何运行集成测试?