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