iOSアプリ 
UIテスト自動化入門 
~AppiumによるE2Eテスト~
agenda 
• 前提知識 
• OS標準のUIテストツール 
• Appiumとは 
• 今後の展開
前提知識 
Ruby 
Bundler 
Gem 
RSpec 
Cucumber 
Turnip 
Gherkin 
BDD 
UIAutomation 
Tuneup.js 
uiautomator 
Javascript 
Node.js 
npm 
Selenium
UIテストどうしてます?
目視
スクリーンショット 
(手動)をExcelに
ある人は言いました
これはもう人類のやる作業 
じゃないよね
自動化しましょう
UIAutomation 
iOSアプリ開発の標準ツールInstrumentsのテンプ 
レートの一つ、UIの操作をjavascriptでレコード 
し、iPhoneSimulator及びiPhone実機で操作を追 
実行出来る。スクリーンショットなども取れる。 
https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/ 
UsingtheAutomationInstrument/UsingtheAutomationInstrument.html#//apple_ref/doc/uid/TP40004652-CH20 
https://developer.apple.com/library/ios/documentation/DeveloperTools/Reference/UIAutomationRef/ 
_index.html#//apple_ref/doc/uid/TP40009771
使い勝手を良くする為の 
フレームワークもあります。
Turneup JS
Turneup JS 
UIAutomationのコードを素のまま書くと 
ちょっと冗長になので、その点を補完されて 
いる。jsライブラリ 
http://www.tuneupjs.org
iOSだけ?
UIテスト自動化ツールは 
Android標準もあります。
uiautomator
また新しいツール使い方覚え 
なきゃいけないの?
ある程度は仕方ない
既存のテスティングフレーム 
ワークを使えないの?
既存のテスティングフレーム 
ワークって?
xUnit系(JUnit、OCUnit、NUnit)、 
BDD系(RSpec,Cucumebr)
慣れたツール・言語でやれる 
に越したことはないよね?
こっから今日の本題
Appium
Appium 
iOS/AndroidのUIテスト自動化ツール、 
Selenium WebDriverを使用している為、 
Web系の開発でSeleniumを使ってた人は 
比較的導入が楽。
Appiumの構成
Appiumのイイトコ 
・リリースビルドのバイナリを使える。 
アプリにSDKの埋め込みをする必要がありません。 
・言語・テスティングフレームワークが自由
Appiumのビミョーなトコ 
・ちょっと遅い 
・Selenium WebDriverの知識必須
Turnip 
Turnip は、受け入れテストのフレームワークである Cucumber によって整備 
されてきた feature ファイルと step_definitions ファイルの構成 (Gherkin 書 
式) を RSpec 内でテスト実行することができる新鋭のライブラリで、 
Cucumber の改善案として提案されました。Cucumberの後継としてWeb シ 
ステムでのエンドツーエンドのテストを自動化する際に利用できます。 
Cucumber の問題点を改善して実装されている筋の良さで、今後の普及が期 
待されています。(下記リンクから抜粋) 
http://magazine.rubyist.net/?0042-FromCucumberToTurnip
http://www.slideshare.net/KazuMatsu/20141018-selenium-appiumcookpad
Scenario 
機能: UI操作テスト 
Appiumの操作を理解する為にアプリでよくある操作を行ってみます。 
シナリオ: スイッチを操作する 
* "Switches" をタップ 
* 1 番目のスイッチをON 
* 2 番目のスイッチをOFF 
* 戻る 
シナリオ: スライダーを操作する 
* "Sliders" をタップ 
* 1 番目のスライダーに 80 %を指定 
* 戻る 
シナリオ: 日付ピッカーを操作する 
* "Date Picker" をタップ 
* 日付ピッカーに "2014/11/25 12:23:55" を指定 
* 戻る
Step 
#タップ 
step ":name をタップ" do |name| 
find(name).click 
end 
#スイッチ 
step ":index 番目のスイッチをON" do |index| 
sleep 0.5 
ele_index('UIASwitch',index.to_i).send_keys("1") 
end 
#DatePicker操作 
step "日付ピッカーに :dateTime を指定" do |dateTime| 
sleep 0.5 
pickerDate = tags("UIAPickerWheel")[0] 
pickerHour = tags("UIAPickerWheel")[1] 
pickerMinute = tags("UIAPickerWheel")[2] 
pickerAmPm = tags("UIAPickerWheel")[3] 
date = DateTime.strptime(dateTime,"%Y/%m/%d %H:%M:%S") 
pickerDate.send_keys(date.strftime("%Y/%m/%d %H:%M:%S")) 
pickerHour.send_keys(date.hour.to_s) 
pickerMinute.send_keys(date.minute.to_s) 
pickerAmPm.send_keys(date.strftime("%p")) 
end
demo
学習コスト
Stepの作成する場合は結構手間
Scenarioが書ければいい
今後の予定 
・ImageMagickでスクリーンショットの差分画像作 
成の自動化 
・Jenkins、Grunt、gulpと組み合わせる 
・hubot等のChatOpsからの実行 
・Androidで同じシナリオを実行する
以上 
ご静聴ありがとうございました。

iOSアプリ UIテスト自動化入門