Upgrade to Pro — share decks privately, control downloads, hide ads and more …

XCTest in Xcode9

XCTest in Xcode9

関西モバイルアプリ研究会 #24

Masaya Hayashi

August 29, 2017
Tweet

More Decks by Masaya Hayashi

Other Decks in Programming

Transcript

  1. 気を配る量は アプリのコー ド = テストのコー ド Treat your test code

    with the same amount of care as your app code WWDC2017 のセッション「Engineering for Testability」 より 4
  2. テストコー ドと一緒にレビュー テストコー ドをレビュー Code reviews for test code, not

    code reviews with test code WWDC2017 のセッション「Engineering for Testability」 より 5
  3. 非同期処理のテスト 今まで let document = UIDocument(fileURL: documentURL) let expectation =

    expectation(description: "Doc Opened") document.open() { success in XCTAssert(success, "Failed to open doc") expectation.fulfill() } waitForExpectations(timeout: 10) // すべてのexpectation に対してfulfill されるのを待っている WWDC2017 のセッション「What's New in Testing」 より ( 一部変更) 10
  4. 非同期処理のテスト Xcode9 から // expectation を指定してテストケー スをwait させられる wait(for: [expectation],

    timeout: 10) // コー ルバック処理が書ける(XCTWaiterDelegate) let waiter = XCTWaiter(delegate: self) waiter.wait(for: [expectation], timeout: 10) // wait の返り値によって処理を分けられる // 今までは タイムアウト-> テスト失敗 ( 原因特定が難しい) let res = XCTWaiter.wait(for: [expectation], timeout: 10) if res == .timedOut { // タイムアウトを扱う } WWDC2017 のセッション「What's New in Testing」 より ( 一部変更) 11
  5. クエリの高速化 今まで // 今まではこうやってUI 部品を見つけていた let app = XCUIApplication() app.launch()

    let button = app.buttons["Done"] // 時間かかる button.tap() とても時間がかかっていた → タイムアウト → テスト失敗 WWDC2017 のセッション「What's New in Testing」 より ( 一部変更) 12
  6. クエリの高速化 Xcode9 から var firstMatch: XCUIElement { get } //

    あんまりよくない let b = app.buttons.firstMatch // まだマシ let b = app.buttons["Done"].firstMatch // こうするのがベスト let b = app.navigationBars.buttons["Done"].firstMatch // 曖昧さを最大限なくすのが重要 accessibilityIdentifier がなくてもOK WWDC2017 のセッション「What's New in Testing」 より ( 一部変更) 13