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

38
Xcode 7における UIテストとカバレジ計測 2015.07.11 #yidev 第20回勉強会 @nowsprinting / Koji Hasegawa

Upload: koji-hasegawa

Post on 07-Aug-2015

1.687 views

Category:

Software


3 download

TRANSCRIPT

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

Xcode 7における UIテストとカバレジ計測

2015.07.11 #yidev 第20回勉強会 @nowsprinting / Koji Hasegawa

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

自己紹介• id: @nowsprinting

• フリーランス(iOS/Androidアプリ受託開発)

• アプリ『山吹色の茸疾走』『フットサル ルールと雑学』『電エースQuiz - 河崎実監督と特撮映画の世界』

• コミュニティ:テスト自動化研究会、Androidテスト部、VR部

• エバンジェリスト

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

著書

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

アジェンダ• UIテストの位置づけ

• UI Testing API

• UI recording

• Code coverage

• Test Reports

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

UIテストの位置づけ

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

テストレベル

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

テストレベル

テスト工程

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

テストレベル

テスト工程

結合度

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

テストレベル

開発者

QA

顧客

誰が実施するか、という区切り方

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

テストレベル

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

システムテスト(1/2)• アプリ(.ipa)を端末にインストールし、UIを操作する(リリースビルド、proguard)

• サーバと通信する場合、ステージングもしくはプロダクション環境を使用する(End to End)

• 一般に、独立したテストチーム(QA)が行なう

(ISTQBにおける定義)

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

システムテスト(2/2)• 自動化ツール:UI Automation, MonkeyTalk, Calabash, Appium

• E2Eなので、日時、天気、株価、為替、乱数など、自動テストで成否判定が困難となる要因が多い

• バックエンドが のようなMBaaSの場合、自動テスト専用のサーバインスタンスを準備して実現できることも(ncmbでは追加費用なし)

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

テストレベル

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

ユニットテスト(1/2)• XCTestを使用する(Xcode 5より導入)Edit -> Add Target -> “iOS Unit Testing Bundle” を選択してテストターゲットを追加する

• MVCのM(Model)を中心に、原則自動化すべき。 ただし無理にカバレッジを追わない。ViewControllerやAppDelegateのテストは困難。

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

ユニットテスト(2/2)

• OCMock, OCHamcrest, Kiwiなどの補助ツール

• バックエンドが のようなMBaaSの場合、SDKをMock化してテスト

• バックエンドのAPIを直接呼び出す場合は、スタブサーバを利用するNLTHTTPStubServer, OHHTTPStubs, Nocilla

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

テストレベル

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

統合テスト• iOSアプリ開発ではユニットテストとの明確な境目はないが、『UIを操作すること』を境界と仮定。

• XCTestを使用することで、カバレジ計測、CIまで、まとめて実行できる

• 自動化ツール:- これまでは、KIF(Keep It Functional) - Xcode 7からは、iOS UI Testing Bundle

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

参考: 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回勉強会

参考: テストタイプ• テスト活動をまとめたもの

• たとえば、機能テスト、使用性テスト、回帰テストなど、特定のテスト目的に焦点を当てたもの

• 一つ又は複数のテストレベルで行なわれる

『ISTQB ソフトウェアテスト標準用語集 日本語版』より引用

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

結局、UIテストはどこで?• システムテストレベルでの自動化はスモークテストにとどめる。もしくはBDD。

• UI操作を伴なう機能テストは統合テストレベル中心に行なうのがよさそう(iOS UI Testing Bundle + Hermetic Servers)

• それでも限界はある。あきらめ、割り切りは必要。

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

UI Testing API

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

UI Testing API• XCTestに追加された、UI操作を行なうクラス

• XCUIApplication

• XCUIElement

• XCUIElementQuery

• Editor -> Add Target -> “iOS UI Testing Bundle” でテストターゲットを追加

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

XCUIApplication• XCUIElementのサブクラス

• let app = XCUIApplication()app.launch() で、テスト対象アプリを起動

• app.terminate() で停止

• launchArguments, launchEnvironmentを設定できる(未確認)

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

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回勉強会

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回勉強会

XCUIElementQuery(2/2)• XCUIElementを取り出すには、例えば、tomCells.elementAtIndex(0)

• ヒエラルキのパスを正しく指定する必要はない(チェインを辿って検索してくれる)

• wait/sleepを考慮する必要がない。適宜waitしてUIエレメントを探してくれる

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

UI recording

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

UI recording(1/2)

• テストメソッドにカーソルが置かれた状態で、エディタ下の赤丸(Record UI Test)をクリック

• iOSシミュレータでアプリが起動し、アプリに対する操作がテストコードに反映される

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

UI recording(2/2)

Record UI Test

UI Testing in Xcode (WWDC 2015 Video) より

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

Code coverage

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

Code coverage

New Features in Xcode 7 より

• スキーム設定でチェックをonにするだけで、以降のテスト実行でコードカバレジが採取できる

• 結果はReport Navigatorで確認できる。ファイル出力については未調査

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

Test Reports

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

Test Reports(1/3)• Report Navigatorを選択すると、テストの結果、カバレジ、ログが参照できる

UI Testing in Xcode (WWDC 2015 Video) より

Report Navigator

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

Test Reports(2/3)• UI Testの場合、操作ステップごとの詳細まで確認できる

UI Testing in Xcode (WWDC 2015 Video) より

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

Test Reports(3/3)• ステップごとにスクリーンショットが撮影・保管されており、目のマークをクリックすると表示される

UI Testing in Xcode (WWDC 2015 Video) より

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

まとめ

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

まとめ• UI Testing APIは、統合レベルのUIテスト自動化フレームワークとして、KIFの代わりになりうる

• UI Testing APIとUI recordingにより、統合テストレベルのUIテスト自動化コストが低減されそう

• ただし、UIテストの自動化は、実行時間がかかる、メンテコストもかかる点を忘れない。iOS 8.x以下での回帰テストをどうするかも考慮。