繁体   English   中英

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控制台运行ScalaTest测试一样,在FunSuite每个测试运行之前,不会向屏幕报告任何内容。 问题是,当n大且每个测试运行缓慢时,您不知道发生了什么。 (运行top或Windows Task Manager并寻找Java的CPU使用情况并不能令人满意。)

但是真正的问题是,当Travis CI运行该构建时:Travis认为该构建出错了,如果经过10分钟且屏幕上没有任何内容打印,则将其杀死。 就我而言,即使测试仍在运行,Travis仍会终止我的构建,并且FunSuite中的每个test都不需要10分钟(尽管由于测试数量的缘故,整个套件的确需要10分钟以上的时间)。

因此,我的第一个问题是:FunSuite进行每次test后,如何让ScalaTest向控制台报告进度?

我的部分解决方案是使用以下特征作为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记录器?

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

对于内SBT一般记录的目的,你可以使用的一个实例sbt.util.Logger从获得streams.value.log的SBT任务中所描述这里 如果需要从测试代码进行日志记录,则可以使用下面的Wilson答案。

(两年后,我在回答自己的问题,但这是Google上“ ScalaTest sbt进度”的第一批点击。)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM