ActivityInstrumentationTestCase2

Last-modified: 2009-11-09 (月) 14:15:01

Activityの機能テストを行うActivityInstrumentationTestCase2クラスについて説明します。

 

概要

ActivityInstrumentationTestCase2はアクティビティの機能テストケースの基底クラスです。
このクラスを継承したテストケースでは、テスト対象アプリケーション内で実際にアクティビティを起動させてユーザ入力をシミュレートできます。
ActivityInstrumentationTestCaseというクラスも存在しますが、非推奨となっているため(Android 1.5 SDK時点)注意が必要です。
ActivityInstrumentationTestCase2は以下の特徴があります。

 

・アクティビティ内のButtonやEditText等のすべてのウィジェットの操作が可能です。
・[メニュー]、[ホーム]、[戻る]を含めたすべての端末のキーボード入力をシミュレートすることができます。
・一つのテストメソッドで、対象アクティビティのonCreate()からonDestroy()までが実行されます。
・別のアクティビティを起動してその状態を確認するような、アクティビティをまたがった試験はできません。

 

android.test.ActivityInstrumentationTestCase2リファレンス

http://developer.android.com/intl/ja/reference/android/test/ActivityInstrumentationTestCase2.html

 

使い方

基本

ActivityInstrumentationTestCase2を継承したテストケースのサンプルは以下になります。

public class TextInstrumentationTest extends
        ActivityInstrumentationTestCase2<TextTestActivity> {
    private EditText text;
    public TextInstrumentationTest() {
        super("org.sample", TextTestActivity.class);
    }
    @Override
    protected void setUp() throws Exception {
        super.setUp();
        text = (Text) getActivity().findViewById(R.id.test_text);
    }
    public void test01() {
        // ※1 UIスレッドからテキストにフォーカスする
        getActivity().runOnUiThread( new Runnable() {
            @Override
            public void run() {
                text.requestFocus();
            }
        });
        // ※2 UIスレッドに要求した操作の完了を待つ
        getInstrumentation().waitForIdleSync();
        sendKeys(KeyEvent.KEYCODE_A,
                KeyEvent.KEYCODE_B,
                KeyEvent.KEYCODE_C,
                KeyEvent.KEYCODE_1,
                KeyEvent.KEYCODE_2,
                KeyEvent.KEYCODE_3
        );
        assertEquals("abc123", text.getEditableText().toString());
    }
}

テストメソッドtest01()では、TextTestActivity上のEditTextに"abc123"という入力イベントを送り、実際に入った値を確認しています。
※1 ではActivityのUIスレッド上でEditTextインスタンスへのフォーカス要求を送っています。これは画面の状態変更は、UIスレッド上でしか行えないためです。※2では※1で送った要求が完了するのを待機しています。

インテントを渡す場合

Activityにインテントを渡して起動したい場合は、setUp()メソッド内で設定します。
以下はサンプルコードです。

@Override
protected void setUp() throws Exception {
    super.setUp();
    Intent intent = new Intent(Intent.ACTION_MAIN);
    setActivityIntent(intent);
}

端末からの入力をシミュレートする場合

H/Wキーボードや端末の「戻る」「ホーム」「メニュー」ボタンの押下をシミュレートする場合は、
sendKey()メソッドを使用して、入力したいボタンに対応するキーコードイベントを送信します。
sendKey()の引数に指定するintには、KeyEventクラスに用意された定数を使用します。