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)
从这个 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)