36

我有一个多项目构建,其中包含子项目和父项目中的测试。构建被聚合,以便父项目运行子项目中的所有测试。

我对其进行了配置,以便在子项目和父项目中都没有并行执行测试,通过

parallelExecution in Test := false

但是,我有一种烦人的感觉,即跨多个项目的测试是并行运行的。在其中一个子项目的情况下,这是一个问题,因为它同时改变了测试数据库中的状态,导致测试失败。

关于如何在项目之间全局切换并行执行测试的任何想法?

4

7 回答 7

36

我认为您可以使用 scope 跨项目应用设置ThisBuild,例如

parallelExecution in ThisBuild := false

我不知道你是否可以将它与 scope 结合起来Test,但这可能没有必要。

于 2012-08-10T11:13:16.090 回答
20

要限制所有项目中同时执行的测试数量,请使用:

concurrentRestrictions in Global += Tags.limit(Tags.Test, 1)

sbt 文档

讨论

于 2015-10-31T21:27:33.730 回答
10

这在 1.1.0 中对我有用:

Test / parallelExecution := false

于 2018-05-11T23:13:14.470 回答
4

在此处查看我的答案如何在测试时按顺序运行子项目测试(包括设置方法)

还有另一种方法可以防止并行执行。您可以使不同项目的测试任务相互依赖:

test in Project2 := (test in Project2).dependsOn(test in Project1).value
parallelExecution in Test in Project2 := false
于 2014-12-29T14:33:28.323 回答
1

基于https://stackoverflow.com/a/27068019/1922026的另一种可能性是在根项目中定义命令别名:

.settings(addCommandAlias("test", ";s1/test;s2/test;s3/test"): _*)

其中 s1、s2 和 s3 是子项目。当您在根项目中并运行“测试”时,测试将按定义的顺序依次执行。

于 2017-04-13T14:44:12.147 回答
1

你也可以试试Global / parallelExecution := false

于 2021-11-23T13:02:50.433 回答
0

在范围内禁用并行执行的“现代”(即 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 来说是一个非常有用的设置,尤其是在数据库测试期间围绕设置/拆卸逻辑。修复了一些非常令人费解的非确定性错误,在启用并行执行时不可避免地会遇到这些错误。

于 2022-02-14T22:49:22.143 回答