2013-05-31 70 views
0

這可能是東西,是已知最,但令我感到驚訝的測試代碼執行順序。使用scalatest時FunSpec和BeforeAndAfter

鑑於以下測試:

import org.scalatest.{BeforeAndAfterAll, FunSpec} 

class MyFunSpecTest extends FunSpec with BeforeAndAfterAll { 
    override def beforeAll { 
     println("Inside beforeAll") 
    } 

    describe("Testing something") { 
     println("Inside describe") 
     it("should fail") { 
      println("Inside it") 
      fail("not yet implemented") 
     } 
    } 
} 

我會預期輸出:

Inside beforeAll 
Inside describe 
Inside it 
[info] MyFunSpecTest: 
[info] Testing something 
[info] - should fail *** FAILED *** 
[info] not yet implemented (MyFunSpec.scala:12) 

相反的輸出是:

Inside describe 
Inside beforeAll 
Inside it 
[info] MyFunSpecTest: 
[info] Testing something 
[info] - should fail *** FAILED *** 
[info] not yet implemented (MyFunSpec.scala:12) 

這至少與scalatest_2.9.1版本2.0 .M5b和2.0.M5。

我們發現這一點是與Selenium測試,我們在beforeAll創建的網絡驅動器的方式 - 鉤在測試中使用它。只要我們在describe塊初始化lazy val S和使用它們it塊中有沒有問題,因爲計算被推遲到it,其中狀態beforeAll已經執行。當我們第一次引入一些​​在describe塊中計算出來的東西時,自然會出現問題,並依賴於網絡驅動程序(目前尚未構建)。

+0

您是否嘗試用* info()*替換* println()*? – Beryllium

回答

0

before()在每個it()之前被調用,而不是在每個describe()之前被調用。嘗試將你的代碼移動到它()並讓我們知道是否有幫助。

+0

它的邏輯在每個'it'之前被調用。 最初的問題是'BeforeAndAfterAll',其中'beforeAll'運行_after_ describe_block。我複製粘貼錯誤的測試代碼(我使用'BeforeAndAfter')到原始文章。我更新了示例以使用'BeforeAndAfterAll'。麻煩抱歉。 我認爲我們現在的困惑更加明顯。 – uhef

+0

啊,我明白了。你所預期的並不完全不合理。我明白爲什麼它也會如此運作。我相信我們必須把他們的每一個「()」作爲他們術語中的一個測試。因此,beforeAll在所有'it()'之前執行。它不保證與其他工件(如describe())有關的執行順序。 – joescii