I have a potentially long-running test written with scalatest:
test("a long running test") {
failAfter(Span(60, Seconds)) {
// ...
}
}
Even if the test finishes within the timeout limit, its running time can be valuable to the person who runs the test. How can I measure and display the running time of this single particular test in scalatest's output?
Update: Currently I measure the running time with my own function, just as in r.v's answer. I'd like to know if scalatest offers this functionality already.
the -oD
option will give the duration of the test. For example, I use the following in my build.sbt.
testOptions in Test += Tests.Argument("-oD")
EDIT:
You can also use the following for individual runs:
> test-only org.acme.RedSuite -- -oD
See http://www.scalatest.org/user_guide/using_scalatest_with_sbt.
Moreover, you can define the following function for general time measurements:
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
}
and use it anywhere (not dependent on ScalaTest)
test("a long running test") {
time("test running"){
failAfter(Span(60, Seconds)) {
// ...
}
}
In addition to r.v.'s answer:
If you have multiproject builds the testOptions in Test += Tests.Argument("-oD")
does not work on root level in build.sbt, because Test refers to src/test/scala. You have to put it inside your Sub-Project settings
Project(id = "da_project", base = file("da_project"))
.settings(
testOptions in Test += Tests.Argument("-oDG"),
libraryDependencies ++= Seq(
...
)
)