【问题标题】:How to turn off parallel execution of tests for multi-project builds?如何关闭多项目构建的并行执行测试?
【发布时间】:2012-08-07 15:23:15
【问题描述】:

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

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

parallelExecution in Test := false

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

关于如何在项目之间全局切换并行执行测试有什么想法吗?

【问题讨论】:

    标签: scala sbt


    【解决方案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://stackoverflow.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 非常有用的设置,特别是在数据库测试期间围绕设置/拆卸逻辑。修复了一些非常令人费解的非确定性错误,在启用并行执行时您将不可避免地遇到这些错误。

            【讨论】:

              猜你喜欢
              • 2014-03-03
              • 2015-12-27
              • 1970-01-01
              • 1970-01-01
              • 2017-05-16
              • 1970-01-01
              • 2016-05-19
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多