Compose プレビューのスクリーンショットのテスト

スクリーンショット テストは、UI がユーザーにどのように表示されるかを確認する効果的な方法です。Compose プレビュー スクリーンショット テストツールは、コンポーザブル プレビューのシンプルさと機能と、ホストサイドのスクリーンショット テストを実行することで生産性を向上させる機能を組み合わせたものです。Compose プレビューのスクリーンショット テストは、コンポーザブル プレビューと同じくらい使いやすく設計されています。

スクリーンショット テストは、UI の一部をスクリーンショットし、事前に承認された参照画像と比較する自動テストです。画像が一致しない場合、テストは失敗し、HTML レポートが生成されます。このレポートは、比較して違いを見つけるのに役立ちます。

Compose プレビューのスクリーンショット テストツールを使用すると、次のことができます。

  • スクリーンショット テストに使用する既存または新しいコンポーザブル プレビューの数を特定します。
  • これらのコンポーザブル プレビューから参照画像を生成します。
  • コードを変更した後のプレビューの変更を特定する HTML レポートを生成します。
  • @Preview パラメータ(uiModefontScale など)とマルチプレビューを使用して、テストをスケーリングします。
  • 新しい screenshotTest ソースセットを使用してテストをモジュラー化する。
図 1. HTML レポートの例。

要件

Compose プレビューのスクリーンショット テストを使用するには、以下が必要です。

  • Android Gradle 8.5.0-beta01 以降。
  • Kotlin 1.9.20 以降。

設定

このツールを有効にする手順は次のとおりです。

  1. com.android.compose.screenshot プラグイン(バージョン 0.0.1-alpha07)をプロジェクトに追加します。
    1. バージョン カタログ ファイルにプラグインを追加します。
      [versions]
      agp = "8.5.0-beta01"
      kotlin = "1.9.20"
      ...
      screenshot = "0.0.1-alpha07"
      
      [plugins]
      ...
      screenshot = { id = "com.android.compose.screenshot", version.ref = "screenshot"}
      
    2. モジュール レベルの build.gradle.kts ファイルで、plugins {} ブロックにプラグインを追加します。
      plugins {
          ...
          alias(libs.plugins.screenshot)
      }
      
  2. プロジェクトの gradle.properties ファイルで試験運用版プロパティを有効にします。
    android.experimental.enableScreenshotTest=true
    
  3. モジュール レベルの build.gradle.kts ファイルの android {} ブロックで、screenshotTest ソースセットを使用する試験運用版フラグを有効にし、kotlinCompilerExtensionVersion が 1.5.4 以上に設定されていることを確認します。
    android {
        ...
        composeOptions {
            kotlinCompilerExtensionVersion = "1.5.4"
        }
        experimentalProperties["android.experimental.enableScreenshotTest"] = true
    }
    
  4. ui-tooling 依存関係が追加されていることを確認します。
    1. バージョン カタログに追加します。
      [libraries]
      androidx-compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling"}
      
    2. モジュール レベルの build.gradle.kts ファイルに追加します。
      dependencies {
        screenshotTestImplementation(libs.androidx.compose.ui.tooling)
      }
      

スクリーンショット テストに使用するコンポーザブル プレビューを指定

スクリーンショット テストに使用するコンポーザブル プレビューを指定するには、プレビューをテストクラスに配置します。テストクラス ファイルは、新しい screenshotTest ソースセット(app/src/screenshotTest/kotlin/com/google/yourapp/ExamplePreviewScreenshots.kt{module}/src/screenshotTest/{kotlin|java}/com/your/package)など)に配置する必要があります。

このファイルまたは同じソースセットで作成された他のファイルに、コンポーザブルやプレビュー(マルチプレビューを含む)を追加できます。

package com.google.yourapp

import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import com.google.yourapp.ui.theme.MyApplicationTheme

class ExamplePreviewsScreenshots {

    @Preview(showBackground = true)
    @Composable
    fun GreetingPreview() {
        MyApplicationTheme {
            Greeting("Android!")
        }
    }
}

参照画像を生成する

テストクラスを設定したら、プレビューごとに参照画像を生成する必要があります。これらの参照画像は、コードを変更した後で変更を特定するために使用されます。コンポーザブル プレビュー スクリーンショット テストの参照画像を生成するには、次の Gradle タスクを実行します。

  • Linux と macOS: ./gradlew updateDebugScreenshotTest./gradlew {:module:}update{Variant}ScreenshotTest
  • Windows: gradlew updateDebugScreenshotTestgradlew {:module:}update{Variant}ScreenshotTest

タスクが完了したら、app/src/debug/screenshotTest/reference{module}/src/{variant}/screenshotTest/reference)で参照画像を見つけます。

テストレポートを生成する

参照画像が存在したら、検証タスクを実行して新しいスクリーンショットを撮影し、参照画像と比較します。

  • Linux と macOS: ./gradlew validateDebugScreenshotTest./gradlew {:module:}validate{Variant}ScreenshotTest
  • Windows: gradlew validateDebugScreenshotTestgradlew {:module:}validate{Variant}ScreenshotTest

検証タスクは、{module}/build/reports/screenshotTest/preview/{variant}/index.html に HTML レポートを作成します。

既知の問題

既知の問題の最新リストは、ツールのIssue Tracker コンポーネントで確認できます。その他のフィードバックや問題については、Issue Tracker から報告してください。

リリースの更新内容

継続中のバージョンのリリースノートと変更点

0.0.1-alpha06

このリリースでは、以下の新機能が導入されています。

画像の差異しきい値: この新しいグローバルなしきい値設定により、スクリーンショットの比較をより細かく制御できます。構成するには、モジュールの build.gradle.kts を更新します。

android {
    ...
    testOptions {
        ...
        screenshotTests {
            imageDifferenceThreshold = 0.0001f // 0.01%
        }
    }
}

このしきい値は、モジュールで定義されているすべてのスクリーンショット テストに適用されます。

  • バグの修正: Compose レンダラのバグと、空の Compose のサポートを追加
  • パフォーマンスの向上: 画像の差分アルゴリズムを更新して高速化