Robotium を使った UI テスト
とレイアウト確認の効率化
2015/02/28
最新事例から学ぶ!モバイル向けテスト手法勉強会
Sansan株式会社 辰濱健一
form 徳島サテライト会場(リモート発表)
Agenda
 自己紹介
 Robotium で UI 自動テスト
 デモ
 Robotium でレイアウト確認効率化
 【おまけ】 これからやりたいこと(実験中の内容)
自己紹介
 Sansan 株式会社 Sansan 開発部所属
 神山ラボ勤務 (徳島現地採用)
 アプリチームリーダー (メンバーは東京)
 Android 版 Sansan アプリ実装担当
 趣味
 音楽
 トランペット … 徳島の吹奏楽団で週末に吹いています
 エレクトーン … 3歳から始め今も現役
 旅行
 黒部立山アルペンルートがお気に入りスポット
 小笠原諸島が最近気になっている
テストの自動化との関わり
 前々職で、正確さとパフォーマンスが求められる表計算ソフトの
UIテストの自動化&高速化を担当
 高速化したは良いが、影響はないか?
 本当に速度は速くなったか?
 他者の修正でまた遅くなっていないか?
 表示結果は期待通りか?
 CPPUnit で見切れない UI の動作は OK か?
などを日々計測・監視するツールを作成
 前職では、Android, iOS, Windows8(C#)のスマホ・タブレット向け
アプリ開発に従事
 前々職&前職のスキルを活かし、
スマホアプリでUIテストの自動化!
Sansan神山ラボ
 築70年の木造古民家(3棟)
 略歴
 2010年設置
 〜2013/11:合宿所
 2013/11〜:常駐メンバーのいる開発拠点に
 家具家電あり、畑付き、風呂トイレセパレート
 家賃:数万円 / 月
 インターネット接続:あり
 最寄り(道の)駅:「温泉の里神山」徒歩15分
 改装OK物件
神山での開発(良いこと)
 静かで広々していて、高いパフォーマンスの状態で仕事に
集中できる
 Github や Skype などのツールの利活用で、実務における
チーム内コミュニケーションは意外と何とかなっている
神山での開発(難点)
 ネットワーク状態にコミュニケーションが左右される
 開発チーム外の人に直接話しかけられない
 視察・取材など開発以外の業務も伴う
 自然環境との戦い(虫、カビ、寒さ、…)
端末操作を自動化するライブラリ
 Android専用
 Robotium
 monkeyrunner
 Espresso
 など…
 iOS専用
 KIF
 Kiwi
 など…
 ハイブリッド
 Appium
 Calabash
 MonkeyTALK
 など…
なぜ Robotium?
 メリット
 数年前に調査して慣れていた
 Android 実装と同じ Java 言語で記述
 アプリケーション内部のオブジェクトが参照できる
 細かいところまで手が届く
 テストケースや期待値の動的生成ができる
 デメリット
 リリースビルドでは使えない
→ 別途 Appium を調査中
http://www.slideshare.net/kenichitatsuhama/rubyui
UI自動テスト実装ポリシー
 浅く広くから!
 あきらめも大事
 ライブラリ関数を直接叩かず、ラップして抽象化する
 極力 SLEEP は使わない。wait* 関数で!
 ローカライズ対応
ポリシー:浅く広くから!
 主要画面に遷移し、基本機能1パスだけの確認
 いわゆる、リグレッションテスト
 主要機能のデグレードを早期検出することが目的
 1,000 文字制限の所に 1,001 文字入れたときにエラーが
出るかでないかは、ここではどうでもいい
(※これは、狭く深いフルテストでやろう)
 運用例
 テストレベルを設定して、このテストをスモークテストにする
 【スモークテスト】:最初の簡易テスト
 スモークテストはコミット毎に実行
 フルテストは深夜に実行
ポリシー:あきらめる
 メールに表示されている URL をクリックして…
 メールアプリ起動して操作??
 アプリを終了させて再起動したときに…
 どうやってアプリを起動する??
 通信が途中で切れたときの動作
 etc…
頑張ればできるかもしれない。。。
(Appiumなどのシステムテスト)
でも、調査に時間が掛かりそうであれば、手動で確認しよう!
ポリシー:ライブラリ関数のラップ
 テストコードの可読性を上げ、手順書代わりにしたい!
 将来テストライブラリを変更する(かもしれない)場合に備え、
ライブラリとテストコードの結合度を下げておく
 ライブラリにない拡張機能を仕込みやすい
 実行時ログ
 エラーログ
 テスト失敗時にスクリーンショットを残しておくのはオススメ!
ポリシー:極力SLEEPは使わない
 つい使ってしまいがち…
 でも、実行環境によって必要な SLEEP 時間は違う
 → wait* 関数を使おう (作ろう!)
 ライブラリ関数の例
 waitForActivity
 waitForFragmentByTag
 waitForLogMessage
 自作例
 waitHideProgress // ぐるぐるが消えるまで待つ
 自作関数や、ライブラリのラッパー関数内でSLEEPを使う
のはアリと考えます。
自作 waitHideProgress
 アプリ内の Activity基底クラス に「ぐるぐる」表示中かどうかの関数を追
加
 一定時間毎に↑の状態をチェックする
ポリシー:ローカライズ対応
 端末の言語設定によらず同じ結果になるように!
 ×:clickOnText(“送信”);
 ○:clickOnText(R.string.send);
 言語環境によって動作が違う場所はテストコードも切り分けよう
 If (isJapan) {
// 日本語のときの動作確認
}else {
//
}
 実機でも、エミュレータでも問題なく通るように
 エミュレータでカメラがなければ、カメラ系のテストはスキップする。
Sansan アプリ
リグレッションテスト項目(抜粋)
 Sansan アプリ とは…?
 「スマホで社内の名刺を一括管理」
 ざっくり言うと、Eight 法人版のイメージ
 同僚が持っている名刺も
閲覧・検索できる機能がある
 リグレッションテスト項目
 ログインできること
 同僚一覧で自分をタップすると、自分の名刺一覧が開くこと
 名刺一覧の名刺をタップすると、名刺詳細画面が開くこと
 など…
サンプルコード(Android)
 ログイン処理
 メールアドレス入力欄を取得
 パスワード入力欄を取得
 メールアドレスを入力
 パスワードを入力
 ログインボタンを押す
ラップしてるから読みやすい!
リグレッションテストのデモ
 2014/11 時点の動画です
 http://youtu.be/scY_RPgfxeY
 4分ぐらいありますが、発表時間の都合上ちょっとだけ…
UI自動テストを導入してみた効果
 デグレードの早期発見・防止につながった
 実際に開発中のミスを検出し、デグレードを未然に防いだ
 開発サーバの異常を検出した
 大規模な修正も行いやすくなった
 何度でもテストを簡単に実行できる
 作業効率UP
 離席中・昼食中・ミーティング中にでもテストができる
 テストに割く時間を開発に充てることができる
 新しい OS が出てもテスト工数を割かなくて良い
とはいっても…
 リリース前の本番バイナリは手作業でテストしています。
(機械を過信しない。目で確認すると安心)
 色んな施策で、画面遷移の動線が変わるとテストコードのメンテが大変
 前提条件(この画面にいること)の造り出しに工夫が必要
 setUp() でログイン、tearDown() でサインアウト など
 導入に当たっては、
 費用対効果の高いところから
 仕様変更がなさそうな基本機能
 直近リファクタリングしたい箇所
など、から着手するのが良いと感じています。
(後述のスクリーンショット収集は自動化テスト入門として最適かも…)
スクリーンショット
 テスト実行中に必要に応じて撮影している
 → レイアウト確認に利活用できる!
Robotium で
レイアウト確認効率化
スクリーンショットの活用
 Robotium でスクリーンショットを撮る
 画面遷移してスクショを撮るだけのテストケースを作成&実行
 このテストケースを言語設定を動的に切り替えて実行
 スクショを端末名フォルダに集める
 一覧View を作る(ツールを Ruby で作った)
 結果確認は目視!
 機械的には完全一致は容易だけど、正当な差分と意図しない
差分をプログラムで認識するのは至難の業
テストコード(抜粋)
スクリーンショットの活用の全体像
デザイン指示画像スクリーンショット
html 生成ツール
スクリーンショット
スクショ一覧のhtml
画面名→
画面名→
画面名→
Nexus4 Nexus5 デザイン指示画像(期待値)
各画像をクリックすると、
原寸大で表示される
※元サイズが違うけど、
今は同じサイズで
表示されている
目で比較する!
デザイナにはこの
html を含む zip を
提供するだけ。
スクショ一覧の効果
 デザイナーに apk 作って提供
↓
色んな動作確認端末にもインストール
↓
手で操作して、その画面に遷移して動作確認
↓
フィードバック&修正
 ↑を何度もする必要はなくなり、
開発者&デザイナー双方に効率化をもたらした!
(最終的には apk を渡して実機で見てもらいます)
 Robotium は画面遷移とスクショ撮影しかしていないので、
iOS や 他プロダクトでのこのツールの使い回しが可能!
これからやりたいこと
Robotium に限らず、アプリ開発テストで…
 テスト実行ごとにもっと色んなデータを収集・集積・分析していく
 処理時間の推移
 ClientAPI の呼び出し回数
 メモリ使用量のモニタリング
 ※計画段階で、まだまだ検証段階です
処理時間(推移)
 パフォーマンス改善の結果確認、性能デグレの検出ができ
るかも?
 通信状態やサーバ状態に大きく左右される気がする…
0
2
4
6
8
10
12
ログイン処理
初回同期
名刺画像送信
詳細データ取得
高画質画像データ取得
手動同期処理
ClientAPI の呼び出し分析(1回)
 呼び出し毎に API名と実行時間を csv ファイルに出力
 Excel のピボットテーブルで集計
 iOS / Android で同じ仕組みを入れれば、
同じ操作で API 呼び出しの違いがわかる!
そんなに呼び
出す必要ある
の…?
サーバ負荷削減のためのボトルネック分析が容易になる
Excelマクロ
ClientAPI の呼び出し分析(推移)
 さっきのデータを実行毎に集計する
呼び出し回数削減施策導入
メモリ使用量(1回)
 ユーザトラッキングイベント発生時にメモリ使用量を記録
→ どの操作以降メモリ使用量が急上昇するかわかる
0
10000
20000
30000
40000
50000
60000
[prelogin]Startup
apps
[prelogin]View
SplashtourSigninpage
[app]Startup
w
hile
Loggedin
[prelogin]Tap
Signin
bu
on
[prelogin]Com
plete
Signin
[app]StartSync
[app]Com
plete
Sync
[app]View
Rem
indFirstInvite
Dialog
[app]Tap
nexton
Rem
indFirstInvite
Dialog
[app]Open
InviteDialog
[app]View
Im
portContactDialog
[app]Tap
Send
on
InviteDialog
[app]View
InvitesuccessDialog
[app]Tap
Useascanneron
Scanm
enu
[app]Tap
M
yteam
on
Tabbar
[app]Tap
M
ycontacton
M
yteam
[app]Tap
Contacton
M
ycontact
[app]StartSync
[app]Com
plete
Sync
[app]Tap
Signouton
Accountse
ng
系列1
メモリ使用量(推移)
 GCがいつ起きるかまちまちで微妙かも…
アプリ開発チームの今期の取り組みに、
これらを盛り込んでいるので、
何ヶ月後かにはこれらが実現できてる見込みです。
アプリエンジニア募集中!
 対象:iOS or Android エンジニア
 勤務地:東京本社 or 神山ラボ

Robotium を使った UI テストとレイアウト確認の効率化