2017-03-29 5 views
4

Xcode UI Testingは、テストが失敗するたびに結果ナビゲータで表示するための自動スクリーンショットを取得するので、非常に便利です。ただし、述部が失敗したために失敗したテストは含まれません。プレディケートは基本チェック(要素が現在のビューに存在するかどうかなど)によく使用されるため、スクリーンショットはテストが失敗したときにアプリで何が起こっていたかを診断するのに役立ちます。Xcode UIテスト:述語が失敗したときにスナップショットを自動的に取得しますか?

誰かがスクリーンショットを強制する方法を知っていますか?これにはFastlane Snapshotツールの統合が必要ですか?

答えて

6

このためにFastlane 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...方法のいずれかで、このコードを置くことができます。

テスト出力は、それが内部のエラーと実際の述語エラーとして「不明にデバイスの向きを設定します」と表示されますよう少し奇妙ですが、あなたのスクリーンショットを持っています:tearDownオン

Test execution log

4

次のことができますテストが失敗した場合には(テストが合格したときにスクリーンショットを破棄されていない場合には便利です。)チェックすでにXCode9を使用している場合は、takeScreenshot機能が使用できる

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

新しいAPI(ない場合は、他の回答で述べた回避策を使用):

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

あなたはまた、添付し、その寿命を変更するに名前を付けることができます。あなたはそれがスナップショットを保存し任意のアイデアを)

+0

を持っていますか?ファストレーンのスナップショットと同様に、そのパスを設定できますか?ありがとう。 – Brduca

関連する問題