遥かへのスピードランナー

シリコンバレーでAndroidアプリの開発してます。コンピュータービジョン・3D・アルゴリズム界隈にもたまに出現します。

RobotiumでAndroidアプリのシナリオテストを自動化する

Androidアプリのテスト自動化について色々調査していたら、Robotiumというテストツールを見つけました。このツール、便利なんですが、国内ではまだあまり知られてないみたいなので紹介してみます。

Robotiumとは

RobotiumとはAndroidアプリケーションのブラックボックスレベルのテストを自動化するためのTest Frameworkです。
Android版Seleniumというのが謳い文句のようです。
Android SDKが提供しているActivityInstrumentationTestCase2では複数のActivityにまたがるようなテストが難しいことで知られていますが、RobotiumはActivityをまたがるテストを簡単に自動化することができます。また、ユーザー操作をエミュレートする関数が豊富に用意されていて、従来は複雑になりがちだったテストコードを簡単に記述することができます。

以下、Robotiumを利用したテストコードの例です。

	 public void testAddNote() throws Exception {
		 //メニューボタンから"Add note"を選択
		 solo.clickOnMenuItem("Add note");
		 //NoteEditorアクティビティが起動していることを確認
		 solo.assertCurrentActivity("Expected NoteEditor activity", "NoteEditor"); 
		 //0番目のテキストフィールドに"Note 1"と入力する
		 solo.enterText(0, "Note 1");
		 //"NotesList"アクティビティに戻る
		 solo.goBackToActivity("NotesList");
		 //現在の画面上にから"Note 1"というテキストを探す
		 boolean actual = solo.searchText("Note 1");
		 //テキストが存在すればテストOK
		 assertEquals("Note 1 is not found", expected, actual);
	 }

このような形でユーザーの操作をもとに、直感的にテストコードを書くことができます。

さっそく試してみる

1. サンプルプロジェクトのダウンロード

RobotiumのサイトからExampleTestProject_v8.zip (2010/10/19現在の最新)を落とします。そのままEclipseでプロジェクトをインポートします。

2. NotePadプロジェクトの作成

ExampleTestProject はAndroidSDKに付属する、NotePadプロジェクトのテストプログラムとして動作するため、NotePadのソースコードを、Eclipseの新規プロジェクト作成からインポートします。
(最新のSDKですと、android-sdk-mac_86/samples/android-7/NotePad/ に存在するようです。)

3. テスト実行

1でインポートしたNotePadTestプロジェクトをAndroid Junit Testで実行します。もちろん実機上で実行することも可能です。
下記のように自動で画面が遷移していく様子を 観察することができます。


感想

ユーザー操作に関するテストコードをかなりの部分ラップしてくれるので、その点使い勝手は非常に良いと思います。Listのxx個目をクリック→メニューボタンのxxxxをクリック→xxxxxのテキストが表示されているか確認、といったようなテストケースをほぼ一瞬で書くことができます。

ネックなのは信頼性で、内部の実装を見るとリフレクションを使ってWindowManagerからビューを取得したりと、かなりエグいことをやっているので、将来的にOSがバージョンアップされたいったときの動作や、機種別の動作は不安が残ります。また最新のバージョンでも、僕が試した限りでは Solo.goBack() が動作しなかったため、Solo.goBackToActivity("NotesList") に書き直したりしました。

というわけで、まだ信頼性に不安があるので、Robotiumだけでテストを書くというわけにはいかないとのが僕の感想です。自動テストのメインはAndroidSDK標準のテストフレームワークで作った単体テストで行い、サブ的に主要なシナリオテストをRobotiumで作成する、というのはアリかと思います。