先ほどは、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()では、値が変化していることが確認できると思います。
先ほど、「画面遷移を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アプリケーションエンジニア。現在は、ソーシャルWebサービスのAndroidアプリ開発に従事。過去には組み込み機器用Webブラウザのレンダリングエンジン開発やAndroid向けWebブラウザの開発に携わる
Copyright © ITmedia, Inc. All Rights Reserved.