SlideShare a Scribd company logo
クックパッドアプリの開発を支援する 
Appiumの話し 
2014/10/18 
第2回 日本Seleniumユーザーコミュニティ勉強
私 
• 松尾和昭 
• テストエンジニア at Cookpad 
• Twitter: @Kazu_cocoa 
! 
• 関連 
• JaSST’14 Hokkaido 
• 『モバイルアプリ開発体制の継続的改善』
20141018 selenium appium_cookpad
20141018 selenium appium_cookpad
Appium
第1回日本Seleniumユーザーコミュニティ勉強会 
http://www.slideshare.net/hugs/selenium-appium
20141018 selenium appium_cookpad
Web Page: http://appium.io/ 
GitHub: https://github.com/appium/appium
参照: http://www.3pillarglobal.com/insights/appium-a-cross-browser-mobile-automation-tool
UIAutomation 
uiautomator 
(API 16 (Android 4.1) or higher)
Philosophy
20141018 selenium appium_cookpad
MVCなどで切り分けて 
テストしにくい
描画要素をテスト 
SDK + 専用ビルド
「SDK+専用ビルド」は 
リリースされない
SDK+専用ビルド 
+ 
リリースビルド
リリースビルド + Appium
リリースモジュールを 
テストする
20141018 selenium appium_cookpad
自分たちの開発環境に、 
Appiumを統合する
20141018 selenium appium_cookpad
Ruby + RSpec + Turnip 
ImageMagick or perceptualdiff 
Selenium Grid 
! 
目的に見合ったツール群の組み合わせ
よいとこ 
! 
よくはない
よいとこ 
• リリースビルドをテスト可能 
• 多彩なツールの組み合わせ 
• Appiumはあくまでもアプリ操作 
• 黒魔術を使わないのでOSの変化に追従しやすそう
よくはない 
• 実例がない 
• 実行に時間がかかる 
• 工夫が必要 
• 誰もがAppiumを使える環境の構築が手間 
• 社内に広げるきっかけの妨げ
Cookpadにおける活用事例
私の今の立ち位置 
• テストエンジニア 
• Android / iOS アプリ 
• 開発行程の改善 
• テストに関わる社内への情報伝搬
iOS クックパッドアプリ 
• ネイティブアプリ 
• UIの修正が頻繁 
• 修正規模の大小はあるが 
• 約2週間毎のAppStoreへのサブミット 
• 実装は数人のチーム
テストレベル 
Web API
リリース工程 
企画期間開発期間 
検証期間 
master branch 
release branch
Appiumを使うタイミング
企画期間開発期間 
master branch 
検証期間 
release branch
主な確認対象 
• 画面遷移 
• レイアウト崩れ
テストケース数と時間 
• テストケース数 
• 100ケース/1capability 
• Capability 
• 2 ~ 3 種類 
• 1種類にかかる時間 
• 1時間 
今の開発周期ではこの時 
間で十分なので、これ以上は 
頑張っていない
工夫
変化への追従
• 使い始めた当初は、Appium 1.0.0 よりも前 
• 修正が入る可能性が大いにある 
• 実行シナリオは変更したくない 
• テストケースの変更にのみ依存するようにしたい 
• 具体的な実装からは切り離したい
責務の分離 
シナリオ 
.feature 
実装コード 
*_steps.rb 
ラッパー 
.rb 
appium_lib 
Appium 
シナリオ変更の吸収Appium
役割 
シナリオ 
.feature 
実装コード 
*_steps.rb 
ラッパー 
.rb 
appium_lib 
Appium 
シナリオ変更の吸収Appium 
シナリオの修正に 
のみ追従したいAppium側の修正を、 
シナリオから分離したい 
Appium側の 
修正に依存
$ rspec
login.feature 
hs|				|_YMcWRdCG= 
||Z^bTQS]aRd 
||_YMEOFOeKNQUSd]IcWRdDNAJ?I@N 
||||pr|%5*$|ImiPj 
|||||421!23342|_YIcWRdDN 
|||||fxL|70$3%|?toBOH=N 
|||||[VbdZ`]P|2$1.2)/3|J=wpIkN 
! 
||{ 
||||:|%5*$|||:|421!23342||:|||70$3%|||||:|2$1.2)/3|: 
||||:|*0)/.|:|X[]|||||:|gqDNun|:|$0341
|: 
||||:|*0)/.|:|vz|||||||:|gqDNun|:|$0341|: 
||||:|*0)/.|:|yz|||||||:|gqDNun|:|$0341
|:
login_steps.rb -/%4,|2302 
||230|lM|$$/4.3|J|022|IcWRdDN|%/|:$$/4.3|022: 
||||,-.32||373'*,%2 
||||,-.32	 2.%!+82|$$/4.3 
||||,-.32
 2.%!+82|022 
||||#433/.cWRd$,*$+ 
||.% 
! 
||230|lM|421|_YIcWRdDN|%/|:421: 
||||*'|421||vz 
||||||$$/4.3||!! 
||||||022||!! 
||||,2*'|421||yz 
||||||$$/4.3||!! 
||||||022||!! 
||||,2 
||||||$$/4.3|| 
||||||022|| 
||||.% 
||||2.%|lM|$$/4.3|J|022|IcWRdDN|$$/4.3|022 
||.% 
! 
||230|[VbdZ`]P|'*,.-|J=wpIkN|%/|:'*,.-: 
||||25!2$1.!6*3)!
!2'*,.- 
||.% 
! 
||230|fxL|.-|?toBOH=N|%/|:.-: 
||||2,0|
 
||||70$3|6*3|9|'*.%!,-.3$$22*#*,*38!*%|.-|;%*20,8%|3/|#|314 
||.% 
.%
薄いラッパー層 
-/%4,|00*4-2341 
|||'*.%|,-.3|6*3)|$$22*#*,*38!*%|2313(8 
||%'|30!.-,-.3!.- 
||||2,0|	
 
||||'*.%!,-.3$$22*#*,*38!*%|,-.3!.-$,*$+ 
||.% 
! 
|||'*.%|,-.3|6*3)|703)|2313(8 
||%'|30!703),-.3!703) 
||||2,0|	
 
||||'*.%!,-.3703)|,-.3!703)$,*$+ 
||.% 
! 
||%'|30!373373!.- 
||||2,0|	
 
||||373373!.-$,*$+ 
||.% 
.%
Ruby 
コード 
JavaScript
どんなテストをAppiumに 
任せるか
機械が実行可能なタスクは 
機械に任せる
人が忘れがちなシナリオは 
機械に任せる
シナリオの統合/作り替え
• アカウントの状態に依存しない処理はアカウントの 
各状態ではシナリオを用意しない 
• 複数の操作を1つのシナリオで内包できる場合、内 
包させ、テストケースを削減 
• 他の手段(UIから確認しなくても良い方法に対応し 
たなど)が見つかったシナリオは削除、もしくは操 
作を限定
機械が実施していない領域を 
探索的にテスト
• 機能 
• 状態が関係するような複雑性を増した手順 
• 非機能 
• ユーザビリティ 
• ISO 2941 
• Context of use 
など
これまでの成果 
• 検証期間中のタスク内容の変化 
• 致命的な不具合の検出(落ちバグ系) 
• Crashlytics/お問い合わせによるク 
ラッシュ系不具合、不具合報告が減少
これからの課題 
• Appiumを使っているところ 
• iOS8対応 
• Androidのシナリオ充実 
• 社内への他アプリへの展開 
• モバイルアプリの評価自体 
• 評価体制のスケール
まとめ 
• Appium 
• Android / iOS (FireFox) 
• ツールの組み合わせ 
• よいとこ / よくないとこ 
• Cookpadでの活用事例

More Related Content

20141018 selenium appium_cookpad