如何在 sbt 中运行和编译准确的一项测试?

Posted

技术标签:

【中文标题】如何在 sbt 中运行和编译准确的一项测试?【英文标题】:How to run and compile exact one test in sbt? 【发布时间】:2020-02-05 22:31:08 【问题描述】:

我正在处理一个使用 SBT 在 Scala 中编写的遗留项目。单元测试是用 ScalaTest 编写的。 问题是有很多测试类有编译错误。

我只想运行这些测试类中的一个,并且我知道只运行一个测试我应该尝试这样的事情:

test:testOnly *myClass

但是当我运行这个命令时,SBT 会尝试编译整个项目,正如我所说,有很多测试类有编译错误。 有什么方法可以准确地告诉 SBT 哪些类需要编译,而其他类将被忽略?

【问题讨论】:

sbt testOnly name.DanielSmith.TestClass 【参考方案1】:

考虑像这样在build.sbt 中定义一个single-argument custom command

commands += Command.single("compileAndTestOnly")  (state, file) =>
  s"""set sources in Test := (sources in Test).value.filter(_.name.contains("$file"))""" ::
    "test" :: state

现在用compileAndTestOnly MySpec.scala 运行它。此命令将Test / sources 设置修改为仅包含单个文件,如下所示

sources in Test := (sources in Test).value.filter(_.name.contains(file))

注意sources in Compile 保持不变。然后它执行test,它实际上编译并运行了一个测试。

这个答案的灵感来自0__。

【讨论】:

当我运行这个时,SBT 给我一个错误:> compileAndTestOnly RunTest.scala :1: error: value / is not a member of sbt.Configuration Test / sources := (Test /来源).value.filter(_.name.contains("RunTest.scala")) @DanielSmith 您使用的是什么版本的 SBT?你能发布最小的可重现示例吗,也许是 GitHub 存储库? 我用的是0.13.11版本,不能升级,超级老代码!不幸的是,没有任何 github repo。 @DanielSmith 在 SBT 0.13.x 中 slash syntax Test / sources 不可用,因此我们必须改写 sources in Test。请尝试编辑后的答案。 我对其进行了测试,并且 sbt 再次尝试编译所有类并运行每个 UT。【参考方案2】:

不可能指示 sbt 只编译包含与您的名称匹配的测试的文件,因为它只会在编译后知道测试的名称——在 scala 中,类名和文件名不必须与其他人有任何关系。

sbt 中没有内置源过滤器。您将需要按照上述@mario-galic 的内容执行自定义任务。

但请注意,这将根据文件名而不是类名进行过滤。

我同意,即使某些文件的编译失败,sbt 也可以运行所有测试,这将是一个很好的功能。

【讨论】:

【参考方案3】:

如上所述,您有下一个选项:

sbt testOnly *className :这将运行该类中定义的所有测试。 sbt testOnly *className-- -z "test-pattern" :它将运行该类的所有测试,该类的规范与定义的模式匹配。

【讨论】:

它只运行一个测试,但它会编译项目中的所有类,这就是问题所在。

以上是关于如何在 sbt 中运行和编译准确的一项测试?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有编译/检查的情况下运行“sbt run”?

Scala SBT 如何同时运行测试和测试

gitlab ci:sbt 在每个阶段重新编译

如何在 ScalaTest / SBT 中按顺序运行测试套件?

如何在 sbt 中运行 java/scala 单元测试

迁移到 sbt 1:如何在编译时运行 Scalastyle