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

问题描述:

无论何时测试失败,Xcode UI测试都会在结果导航器中进行自动截屏以便查看,这非常有用。但是,这不包括因谓词失败而失败的测试。由于谓词通常用于基本检查(例如,如果元素存在或不存在于当前视图中),这是一个巨大的缺点,因为屏幕截图在诊断测试失败时应用程序中发生的情况时很有用。Xcode UI测试:谓词失败时自动拍摄快照?

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

您不必为此整合Fastlane快照。唯一的技巧快照是做给力截图触发此代码:

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

tearDown可以检查测试失败(这是有益的,如果你不放弃截图当测试通过。)

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

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

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

您也可以命名的连接,改变它的寿命;)

+0

你有它保存快照的任何想法?像Fastlane快照一样,我可以为此设置路径吗?谢谢。 – Brduca