匡秀2013.11.27robotiumのwaitForメソッドがすごく便利だったAndroidAndroidアプリ担当の高畑です。社内でぷよぷよテクニックを披露したら軽く引かれました。おじゃまぷよを消すのは得意ですが、お腹のおじゃまぷよはなかなか消せません。今回のブログネタですが、robotiumについて書こうと思います。知っている人にとっては今さらrobotium?って感じかもしれませんが、僕は最近初めて使ってみました。robotiumのwaitForメソッド系が何かと便利だったのでそれに重点を置いて書いていきます。robotium準備こちらからrobotiumのライブラリをダウンロードします。後はテストプロジェクトにrobotium.jarをビルドパスを通すだけで使用準備は完了です。導入は非常に手軽です。後はInstrumentationTestCase2で以下のように書くだけでセットアップは完了です。getActivity());}}waitForメソッドシリーズ冒頭でも触れたのですがrobotiumには便利なwaitForメソッドがあります。サンプルソースに移る前にどんなものかをいくつかピックアップして紹介します。waitForActivity引数にクラス名とタイムアウト時間を渡すと指定した時間内に指定したActivityが表示されるかを判定します。waitForActivity(HogeActivity.class,2000)12//2秒以内にHogeActivityが表示されるかどうかwaitForActivity(HogeActivity.class,2000)waitForFragmentById引数にレイアウトのIDを指定します。指定したレイアウトIDにFragmentが指定時間内に追加されているかを判定します。waitForFragmentById(R.id.fragment,2000)12//2秒以内にR.id.fragmentに何かしらのFragmentが追加されるかどうかwaitForFragmentById(R.id.fragment,2000)waitForFragmentByTag引数にFragmentのタグ名を指定します。指定したタグ名のFragmentが指定時間内に追加されているかを判定します。waitForFragmentByTag("hoge",2000)12//2秒以内にタグ名がhogeのFragmentが追加されるかどうかwaitForFragmentByTag("hoge",2000)waitForFragment系を使う時はandroid-support-v4.jarが必要になるので注意してください。waitForText引数にした文字列が時間内に表示されているかを判定します。waitForText("hoge",2000);12//hogeという文字列が2秒以内に表示さているかどうかwaitForText("hoge",2000);waitForConditionなんでもありのwaiForメソッド引数にConditionを指定する。指定したConditionになるかを判定します。button.isEnabled();}},2000);その他のwaitForメソッドwaitForDialogToOpenwaitForDialogToClosewaitForViewwaitForLogMessageなど色々ありますが、どれも基本的に使い方は同じです。サンプルソースrobotiumでテストするための簡単なサンプルを用意します。Activityを2ファイルとFragmentを2ファイル用意しました。始めにメインとなる画面です。onCreateでListFragmentを追加するのとボタンのクリックでFragmentを入れ替える機能を持っています。"grid");ft.addToBackStack(null);ft.commit();}}次にSampleActivityに紐づけるFragmentです。ただのListFragmentです。ItemをクリックするとNextActivityに選択した文字列を渡して画面遷移します。adapter.getItem(position));startActivity(intent);}}もうひとつのFragmentはGridViewを表示するFragmentです。データはどこからダウンロードしてくると仮定して、非同期取得してGridViewに反映させます。SampleListFragmentと同様に、Itemを選択するとNextActivityに選択した文字列を渡して遷移します。gridView.getAdapter();adapter.addAll(strings);adapter.notifyDataSetChanged();}}}最後にNextActivityです。intentで文字列を受け取って、非同期で取得した文字列と連結させて表示します。string);}}}サンプルのテストソースいよいよrobotiumを使ったInstrumentTestです。waitForメソッドの返却値はboolean型なのでassertTrueと絡めるとスッキリします。どんな動作や確認をしているかはコメントから読み取ってください。"hogehoge"));//NextActivityを終了するsolo.getCurrentActivity().finish();//SampleActivityに戻ってくることを確認するassertTrue(solo.waitForActivity(SampleActivity.class));}}最後にテストコードを書くためにソースコードが多くなってしまったので今回のサンプルプロジェクトをgithubにあげておきました。今回のブログ結局何を言いたかったのかというとwaitForメソッドを使えば、非同期処理でガチガチのアプリでもシンプルにInstrumentTestが書けるということです。US私たち”アライドアーキテクツのエンジニア”は”世界をよりよく変えたい”という想いを強く持ちながらWebサービスを創っています。”日本発、世界的なWebサービスを創る”ことをエンジニアチームは本気で考え、毎日チャレンジしています。