Androidのシナリオテストツール Robotium やってみた。

昨日、パプテマス Scirocco 触ってたら中はRobotiumというのを使っていたので調べてみたら、そこそこメジャーなシナリオテストツールだったので、触ってみました。

Robotium とは

Androidのシナリオテストを簡単に書けるライブラリです。UIスレッドを意識せずに書けるので、テスト仕様書に近いコードを書くことができます。ブラウザテストツールのSeleniumを意識してるみたいですね。

サンプルプロジェクトを動かす。

とりあえずサンプルプロジェクトを動かします。やることは二つ。

  1. SDKのサンプルアプリ notePad をインポート
  2. ExampleTestProjectをインポート

テスト対象となるプロジェクトはSDKに含まれるsampleのNotePadプロジェクトです。Eclipseにインポートします。
Downloads - robotium - It's like Selenium, but for Android™ - Google Project Hosting から最新のExampleTestProjectを落とします。落としたzipはandroidプロジェクトなのでeclipseでインポートします。

比較してみた

Robotiumを使ったテストコードと使わないテストコードを比較してみました。

Robotiumのソースコード
	public void testAddNote() throws Exception {
		solo.clickOnMenuItem("Add note");
		//Assert that NoteEditor activity is opened
		solo.assertCurrentActivity("Expected NoteEditor activity", "NoteEditor"); 
		//In text field 0, add Note 1
		solo.enterText(0, "Note 1");
		solo.goBack(); 
		//Clicks on menu item
		solo.clickOnMenuItem("Add note");
		//In text field 0, add Note 2
		solo.enterText(0, "Note 2");
		//Go back to first activity named "NotesList"
		solo.goBackToActivity("NotesList"); 
		boolean expected = true;
		boolean actual = solo.searchText("Note 1") && solo.searchText("Note 2");
		//Assert that Note 1 & Note 2 are found
		assertEquals("Note 1 and/or Note 2 are not found", expected, actual); 
	}

なにをやってるのかが一目でわかりますね。テスト以外のコードがないので書きやすく読みやすいです。

Robotiumを使わずに書いた場合。(一部分からないのでコメント。動く保証もないです><)
	public void testNonRobo(){
		ActivityMonitor monitor = new Instrumentation.ActivityMonitor("NoteEditor", null, true);
		getInstrumentation().addMonitor(monitor);
		
		NotesList activity = getActivity();
		sendKeys(KeyEvent.KEYCODE_MENU);
		sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
		
		Activity next = getInstrumentation().waitForMonitor(monitor);
		//Assert that NoteEditor activity is opened
		assertEquals(NoteEditor.class, next.getClass());
		//In text field 0, add Note 1
		EditText note = (EditText) next.findViewById(R.id.note);
		note.setText("Note 1");
		sendKeys(KeyEvent.KEYCODE_BACK);
		//Clicks on menu item
		sendKeys(KeyEvent.KEYCODE_MENU);
		sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
		sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
		//In text field 0, add Note 2
		note.setText("Note 2");
		//Go back to first activity named "NotesList"
		sendKeys(KeyEvent.KEYCODE_BACK);
		//TODO 戻ったあとのActivityの状態を見るのはどうするんだろう・・・。
		//assert(書くの疲れた)
	}

monitorやらInstrumentationやら慣れないとわからないですね。書いてて辛いです。今回はUIを駆使する事がないですが、UIスレッドを意識したテストも書くとどんどんややこしくなっていきます。

まとめ

Robotiumを使えば、簡単にシナリオテストが書けます。とっても便利!でも、

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

RobotiumでAndroidアプリのシナリオテストを自動化する - 遙かへのスピードランナー
という意見もあるので、単体テストをしっかり書いた上で、全体の動きのテストができるといいなーって感じですね。とはいえ、しっかり動くようになるととても協力なツールなので、今後も使っていきたいと思います。