Activityテスト


http://www.cnblogs.com/trinea/archive/2012/02/29/2420108.html
 
他のコンポーネントとは違って、activityは複雑なコールバック方式によるライフサイクルがあります。instrumenation以外に他の種類によって呼び出されたものを表示できないので、activityのテストは特にAndroid instructionの枠組みに依存します。
 
1、activityをテストするアプリ
activityをテストするappiのベースはInstructionation TestCaseで、このベースはinstruumentationを提供します。
1.1 activityテストに対して、Instructionation TestCaseという基質は次のような機能を提供しています。
a.ライフサイクルコントロール:instrumenationを通じて、テストされたactivityの起動、一時停止、廃棄などをコントロールできます。通常、コンポーネントのライフサイクルはシステムによって制御されています。例えば、おなじみのactivityライフサイクルの対応する関数one Create、onResume、onStopなどの関数はシステムによって自動的に呼び出しられます。そして、Androidアプリケーションフレームは直接に呼び出す権限を提供していませんが、instrumenationでは呼び出しができます。
 
b.依存注入:instructionation mockシステムのオブジェクトを使用して、contexts、aplicationなど、activityを起動します。測定点がデータと分離できるようにする。
 
c.ユーザーインタフェースのインタラクション:instructumentationを使って、activityにキーボード、タッチ、ジェスチャーイベントを送信することができます。
 
activityをテストするための2つの主要クラスはActivityInstrumentationTestCase2です。 和  ActivityUnitTestCase。は、非標準状態のactivityをテストするために、SingleLaunchActivityTestCaseを使用することができます。
 
1.2 ActivityInstructionation TestCase 2
複数のactivityに会う機能テスト及びactivityのintenstsに対する応答テストに適用します。テストされたactivityはシステムベースアプリで作成され、作成されたactivityを直接操作できます。以前のActivityInstructionation TestCaseに取って代わりました。
利点:
a.便利なmock intensが各activityに切り替えられ、activityが異なる種類のintenstsに対する応答をテストし、もっとset ActivityIntentに会います。
b.uiスレッドでは任意のテスト方法を実行できます。UiThreadTestを参照してください。
短所:正常なシステムベースアプリを作成することで、mock contextsやappliationsは許可されないので、activityとシステムの他の部分を分離して独立したテストを行うことができません。
 
1.3 ActivityUnit TestCase
単一activityをシステムから分離して独立してテストすることに適合して、およびactivityの中でmock contextとaplicationのテスト。テストされたactivityが作成された時は、できるだけ少ないシステムの基礎を頼りにして、activityの多くの依存をモデルで落とすことができます。
利点:activity起動前に便利なmock context、aplicationなどが、activityの作成を相対的に独立させ、システムと相互作用しないユニットテストを行うことができます。
短所:activityは通常のシステムではなく、システムの他のactivityとの対話もできないため、多くの関数が正常に起動できない、または呼び出し後は何もしない。
 
1.4 SingleLaunchActivityTestCase
非標準状態のactivityをテストするのに適しています。これはsetUp()とtearDown()だけを呼び出して、各方法の呼び出しではなく一回setUpとtearDownを呼び出します。したがって、setUpでactivityを作成し、tearDownでactivityを廃棄します。このようにテストクラス全体の実行過程で、activityは一回だけ作成されます。
activity起動のいくつかの方法を知っていると、必ずsingleTop、singleTask、singleInstanceの3つの起動モードを連想します。このタイプは実際にはこの3つの起動モードを模擬するためのテストです。これらの3つのモードについては、以下を参照することができる。http://trinea.iteye.com/blog/1112902
利点:非標準モードのactivityをテストしてもいいです。テスト中に配置が変更されず、activityが異なる呼び出しに対する処理をテストすることができます。
短所:どのオブジェクトもmockできません。
 
2、テストポイント
2.1入力の有効性:これは多くのソフトウェアとウェブページの開発と似ています。もちろん、mokeyとmokeyrunnerを使って自動化テストができます。
 
2.2ライフサイクルイベント:ライフサイクル状態の切り替えにおいて、現在の状態を正しく保存し、応答することに重点を置く。
 
2.3 Intensts:activityはAndroid Manifest.xmlファイルのintent filterノードに配置されたintentを正確に処理できます。 ActivityInstructionation TestCase 2 mockの異なるintenstsをテストします。
 
2.4運転時の配置変化:プログラム運転時の設定変化は、画面の方向、言語の変更などの正確な応答ができるかどうか。もっと変化が見られます。 Handling Runtime Changs.
 
2.5スクリーンサイズと解像度:アプリケーションのリリース前に、異なる画面サイズと解像度デバイスに適用されるテストが必要であり、直接にavdsのサイズを変更することによって、または対象機器に直接テストすることができます。より多くはSupporting Multile Sreensを参照することができます。
 
3、UIテストの説明
アプリケーションのactivitiesは、UIスレッドすなわちメインラインで実行されています。UIが実用化されると、すべてのUIとのインタラクションがこのメインラインで行われる必要があります。参照してください。http://trinea.iteye.com/blog/1142151。プログラムが正常に実行されている場合、スレッドへのアクセス権限があります。
 
テストを行うときは、instructionのクラスに基づいて、方法をUI操作に呼び出すことができますが、他のクラスはできません。あるテスト方法をUI Threadで実行させるために、@UID ThreadTestを使用してこの方法を表示することができ、この方法のすべてのステートメントはUI Threadで実行され、Instruction.waitForIdleSync()などのUIと対話しないステートメントを含んではいけない。
 
UI Threadでテスト方法のサブセットを実行するために、Runnableの匿名サブクラスを作成し、実行されているステートメントをrun()メソッドに置いて、対象をappActivity.run OnUiThread()として具体化することができます。 パラメータその中のappActivityは測定されたactivityの一例示的な対象である。具体的には例示コードを参照してください。
 
 
以下はいくつかの問題解決方法です。
1、デバイスの応答テストを送信したキーボードイベントのために、touchモードをオフにしないと応答できない。
touchモードを閉じる方法:getActivity()メソッドを呼び出す前にActivityInstrumentationTestCase2.setActivityTouchMode(false)を呼び出します。 ,また、非UI Threadで実行される方法でのみ呼び出しが可能です。
 
2、スクリーンがロックされている時、テストは実行できません。
解決方法:スクリーンロック禁止
a.AndroidManifest.xmlファイルのmaifestノードに追加し、追加する。
<uses-permission android:name=“android.permission.DISABLEguKEYGUARD”/”
プログラムの使用を許可するスクリーンのロックを禁止する権限を表します。
b.activitiesをテストされたonCreate()関数に追加する
  mKeyGuardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
  mLock = mKeyGuardManager.newKeyguardLock("activity_classname");
  mLock.disableKeyguard();
そのうちactivityclassinameはactivityのクラス名をテストされます。 
 
3、WrongThreadException
テストケースの実行に失敗した場合、以下の異常があります。
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
この問題は、非UIスレッド内でUIの操作が行われているため、@UiThreadTestを追加するか、あるいはrunOnUiThreadを使用することができる。
開発コードが報告されたら、解決は参考になります。http://trinea.iteye.com/blog/1142151
 
4、java.lang.RuntimeException
テストケースの実行に失敗した場合、以下の異常があります。
java.lang.RuntimeException: This method can not be called from the main application thread
これはUI Thread(主スレッド)内で非プライマリスレッドで許可された操作かもしれません。方法が@UiThreadTestを追加したか、あるいはrunOnUiThread()方法を使用したかもしれません。
 
参考:http://developer.android.com/guide/topics/testing/activity_testingy.
http://developer.android.com/resources/tutorials/testing/activity_test.