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

事例 アジャイルと自動化 後半(ヤフオク!アプリでの自動テストの事例紹介) at Ques vol.7( #ques7 ) 11/20/2015

302
-1

Published on

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

Published in: Technology

事例 アジャイルと自動化 後半(ヤフオク!アプリでの自動テストの事例紹介) at Ques vol.7( #ques7 ) 11/20/2015

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

    Clipping is a handy way to collect important slides you want to go back to later.

×