2015-09-08 42 views
1

我正在使用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每個testFunSuite後報告進展情況到控制檯,以慣用的方式?

我的部分解決方案是使用下面的特徵作爲一個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記錄器?

回答

0

要讓ScalaTest在每次SBT測試後向控制檯報告,請將 logBuffered in Test := false 添加到您的構建配置中。 (請參閱SBT docs。)

對於一般記錄的目的內SBT,可以如所描述的here使用SBT任務內從streams.value.log獲得的sbt.util.Logger一個實例。如果測試代碼需要記錄,Wilson可以使用下面的答案。

(我在兩年後回答了我自己的問題,但這是目前Google上第一個針對「ScalaTest sbt progress」的熱門遊戲。)

0

This對您的第二個問題可能會有幫助。

要這樣記錄,您必須使用scala日誌記錄。您必須添加scala日誌記錄作爲測試依賴項,擴展一些日誌記錄類(建議LazyLogging),然後致電logger.info("Your message")

+0

編輯:我在我的第一個答案中引用slf4j,但實際上你必須使用scala日誌記錄這是slf4j的包裝。 :-) –