670 Views
November 25, 15
スライド概要
2015/11/20 開催のQues vol.7( #ques7 )での講演「事例 アジャイルと自動化」の後半部分の資料です
ヤフオク!アプリでの自動テストの事例紹介です
This is a slide of "Example of Agile and Test Automation" that used by Ques vol.7( #ques7 ) 11/20/2015
2023年10月からSpeaker Deckに移行しました。最新情報はこちらをご覧ください。 https://speakerdeck.com/lycorptech_jp
ヤフオク!アプリでの ⾃自動テストの事例例紹介 ヤフー株式会社 ⻘青野彰太朗 1
⾃自⼰己紹介 • ⻘青野彰太朗 • Androidエンジニア • Webエンジニア • 開発チームのスクラムマスター • @shota_̲low 2
今⽇日お話することの概要 1.⾃自動テストを導⼊入した経緯 2.導⼊入時のノウハウ 3.導⼊入後の結果 4.今後の予定 3
http://topic.auctions.yahoo.co.jp/mobile/app/promo/ 4
本資料料での ⾃自動テスト = UIテスト 5
1.⾃自動テストを導⼊入した経緯 6
2015年年4⽉月当時に困っていた問題 • 特定の画⾯面を開くと100%クラッシュ • 古い端末やOSで起動すると100%クラッシュ リリース後に発覚 7
アプリのリリース前テスト • 関係者全員がアプリを実際に触ってテスト • 1999年年からある歴史あるサービス • -‐‑‒>画⾯面/条件/機能が多岐にわたり、確認漏漏れ がどうしても発⽣生してしまう状況 8
Androidの場合 • 即時に修正版をリリース可能 • 段階的公開機能を使⽤用(5%-‐‑‒>20%-‐‑‒>100%) • リリースする割合をコントロールできる 被害は最⼩小限に留留めることが可能 9
iOSの場合 • 即時に修正しても審査が必要 • 審査期間は不不確実 • 公開範囲をAndroidのように指定できない 致命的 10
困った… 11 写真:アフロ
そんなときに • 社内のテスト⽀支援チームからお声がけいただく テスト⾃自動化 しませんか? 12
テスト⽀支援チームと 協⼒力力して導⼊入することに 13
2.導⼊入時のノウハウ 14
解決したいこと • まずはiOSにフォーカス • 致命的なクラッシュはリリース前に検知したい • 主要画⾯面は網羅羅してテストしたい • 古いOSでのテストも実⾏行行したい • iOS9対応に間に合うようにしたい 15
⾃自動テストツールの選択 • UI Automation • UI Testing • Appium • Calabash-‐‑‒iOS • KIF • Remote TestKit 16
⾃自動テストツールの選択 • UI Automation • UI Testing • Appium • Calabash-‐‑‒iOS • KIF • Remote TestKit 17
Appiumを選択 http://appium.io/ 18
Appiumを選択した理理由(1) • OSSの更更新頻度度が⾼高い • 企業サポートも付いているため、将来性がある • ライセンスが社内でも使い易易い • -‐‑‒>Apache License, Version 2.0 19
Appiumを選択した理理由(2) • クライントが複数⾔言語に対応している • GUIツールがわかりやすくインスペクターがある • iOS、Android両⽅方対応している • テスト対象のアプリには⼿手を加える必要がない 20
他のツールについて UI Automation • ⾔言語がJS固定 、instrument上での作業に慣れが必要 • 実際はAppiumはこれを内部で利利⽤用しているラッパー 21
他のツールについて UI Testing • まだ実装間もないため、ノウハウが蓄積されておら ず、機能的にもまだ不不⼗十分。 • 新製品の宿命であるバグの懸念念があった 22
他のツールについて Calabash-‐‑‒iOS • Xpath取得のために都度度コマンドを叩く必要がある • 開発がほぼ⽌止まっており、iOS9サポートなどが期待で きなかった • 公式リファレンスが不不⼗十分であり、込み⼊入ったことす るためにはソースを読む必要がある 23
他のツールについて KIF • objective-‐‑‒cで書けるためiOSエンジニアのみが使う場合 は良良いが、Androidエンジニアにはハードルが⾼高い • 公式リファレンスが不不⼗十分であり、込み⼊入ったことする ためにはソースを読む必要がある • nameで指定されていないと取れない. xpath で取るため の⽅方法が不不明 24
他のツールについて Remote TestKit • テストフレームワークではないが、クラウド系に代表されるテス ト環境ツール • これだけあっても⾃自動化はできない. テスト実⾏行行+テスト環境を 揃える必要がある • 実⾏行行モジュールを外部へ⼀一時的に送ることになるため、社内フ ローを作るところから始める必要があり、ミニマムスタートにそ ぐわない 25
テストコードの⾔言語の選択 • Java • JavaScript(Node.js) • Python • Ruby • Perl • PHP 26
テストコードの⾔言語の選択 • Java • JavaScript(Node.js) • Python • Ruby • Perl • PHP 27
Pythonを選択 • チーム内で話し合って決定 • 経験者が多かった • 誰が書いても読みやすそう • とりあえずPythonでやってみよう 28
対象画⾯面の決定 • 全画⾯面を対応するのは⾮非現実的 • 主要機能の画⾯面から優先度度をつけて対応 • -‐‑‒>出品、⼊入札、検索索など 29
⾃自動テストの概要 github Mac ファイルサーバ シミュレータ 社内チャットツール 30
⾃自動テストの概要 github Mac (1)gitからclone ファイルサーバ シミュレータ 社内チャットツール 31
⾃自動テストの概要 github Mac (2)cloneしたファイルをビルド ファイルサーバ シミュレータ 社内チャットツール 32
⾃自動テストの概要 github Mac (3)UIテストの実⾏行行 ファイルサーバ シミュレータ 社内チャットツール 33
⾃自動テストの概要 github Mac (3-‐‑‒1)シミュレータのスクリーン ショットをファイルサーバに保存 ファイルサーバ シミュレータ 社内チャットツール 34
⾃自動テストの概要 github Mac ファイルサーバ (3-‐‑‒2)Appiumでシミュレーターに 表⽰示されているXMLを取得 シミュレータ 社内チャットツール 35
⾃自動テストの概要 github Mac (3-‐‑‒3)XMLを解析し、 表⽰示されている要素に対し、 クリックやテキスト⼊入⼒力力を⾏行行う ファイルサーバ シミュレータ 社内チャットツール 36
⾃自動テストの概要 github Mac (3-‐‑‒1)シミュレータのスクリーン ショットをファイルサーバに保存 ファイルサーバ (3-‐‑‒2)Appiumでシミュレーターに 表⽰示されているXMLを取得 (3-‐‑‒3)XMLを解析し、表⽰示されている要素に対し、 クリックやテキスト⼊入⼒力力を⾏行行う (4)(3-‐‑‒1)〜~(3-‐‑‒3)を繰り返す 37 シミュレータ 社内チャットツール
⾃自動テストの概要 github Mac ファイルサーバ シミュレータ (5)テスト結果とスクリーンショットを 社内チャットへ通知 38 社内チャットツール
開発時の苦労話(1) • Appiumが不不安定 • -‐‑‒>UI要素の取得に失敗することが多々ある • -‐‑‒>マシンによっては処理理の同期が取れず、テスト失 敗してしまうことがある → ⾃自前で同期処理理を書いて 対応 39
開発時の苦労話(2) • デバッグに時間がかかる • アプリのUI要素にIDが振られていなかったので、1つ 1つxpathを取得する作業が⼤大変 • 画⾯面の修正が⼊入ると、xpathが変わってしまう可能性 があり、その度度に修正が必要 → 覚悟はしていたがやっ ぱり⼤大変 40
開発時の苦労話(3) • Pythonでの実装が結構⼤大変 • -‐‑‒>unit testのドキュメントが少なく、実装⽅方法を試 ⾏行行錯誤 • -‐‑‒>デバッグしやすい⾔言語、使⽤用するライブラリのド キュメントが豊富な⾔言語等がないか、もう少し検討す るべきだった? 41
開発時の苦労話(4) • Pythonでの実装が結構⼤大変 • -‐‑‒>結局⾃自分たちで「Appiumサーバー+unit test」の フレームワークを作ることになった • -‐‑‒>メタプログラミングをサポートしている⾔言語を使 うことで、ある程度度内部処理理を抽象化できた→ソース コードの可読性◯ 42
開発時の苦労話(5) • iOS9で、アラートダイアログやキーボード⼊入⼒力力の xpath構造が変更更されてしまった → 該当箇所を全て修 正 • AppiumのiOS9の対応が遅く(1週間程度度)、iOS9リ リース前に直接appiumのライブラリを修正しないとい けなかった 43
3.導⼊入後の結果 44
解決したかったことのおさらい • まずはiOSにフォーカス • 致命的なクラッシュはリリース前に検知したい • 主要画⾯面は網羅羅してテストしたい • 古いOSでのテストも実⾏行行したい • iOS9対応に間に合うようにしたい 45
まずはiOSにフォーカス iOSで⾃自動テストが実⾏行行できるようになった できた 46
致命的なクラッシュはリリース前に検知したい リリース後の致命的なクラッシュはゼロ できた 47
主要画⾯面は網羅羅してテストしたい 約9割の画⾯面を⾃自動テストでカバー できた 48
古いOSでのテストも実⾏行行したい サポート対象内のiOS7で実⾏行行できていない XCode7からiOS7がdeprecated ここは⼿手動での確認でカバーしている できていない 49
iOS9対応に間に合うようにしたい ⾃自動テストを実⾏行行して動作を担保することができました できた 50
やってよかった!! 51 写真:アフロ
現状の運⽤用 • • 毎⽇日1回定期実⾏行行 • ⽇日々更更新される開発⽤用ブランチが対象 • リリース前はリリース⽤用ブランチを対象に実⾏行行 テストに失敗した場合 • 理理由はすぐに調査 • プロダクトバックログに積んでスプリント内で解消 52
4.今後の予定 53
今後の予定 • CIツールとの連携 • ⾃自動テストのバリエーションを増やす • 任意タイミング/任意リポジトリ/任意シナリオ… • 処理理の⾼高速化/並列列化 • Androidについても対応を進める(Espresso) 54
まとめ • ⽀支援という形で背中を押していただくことがきっかけ • 形になるまでは試⾏行行錯誤の連続 • ⼿手動によるテスト+毎⽇日の⾃自動テスト = 安⼼心 • より恩恵を受けるための作業はまだ沢⼭山ある • 今回の事例例を、導⼊入のネタとして使ってください:) 55
⼀一緒に働く仲間募集中! 56