アプリのアクティビティをテストする

アクティビティは、アプリ内のすべてのユーザー操作のコンテナとして機能するため、 デバイスレベルでのアプリのアクティビティの動作をテストすることが重要です。 次のようなイベントがあります。

  • デバイスの電話アプリなど、別のアプリがアプリのアクティビティに割り込む。
  • システムによってアクティビティが破棄され、再作成される。
  • ユーザーは、以下のような新しいウィンドウ環境にアクティビティを配置します。 ピクチャー イン ピクチャー(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 を呼び出すことをおすすめします。 表示されます。これにより、関連するリソースがクリーンアップされ、 テストの安定性が向上します。ActivityScenarioCloseable を実装しているため、次のことができます。 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
    }
}

アクティビティを新しい状態に遷移させる

アクティビティを CREATEDSTARTED などの別の状態にするには、次の関数を呼び出します。 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()
            }
        }
    }
}