如何在 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.scalaTest / sources
不可用,因此我们必须改写 sources in Test
。请尝试编辑后的答案。
我对其进行了测试,并且 sbt 再次尝试编译所有类并运行每个 UT。【参考方案2】:
不可能指示 sbt 只编译包含与您的名称匹配的测试的文件,因为它只会在编译后知道测试的名称——在 scala 中,类名和文件名不必须与其他人有任何关系。
sbt 中没有内置源过滤器。您将需要按照上述@mario-galic 的内容执行自定义任务。
但请注意,这将根据文件名而不是类名进行过滤。
我同意,即使某些文件的编译失败,sbt 也可以运行所有测试,这将是一个很好的功能。
【讨论】:
【参考方案3】:如上所述,您有下一个选项:
sbt testOnly *className
:这将运行该类中定义的所有测试。
sbt testOnly *className-- -z "test-pattern"
:它将运行该类的所有测试,该类的规范与定义的模式匹配。
【讨论】:
它只运行一个测试,但它会编译项目中的所有类,这就是问题所在。以上是关于如何在 sbt 中运行和编译准确的一项测试?的主要内容,如果未能解决你的问题,请参考以下文章