如何在测试时按顺序运行子项目测试(包括设置方法)

时间:2013-09-19 12:49:53

标签: scala sbt

EDIT4 横向规则下面的大多数文字与真正的问题没有任何关系。一开始我觉得分叉是问题,但事实并非如此。

我正在尝试运行聚合子项目的所有测试。在子项目中的所有测试之前,应该运行设置方法,并且在子项目中的测试之后应该运行清理方法。

在为聚合项目运行测试任务时,我期望以下序列

  • 项目A的设置方法称为
  • 执行项目A的测试
  • 项目A的清理方法称为
  • 项目B的
  • 相同

但序列是:

  • 项目A和B的设置方法称为
  • 执行项目A的测试
  • 执行项目B的测试
  • 项目A和B的清理方法称为

可以找到具有此行为的构建脚本here

如何解决此问题以获得预期的序列?


我正在使用分叉来运行子项目中的测试。   对于每个子项目,mongo db在测试之前启动并停止   经过测试。

一个项目内的测试按顺序进行;如果我为一个项目运行测试,这很有效。

但如果我为项目root(包含子项目的聚合)运行任务 test ,   我希望分叉的jvms顺序启动,即

  1. 项目A的jvm是分叉的并且其测试已执行
  2. 项目B的jvm分叉并执行其测试
  3. ...
  4. 但看起来jvms是并行启动的;这不是我想要的。

    我尝试了以下内容(根据文档,应该已经设置为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。

    编辑我创建了一个带有sample build的要点。

    EDIT2 documentation中说:

      

    通过设置Tags.ForkedTestGroup标记的限制来控制允许同时运行的分叉JVM的数量,默认为1

    所以这应该在理论上有效。 这是一个错误吗?如果没有,我该怎么办?

    EDIT3 看起来分叉不是问题。问题是为所有子项目立即调用设置方法。

3 个答案:

答案 0 :(得分:8)

嗯。琐碎的答案转换为评论。听起来你问的是在另一个问题中得到解决的同一个问题(见评论)。答案似乎是

parallelExecution in ThisBuild := false

我找到另一篇建议的博客文章

parallelExecution in Global := false

成为答案。 “全局”的答案还表明,关闭编译之类的事情会关闭并行执行,但这可能不如运行测试重要。

答案 1 :(得分:3)

从sbt 0.12开始,您可以使用此设置连续运行所有子项目中的所有测试任务:

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

Tags.Test是所有测试任务的内置语义标记。)

请参阅SBT手册中的Parallel-Execution

答案 2 :(得分:1)

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

test in Project2 := (test in Project2).dependsOn(test in Project1).value
parallelExecution in Test in Project2 := false