==[[Android Activity の テスト]]==
[[Android]] |
*http://developer.android.com/guide/topics/testing/activity_testingacti[[vi]]ty_testing.html
==概要==
*Activity のテストはかなり [[Android ]] instrumentation framework に依存する*Activity Acti[[vi]]ty は他のコンポーネントとは異なり、コールバックメソッドに基づいた、複雑なライフサイクルを持っているため
*これらは、instrumentation 以外から直接呼び出すことができない
*プログラムからイベントをユーザーインターフェースへ送る唯一の方法は、instrumentation を通して
==Activity Acti[[vi]]ty テスト API==
*Activity テスト API の基底クラスは、[http://developer.android.com/reference/android/test/InstrumentationTestCase.html InstrumentationTestCase]
*テストケース派生クラスへActivityのための操作方法を提供するテストケース派生クラスへActi[[vi]]tyのための操作方法を提供する
===[http://developer.android.com/reference/android/test/InstrumentationTestCase.html InstrumentationTestCase]が提供する機能===
====ライフサイクル制御====
*テストケースクラスが提供するメソッドから、Activity テストケースクラスが提供するメソッドから、Acti[[vi]]ty を開始でき、一時停止でき、破棄できる
====依存性の注入====
*Instrumentaion は、Contexts や Application のようなシステムオブジェクトのモックを作成することができ、テストで利用できる
*れこは、テスト環境の制御を助け、製品のシステムから隔離する。
*カスタムインテントを用意し、それによりActivityを開始することもできるカスタムインテントを用意し、それによりActi[[vi]]tyを開始することもできる
====ユーザーインターフェースインタラクション====
*Instrumentaion を キーストロークおよびタッチイベントを直接 Activity Acti[[vi]]ty のユーザーインターフェースに送るために利用できる
===JUnit===
Activity Acti[[vi]]ty テストクラスは、TextCase と Assert クラスを継承した、JUnit フレームワークも提供している
===2つの主のテスト用サブクラス===
==[http://developer.android.com/reference/android/test/ActivityInstrumentationTestCase2.html ActivityInstrumentationTestCase2]==
*[http://developer.android.com/reference/android/test/ActivityInstrumentationTestCase2.html ActivityInstrumentationTestCase2] は、アプリケーションの一つ以上のActivity の機能を通常のシステム基盤を用いて、テストするためにデザインされている
*通常のシステムコンテキストを利用してアプリケーションの通常のインスタンスでActivityを起動する。通常のシステムコンテキストを利用してアプリケーションの通常のインスタンスでActi[[vi]]tyを起動する。*モックのインテントをActivityに送信することができるので、モックのインテントをActi[[vi]]tyに送信することができるので、
*複数のタイプのインテントに対する応答をテストできる
*インテントに含まれるデータタイプの確かさを期待するActivity インテントに含まれるデータタイプの確かさを期待するActi[[vi]]ty をテストできる
<blockquote>製品のシステムの残りの部分からテストが隔離されていないため、モックのContext および Application は利用できない</blockquote>
==[http://developer.android.com/reference/android/test/ActivityUnitTestCase.html ActivityUnitTestCase]==
*[http://developer.android.com/reference/android/test/ActivityUnitTestCase.html ActivityUnitTestCase] は、隔離された、ただ一つのAcitivity をテストする。
*Activity Acti[[vi]]ty を開始する前に、モックのContext または Application (もしくは両方) を注入することができる*そして、Androidと影響し合うことなしに、メソッドのユニットテストを行うことができるそして、[[Android]]と影響し合うことなしに、メソッドのユニットテストを行うことができる*テスト時にモックのインテントを Activity Acti[[vi]]ty に送ることはできない
*しかしながら、[http://developer.android.com/reference/android/app/Activity.html#startActivity(android.content.Intent) Activity.startActivity(Intent)] を呼び出すことはできるし、受け取った引数を確認することが可能
==SingleLaunchActivityTestCaseSingleLaunchActi[[vi]]tyTestCase==
*[http://developer.android.com/reference/android/test/SingleLaunchActivityTestCase.html SingleLaunchActivityTestCase] は、複数のテストの間、変化しない環境の中のただ一つのAcitvityをテストするのに便利なクラス
*[http://developer.android.com/reference/junit/framework/TestCase.html#tearDown() setUp()|http://developer.android.com/reference/junit/framework/TestCase.html#setUp()] と [tearDown()] をメソッドの呼び出ごとに呼び出す代わりに、たった一度だけ呼び出す。
*いかなるモックオブジェクトの注入も許可しない
==モックオブジェクトとActivityのテストモックオブジェクトとActi[[vi]]tyのテスト==
*[http://developer.android.com/reference/android/test/mock/package-summary.html android.test.mock] で定義される モックオブジェクトをAcitivity のテストに利用する
===[http://developer.android.com/reference/android/test/mock/MockApplication.html MockApplication]===
*[http://developer.android.com/reference/android/test/ActivityUnitTestCase.html MockApplication|http://developer.android.com/reference/android/test/mock/MockApplication.html]は、 [ActivityUnitTestCase] を使う場合、Activity のテストに唯一有効。
*デフォルトでは、ActivityUnitTestCase デフォルトでは、Acti[[vi]]tyUnitTestCase は隠された MockApplication オブジェクトを生成しテストで使用する
*独自のオブジェクトを、[http://developer.android.com/reference/android/test/ActivityUnitTestCase.html#setApplication(android.app.Application) setApplication]で利用できる
==ActivityテストでのアサーションActi[[vi]]tyテストでのアサーション==
*[http://developer.android.com/reference/android/test/ViewAsserts.html ViewAsserts] はViewのためのアサーションを定義する
*Viewnoアライメントや位置、ViewGroup のステートを確認するのに利用できる
==[[Eclipse ]] ADT でのテスト==
*http://developer.android.com/guide/developing/testing/testing_eclipse.html
===テストプロジェクトの作成===
*テスト環境を Ancroid アプリケーションにセットアップするには、最初にテストコードを含む分離されたプロジェクトを作成する必要がある
*新しいプロジェクトは、Android 新しいプロジェクトは、[[Android]] アプリケーションのディレクトリ構造に従う
*同じタイプのコンテンツとファイル、ソースコード、リソース、マニフェストファイルなどなどを含む
*作成したテストパッケージはテスト時にマニフェストファイルの <instrumentation> 要素に従ってアプリケーションに接続する
*新規 [[Android ]] テストプロジェクトダイアログは、それらを簡単に作成するし、いつでもできる*ダイアログは、新しい [[Android アプリケーション作成直後に表示されるが、事前に作成しておくこともできるアプリケーション作成]]直後に表示されるが、事前に作成しておくこともできる
====テストプロジェクトを作成するには====
=====File - New - Other=====
*[[Android ]] TestProject を選択し、Next
[[File:0120_android_test01.jpg]]
=====[[Android ]] Test Project ウィザード=====
*Test Project Name:任意の名前がつけられるが、対象のプロジェクトに"Test"を付加するのが関連を表す一つの方法
*既存の [[Android ]] プロジェクトを選択すると、必要な項目が自動で設定される
[[File:0121_android_test02.jpg]]
===テストパッケージの作成===
*テストプロジェクトを作成したら、テストパッケージを作成する
*パッケージは、Activity パッケージは、Acti[[vi]]ty を必須とはしないが、望めば、定義することもできる*テストパッケージは、Activity、 テストケースクラスと通常のクラスと一体化可能ではあるが、メインとなるテストケースはAndroid テストケースクラスと通常のクラスと一体化可能ではあるが、メインとなるテストケースは[[Android]] テストケースクラスの一つ、もしくはJUnitクラスから継承すべきである。なぜなら、ベストなテスト機能を提供するから*テストパッケージは、Android GUI テストパッケージは、[[Android]] GUI は必要としない*[[Eclipse ]] ADT から起動する場合、JUnit ビューに結果が表示される
*テストを実行し、結果を確認する詳細については、 [http://developer.android.com/guide/developing/testing/testing_eclipse.html#RunTestEclipse Running Tests] を参照
*android.test にAndroid に[[Android]] のテストケースクラスが定義されている
*それらは、JUnit の [http://developer.android.com/reference/junit/framework/TestCase.html TestCase] クラスを継承している
====作成されたテストパッケージのコンテキストメニューから、New - Class====
*クラス名は、テストしたい対象のクラス名 + "Test" としておくのが一つの方法
*継承元は、上記で上げた基底クラスを指定する。(今回は、ActivityInstrumentationTestCase2今回は、Acti[[vi]]tyInstrumentationTestCase2) とした
[[File:0122_android_test03.jpg]]
*クラスが作成されたら、ActivityInstrumentationTestCase2 クラスが作成されたら、Acti[[vi]]tyInstrumentationTestCase2 の ジェネリック型に対象のActivity ジェネリック型に対象のActi[[vi]]ty を指定する。
*テスト環境を制御するためには、setUp() と tearDown() メソッドをオーバーライドする
=====setUp()=====
import info.typea.shujiroid.core.ShujiView;
import info.typea.shujiroid.free.[[R]]; import info.typea.shujiroid.free.ShujiActivityShujiActi[[vi]]ty; import android.test.ActivityInstrumentationTestCase2Acti[[vi]]tyInstrumentationTestCase2;
import android.test.TouchUtils;
import android.view[[vi]]ew.GravityGra[[vi]]ty;
public class ShujiroidTest extends
ActivityInstrumentationTestCase2Acti[[vi]]tyInstrumentationTestCase2<ShujiActivityShujiActi[[vi]]ty> {
private ShujiView shujiView;
public ShujiroidTest() {
super("info.typea.shujiroid.free", ShujiActivityShujiActi[[vi]]ty.class);
}
protected void setUp() throws Exception {
super.setUp();
shujiView = (ShujiView) getActivitygetActi[[vi]]ty().findViewById(R.id.shujiviewshuji[[vi]]ew);
}
public void testDraw() {
getActivitygetActi[[vi]]ty().runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
TouchUtils.dragViewBy(this, shujiView, GravityGra[[vi]]ty.CENTER, 500, 200);
}
}
*[http://developer.android.com/reference/android/test/TouchUtils.html TouchUtils]: タッチイベントシミュレーション用
===テストの実行===
*テストを [[Eclipse ]] から実行するには、2つの方法がある**Run As ... - [[Android ]] JUnit Test をプロジェクトのコンテキストメニューから選択**[[Eclipse ]] の run configuration を作成する
[[File:0123_android_test04.jpg]]
*自動で、画面に描画された
[[File:0124_android_test05.png]]