Slide 1

Slide 1 text

Xcode9 からのXCTest 林 雅也 Hatena id:snowman_mh 2017/8/29 関西モバイルアプリ研究会 #24 1

Slide 2

Slide 2 text

何をしてる人? 東京大学3 年生 株式会社ookami 長期インター ン 株式会社はてな サマー インター ン参加中 2017/8/29 関西モバイルアプリ研究会 #24 2

Slide 3

Slide 3 text

今日言いたいこと 2017/8/29 関西モバイルアプリ研究会 #24 3

Slide 4

Slide 4 text

気を配る量は アプリのコー ド = テストのコー ド Treat your test code with the same amount of care as your app code WWDC2017 のセッション「Engineering for Testability」 より 4

Slide 5

Slide 5 text

テストコー ドと一緒にレビュー テストコー ドをレビュー Code reviews for test code, not code reviews with test code WWDC2017 のセッション「Engineering for Testability」 より 5

Slide 6

Slide 6 text

つまり、 こうじゃなくて WWDC2017 のセッション「Engineering for Testability」 より 6

Slide 7

Slide 7 text

こう WWDC2017 のセッション「Engineering for Testability」 より 7

Slide 8

Slide 8 text

おわり ( おわらない) 2017/8/29 関西モバイルアプリ研究会 #24 8

Slide 9

Slide 9 text

Xcode9 で登場する XCTest まわりの新しいAPI 2017/8/29 関西モバイルアプリ研究会 #24 9

Slide 10

Slide 10 text

非同期処理のテスト 今まで 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

Slide 11

Slide 11 text

非同期処理のテスト 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

Slide 12

Slide 12 text

クエリの高速化 今まで // 今まではこうやってUI 部品を見つけていた let app = XCUIApplication() app.launch() let button = app.buttons["Done"] // 時間かかる button.tap() とても時間がかかっていた → タイムアウト → テスト失敗 WWDC2017 のセッション「What's New in Testing」 より ( 一部変更) 12

Slide 13

Slide 13 text

クエリの高速化 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

Slide 14

Slide 14 text

他にも XCUIApplication にinit(bundleIdentifier: String) 複数アプリを同時にテストできるように アプリ間の連携のテスト XCTContext とXCTActivity テストがグルー ピングできるように スクリー ンショットが撮れるように WWDC2017 のセッション「What's New in Testing」 より ( 一部変更) 14

Slide 15

Slide 15 text

UI Test を導入しましょう 2017/8/29 関西モバイルアプリ研究会 #24 15

Slide 16

Slide 16 text

バランスが大事 WWDC2017 のセッション「Engineering for Testability」 より 16

Slide 17

Slide 17 text

参考 http://qiita.com/MasayaHayashi724/items/72d08 848e404683277f6 http://qiita.com/MasayaHayashi724/items/20bc2 1e194141240f80d http://qiita.com/MasayaHayashi724/items/1aa70 b16b7163f56ab4b 2017/8/29 関西モバイルアプリ研究会 #24 17

Slide 18

Slide 18 text

ありがとうございました 2017/8/29 関西モバイルアプリ研究会 #24 18