2017-03-29 108 views
4

無論何時測試失敗,Xcode UI測試都會在結果導航器中進行自動截屏以便查看,這非常有用。但是,這不包括因謂詞失敗而失敗的測試。由於謂詞通常用於基本檢查(例如,如果元素存在或不存在於當前視圖中),這是一個巨大的缺點,因爲屏幕截圖在診斷測試失敗時應用程序中發生的情況時很有用。Xcode UI測試:謂詞失敗時自動拍攝快照?

有誰知道如何強制截圖?這是否需要集成Fastlane快照工具?

回答

6

您不必爲此整合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

4

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