Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会

7,699 views

Published on

Published in: Software
  • Be the first to comment

Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会

  1. 1. Xcode 7における UIテストとカバレジ計測 2015.07.11 #yidev 第20回勉強会 @nowsprinting / Koji Hasegawa
  2. 2. 自己紹介 • id: @nowsprinting • フリーランス
 (iOS/Androidアプリ受託開発) • アプリ『山吹色の茸疾走』『フットサル ルールと雑学』
 『電エースQuiz - 河崎実監督と特撮映画の世界』 • コミュニティ:
 テスト自動化研究会、Androidテスト部、VR部 • エバンジェリスト
  3. 3. 著書
  4. 4. アジェンダ • UIテストの位置づけ • UI Testing API • UI recording • Code coverage • Test Reports
  5. 5. UIテストの位置づけ
  6. 6. テストレベル
  7. 7. テストレベル テスト工程
  8. 8. テストレベル テスト工程 結合度
  9. 9. テストレベル 開発者 QA 顧客 誰が実施するか、という区切り方
  10. 10. テストレベル
  11. 11. システムテスト(1/2) • アプリ(.ipa)を端末にインストールし、UIを操作す る(リリースビルド、proguard) • サーバと通信する場合、ステージングもしくはプロ ダクション環境を使用する(End to End) • 一般に、独立したテストチーム(QA)が行なう (ISTQBにおける定義)
  12. 12. システムテスト(2/2) • 自動化ツール:
 UI Automation, MonkeyTalk, Calabash, Appium • E2Eなので、日時、天気、株価、為替、乱数など、 自動テストで成否判定が困難となる要因が多い • バックエンドが のようなMBaaS の場合、自動テスト専用のサーバインスタンスを準備 して実現できることも(ncmbでは追加費用なし)
  13. 13. テストレベル
  14. 14. ユニットテスト(1/2) • XCTestを使用する(Xcode 5より導入)
 Edit -> Add Target -> iOS Unit Testing Bundle を選択してテストターゲットを追加する • MVCのM(Model)を中心に、原則自動化すべき。
 ただし無理にカバレッジを追わない。 ViewControllerやAppDelegateのテストは困難。
  15. 15. ユニットテスト(2/2) • OCMock, OCHamcrest, Kiwiなどの補助ツール • バックエンドが のような MBaaSの場合、SDKをMock化してテスト • バックエンドのAPIを直接呼び出す場合は、スタブ サーバを利用する
 NLTHTTPStubServer, OHHTTPStubs, Nocilla
  16. 16. テストレベル
  17. 17. 統合テスト • iOSアプリ開発ではユニットテストとの明確な境目 はないが、『UIを操作すること』を境界と仮定。 • XCTestを使用することで、カバレジ計測、CIまで、 まとめて実行できる • 自動化ツール:
 - これまでは、KIF(Keep It Functional)
 - Xcode 7からは、iOS UI Testing Bundle
  18. 18. 参考: Hermetic Servers • End to Endでなく、ユニットテストのようにDIや Mock/Stubを使うでもなく、Hermetic Serverと呼 ぶモックサーバを使用してテストを自動化する。 Hermetic==気密 • 統合テストレベルの機能テスト自動化と相性が良い • 出典はGoogle testing blog
 http://googletesting.blogspot.jp/2012/10/ hermetic-servers.html
  19. 19. 参考: テストタイプ • テスト活動をまとめたもの • たとえば、機能テスト、使用性テスト、回帰テスト など、特定のテスト目的に焦点を当てたもの • 一つ又は複数のテストレベルで行なわれる 『ISTQB ソフトウェアテスト標準用語集 日本語版』より引用
  20. 20. 結局、UIテストはどこで? • システムテストレベルでの自動化はスモークテスト にとどめる。もしくはBDD。 • UI操作を伴なう機能テストは統合テストレベル中心 に行なうのがよさそう
 (iOS UI Testing Bundle + Hermetic Servers) • それでも限界はある。あきらめ、割り切りは必要。
  21. 21. UI Testing API
  22. 22. UI Testing API • XCTestに追加された、UI操作を行なうクラス • XCUIApplication • XCUIElement • XCUIElementQuery • Editor -> Add Target -> iOS UI Testing Bundle でテストターゲットを追加
  23. 23. XCUIApplication • XCUIElementのサブクラス • let app = XCUIApplication()
 app.launch()
 で、テスト対象アプリを起動 • app.terminate() で停止 • launchArguments, launchEnvironmentを設定で きる(未確認)
  24. 24. XCUIElement • let addButton = app.buttons[ Add ]
 //ヒエラルキからAddボタンを探して取得
 //指定はAccessibility identifier, label, title, etc.. • addButton.tap()
 //Addボタンをタップ • XCAssertEqual(app.tables.cells.count, 1)
 //UITableCellの数を取得、1個であればok
  25. 25. XCUIElementQuery(1/2) • let allButtons =
 app.descendantsMatchingType(.Button)
 //すべてのButtonのサブクラス • let tomCells = app.cells.containingType(
 .StaticText, identifier: Tom )
 //ラベル Tom を持つすべてのUITableViewCell • XCAssertEqual(tomCells.count, 2)
 //Cellの数が2であればok
  26. 26. XCUIElementQuery(2/2) • XCUIElementを取り出すには、例えば、
 tomCells.elementAtIndex(0) • ヒエラルキのパスを正しく指定する必要はない(チェ インを って検索してくれる) • wait/sleepを考慮する必要がない。適宜waitしてUI エレメントを探してくれる
  27. 27. UI recording
  28. 28. UI recording(1/2) • テストメソッドにカーソルが置かれた状態で、エディ タ下の赤丸(Record UI Test)をクリック • iOSシミュレータでアプリが起動し、アプリに対す る操作がテストコードに反映される
  29. 29. UI recording(2/2) Record UI Test UI Testing in Xcode (WWDC 2015 Video) より
  30. 30. Code coverage
  31. 31. Code coverage New Features in Xcode 7 より • スキーム設定でチェックをonにするだけで、以降のテスト実行で コードカバレジが採取できる • 結果はReport Navigatorで確認できる。ファイル出力について は未調査
  32. 32. Test Reports
  33. 33. Test Reports(1/3) • Report Navigatorを選択すると、テストの結果、 カバレジ、ログが参照できる UI Testing in Xcode (WWDC 2015 Video) より Report Navigator
  34. 34. Test Reports(2/3) • UI Testの場合、操作ステップごとの詳細まで確認できる UI Testing in Xcode (WWDC 2015 Video) より
  35. 35. Test Reports(3/3) • ステップごとにスクリーンショットが撮影・保管さ れており、目のマークをクリックすると表示される UI Testing in Xcode (WWDC 2015 Video) より
  36. 36. まとめ
  37. 37. まとめ • UI Testing APIは、統合レベルのUIテスト自動化フ レームワークとして、KIFの代わりになりうる • UI Testing APIとUI recordingにより、統合テスト レベルのUIテスト自動化コストが低減されそう • ただし、UIテストの自動化は、実行時間がかかる、 メンテコストもかかる点を忘れない。
 iOS 8.x以下での回帰テストをどうするかも考慮。
  38. 38. 参考 • UI Testing in Xcode (WWDC 2015 Video) • Testing with Xcode • New Features in Xcode 7

×