Compose は一般的なテスト フレームワークと統合できます。
Espresso との相互運用
ハイブリッド アプリでは、ビュー階層内の Compose コンポーネントと Compose コンポーザブル内のビューを(AndroidView
コンポーザブルを介して)見つけることができます。
どちらのタイプも、マッチングするために特別な手順は必要ありません。ビューをマッチングするには Espresso の onView
を使用し、Compose 要素をマッチングするには ComposeTestRule
を使用します。
@Test
fun androidViewInteropTest() {
// Check the initial state of a TextView that depends on a Compose state.
Espresso.onView(withText("Hello Views")).check(matches(isDisplayed()))
// Click on the Compose button that changes the state.
composeTestRule.onNodeWithText("Click here").performClick()
// Check the new value.
Espresso.onView(withText("Hello Compose")).check(matches(isDisplayed()))
}
UiAutomator との相互運用
デフォルトでは、使い勝手のよい記述子(表示されるテキストやコンテンツの説明など)によってのみ、UiAutomator からコンポーザブルにアクセスできます。Modifier.testTag
を使用する任意のコンポーザブルにアクセスするには、そのコンポーザブルのサブツリーに対してセマンティック プロパティ testTagsAsResourceId
を有効にする必要があります。この動作を有効にすると、スクロール可能なコンポーザブル(LazyColumn
など)のように、一意のハンドルがないコンポーザブルに役立ちます。
コンポーザブルの階層では、上位で 1 度有効にすれば、Modifier.testTag
を持つすべてのネストされたコンポーザブルに UiAutomator からアクセスできるようになります。
Scaffold(
// Enables for all composables in the hierarchy.
modifier = Modifier.semantics {
testTagsAsResourceId = true
}
){
// Modifier.testTag is accessible from UiAutomator for composables nested here.
LazyColumn(
modifier = Modifier.testTag("myLazyColumn")
){
// Content
}
}
Modifier.testTag(tag)
を持つ任意のコンポーザブルにアクセスするには、By.res(resourceName)
で resourceName
と同じ tag
を使用します。
val device = UiDevice.getInstance(getInstrumentation())
val lazyColumn: UiObject2 = device.findObject(By.res("myLazyColumn"))
// Some interaction with the lazyColumn.
参考情報
- Android でアプリをテストする: Android テストのメイン ランディング ページでは、テストの基礎と手法について幅広く説明しています。
- テストの基礎: Android アプリのテストに関する基本コンセプトを学びます。
- ローカルテスト: 一部のテストは、自分のワークステーションでローカルに実行できます。
- インストルメンテーション テスト: インストルメンテーション テストも実行することをおすすめします。つまり、デバイス上で直接実行されるテストです。
- 継続的インテグレーション: 継続的インテグレーションを使用すると、テストをデプロイ パイプラインに統合できます。
- さまざまな画面サイズをテストする: ユーザーが利用できるデバイスは非常に多様であるため、さまざまな画面サイズでテストする必要があります。
- Espresso: Espresso はビューベースの UI を対象としていますが、Compose テストの一部のアスペクトでも役立ちます。