ScalaTest 和 SBT:报告测试套件的进度?

ScalaTest and SBT: Reporting progress of test suite?

我正在使用 ScalaTest 并且有一个包含许多测试的测试套件,每个测试可能需要大约一分钟才能 运行。

class LargeSuite extends FunSuite {
    test("Name of test 1") { ... }
    ...
    test("Name of test n") { ... }
}

与从 SBT 控制台进行 运行ning ScalaTest 测试一样,在 FunSuite 中的每个测试都已 运行 之前,不会向屏幕报告任何内容。问题是当 n 很大并且每个测试都慢到 运行 时,您不知道发生了什么。 (运行 top 或 Windows 任务管理器并寻找 CPU 用法 Java 并不是很令人满意。)

但真正的问题是当 Travis 运行 构建时 CI:Travis 假设构建出错并在 10 分钟过去并且没有任何内容打印到屏幕上时将其终止。就我而言,Travis 正在扼杀我的构建,即使测试仍在 运行ning,并且 FunSuite 中的每个人 test 不需要 10 分钟(尽管整个套件确实需要由于测试次数超过 10 分钟)。

因此,我的第一个问题是: 如何让 ScalaTest 在 FunSuite 中的每个 test 之后向控制台报告进度惯用的方式?

我的部分解决方案是使用以下特征作为 mixin,这解决了 Travis 的问题:

trait ProgressConsolePrinter extends BeforeAndAfterEach with BeforeAndAfterAll {
  self: Suite =>

  override def beforeAll: Unit = {
    Console.print(s"$suiteName running")
    Console.flush
  }

  override def afterEach: Unit = {
    Console.print(".")
    Console.flush
  }

  override def afterAll: Unit = {
    Console.println
    Console.flush
  }
}

但我知道使用 Console 打印到 SBT 控制台并不完全可靠(谷歌搜索似乎从其他人的经验中证实了这一点)。

此外 (i) 您从 Console 打印的任何内容 不会 通过 SBT 的记录器,因此不会以 [info] 为前缀,并且 (ii ) 在尝试上述操作时,从 Console 打印的消息与来自 SBT 的其他消息混在一起。如果我能够使用正确的记录器,那么这些事情都不会发生。

因此我的第二个问题是: 如何从 ScalaTest 的测试中打印到 SBT 记录器?

This 可能对您的第二个问题有所帮助。

要这样记录,您必须使用 Scala 记录。您必须添加 scala 日志记录作为测试依赖项,扩展它的一些日志记录 类(建议 LazyLogging)然后调用 logger.info("Your message").

要让 ScalaTest 在 SBT 中的每个测试后向控制台报告,请添加 logBuffered in Test := false 到您的构建配置。 (参见 SBT docs。)

为了 SBT 中的一般日志记录目的,您可以在 SBT 任务中使用从 streams.value.log 获得的 sbt.util.Logger 实例,如 here 所述。如果测试代码需要日志记录,可以使用下面的 Wilson 答案。

(我在两年后回答我自己的问题,但这是目前 Google 上 "ScalaTest sbt progress" 的第一次点击。)