टेस्ट सुइट की मदद से स्क्रीनशॉट की टेस्टिंग करना

Android Gradle प्लगिन (AGP) 9.5.0-alpha03 और Compose Preview Screenshot Testing engine 0.0.1-alpha16 से, स्क्रीनशॉट टेस्टिंग को AGP के नेटिव टेस्ट सुइट फ़्रेमवर्क के साथ इंटिग्रेट किया गया है.

यह तरीका, अलग से मौजूद स्क्रीनशॉट प्लगिन (com.android.compose.screenshot) की जगह ले लेता है. हमारा सुझाव है कि आप इन वजहों से, एजीपी टेस्ट सुइट का इस्तेमाल करें:

  • नेटिव Gradle टास्क लाइफ़साइकल: स्क्रीनशॉट टेस्ट, सीधे तौर पर स्टैंडर्ड Gradle और AGP टेस्टिंग लाइफ़साइकल में इंटिग्रेट होते हैं. इससे टास्क आइसोलेशन और टेस्ट एक्ज़ीक्यूशन की विश्वसनीयता बेहतर होती है.
  • एक से ज़्यादा वर्शन और कस्टम सुइट के साथ काम करता है: एक ही मॉड्यूल में, अलग-अलग स्क्रीनशॉट टेस्ट सुइट (जैसे, screenshotTest, uiTests या smokeTests) बनाए जा सकते हैं. साथ ही, किसी एक प्री-कॉन्फ़िगर किए गए सोर्स सेट तक सीमित रहने के बजाय, खास बिल्ड वर्शन (जैसे, demoDebug या release) को टारगेट किया जा सकता है.
  • बिल्ड की बेहतर परफ़ॉर्मेंस और आइसोलेशन: AGP टेस्ट सुइट, बिल्ट-इन आर्टफ़ैक्ट ट्रांसफ़ॉर्म (जैसे कि Layoutlib रनटाइम एक्सट्रैक्शन) और आइसोलेटेड क्लासलोडिंग का इस्तेमाल करते हैं. साथ ही, Gradle कॉन्फ़िगरेशन कैश मेमोरी और प्रोजेक्ट आइसोलेशन के लिए पूरी तरह से काम करते हैं.

ज़रूरी शर्तें

टेस्ट सुइट के साथ Compose Screenshot Testing का इस्तेमाल करने के लिए, पक्का करें कि आपका एनवायरमेंट इन ज़रूरी शर्तों को पूरा करता हो:

  • Android Studio Rabbit 1 Canary 4 या इसके बाद का वर्शन.
  • Android Gradle प्लगिन (AGP) 9.5.0-alpha03 या इसके बाद का वर्शन.
  • Compose Screenshot Engine का 0.0.1-alpha16 या इसके बाद का वर्शन.
  • JDK का वर्शन 17 या इसके बाद का वर्शन.
  • आपके प्रोजेक्ट के लिए, कंपोज़ करने की सुविधा चालू हो. हमारा सुझाव है कि Compose Compiler Gradle प्लगिन का इस्तेमाल करके, Compose को चालू करें.

सेट अप और कॉन्फ़िगरेशन

टेस्ट सुइट के साथ Compose की स्क्रीनशॉट टेस्टिंग को कॉन्फ़िगर करने के लिए, यह तरीका अपनाएं:

1. एक्सपेरिमेंटल फ़्लैग चालू करना

अपने प्रोजेक्ट की रूट gradle.properties फ़ाइल में, स्क्रीनशॉट टेस्टिंग और टेस्ट सुइट की सुविधा चालू करें:

android.experimental.enableScreenshotTest=true
android.experimental.testSuiteSupport=true

2. build.gradle.kts फ़ाइल में टेस्ट सुइट कॉन्फ़िगर करना

अपने मॉड्यूल की build.gradle.kts फ़ाइल में, testOptions ब्लॉक में स्क्रीनशॉट टेस्ट सुइट तय करें:

android {
    testOptions {
        screenshotTests.create("screenshotTest") { // suiteName can be customized (for example, "uiTests")
            engineVersion = "0.0.1-alpha16"
            targetVariants.add("demoDebug") // Add specific variants to test

            dependencies {
                implementation(libs.androidx.compose.ui.tooling)
                implementation("com.android.tools.screenshot:screenshot-validation-api:0.0.1-alpha16")
            }
        }
    }
}

3. टेस्ट सोर्स सेट बनाएं

अपने सुइट के नाम से मिलती-जुलती, सोर्स सेट डायरेक्ट्री बनाएं:

{module}/src/{suiteName}/kotlin/

उदाहरण के लिए, screenshotTest नाम के सुइट के लिए:

feature/foryou/impl/src/screenshotTest/kotlin/com/example/app/ForYouScreenTest.kt

4. कंपोज़ की जा सकने वाली झलक की जांच तय करना

@PreviewTest और स्टैंडर्ड @Preview या मल्टी-प्रीव्यू एनोटेशन का इस्तेमाल करके, कंपोज़ेबल को एनोटेट करें:

package com.example.app

import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import com.android.tools.screenshot.PreviewTest
import com.example.app.ui.theme.AppTheme

@PreviewTest
@Preview(showBackground = true)
@Composable
fun ForYouScreenPreview() {
    AppTheme {
        ForYouScreen(isSyncing = false)
    }
}

स्क्रीनशॉट टेस्ट चलाना

AGP टेस्ट सुइट, आपके सुइट के नाम, टारगेट, और वैरिएंट के आधार पर Gradle टास्क जनरेट करते हैं.

1. रेफ़रंस इमेज जनरेट करना या उन्हें अपडेट करना

कंपोज़ की जा सकने वाली झलकियां रेंडर करें और गोल्डन बेसलाइन रेफ़रंस इमेज सेव करें:

  • Linux और macOS: ./gradlew update{SuiteName}{Target}{Variant}TestSuite (उदाहरण के लिए, ./gradlew updateScreenshotTestDefaultDemoDebugTestSuite)
  • Windows: gradlew updateScreenshotTestDefaultDemoDebugTestSuite

रेफ़रंस इमेज यहां जनरेट और सेव की जाती हैं:

{module}/src/{suiteName}{Target}{Variant}/reference/

2. पुष्टि करना और टेस्ट चलाना

नए स्क्रीनशॉट रेंडर करें और उनकी तुलना रेफ़रंस इमेज से करें:

  • Linux और macOS: ./gradlew test{SuiteName}{Target}{Variant}TestSuite (उदाहरण के लिए, ./gradlew testScreenshotTestDefaultDemoDebugTestSuite)
  • Windows: gradlew testScreenshotTestDefaultDemoDebugTestSuite

टेस्ट रिपोर्ट की जांच करना

अगर अंतर का पता चलता है या टेस्ट पूरे नहीं होते हैं, तो AGP, एचटीएमएल टेस्ट रिपोर्ट जनरेट करता है.

  • रिपोर्ट की गई जगह की जानकारी: {module}/build/reports/tests/{taskName}/index.html (उदाहरण के लिए, app/build/reports/tests/testScreenshotTestDefaultDemoDebugTestSuite/index.html)

अपडेट की गई रिपोर्ट में ये शामिल हैं:

  • हेडर मेटाडेटा कार्ड: इसमें टेस्ट का नाम, झलक दिखाने का तरीका, वैरिएंट, सुइट, और स्टेटस बैज दिखता है.
  • गड़बड़ी की कैटगरी: कॉपी किए जा सकने वाले स्टैक ट्रेस के साथ Reference Image Missing, Image Size Mismatch या Pixel Mismatch को साफ़ तौर पर फ़्लैग करता है.
  • डाइनैमिक विज़ुअल डिफ़: यह सुविधा, छोटे-मोटे बदलावों को कम इंटेंसिटी के साथ और बड़े बदलावों को ज़्यादा कंट्रास्ट के साथ हाइलाइट करती है. इससे नेस्ट किए गए एलिमेंट को छिपाने से रोका जा सकता है.

लेगसी स्टैंडअलोन प्लगिन से माइग्रेट करना

लेगसी स्टैंडअलोन स्क्रीनशॉट प्लगिन से AGP टेस्ट सुइट पर माइग्रेट करने के लिए, Gradle कॉन्फ़िगरेशन और टास्क कमांड अपडेट करें.

बिल्ड कॉन्फ़िगरेशन डीएसएल की तुलना

लेगसी स्टैंडअलोन प्लग इन (अब काम नहीं करता)

// In build.gradle.kts
plugins {
    alias(libs.plugins.screenshot)
}

dependencies {
    screenshotTestImplementation(libs.androidx.compose.ui.tooling)
    screenshotTestImplementation("com.android.tools.screenshot:screenshot-validation-api:0.0.1-alpha16")
}
// In build.gradle.kts
android {
    testOptions {
        screenshotTests.create("screenshotTest") {
            engineVersion = "0.0.1-alpha16"
            targetVariants.add("demoDebug")

            dependencies {
                implementation(libs.androidx.compose.ui.tooling)
                implementation("com.android.tools.screenshot:screenshot-validation-api:0.0.1-alpha16")
            }
        }
    }
}

टास्क और पाथ की मैपिंग

कॉन्सेप्ट लेगसी सेटअप (अब सेवा में नहीं है) AGP टेस्ट सुइट (सुझाया गया)
टास्क अपडेट करना ./gradlew updateDebugScreenshotTest ./gradlew update{SuiteName}{Target}{Variant}TestSuite
टेस्ट टास्क ./gradlew validateDebugScreenshotTest ./gradlew test{SuiteName}{Target}{Variant}TestSuite
रेफ़रंस पाथ src/screenshotTestDebug/reference src/{suiteName}{Target}{Variant}/reference
रिपोर्ट पाथ build/reports/screenshotTest/debug/ build/reports/tests/{taskName}/