スマートフォンアプリ開発
と自動化
∼なじむ。実に!なじむぞ!∼
2014.06.28 Asian Automation Alliance
@nowsprinting/Koji Hasegawa
自己紹介
• @nowsprinting/Koji Hasegawa	

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

• テスト自動化研究会、Androidテスト部	

• 山吹色の茸疾走(Android)、フットサル
ルールと雑学(iOS)、電エースQuiz(iOS)
著書
アジェンダ
• アプリ開発における課題	

• ビルド、デリバリの自動化	

• テストの自動化	

• まとめ
アプリ開発における
課題
アプリ開発における課題
• テスト対象OSバージョン、機種が多い

(古いものがなかなか切れない)	

• 新OSバージョン、新機種への対応	

• ビルドの種類が多い
ビルドの種類が多い
• ステージング、プロダクション

アプリの接続先ごとに識別子を変え、別
アプリとして端末にインストールしたい	

• Debug、Release

ログ出力、証明書などの切り替え	

• テストツールのエージェントをバンドル
手動ビルドの限界
• 入門書にはIDE(GUI)でのビルド方法が
書かれている	

• 設定を切り替えてビルドを繰り返す?	

• 手順書を作っても、IDEのGUIが変わる
し、人間はオペミスする
手動デリバリの限界
• QA担当者、顧客のUAT担当者、ベータ
テスター向けのビルドを配布	

• 端末をUSBでつないでインストール、

端末をUSBでつないでインストール、

端末をUSBでつないでインストール、

…
手動回帰テストの限界
• エンハンス時の回帰テスト	

• 複数OS/機種でのテスト実行(ISTQBによ
るとこれも回帰テスト)	

• 手作業での同じテストの繰り返し、オペ
ミス、見落とし

→人間の(集中力の)限界
ビルド、デリバリの
自動化
ビルドの自動化
• iOS	

• Build Target/Configurationで設定の異な
るビルドを定義できる	

• xcodebuildコマンドでビルド	

• JenkinsではXcodeプラグイン
ビルドの自動化
• Android	

• 新ビルドシステム(Gradle plugin for
Android)では、Build Flavor/Typeで設定
の異なるビルドを定義できる	

• gradleコマンドでビルド
CIツール
• Jenkins	

• OS X Server/Bots(複数OS/機種での実行
もサポート)	

• Travis CI	

• language: objective-cでMac OS X	

• language: androidでAndroid(beta)
OS X Server/Bots
デリバリの自動化
• QA担当者、顧客のUAT担当者、ベータ
テスター向けのビルドをAPIでアップ
ロード、OTAでデリバリ	

• TestFlight(iOSのみ)	

• DeployGate(iOS/Android)
ただし、リリースの自動化は…
• App Store/Google Play Storeへのリリース
は自動化できていない(APIは無く、UI
も突然変更される)	

• ビルドスクリプトでファイル名の中にバー
ジョン番号を入れるなど、オペミスを防
ぐ工夫はするべき
テストの自動化
ユニットテスト
• iOS	

• XCTest, Kiwi(SpecBDD) 	

• OCMock, OCMockit	

• Android	

• JUnit 3 or JUnit 4 + JavaVM + Robolectric	

• Mockito, EasyMockのDalvikサポート
ユニットテスト
• iOS	

• XCTest, Kiwi(SpecBDD)	

• OCMock, OCMonkit	

• Android	

• JUnit 3 or JUnit 4 + JavaVM + Robolectric	

• Mockito, EasyMockのDalvikサポート
自動化しない理由は無い
“L”はARTなので動かない
システムテスト
• 機能テスト(回帰テスト)向けツール	

• ViewのツリーからUIコンポーネントを
扱える、ロバストなテストを書ける	

• Cucumber系(Scenario BDD)	

• ユーザビリティテストは除外(機種ごと
の表示ズレ、トランケートなども含め)
機能テスト向けツール
• iOS	

• XCTestベース:KIF	

• Instrumentsベース:UI Automation,Appium	

• エージェントをバンドル:Frank,
MonkeyTalk
機能テスト向けツール
• Android	

• Unit Testの拡張:Robotium	

• Instrumentベース:uiautomator, Espresso,
Appium	

• エージェントをバンドル:MonkeyTalk
FrankのFeature例
Given I should see a navigation bar titled "Detail"	
When I type "Newton Geizler" into the "name" text	
	 	 	 	 	 	 	 	 	 	 	 field using the keyboard	
And I select gender to "男性"	
And I select age to "35"	
And I navigate back	
Then I wait to see a navigation bar titled "Master"	
And I should see a cell name "Newton Geizler”	
	 	 	 	 	 	 	 	 	 	 	 	 and division "M2層"
MonkeyTalkの例
ユーザビリティテスト
• このあたりから「自動化ハイ」の危険
ユーザビリティテスト
• このあたりから「自動化ハイ」の危険	

• アプリのレイアウト変更、OSバージョン
アップ、機種によって容易に壊れるテス
トは自動化するメリットが少ない
ユーザビリティテスト
• このあたりから「自動化ハイ」の危険	

• アプリのレイアウト変更、OSバージョン
アップ、機種によって容易に壊れるテス
トは自動化するメリットが少ない
吸血鬼は日光に弱いッッ!
のと同じです
ユーザビリティテスト
• 使い心地は、実機を人間が操作して評価	

• 機種ごとの表示ズレ、トランケートも、
機能テストとは分けて評価する	

• ショーストッパーではない	

• スクリーンショットは自動で撮って、
目視確認するなどの工夫はする
メンテナンスコストの意識
• テストのメンテナンスコストまで考えて
無理のない自動化を	

• テスト自動化全般のROI(投資利益率)
については、午後のテスト自動化研究会
セッションをぜひご聴講ください
機能テストでだいたい
まかなえる事例
iOSのUIAlertView
iOS6
iOS7
iOSのUIAlertView
iOS6
iOS7 CLASH!!!
iOSのUIPickerView
iOS6
iOS7
iOSのUIPickerView
iOS6
iOS7 CLASH!!!
その他 iOSの事例 1
CLASH!!!
UIAlertViewを非UIスレッドから表示できてしまっていた
が、正しく例外となるようになった例	

( アプリの潜在不良が顕在化 /iOS3前後くらい?)
AndroidのdrawRect()
Android 4.1
Canvas#drawRect(100,100,10,10);
(10,10)
(100,100)
Android 4.2
AndroidのdrawRect()
Android 4.1
Canvas#drawRect(100,100,10,10);
(10,10)
(100,100)
描画されない!Android 4.2
※left<=right, top<=bottomでないと描画されない仕様
Android機種依存の例 1
一定量のViewヒエラルキー
の上でソフトウェアキーボー
ドが出現するときに
StackOverflowErrorが発生
(某メーカーのAndroid 2.3
搭載端末のみ)
普通の端末
奇妙な端末
Android機種依存の例 2
普通の端末
奇妙な端末
Android機種依存の例 2
まとめ
まとめ
• おれは人間を超越するッ!

自動テストでだァーッ!!	

• スマートフォンアプリ開発と自動化は

なじむ。実に!なじむぞ!	

• 最高に「ハイ!」tt 慢心ダメ絶対
まとめ
• おれは人間を超越するッ!

自動テストでだァーッ!!	

• スマートフォンアプリ開発と自動化は

なじむ。実に!なじむぞ!	

• 最高に「ハイ!」tt 慢心ダメ絶対
まとめ
• おれは人間を超越するッ!

自動テストでだァーッ!!	

• スマートフォンアプリ開発と自動化は

なじむ。実に!なじむぞ!	

• 最高に「ハイ!」tt 慢心ダメ絶対
まとめ
今日お話したこと、iOS
についてはだいたい載っ
てます。	

!
また、某Web媒体でiOS/
Android自動化ツールに
関する連載を準備中です

スマートフォンアプリ開発と自動化 〜なじむ。実に!なじむぞ!〜 #AsianAA