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

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

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

test:testOnly *myClass

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

【问题讨论】:

  • sbt testOnly name.DanielSmith.TestClass

标签: scala sbt scalatest


【解决方案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" :它将运行该类的所有测试,该类的规范与定义的模式匹配。

    【讨论】:

    • 它只运行一个测试,但它会编译项目中的所有类,这就是问题所在。
    猜你喜欢
    • 2012-11-30
    • 1970-01-01
    • 2017-10-09
    • 2023-03-26
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 2017-07-07
    • 2014-11-15
    相关资源
    最近更新 更多