Xcode UI测试:在谓词失败时自动拍摄快照?

时间:2017-03-29 00:27:23

标签: xcode xctest xcode-ui-testing

Xcode UI Testing每当测试失败时都会在结果导航器中自动截取屏幕,这非常有用。但是,这不包括由于谓词失败而失败的测试。由于谓词通常用于基本检查(例如,当前视图中是否存在元素),这是一个巨大的缺点,因为屏幕截图对于诊断测试失败时应用程序中发生的事情非常有用。

有谁知道如何强制截屏?这是否需要集成Fastlane快照工具?

3 个答案:

答案 0 :(得分:7)

tearDown上,您可以检查测试是否失败(如果您在测试通过时没有丢弃屏幕截图,这将非常有用。)

if let failureCount = testRun?.failureCount, failureCount > 0 {
  takeScreenshot()
}

如果您已经使用XCode9,takeScreenshot功能可以使用新API(如果没有,则使用其他答案中提到的解决方法):

let screenshot = XCUIScreen.main.screenshot()
let attach = XCTAttachment(screenshot: screenshot)
add(attach)

您还可以命名附件并更改其生命周期;)

答案 1 :(得分:6)

您不必为此整合Fastlane Snapshot。 Snapshot用于强制截屏的唯一技巧是触发此代码:

XCUIDevice.shared().orientation = .unknown

这不会像快照documentation中描述的那样改变UI。

不幸的是,如果您对谓词使用期望并且将此代码置于waitForExpectations(timeout:handler:)处理程序关闭状态并且我不知道原因,那么这将不起作用。

要解决此问题,您可以创建自己的XCTestObservation处理程序,如下所示:

class MockObserver: NSObject, XCTestObservation {
    func testCase(_ testCase: XCTestCase, didFailWithDescription description: String, inFile filePath: String?, atLine lineNumber: UInt) {
        XCUIDevice.shared().orientation = .unknown
    }
}

XCTestObservationCenter.shared().addTestObserver(MockObserver())

您可以将此代码放在setUp()方法或特定test...方法中。

测试输出有点奇怪,因为它会显示"将设备方向设置为未知"作为一个错误和实际的谓词错误,但你将有你的截图:

Test execution log

答案 2 :(得分:0)

您可以重写recordFailure方法以捕获任何类型的故障的屏幕截图。

override func recordFailure(withDescription description: String, inFile filePath: String, atLine lineNumber: Int, expected: Bool) {
        add(XCTAttachment(screenshot: XCUIScreen.main.screenshot()))
        super.recordFailure(withDescription: description, inFile: filePath, atLine: lineNumber, expected: expected)
}