gpt4 book ai didi

scala - 如何让 SBT 并行运行测试套件?

转载 作者:行者123 更新时间:2023-12-02 14:47:00 30 4
gpt4 key购买 nike

我有一堆由 sbt 运行的集成测试,给定测试 N 套件,每个套件有 1..M 测试。我在 IntegrationTest 中设置了 fork := true,但测试套件总是按顺序执行。根据文档,事实并非如此:测试套件应该同时执行。

测试套件是一个类如下:

class MyTestSuite1 extends FlatSpec with Matchers 
...
it should "do A" {}
it should "do B" {}
class MyTestSuite2 extends FlatSpec with Matchers 
...
it should "do C" {}
it should "do D" {}

问题

MyTestSuite1 和 MyTestSuiteN 按顺序执行(准确地说是按字母顺序)

期待

MyTestSuite1 和 MyTestSuiteM 并发执行

环境

.sbopts:

-J-Xms1G
-J-Xmx4G
-J-XX:MaxMetaspaceSize=512m
-J-Xss4M

注意

我注意到所有测试都使用相同的池和线程运行,例如,pool-1-thread-1 用于所有测试。

sbt 版本:1.2.8斯卡拉:2.12.8操作系统:MacOS 10.15,Ubuntu 19.04最新版本:3.2.0-SNAP10

尝试了 sbt v. 1.3.2 - 结果相同。添加

testOptions in IntegrationTest += Tests.Argument(TestFrameworks.ScalaTest, "-P4"),

没有帮助。

============

更新

fork in(IntegrationTest, test) := true 在全局范围内工作,但我有 2 个项目,我想让它工作以保留项目的相对路径。

例如

lazy val `p1` = Project(id = "p1", base = file("./p1"))
.configs(IntegrationTest)
.settings(Defaults.itSettings: _*)
.settings(
fork in(IntegrationTest, test) := true,
...)

lazy val `p2` = Project(id = "p2", base = file("./p2"))
.configs(IntegrationTest)
.settings(Defaults.itSettings: _*)
.settings(
fork in(IntegrationTest, test) := true,
...)

不并行运行测试

相反,它是并行运行的,但很明显,主目录设置为“.”而不是分别是“./p1”或“./p2”:

fork in(IntegrationTest, test) := true

lazy val `p1` = Project(id = "p1", base = file("./p1"))
.configs(IntegrationTest)
.settings(Defaults.itSettings: _*)

最佳答案

解决方案:

IntegrationTest 中似乎有 testForkedParallel := true 选项,它完全满足我的需要——它为每个测试套件生成新的 JVM。

==============

备注:

所以,唯一的问题是,现在它生成的 JVM 数量与所有可用 CPU 的数量一样多,我不能仅通过漏斗来测试并发性:

选项 1 - 将所有 sbt 进程集中到只有 4 个并行

concurrentRestrictions in Global := Seq(Tags.limitAll(4))

选项 2 - 什么都不做(测试在子项目中)

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

关于scala - 如何让 SBT 并行运行测试套件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58570784/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com