如何测量和显示单个测试的运行时间?

11

我有一个可能运行时间较长的测试,使用scalatest编写:

test("a long running test") {
  failAfter(Span(60, Seconds)) {
    // ...
  }
}
即使测试在超时限制内完成,对于运行测试的人来说,其运行时间仍然很有价值。我该如何测量并显示scalatest输出中这个单独特定测试的运行时间?
更新:目前我使用自己的函数来测量运行时间,就像r.v的答案中一样。我想知道scalatest是否已经提供了这个功能。
2个回答

15

-oD选项将给出测试的持续时间。例如,我在我的build.sbt中使用以下内容。

testOptions in Test += Tests.Argument("-oD")

编辑:

您也可以使用以下内容进行单独运行:

> test-only org.acme.RedSuite -- -oD

请参考http://www.scalatest.org/user_guide/using_scalatest_with_sbt,该网站有相关的IT技术内容。

此外,您可以定义以下函数进行通用时间测量:

def time[T](str: String)(thunk: => T): T = {
  print(str + "... ")
  val t1 = System.currentTimeMillis
  val x = thunk
  val t2 = System.currentTimeMillis
  println((t2 - t1) + " msecs")
  x
}

并且可以在任何地方使用它(不依赖于ScalaTest)

test("a long running test") {
  time("test running"){
    failAfter(Span(60, Seconds)) {
    // ...
  }
}

谢谢,这很有帮助,但我想只测量单个测试,而不考虑sbt的配置。我不需要测量其他测试,我希望始终测量这一个。我正在考虑测量一段代码块,并在测试结束时打印其时间,使用 info(...)。我希望 scalatest 提供这样的测量函数,因为它已经使用此选项执行测量。 - Petr
我已经编辑了问题。我不知道info()是什么,但我认为我的答案是等效且可行的。info()在哪里,它是做什么的? - r.v
是的,这就是我现在正在使用的方式,使用自己的函数,例如 time。(也许 nanoTime 可能会更精确一些。)info() 只是将消息添加到 scalatest 的输出中。 - Petr
在较新版本的sbt和ScalaTest中,我们应该设置测试框架:testOptions in Test += Tests.Argument(TestFrameworks.ScalaTest, "-oD") - Hosam Aly

0
除了r.v.的回答之外: 如果您有多项目构建,则在build.sbt的根级别上testOptions in Test += Tests.Argument("-oD")不起作用,因为Test是指src/test/scala。您必须将其放在子项目设置中。
Project(id = "da_project", base = file("da_project"))
    .settings(
        testOptions in Test += Tests.Argument("-oDG"),
        libraryDependencies ++= Seq(
            ...
        )
    )

1
或者,我们可以在整个构建级别上设置它: testOptions in Test in ThisBuild += Tests.Argument(TestFrameworks.ScalaTest, "-oD") - Hosam Aly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接