UI测试断言作为效用方法不会返回失败(Xcode 8,Swift 3)

时间:2017-03-20 16:38:59

标签: swift3 xcode8 xctest xcode-ui-testing

从这个website窃取帮助,我已经实现了这个修复程序来运行一个小的等待函数,所以我可以确保我等待元素/页面/等。在继续测试之前加载。修复工作应该直接在测试中使用代码,但是当我把它放在另一个类的实用程序方法中时,它不会返回正确的通过/失败结果。

运行以下代码时出现问题:

func testCreateGame() {
    let app = LauncherUtilityMethods.startApp()
    AllStageUtilityMethods().waitForElement(app.buttons["THISDOESNOTEXIST"])

这个元素不存在,但我仍然会看到测试通过。 这是实用方法:

    func waitForElement(_ element: XCUIElement, file: String = #file, line: UInt = #line) {
    let exists = NSPredicate(format: "exists == true")
    expectation(for: exists, evaluatedWith: element, handler: nil)

    waitForExpectations(timeout: 5) { (error) -> Void in
        if (error != nil) {
            let message = "Failed to find \(element) after 5 seconds."
            self.recordFailure(withDescription: message, inFile: file, atLine: line, expected: true)
            XCTFail()
        }
    }

在if语句中插入直接XCTFail()后,测试将失败/相应地传递。有没有更好的方法来处理这种情况?有效地两次失败我的测试似乎是多余的,但只有一个实际显示为失败。

我想我可以在XCTFail上添加一个描述,但这是一种不太优雅的方法,因为它是实际的.recordFailure选项。 谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

我建议在XCTestCase本身上创建该实用程序方法,以便它具有正在运行的测试用例的上下文。所有断言都需要测试用例通过或失败。这是示例代码。

extension XCTestCase {

func waitForElementToAppear(element: XCUIElement, timeOut: Double  = 5) {
    let existsPredicate = NSPredicate(format: "exists == true")
    expectation(for: existsPredicate,
                evaluatedWith: element, handler: nil)
    waitForExpectations(timeout: timeOut, handler: nil)
}


func waitForElementToDisappear(element: XCUIElement){
    let doesNotExistPredicate = NSPredicate(format: "exists == false")
    expectation(for: doesNotExistPredicate,
                evaluatedWith: element, handler: nil)
    self.waitForExpectations(timeout: 50) { error in
        sleep(1)
    }
 }   
}

您可以按以下方式调用

   testCase.waitForElementToAppear(element: signOutButton)