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

UI Testing Assertion as Utility Method doesn't return failure (Xcode 8, Swift 3)

从这个 website 窃取帮助,我已经对 运行 一个小的等待函数实施了这个修复,这样我就可以确保等待 elements/pages/etc。在继续测试之前加载。如果我直接在测试中使用代码,修复工作,但是当我把它放在另一个 class 的实用方法中时,它不会 return 正确 pass/fail 结果。

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

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()
        }
    }

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

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

我建议在 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)