2017-04-04 153 views
3

我正在閱讀一本關於Swift中測試驅動開發的書。我的最終目標是更好地理解OOP體系結構。在我讀這本書的時候,最早的一節講述了setUp()方法在每個測試方法之前被觸發,我明白做的是設置對象以運行測試以獲得通過或失敗的結果。我不確定的是,從架構的角度來看,這甚至是可能的?蘋果公司如何能夠制定出一種在班級中每一種其他方法之前都被解僱的方法?在調用每個測試方法之前,如何調用setUp()方法?

下面是一些示例代碼:

import XCTest 
@testable import FirstDemo 

class FirstDemoTests: XCTestCase { 

    override func setUp() { 
     super.setUp() 
     // Put setup code here. This method is called before the invocation of each test method in the class. 
    } 

    override func tearDown() { 
     // Put teardown code here. This method is called after the invocation of each test method in the class. 
     super.tearDown() 
    } 

    func testExample() { 
     // This is an example of a functional test case. 
     // Use XCTAssert and related functions to verify your tests produce the correct results. 
    } 

    func testPerformanceExample() { 
     // This is an example of a performance test case. 
     self.measure { 
      // Put the code you want to measure the time of here. 
     } 
    } 

} 

回答

4

我認爲XCTest類都有一個生命週期,就像UIViewController例如。

與相同viewDidLoad()當視圖加載到內存時調用setUp()方法在加載測試類(在對象的生命期間一次)後也被調用。

您也可以在github調查本地和第三方測試框架的源代碼:

https://github.com/apple/swift-corelibs-xctest

https://github.com/google/googletest

+0

謝謝,如果是這種情況,那麼我該如何理解UIViewController的方法是如何被觸發的?例如,我相信ViewDidLoad()是由運行時環境自動觸發的。但是,我們所說的「自動」是指什麼,我正在考慮某個地方的某個地方是否調用了這種方法,我想知道在哪裏瞭解更多信息。我希望這是有道理的 –

2

你是子類名爲XCTestCase類。通常測試框架反思定義測試方法的類,並以特定順序運行它們。

無論如何,我不是100%肯定,如果XCTest正在以這種方式工作,但你可以嘗試看看源代碼,並試圖挖掘有更深層次的:

https://github.com/apple/swift-corelibs-xctest

+0

謝謝你,這是一個好點,因爲我忘了Swift是開源的,但我發現導航github回購有點混淆,至於如何找到我感興趣的區域。有關這方面的任何提示? –

+1

我不會試圖理解整個來源,只是通過在git中讀取它...我會嘗試檢查出來並構建它。建立後,嘗試引用另一個項目,寫一些愚蠢的測試,以確保它的工作。然後玩。改變一下源代碼,打破它,引入一些錯誤。重新編譯一切,看看會發生什麼。 – Kris

2

對於每個測試被測試:setup()被調用,然後進行實際測試,然後teardown()

然後再次設置另一個測試從這個類和tearDown再次......直到你的測試類的所有**測試得到運行。

這些行的順序不會影響首先調用哪個測試。

這樣做的原因是因爲2個測試應該100%獨立。你不想測試示例對你正在執行你的測試的對象/ sut/system_under_test(改變它的狀態)做一些事情,但是,而不是撤消它做了什麼。否則你的testPerformanceExample將從你不是 的期望狀態加載。

相關問題