スマートフォンアプリの
テスト自動化をはじめよう

システムテスト自動化カンファレンス2013	

2013.12.1 #stac2013
自己紹介
長谷川 孝二

•
•
•

@nowsprinting (twitter, github, etc...)	


テスト自動化研究会	

Androidテスト部	

iOS/Androidアプリ開発者	


•
•

受託開発(フリーランス)	

自社開発
自己紹介
長谷川 孝二

•
•
•

@nowsprinting (twitter, github, etc...)	


テスト自動化研究会	

Androidテスト部	

iOS/Androidアプリ開発者	


•
•

受託開発(フリーランス)	

自社開発
アジェンダ
• テスト自動化の現状	

• システムテスト自動化のROI	

• システムテスト自動化フレームワークの紹介	

• デモ	

• Tips
テスト自動化の現状
ユニットテスト/iOS
• Xcode標準のOCUnit(SenTestingKit)	

• Xcode5ではXCTest、テスト実行の強化	

• Mac OS 10.9でX Server(Bot)によるCI	

• GHUnit, OCMockなど
モデルのユニットテストは容易
ユニットテスト/Android
• Android Testing Framework(Android SDK
同梱/JUnit3ベース)	


• UI操作を補完するオープンソースフレー
ムワーク(Robotiumなど)	


• Mockito, EasyMock, Robolectricなど
モデルのユニットテストは容易
システムテスト
• iOS/Androidとも自動化ツール/フレーム
ワークは多数存在する(後ほど紹介)	


• UI変更頻度が高い、トランジションアニ
メーション等の重要度が高いが、そのテ
ストは自動化しにくい
システムテスト
• iOS/Androidとも自動化ツール/フレーム
ワークは多数存在する(後ほど紹介)	


• UI変更頻度が高い、トランジションアニ
メーション等の重要度が高いが、そのテ
ストは自動化しにくい
自動化は(現実的に)可能なのか?
システムテスト自動化の
ROI
理想の高い利益
Return

• テスト実行時間の短縮	

• “正しい”画面表示のテスト(Judge)	

• 複数のOSバージョン/機種で実行できる	

• OS/機種依存問題を検出できる
理想の高い利益を	

得るための

投資

Investment

• 自動化ツールの選定/習得	

• 自動化スクリプトの作成(高度なJudgeを
求められる)	


• 自動化スクリプトの保守(同上)	

• テストデータ、スタブサーバの準備
理想の高い利益を	

得るための

投資

Investment

• 自動化ツールの選定/習得	

• 自動化スクリプトの作成(高度なJudgeを
求められる)	


• 自動化スクリプトの保守(同上)	

• テストデータ、スタブサーバの準備
コストの増大、工程遅延、保守の放棄
理想の高い利益
Return

• テスト実行時間の短縮	

• “正しい”画面表示のテスト(Judge)	

• 複数のOSバージョン/機種で実行できる	

• OS/機種依存バグを検出できる
現実的な利益に絞る
Return

• テスト実行時間の短縮	

• “正しい”画面表示のテスト(Judge)	

• 複数のOSバージョン/機種で実行できる	

• OS/機種依存バグを検出できる
“テストの目的”に立ち返る
• 欠陥を摘出する	

• 対象ソフトウェアの品質レベルが十分で
あることを確認する	


• 意思決定のための情報を示す	

• 欠陥の作り込みを防ぐ
※JSTQBシラバスより引用
“テストの目的”に立ち返る
スコープを“回帰テスト”に絞っても満たせるもの

• 欠陥を摘出する	

• 対象ソフトウェアの品質レベルが十分で
あることを確認する	


• 意思決定のための情報を示す	

• 欠陥の作り込みを防ぐ
※JSTQBシラバスより引用
“テストの目的”に立ち返る
対象OS/機種で”とりあえず”動くことが確認できれば

• 欠陥を摘出する	

• 対象ソフトウェアの品質レベルが十分で
あることを確認する	


• 意思決定のための情報を示す	

• 欠陥の作り込みを防ぐ
※JSTQBシラバスより引用
欲張らないROI
• 利益	

• テスト実行時間の短縮	

• 複数OSバージョン/機種で実行できる	

• 投資	

• 自動化ツールの選定/習得	

• 自動化スクリプトの作成/保守(高度な
頑張らないテストスクリプト)	

• テストデータ、スタブサーバの準備
頑張らないテストスクリプト

• 日時、天気、株価、為替、乱数などに
起因するJudgeを無理にはしない	


• レイアウト崩れまでJudgeしようとしない	

• 機種依存の問題を狙ってテストしようと
しない(OS/解像度のフラグメンテー
ションと、機種依存問題は分けて考える)
頑張らないテストスクリプト
ユニットテストでモックを使って実施

• 日時、天気、株価、為替、乱数などに
起因するJudgeを無理にはしない	


• レイアウト崩れまでJudgeしようとしない	

• 機種依存の問題を狙ってテストしようと
しない(OS/解像度のフラグメンテー
ションと、機種依存問題は分けて考える)
頑張らないテストスクリプト
ユニットテストでモックを使って実施

• 日時、天気、株価、為替、乱数などに
起因するJudgeを無理にはしない	

スクリーンショットを目視確認

• レイアウト崩れまでJudgeしようとしない	

• 機種依存の問題を狙ってテストしようと
しない(OS/解像度のフラグメンテー
ションと、機種依存問題は分けて考える)
頑張らないテストスクリプト
ユニットテストでモックを使って実施

• 日時、天気、株価、為替、乱数などに
起因するJudgeを無理にはしない	

スクリーンショットを目視確認

• レイアウト崩れまでJudgeしようとしない	

• 機種依存の問題を狙ってテストしようと
しない(OS/解像度のフラグメンテー
ションと、機種依存問題は分けて考える)
内容次第で手動で確認
頑張らなくても
ここまでできる事例
iOSのUIAlertView
iOS6

iOS7
iOSのUIAlertView
iOS6

iOS7

CLASH!!!
iOSのUIPickerView
iOS6

iOS7
iOSのUIPickerView
iOS6

iOS7

CLASH!!!
その他 iOSの事例 1
CLASH!!!
UIAlertViewを非UIスレッドから表示できてしまっていた
が、正しく例外となるようになった例	

( アプリの潜在不良が顕在化 /iOS3前後くらい?)
その他 iOSの事例 2
何か操作

CLASH!!!

開放/上書きされるはずのインスタンスを参照していた
が、iOSバージョンアップでインスタンスが正しく開放
されるようになった	

(アプリの潜在不良が顕在化)
AndroidのdrawRect()
Canvas#drawRect(100,100,10,10);
(10,10)

Android 4.1
(100,100)

Android 4.2
AndroidのdrawRect()
Canvas#drawRect(100,100,10,10);
(10,10)

Android 4.1
(100,100)

Android 4.2

描画されない!
※left<=right, top<=bottomでないと描画されない仕様
Android機種依存の例 1
一定量のViewヒエラルキー
の上でソフトウェアキーボー
ドが出現するときに
StackOverflowErrorが発生
(某メーカーのAndroid 2.3
搭載端末のみ)
Android機種依存の例 2
普通の端末

奇妙な端末
Android機種依存の例 2
普通の端末

奇妙な端末
押さえておきたいポイント

• 全ての画面は網羅する(エラーケースの

AlertView表示等も含むことが望ましい)	


• CIなどで繰り返し行なう段階であれば、スク
リーンショットの比較はImageMagickなどで
自動化する(但し全てCI化は目指さない)	


• 実行時間も0ではないので、テストケースの
絞り込みは意識する
利益を拡大する
Return
欲張らないROI
• テスト実行時間の短縮	

➡時間と集中力を高度なテストに割り振る	

➡リリース頻度の向上(4∼6週間ごとが理想)	

• 複数OSバージョン/機種で実行できる	

さらにテスト実行環境を増やす。端末の回転、
➡ロケール、タイムゾーン、12h/24h表記、IME
(Android)、文字サイズ(Android 4.0)
利益を拡大する
Return

• テスト実行時間の短縮	

➡時間と集中力を高度なテストに割り振る	

➡リリース頻度の向上(4∼6週間ごとが理想)	

• 複数OSバージョン/機種で実行できる	

さらにテスト実行環境を増やす。端末の回転、
➡ロケール、タイムゾーン、12h/24h表記、IME
(Android)、文字サイズ(Android 4.0)
手動ではできないことができる

• ロードテスト(ヒートラン)	

• メモリリークの調査	

• 低メモリ状態での動作	

• コンカレンシーテスト	

• 再現率の低い(タイミングがシビアな)
問題の確認テスト
システムテスト自動化	

フレームワークの紹介
monkeyrunner
• Android SDK同梱の自動テストツール。スクリプ
トはPythonで記述。キャプチャツール有り	


• 座標を指定してタップ、ドラッグ	

• スクリーンショット、画像比較でのJudge	

•
•

http://developer.android.com/tools/help/monkeyrunner_concepts.html	

サンプル https://github.com/nowsprinting/nameko-harvest
Robotium
• Android Testing Frameworkのヘルパーで、
Seleniumライクなテスト記述が可能
(JUnitの知識が必要)	


• 端末回転、スクリーンショットなど必要
機能は

•
•

っている	


https://code.google.com/p/robotium/	

サンプル https://github.com/mike-neck/AllowLog
uiautomator
• Android 4.1で利用できるSDK同梱の自動テスト
ツール。端末の回転とスクリーンショットは
4.2から利用可能。JUnitベース	


• SeleniumのようにViewのヒエラルキーを

って

画面要素を指定可能	


• Viewのdescriptionでも要素を指定可能	

•
•

http://developer.android.com/tools/help/uiautomator/index.html	

サンプル https://gist.github.com/nowsprinting/4131415
Espresso
• 10月に公開された、Google謹製のAndroid
向けテスティングフレームワーク	


• Android 2.2以上で利用可能	

• テスト記述は JUnitベース	

• https://code.google.com/p/android-test-kit/
UIAutomation
• Xcodeに同梱のInstrumentツールで自動実行を
行なうフレームワーク	


• スクリプトはJavaScriptで記述	

• 標準でassert機能が無いのでJSのライブラリを
使う( tuneup_js等)
Appium
• iOS/Androidで利用できるオープンソースの
テストツール	


• 複数のスクリプト言語で記述可能	

• テスト対象にAgentを組み込む必要がない	

• AndroidはAPI Level 17 (JellyBean)以上が必要	

• http://appium.io/
Calabash
• Cucumberのテスト(feature)を、iOS/
Androidデバイスで実行できる	


• iOS版はテスト対象にAgentを組み込む必要
あり	


• https://github.com/calabash/calabash-android	

• https://github.com/calabash/calabash-ios
MonkeyTalk
• Gorilla Logic社が開発/公開しているOSSで
iOS/Androidで利用可。旧”FoneMonkey”	


• 専用の表形式IDEでテストを記述可能	

• テスト対象にAgentを組み込む必要あり	

• ATI 2012 Awards iOS/Android部門winner	

• https://www.gorillalogic.com/monkeytalk
その他 iOS向けフレームワーク

• Franc	

• Cucumber系、 ATI 2012 Awards iOS部門
finalists	

• http://www.testingwithfrank.com/	

• Zucchini	

• DSL系、ATI 2012 Awards iOS部門finalists	

• http://www.zucchiniframework.org/	

• KIF	

• https://github.com/kif-framework/KIF
ツール選定のポイント
• スクリプトを書けるチームかどうか

(将来も保守していけるのか)	


• iOS/Androidでテストを共有したいのか

(但しUIが異なるので期待しすぎない)	


• 「何が実行できるか」は余り重視しない

(ツールの実行機能の差は縮まる)
デモ
Tips
テスト用ビルドを作る
Agentの組み込みの他、接続先サーバ別など
自動生成できると便利です

•

複数のTarget/Configurationを持つiOSプロジェクトの構
成Tips http://nowsprinting.hatenablog.com/entry/2012/11/
18/031511	


•

Gradle+Androidプラグインでプロダクトフレーバーを
試してみた http://nowsprinting.hatenablog.com/entry/
2013/05/23/153941
UAT/ベータテスト
On The Airでビルドを配布できるサービス

• iOS/Android	

• TestFlight https://testflightapp.com/	

• Android	

• deploy gate https://deploygate.com/	

• Google Play Storeのベータ版配布機能
リモートテストサービス
• AppKit Box Remote TestKit	

• インターネット経由で実機をレンタル
し、テストできるサービス	


• Android向けサービスだったが、9月に
iOSデバイスも利用可能に	


• http://appkitbox.com/testkit
まとめ
まとめ

• 欲張らない	

• 頑張らない
まとめ

• 欲張らないROI	

• 頑張らないテストスクリプト

スマートフォンアプリの テスト自動化をはじめよう