我需要XCode項目的UI測試,這是多個產品的平臺。這意味着某些元素是爲某些產品定製的。例如,他們可以在產品之間具有不同的顏色,文本樣式等,或者同一個元素可以在一個項目中可見,但隱藏了另一個元素。幾種產品的可重用XCTests
如何配置我的XCode UI測試以使其可用於各種產品?我知道我需要不同的模式。但是,例如,可見性元素呢?看來我需要在UI測試代碼中檢查它嗎?但我認爲使用任何配置文件會更好。我對嗎?有沒有人有任何想法?我會很感激所有的建議。
我需要XCode項目的UI測試,這是多個產品的平臺。這意味着某些元素是爲某些產品定製的。例如,他們可以在產品之間具有不同的顏色,文本樣式等,或者同一個元素可以在一個項目中可見,但隱藏了另一個元素。幾種產品的可重用XCTests
如何配置我的XCode UI測試以使其可用於各種產品?我知道我需要不同的模式。但是,例如,可見性元素呢?看來我需要在UI測試代碼中檢查它嗎?但我認爲使用任何配置文件會更好。我對嗎?有沒有人有任何想法?我會很感激所有的建議。
我建議構建一套您在每個產品中使用的測試助手。這些是通用的,參數化的功能,例如登錄用戶或將商品添加到購物車。而不是在這些助手中對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)
}
}
我使用的功能在每個測試的開始。
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"
}
是的,我想到了這一點,但我沒有與它的經驗。你能舉出更多細節的例子嗎? – Yulia
我編輯了答案。我爲get config方法編寫了一個示例(一個簡單的例子,但工作正常)。和一個示例用法。 –
另外請記住,您可以在所有測試目標中添加一個「XCTestCase」並重新使用它。 –