2017-01-11 103 views
2

我們有一個運行iOS UI測試的Jenkins作業,我需要能夠在測試運行期間根據特定運行時信息忽略一些測試(或測試類)。根據XCTestSuite文檔https://developer.apple.com/reference/xctest/xctestsuite,您可以通過編程方式創建自定義測試套件,但我還沒有找到任何實際操作的示例。那麼人們究竟如何去做呢?如何使用XCTestSuite? (Swift 3)

我已經玩了下面的代碼作爲一個起點,但並沒有真正得到任何地方。當IgnoreThisClass在Xcode中運行時,即使BaseTestClass的setUp()中的testCaseCount在套件中報告0測試,其中的測試方法也會運行。我是否需要重寫一些init()方法或者執行其他操作?任何提示將非常感謝!

import XCTest 

class BaseTestClass: XCTestCase { 
    var runThis: Bool? 

    override func setUp() { 
     if runThis != nil { 
      let suite = XCTestSuite(name: "Custom suite") 

      if runThis! { 
       suite.addTest(self) 
      } 
      print("Testcases in suite \(suite.testCaseCount)") 
      // This causes an error that the suite has already started, 
      // even though this call is present in Apple's example documentation. 
      //suite.run() 
     } 
     XCUIApplication().launch() 
    } 

    override func tearDown() { 
     super.tearDown() 
    } 
} 

// Run this. 
class RunThisClass: BaseTestClass { 

    override func setUp() { 
     super.runThis = true 
     super.setUp() 
    } 

    override func tearDown() { 
     super.tearDown() 
    } 

    func testThis() { 
     print("Test class was run.") 
    } 
} 

// Don't run this. 
class IgnoreThisClass: BaseTestClass { 

    override func setUp() { 
     super.runThis = false 
     super.setUp() 
    } 

    override func tearDown() { 
     super.tearDown() 
    } 

    func testIgnoreThis() { 
     print("Ignored class was run.") 
    } 
} 
+0

你可以舉一個例子,你想動態地重建你運行的測試列表嗎?你能簡單地移動特定的測試來分離測試包並有條件地運行它嗎? – Andy

+0

例如,我們發現某些測試在運行iOS 10的設備中發生故障/行爲不同,但仍然在運行iOS 9的設備中運行,而應用程序功能本身並未發生變化。因此,爲了減少已經很長的測試運行時間,我們希望停止iOS 10設備上運行失敗的測試 - 因爲它們都是誤報 - 直到我們修復它們。我們已經有超過100多個測試,並且每天寫更多,所以如果我們可以避免的話,我們寧願不維護單獨的測試包。 – sjalv

回答

0

達到你想要什麼,你將無法從一個XCTestCase子類中初始化XCTestSuite。這是因爲爲了讓XCTestCase運行它的測試(並因此設置),它必須是XCTestSuite的一部分 - 所以在已經初始化的測試中初始化定製測試套件將不起作用。

Xcode會自動初始化必要的測試類,包括XCTestSuite,因此您無法控制何時初始化並且無法發送任何自定義參數。

最好的辦法是爲XCTestSuite添加一個extension,並添加評估是否運行套件中包含的測試用例。

+0

謝謝,所以我認爲自定義套件的suite.run()方法不斷抱怨套件已經在運行。調試器還顯示默認套件已經創建。我會看到關於擴展XCTestSuite。 – sjalv