我正在使用ScalaTest,並且有一個包含很多測試的測試套件,每個測試可能需要大約一分鐘的時間才能運行。ScalaTest和SBT:測試套件的報告進度?
class LargeSuite extends FunSuite {
test("Name of test 1") { ... }
...
test("Name of test n") { ... }
}
正如往常一樣從SBT控制檯運行ScalaTest測試,沒有報告給屏幕直到FunSuite
每個測試已運行。問題是,當n
很大,並且每個測試運行緩慢時,您都不知道發生了什麼。 (運行top
或Windows任務管理器,並且尋找Java的CPU使用率並不是真的令人滿意。)
但真正的問題是當構建由Travis CI運行時:Travis假定構建出錯並終止它如果10分鐘過去並且沒有任何內容被打印到屏幕上。在我的情況下,即使測試仍在運行,特拉維斯正在殺死我的構建,並且FunSuite
中的每個人test
不需要10分鐘(儘管由於測試次數整個套件需要超過10分鐘)。因此
我的第一個問題是:我怎樣才能得到ScalaTest每個test
在FunSuite
後報告進展情況到控制檯,以慣用的方式?
我的部分解決方案是使用下面的特徵作爲一個mixin,它解決了與特拉維斯問題:
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的記錄確實不去,並因此與前綴,及(ii)嘗試上述時,從Console
打印的信息都混雜了其他消息來自SBT。如果我能夠使用適當的記錄器,那麼這些事情都不會發生。
因此,我的第二個問題是:如何從ScalaTest的測試中打印到SBT記錄器?
編輯:我在我的第一個答案中引用slf4j,但實際上你必須使用scala日誌記錄這是slf4j的包裝。 :-) –