連載
» 2012年01月20日 00時00分 公開

Androidアプリを“超”魅力的にする3種類のUIテストAndroidアプリ開発テスト入門(3)(3/3 ページ)

[渡辺悟史,日本Androidの会テスト部]
前のページへ 1|2|3       

【2】ライフサイクルのテスト

 先ほどは、ActivityInstrumentationTestCase2を使ってテストを書いてみました。

 ただ、このテストケースでgetActivity()を実行すると、onCreate()だけではなく、onStart()やonResume()まで実行された状態のActivityが返されます。従って、ActivityInstrumentationTestCase2だとActivityのライフサイクルの各状態についてのテストができません。

 では、先ほど述べたように、onPause()/OnResume()間でデータの状況をテストしたい場合は、どのようにすればいいでしょうか。この場合、「ActivityUnitTestCase」クラスを使ってテストします。ActivityUnitTestCaseは、callActivityOnStart()のような各ライフサイクルのメソッドを明示的に呼び出してテストできます。

 では、実際に試してみます。HelloAndroidActivityにフィールドstateを追加して、以下のコードを追加します。

    @Override
    protected void onStart() {
        super.onStart();
        state = 1;
    }
 
    @Override
    protected void onResume() {
        super.onResume();
        state = 2;
    }

 次に、ActivityUnitTestCaseでテストを実装します。

public class HelloAndroidActivityTest2 extends ActivityUnitTestCase {
    public HelloAndroidActivityTest2() {
        super(HelloAndroidActivity.class);
    }
    public void testButton1() throws Exception {
        Intent intent = new Intent();
        HelloAndroidActivity target = startActivity(intent, null, null);
        assertEquals(“初期値を確認”, 0, target.getState());
        getInstrumentation().callActivityOnStart(target);
        assertEquals(“onStart()後”, 1, target.getState());
        getInstrumentation().callActivityOnResume(target);
        assertEquals(“onResule()後”, 2, target.getState());
    }
}

 startActivity()でActivityのonCreate()が呼ばれ、その後は、callActivityOnStart()でonStart()がが呼ばれ、callActivityOnResume()でonResume()が呼ばれます。OnStart()やOnResume()では、値が変化していることが確認できると思います。

【3】画面遷移のテスト

 先ほど、「画面遷移をIntentの仕組みを使って別なActivityを起動することによって実現する」と述べました。ということは、画面が遷移したかどうかを確認するには、Activityを起動したかどうかをチェックするすればよいということになります。

 そこで、HelloAndroidActivityに以下のコードを追加して、SecondAndroidActivityが起動できるかどうかをチェックしてみましょう。

       Button button = (Button)findViewById(R.id.button);
       button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(HelloAndroidActivity.this, SecondAndroidActivity.class);
                startActivityForResult(intent, 100);
            }
       });

 このActivityの起動をチェックするには、AndroidUnitTestCaseの「getStartedActivityIntent()」というメソッドを使います。また、startActivityForResult()でリクエストコードを渡した場合は、getStartedActivityRequest()で確認できます。以下が、そのテストコードです。

public void testButton() throws Exception {
    Intent intent = new Intent();
    HelloAndroidActivity activity = startActivity(intent, null, null);
    final Button button = (Button)activity.findViewById(com.example.atec.ui.R.id.button);
    activity.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            button.performClick();
        }
    });
    getInstrumentation().waitForIdleSync();
    Intent target = getStartedActivityIntent();
    String ret = target.getComponent().getClassName();
    assertEquals(SecondAndroidActivity.class.getName(), ret);
        
    int request_code = getStartedActivityRequest();
    assertEquals(100, request_code);
}

 他にも、起動したActivityが終了したかどうかを判断する「isFinished()」などがあります。

テストはデグレードやバージョンアップのチェックに役立つ

 今回は、Android TestingFrameworkを利用したUIのテストの書き方について解説しました。

 UIのテストはAndroid SDKに依存するため、書くのに時間がかかってしまうところですが、最初に述べた通りに一度書いて自動化しておくと、デグレードやバージョンアップのチェックに役立つので、ぜひ活用してみてください。

 本稿で掲載したソースコードは以下のリポジトリで公開されています。

著者紹介

Androidテスト部

渡辺悟史

Androidアプリケーションエンジニア。現在は、ソーシャルWebサービスのAndroidアプリ開発に従事。過去には組み込み機器用Webブラウザのレンダリングエンジン開発やAndroid向けWebブラウザの開発に携わる



前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。