Glance を使用した単体テスト

Glance 単体テスト API を使用すると、ビューをインフレートしたり、UI オートメータを必要とせずに Glance のコードをテストできます。たとえば、単体テスト API では、hasContentDescriptionEqualToisChecked などのマッチャーを使用して、要素がリスト内にあるかどうか、チェックボックスがオンになっているかどうかなどの条件を検証できます。

この API は軽量で、セットアップも必要ないため、ウィジェットの各部分を開発しながらテスト駆動開発を行い、コードの再利用性を高めるために整理できます。

セットアップ

単体テスト ライブラリを使用するために必要な依存関係を以下に示します。

// Other Glance and Compose runtime dependencies.
...
testImplementation 'androidx.glance:glance-testing:1.1.0'
testImplementation 'androidx.glance:glance-AppWidget-testing:1.1.0'
testImplementation 'org.robolectric:robolectric:4.11.1'
...
// You may include additional dependencies, such as Robolectric, if your test
// needs to set a LocalContext.

テストの構造

コードの再利用と単体テストを可能にするために、GlanceAppWidget クラスの外部でコンポーズ可能な関数を整理します。テスト対象のユニットの複雑さをできるだけ減らします。

class MyGlanceComposableTest {
    @Test
    fun myNewsItemComposable_largeSize_hasAuthorAsSubtitle() = runGlanceAppWidgetUnitTest {
        // Prepare inputs and state
        setAppWidgetSize(100.dp, 100.dp)

        // Set the composable under test
        provideComposable {
            MyNewsItemComposable(TEST_NEWS_ITEM)
        }

        // Perform assertions
        onNode(hasTestTag("subTitle"))
            .assertHasText(TEST_NEWS_ITEM.authorName)
    }
}

テストのコンテキストとサイズを設定する

コンポーズ可能な関数が LocalContext.current() メソッドを使用してコンテキストを読み取る場合は、LocalContext.current() メソッドを使用してコンテキストを設定する必要があります。それ以外の場合は、この手順は省略可能です。

Roboletric などの JVM ベースの Android 単体テスト フレームワークを使用して、コンテキストを提供できます。

コンポーズ可能な関数が LocalSize にアクセスする場合は、テストでコンポーザブルを提供する前に、テストに目的のサイズを設定します。デフォルトのサイズは 349.dp x 455.dp です。これは、Pixel 4 デバイスの縦向き表示に表示される 5x4 ウィジェットに相当します。

  • AppWidget で sizeMode == Single を使用する場合は、ウィジェットの info.xml ファイルで、これを minWidthminHeight に設定できます。
  • AppWidget で sizeMode == Exact を使用している場合は、ウィジェットのサイズを決定する方法と同様の方法でテスト対象のサイズを特定し、ウィジェットが表示される横向きと縦向きのサイズを特定してテストできます。
  • AppWidget で sizeMode == Responsive を使用する場合は、sizeMode を指定するときに指定したリストのいずれかのサイズに設定できます。

テスト タイムアウトのデフォルトの時間は 1 秒ですが、テスト インフラストラクチャで別のタイムアウトを適用している場合は、引数としてカスタム期間を runGlanceAppWidgetUnitTest メソッドに渡すことができます。

詳細とコードサンプルについては、runGlanceAppWidgetUnitTest のリファレンス ドキュメントをご覧ください。