4.アプリケーションアクティビティテスト


アクティビティステータスの変更


アプリケーションのアクティビティをテストする主な理由->アプリケーションのアクティビティを特定のステータスに配置する
Activity ScenarioインスタンスをAndroid Xテストライブラリの一部として使用して、特定の要素を定義します.
Activity Scenarioとは?
プラットフォーム間APIは、ローカルユニットテストおよびアプライアンス統合テストで使用できます.
Activity Scenario機能
1)スレッドのセキュリティを提供する->テストされた測定スレッドとテスト中のデバイスを実行しているスレッドとの間でイベントを同期します.
2)削除または作成時のテスト中のアクティビティの動作を評価するのに特に適している

アクティビティの作成

    @RunWith(AndroidJUnit4::class)
    class MyTestSuite {
        @Test fun testEvent() {
            val scenario = launchActivity<MyActivity>()
        }
    }
    
アクティビティを作成すると、アクティビティScenarioはアクティビティをRESUMED状態に変換します.
RESUMEDステータスは、アクティビティが実行中であり、ユーザに表示されていることを示します.
この状態では、Espresso UIテストを使用して、アクティブなビュー要素と自由に対話できます.
Activity ScenarioRuleの使用
テスト前->Activity Scenario.launch
テストを無効にする->Activity Scenario.close自動呼び出し
    @RunWith(AndroidJUnit4::class)
    class MyTestSuite {
        @get:Rule var activityScenarioRule = activityScenarioRule<MyActivity>()

        @Test fun testEvent() {
            val scenario = activityScenarioRule.scenario
        }
    }
   
上記の例では、ルールを定義し、ルールからシーンインスタンスを取得する方法を示します.

アクティビティを新しい状態に変更


moveToState()を呼び出し、アクティビティをCREATEDまたはSTARTに変更します.
このオペレーションシミュレーションは、アクティビティが他のアプリケーションまたはシステムのオペレーションによって中断されたため、それぞれ停止または一時停止された場合をシミュレートします.
    @RunWith(AndroidJUnit4::class)
    class MyTestSuite {
        @Test fun testEvent() {
            val scenario = launchActivity<MyActivity>()
            scenario.moveToState(State.CREATED)
        }
    }
    
moveToState()の例です.
注意:テスト中のアクティビティを現在のステータスに変換しようとすると、Activity Scenarioはこのリクエストを例外ではなく、アクションなし(no-op)と見なします.

現在のアクティブ状態の確認


テスト中のアクティビティの現在のステータスを決定するには、アクティビティScenarioオブジェクト内のstateフィールドの値を取得する必要があります.
    @RunWith(AndroidJUnit4::class)
    class MyTestSuite {
        @Test fun testEvent() {
            val scenario = launchActivity<MyActivity>()
            scenario.onActivity { activity ->
              startActivity(Intent(activity, MyOtherActivity::class.java))
            }

            val originalActivityState = scenario.state
        }
    }
    
アクティビティが別のアクティビティにリダイレクトされるか、または自分で完了する場合、上記のコードに示すように、テスト中のアクティビティのステータスを決定することは特に役立ちます.

アクティビティの再作成


アプライアンスのリソースが不足している場合は、アクティビティを削除できます.
したがって、ユーザーがアプリケーションに戻ると、アプリケーションはactivityを再生成する必要がある場合があります.
    @RunWith(AndroidJUnit4::class)
    class MyTestSuite {
        @Test fun testEvent() {
            val scenario = launchActivity<MyActivity>()
            scenario.recreate()
        }
    }
    
Activity Scenarioクラス@NonConfigurationInstanceを使用して、アノテーションオブジェクトとアクティビティの保存済みインスタンスの状態を保持します.
これらのオブジェクトは、テスト中のアクティブな新しいインスタンスにロードされます.

アクティビティ結果の検索


完了したアクティビティに関連付けられた結果コードまたはデータを取得するには、Activity Scenarioオブジェクトで結果フィールドの値を取得する必要があります.
    @RunWith(AndroidJUnit4::class)
    class MyTestSuite {
        @Test fun testResult() {
            val scenario = launchActivity<MyActivity>()
            onView(withId(R.id.finish_button)).perform(click())

            // Activity under test is now finished.

            val resultCode = scenario.result.resultCode
            val resultData = scenario.result.resultData
        }
    }
    
注:Activity Scenarioはアクティビティに対してfinish()を呼び出すことはありません.テスト中のアクティビティがまだ完了していないか、完了していない場合、このメソッドはタイムアウトし、実行時に異常が発生します.

活動の中で仕事を奮い立たせる


Activity Scenarioではすべてのメソッドが呼び出しをブロックするため、APIを使用するには、測定スレッドでメソッドを実行する必要があります.
テスト中のアクティビティのタスクをトリガーするには、Espressonビューを使用してビュー内の要素とインタラクティブにマッチングします.
    @RunWith(AndroidJUnit4::class)
    class MyTestSuite {
        @Test fun testEvent() {
            val scenario = launchActivity<MyActivity>()
            onView(withId(R.id.refresh)).perform(click())
        }
    }
    
ただし、アクティビティ自体からメソッドを呼び出す必要がある場合は、アクティビティ操作を実施し、安全に実行できます.
    @RunWith(AndroidJUnit4::class)
    class MyTestSuite {
        @Test fun testEvent() {
            val scenario = launchActivity<MyActivity>()
            scenario.onActivity { activity ->
              activity.handleSwipeToRefresh()
            }
        }
    }