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でプロジェクトをインポートします。
感想
ユーザー操作に関するテストコードをかなりの部分ラップしてくれるので、その点使い勝手は非常に良いと思います。Listのxx個目をクリック→メニューボタンのxxxxをクリック→xxxxxのテキストが表示されているか確認、といったようなテストケースをほぼ一瞬で書くことができます。
ネックなのは信頼性で、内部の実装を見るとリフレクションを使ってWindowManagerからビューを取得したりと、かなりエグいことをやっているので、将来的にOSがバージョンアップされたいったときの動作や、機種別の動作は不安が残ります。また最新のバージョンでも、僕が試した限りでは Solo.goBack() が動作しなかったため、Solo.goBackToActivity("NotesList") に書き直したりしました。
というわけで、まだ信頼性に不安があるので、Robotiumだけでテストを書くというわけにはいかないとのが僕の感想です。自動テストのメインはAndroidSDK標準のテストフレームワークで作った単体テストで行い、サブ的に主要なシナリオテストをRobotiumで作成する、というのはアリかと思います。