Xcode UI Testing每当测试失败时都会在结果导航器中自动截取屏幕,这非常有用。但是,这不包括由于谓词失败而失败的测试。由于谓词通常用于基本检查(例如,当前视图中是否存在元素),这是一个巨大的缺点,因为屏幕截图对于诊断测试失败时应用程序中发生的事情非常有用。
有谁知道如何强制截屏?这是否需要集成Fastlane快照工具?
答案 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...
方法中。
测试输出有点奇怪,因为它会显示"将设备方向设置为未知"作为一个错误和实际的谓词错误,但你将有你的截图:
答案 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)
}