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

问题描述 投票:4回答:3

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

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

xcode xctest xcode-ui-testing
3个回答
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)

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


6
投票

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

XCUIDevice.shared().orientation = .unknown

这不会改变UI,如快照documentation所述。

不幸的是,如果您对谓词使用期望并且将此代码放入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
投票

您可以覆盖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)
}
© www.soinside.com 2019 - 2024. All rights reserved.