robotium(+ActionBarSherlock)を使ってみた

2013-06-13T00:00:00+00:00 Android Java

https://code.google.com/p/robotium を使う事でSelenium likeな方式でUIをシナリオテスト的な感じで使えるらしい

※以降で継承しているBaseActivityTestCaseはただのActivityInstrumentationTestCase2のサブクラス

インストール

robotium.jarを取ってくるだけ。それをテストプロジェクトのlibsディレクトリに入れる

ただ、ActionBarSherlockを使っているとホームアイコンクリック及びメニューのクリックが上手く行かない。なので https://github.com/atermenji/robotium-actionbarsherlock を取ってくる。又、こいつも問題があってrobotium3ベースなので、robotium4ベースで動かす場合にSolo.clickOnVisibleActionBarItemを使う際にNoSuchMethodExceptionが出るのでコードを修正しておく(35行目辺りのgettter.getViewをgetViewだけにする)

テスト要件

  • ホームアイコンをクリック
  • SlidingMenuが表示されている (SlidingMenu#isMenuShowingメソッドがtrueを返す)
  • onBackPressedをする
  • SlidingMenuが閉じられている (SlidingMenu#isMenuShowingメソッドがfalseを返す)

robotiumを使ってない場合

package kinjouj.sample.aa.test;

import android.annotation.SuppressLint;
import android.os.Build;
import kinjouj.sample.aa.test.lib.BaseActivityTestCase;

import static org.hamcrest.Matchers.*;

public class MainActivityTestCase extends BaseActivityTestCase {

    @SuppressLint("InlinedApi")
    public void test_onMenuHome() throws Throwable {
        int resId = com.actionbarsherlock.R.id.abs__home;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            resId = android.R.id.home;
        }

        clickView(findViewById(resId));
        waitForIdleSync();
        assertThat(mActivity.getSlidingMenu().isMenuShowing(), is(true));

        runTestOnUiThread(new Thread() {
            @Override
            public void run() {
                mActivity.onBackPressed();
            }
        });
        waitForIdleSync();
        assertThat(mActivity.getSlidingMenu().isMenuShowing(), is(false));
    }
}

robotiumを使った場合

package kinjouj.sample.aa.test;

import com.jayway.android.robotium.solo.SoloCompatibilityAbs;
import kinjouj.sample.aa.test.lib.BaseActivityTestCase;

import static org.hamcrest.Matchers.*;

public class MainActivityTestCase extends BaseActivityTestCase {

    private SoloCompatibilityAbs solo;

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        solo = new SoloCompatibilityAbs(getInstrumentation(), mActivity);
    }

    @Override
    protected void tearDown() throws Exception {
        solo.finishOpenedActivities();
        super.tearDown();
    }

    public void test_onMenuHome() throws Throwable {
        runTestOnUiThread(new Thread() {
            @Override
            public void run() {
                solo.clickOnActionBarHomeButtonCompat();
            }
        });
        waitForIdleSync();
        assertThat(mActivity.getSlidingMenu().isMenuShowing(), is(true));

        solo.goBack();
        assertThat(mActivity.getSlidingMenu().isMenuShowing(), is(false));
    }
}

まぁテスト要件が要件なだけにあんま効果が見られない気もするけど、入力させたりとかそういうのもメソッドであるのでめんどくさいViewの取得とかせずにサクッとテスト書けるのではと。ところでrobotiumのサーチキーとかのタッチってどうやってやるんだろう

んまぁ興味ある人は使ってみると良いかも。

参考: http://d.hatena.ne.jp/re_shikajiro/20110601/1306937682

rspec-railsのドキュメント読み (2) ライブラリプロジェクトを伴うAndroidアプリをJenkinsでビルド