2016-12-08 71 views
0

我需要XCode項目的UI測試,這是多個產品的平臺。這意味着某些元素是爲某些產品定製的。例如,他們可以在產品之間具有不同的顏色,文本樣式等,或者同一個元素可以在一個項目中可見,但隱藏了另一個元素。幾種產品的可重用XCTests

如何配置我的XCode UI測試以使其可用於各種產品?我知道我需要不同的模式。但是,例如,可見性元素呢?看來我需要在UI測試代碼中檢查它嗎?但我認爲使用任何配置文件會更好。我對嗎?有沒有人有任何想法?我會很感激所有的建議。

回答

0

我建議構建一套您在每個產品中使用的測試助手。這些是通用的,參數化的功能,例如登錄用戶或將商品添加到購物車。而不是在這些助手中對UI元素表示進行硬編碼,請參數化輸入。然後你可以反覆使用它們。

func addItemToCart(named: String, saveButtonName: String) 
func login(username: String, password: String, submitButtonText: String) 
func tapTableCell(imageNamed: String) 

一旦你創建的導航,你可以移動到斷言傭工基本腳手架。在助手中保留複雜的邏輯使您能夠重用它們,並保持產品特定的測試精簡和可讀。

func assertCurrentScreen(named: String) 
func assertHighlightedCell(colorNamed: String) 
func assertCartTotal(cents: String, containerIdentifier: String) 

對於所有的這些功能,我建議將在最後兩個默認的參數要注意來電文件和行號。如果你做出任何自定義斷言,你可以然後pass these references in to show your failure at the callers line, not the helpers

func assertScreen(titled: String, file: StaticString = #file, line: UInt = #line) { 
    if !XCUIApplication().navigationBars[titled].exists { 
     XCTFail("Item was not added to cart.", file: file, line: line) 
    } 
} 

XCTest Helper Example

0

我使用的功能在每個測試的開始。

class SomeTestsClass: XCTestCase { 
    func testSomeTest() { 
     var externalConfigVariable_1 = "value for defult test" 
     var externalConfigVariable_2 = "value for defult test" 

     // here You use the external config to override 
     // the default test logc 
     if let testConfig = getConfig(for: self.name) { 
      // read config parameters here 
      externalConfigVariable_1 = testConfig["test_var_1"] 
      externalConfigVariable_2 = testConfig["test_var_2"] 
      // .......... 
     } 

     // use the variables as You like 
     // ...... 
    } 
} 

extension XCTestCase { 
    public func getConfig(for name: String?) -> [String: Any]? { 
     let nameComponents = name?.replacingOccurrences(of: "-", with: "").replacingOccurrences(of: "[", with: "").replacingOccurrences(of: "]", with: "").components(separatedBy: " ") 

     if let fileName = nameComponents?.last { 
      let testBundle = Bundle(for: type(of: self)) 
      guard let path = testBundle.url(forResource: fileName, withExtension: "JSON") else { 
       return nil 
      } 

      if let data = try? Data(contentsOf: path) { 
       if let testConfig = (try? JSONSerialization.jsonObject(with: data, options: .allowFragments)) as? [String: Any] { 
        return testConfig 
       } 
      } 
     } 

     return nil 
    } 
} 

下面是一個例子JSON:

{ 
    "test_var_1": "Some var", 
    "test_var_2": "Some other var" 
} 
+0

是的,我想到了這一點,但我沒有與它的經驗。你能舉出更多細節的例子嗎? – Yulia

+0

我編輯了答案。我爲get config方法編寫了一個示例(一個簡單的例子,但工作正常)。和一個示例用法。 –

+0

另外請記住,您可以在所有測試目標中添加一個「XCTestCase」並重新使用它。 –

相關問題