Androidアプリを“超”魅力的にする3種類のUIテスト:Androidアプリ開発テスト入門(3)(3/3 ページ)
日本Androidの会テスト部が、いままで培ってきたAndroidアプリ開発におけるテストのノウハウを、実際のテストコード例とともに紹介していきます
【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に依存するため、書くのに時間がかかってしまうところですが、最初に述べた通りに一度書いて自動化しておくと、デグレードやバージョンアップのチェックに役立つので、ぜひ活用してみてください。
本稿で掲載したソースコードは以下のリポジトリで公開されています。
- https://atec.googlecode.com/svn/atmarkit/ui/trunk/HelloAndroid
- https://atec.googlecode.com/svn/atmarkit/ui/trunk/HelloAndroidTest
著者紹介
渡辺悟史
Androidアプリケーションエンジニア。現在は、ソーシャルWebサービスのAndroidアプリ開発に従事。過去には組み込み機器用Webブラウザのレンダリングエンジン開発やAndroid向けWebブラウザの開発に携わる
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 今日から始める! Androidケータイアプリ作成の基礎
いまこそ知っておきたい「Androidアプリ」とは - 売れるスマホアプリを目指せ! テスト達人への道
安藤幸央のランダウン(56) - 単体テストを“神速”化するQuick JUnitとMockito
ユカイ、ツーカイ、カイハツ環境!(16) - JUnit/FindBugs/PMDなどを総観できるQALab/Limy
ユカイ、ツーカイ、カイハツ環境!(8) - 次世代テストフレームワークでテストを変える
- Eclipseで使えるテストツールカタログ
- イチから始める!Androidセキュリティ
- Androidセキュリティの今、これから