多种产品的可重复使用的XCTe

时间:2016-12-08 09:48:21

标签: xcode xctest ios-ui-automation xcode-ui-testing

我需要XCode项目的UI测试,这是几个产品的平台。 这意味着某些元素是针对某些产品定制的。例如,它们可以在产品之间具有不同的颜色,文本样式等,或者对于一个项目可以看到相同的元素,但是隐藏另一个项目。

如何配置我的XCode UI测试以使其可以重复使用各种产品?我知道我需要不同的模式。但是,例如,可见性元素呢?我似乎需要在UI测试代码中检查它?但我认为使用任何配置文件会更好。我对吗?有没有人有任何想法?我很感激所有的建议。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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"
}