アクティビティは、アプリ内のすべてのユーザー操作のコンテナとして機能するため、 デバイスレベルでのアプリのアクティビティの動作をテストすることが重要です。 次のようなイベントがあります。
- デバイスの電話アプリなど、別のアプリがアプリのアクティビティに割り込む。
- システムによってアクティビティが破棄され、再作成される。
- ユーザーは、以下のような新しいウィンドウ環境にアクティビティを配置します。 ピクチャー イン ピクチャー(PIP)またはマルチウィンドウの
特に、Google Cloud Storage 内でアクティビティが アクティビティ 説明します。
このガイドでは、アプリのデータ維持機能を評価する方法について説明します アプリのアクティビティが移行する際に、整合性と優れたユーザー エクスペリエンスが ライフサイクルのさまざまな状態に変化します。
アクティビティの状態を遷移させる
アプリのアクティビティをテストする重要な側面の一つは、アプリの
特定の状態におけるアクティビティを記録します。この「特定の」状態を使用したい場合は、
ActivityScenario
のインスタンス、
AndroidX Test ライブラリ。このクラスを使用すると、
デバイスレベルのイベントをシミュレートする状態にアクティビティを配置します。
ActivityScenario
は、ローカル単体テストで使用できるクロス プラットフォーム API です。
テストも実施できます実際のデバイスまたは仮想デバイスで
ActivityScenario
はスレッドセーフを提供し、スレッド間でイベントを同期します。
テストのインストルメンテーション スレッドと、テスト対象のアクティビティを実行するスレッドの中間状態となります。
特に、この API は環境内でのアクティビティの 破棄したときや作成されたときに、テストの動作が変わります。このセクションでは、最も一般的な ユースケースを見ていきましょう。
アクティビティを作成する
テスト対象のアクティビティを作成するには、次のスニペットに示すコードを追加します。
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { } } }
アクティビティを作成した後、ActivityScenario
はアクティビティを
RESUMED
状態。この状態は、アクティビティが実行中であり、
ユーザーに表示されます。この状態では、アクティビティのコンテナと
Espresso UI テストを使用した View
要素
テストの際は、アクティビティで close
を呼び出すことをおすすめします。
表示されます。これにより、関連するリソースがクリーンアップされ、
テストの安定性が向上します。ActivityScenario
は Closeable
を実装しているため、次のことができます。
use
拡張機能、または Java プログラミングの try-with-resources
を適用する
アクティビティは自動的に閉じます。
または、ActivityScenarioRule
を使用して、
各テストの前と ActivityScenario.close
の前に ActivityScenario.launch
破棄します。次の例は、ルールを定義し、
シナリオの一例を
返すことができます
@RunWith(AndroidJUnit4::class) class MyTestSuite { @get:Rule var activityScenarioRule = activityScenarioRule<MyActivity>() @Test fun testEvent() { val scenario = activityScenarioRule.scenario } }
アクティビティを新しい状態に遷移させる
アクティビティを CREATED
や STARTED
などの別の状態にするには、次の関数を呼び出します。
moveToState()
。このアクションは、アクティビティの
別のアプリまたはユーザーによって中断されたため、
指定できます。
moveToState()
の使用例を次のコード スニペットに示します。
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { scenario -> scenario.moveToState(State.CREATED) } } }
現在のアクティビティの状態を確認する
テスト対象のアクティビティの現在の状態を判断するには、
ActivityScenario
オブジェクト内の state
フィールド。特に役に立つ
テスト対象のアクティビティが
別のアクティビティまたは自身を終了させるコードの例
snippet:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { scenario -> scenario.onActivity { activity -> startActivity(Intent(activity, MyOtherActivity::class.java)) } val originalActivityState = scenario.state } } }
アクティビティを再作成する
デバイスのリソースが少なくなると、システムがアクティビティを破棄し、
ユーザーがアプリに戻ったときにそのアクティビティを再作成することを要求できます。
これらの条件をシミュレートするには、recreate()
を呼び出します。
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { scenario -> scenario.recreate() } } }
ActivityScenario
クラスは、アクティビティの保存済みインスタンスの状態を維持します。
@NonConfigurationInstance
アノテーションが付けられたオブジェクト。これらのオブジェクトは
テスト対象のアクティビティの新しいインスタンスに
挿入します
アクティビティの検索結果を取得する
終了したアクティビティに関連付けられた結果コードまたはデータを取得するには、
次に示すように、ActivityScenario
オブジェクト内の result
フィールドの値
次のコード スニペットを追加します。
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testResult() { launchActivity<MyActivity>().use { onView(withId(R.id.finish_button)).perform(click()) // Activity under test is now finished. val resultCode = scenario.result.resultCode val resultData = scenario.result.resultData } } }
アクティビティでアクションをトリガーする
ActivityScenario
内のすべてのメソッドはブロッキング呼び出しであるため、API には以下が必要です。
インストルメンテーションスレッドで実行できます
テスト対象のアクティビティでアクションをトリガーするには、Espresso ビュー マッチャーを使用して以下を行います。 ビュー内の要素を操作できます。
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { onView(withId(R.id.refresh)).perform(click()) } } }
ただし、アクティビティ自体でメソッドを呼び出す必要がある場合は、そのようにできます
ActivityAction
を実装することで安全に保護できます。
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { scenario -> scenario.onActivity { activity -> activity.handleSwipeToRefresh() } } } }