বিভিন্ন স্ক্রীন মাপ পরীক্ষা করার জন্য লাইব্রেরি এবং টুল

অ্যান্ড্রয়েড বিভিন্ন ধরণের টুল এবং API প্রদান করে যা আপনাকে বিভিন্ন স্ক্রিন এবং উইন্ডো আকারের জন্য পরীক্ষা তৈরি করতে সাহায্য করতে পারে।

ডিভাইস কনফিগারেশন ওভাররাইড

DeviceConfigurationOverride composable আপনাকে Compose লেআউটে একাধিক স্ক্রিন এবং উইন্ডো আকার পরীক্ষা করার জন্য কনফিগারেশন বৈশিষ্ট্যগুলিকে ওভাররাইড করতে দেয়। ForcedSize ওভাররাইড উপলব্ধ স্থানের যেকোনো লেআউটে ফিট করে, যা আপনাকে যেকোনো স্ক্রিন আকারে যেকোনো UI পরীক্ষা চালাতে দেয়। উদাহরণস্বরূপ, আপনি আপনার সমস্ত UI পরীক্ষা চালানোর জন্য একটি ছোট ফোন ফর্ম ফ্যাক্টর ব্যবহার করতে পারেন, যার মধ্যে বড় ফোন, ফোল্ডেবল এবং ট্যাবলেটের জন্য UI পরীক্ষা অন্তর্ভুক্ত রয়েছে।

   DeviceConfigurationOverride(
        DeviceConfigurationOverride.ForcedSize(DpSize(1280.dp, 800.dp))
    ) {
        MyScreen() // Will be rendered in the space for 1280dp by 800dp without clipping.
    }
চিত্র ১. DeviceConfigurationOverride ব্যবহার করে একটি ছোট ফর্ম ফ্যাক্টর ডিভাইসের ভিতরে একটি ট্যাবলেট লেআউট ফিট করা, যেমন \*এখন অ্যান্ড্রয়েডে*।

উপরন্তু, আপনি এই কম্পোজেবলটি ব্যবহার করে ফন্ট স্কেল, থিম এবং অন্যান্য বৈশিষ্ট্য সেট করতে পারেন যা আপনি বিভিন্ন উইন্ডো আকারে পরীক্ষা করতে চাইতে পারেন।

রোবোবলেট্রিক

JVM-এ স্থানীয়ভাবে কম্পোজ বা ভিউ-ভিত্তিক UI পরীক্ষা চালানোর জন্য Robolectric ব্যবহার করুন — কোনও ডিভাইস বা এমুলেটরের প্রয়োজন নেই। আপনি অন্যান্য দরকারী বৈশিষ্ট্যের মধ্যে নির্দিষ্ট স্ক্রিন আকার ব্যবহার করার জন্য Robolectric কনফিগার করতে পারেন।

Now in Android এর নিম্নলিখিত উদাহরণে , Robolectric কে 480 dpi রেজোলিউশন সহ 1000x1000 dp স্ক্রিন সাইজ অনুকরণ করার জন্য কনফিগার করা হয়েছে:

@RunWith(RobolectricTestRunner::class)
// Configure Robolectric to use a very large screen size that can fit all of the test sizes.
// This allows enough room to render the content under test without clipping or scaling.
@Config(qualifiers = "w1000dp-h1000dp-480dpi")
class NiaAppScreenSizesScreenshotTests { ... }

আপনি Now in Android উদাহরণ থেকে এই স্নিপেটে করা পরীক্ষামূলক বডি থেকে কোয়ালিফায়ার সেট করতে পারেন:

val (width, height, dpi) = ...

// Set qualifiers from specs.
RuntimeEnvironment.setQualifiers("w${width}dp-h${height}dp-${dpi}dpi")

মনে রাখবেন যে RuntimeEnvironment.setQualifiers() নতুন কনফিগারেশনের মাধ্যমে সিস্টেম এবং অ্যাপ্লিকেশন রিসোর্স আপডেট করে কিন্তু সক্রিয় কার্যকলাপ বা অন্যান্য উপাদানগুলিতে কোনও অ্যাকশন ট্রিগার করে না।

আপনি রোবলোকট্রিক ডিভাইস কনফিগারেশন ডকুমেন্টেশনে আরও পড়তে পারেন।

গ্রেডল-পরিচালিত ডিভাইসগুলি

গ্রেডল-ম্যানেজড ডিভাইস (GMD) অ্যান্ড্রয়েড গ্রেডল প্লাগইন আপনাকে আপনার ইন্সট্রুমেন্টেড পরীক্ষাগুলি চালানোর জন্য এমুলেটর এবং আসল ডিভাইসগুলির স্পেসিফিকেশন নির্ধারণ করতে দেয়। বিভিন্ন স্ক্রিন আকারের ডিভাইসগুলির জন্য স্পেসিফিকেশন তৈরি করুন যাতে একটি টেস্টিং কৌশল বাস্তবায়ন করা যায় যেখানে নির্দিষ্ট স্ক্রিন আকারে নির্দিষ্ট পরীক্ষা চালানো আবশ্যক। কন্টিনিউয়াস ইন্টিগ্রেশন (CI) সহ GMD ব্যবহার করে, আপনি নিশ্চিত করতে পারেন যে প্রয়োজনের সময় উপযুক্ত পরীক্ষাগুলি চালানো হয়, এমুলেটরগুলির প্রভিশনিং এবং লঞ্চ করা এবং আপনার CI সেটআপকে সহজ করা।

android {
    testOptions {
        managedDevices {
            devices {
                // Run with ./gradlew nexusOneApi30DebugAndroidTest.
                nexusOneApi30(com.android.build.api.dsl.ManagedVirtualDevice) {
                    device = "Nexus One"
                    apiLevel = 30
                    // Use the AOSP ATD image for better emulator performance
                    systemImageSource = "aosp-atd"
                }
                // Run with ./gradlew  foldApi34DebugAndroidTest.
                foldApi34(com.android.build.api.dsl.ManagedVirtualDevice) {
                    device = "Pixel Fold"
                    apiLevel = 34
                    systemImageSource = "aosp-atd"
                }
            }
        }
    }
}

আপনি টেস্টিং-স্যাম্পল প্রকল্পে GMD-এর একাধিক উদাহরণ খুঁজে পেতে পারেন।

ফায়ারবেস টেস্ট ল্যাব

Firebase Test Lab (FTL), অথবা অনুরূপ ডিভাইস ফার্ম পরিষেবা ব্যবহার করে, নির্দিষ্ট বাস্তব ডিভাইসগুলিতে আপনার পরীক্ষা চালানোর জন্য যেখানে আপনার অ্যাক্সেস নাও থাকতে পারে, যেমন বিভিন্ন আকারের ফোল্ডেবল বা ট্যাবলেট। Firebase Test Lab হল একটি পেইড পরিষেবা যার একটি বিনামূল্যের স্তর রয়েছে । FTL এমুলেটরগুলিতে পরীক্ষা চালানোর সুবিধাও প্রদান করে। এই পরিষেবাগুলি যন্ত্রযুক্ত পরীক্ষার নির্ভরযোগ্যতা এবং গতি উন্নত করে কারণ তারা ডিভাইস এবং এমুলেটরগুলিকে আগে থেকেই সরবরাহ করতে পারে।

GMD এর সাথে FTL ব্যবহার সম্পর্কে তথ্যের জন্য, Gradle-পরিচালিত ডিভাইসগুলির সাথে আপনার পরীক্ষাগুলি স্কেল করুন দেখুন।

টেস্ট রানার দিয়ে ফিল্টারিং পরীক্ষা করুন

একটি সর্বোত্তম পরীক্ষার কৌশল একই জিনিস দুবার যাচাই করা উচিত নয়, তাই আপনার বেশিরভাগ UI পরীক্ষা একাধিক ডিভাইসে চালানোর প্রয়োজন হয় না। সাধারণত, আপনি আপনার UI পরীক্ষাগুলি সমস্ত বা বেশিরভাগই একটি ফোন ফর্ম ফ্যাক্টরে এবং বিভিন্ন স্ক্রিন আকারের ডিভাইসগুলিতে শুধুমাত্র একটি উপসেট চালিয়ে ফিল্টার করেন।

আপনি নির্দিষ্ট কিছু ডিভাইসের সাথে চালানোর জন্য নির্দিষ্ট কিছু পরীক্ষা টীকা করতে পারেন এবং তারপর পরীক্ষাগুলি চালানোর কমান্ড ব্যবহার করে AndroidJUnitRunner- এ একটি আর্গুমেন্ট পাস করতে পারেন।

উদাহরণস্বরূপ, আপনি বিভিন্ন টীকা তৈরি করতে পারেন:

annotation class TestExpandedWidth
annotation class TestCompactWidth

এবং বিভিন্ন পরীক্ষায় এগুলি ব্যবহার করুন:

class MyTestClass {

    @Test
    @TestExpandedWidth
    fun myExample_worksOnTablet() {
        ...
    }

    @Test
    @TestCompactWidth
    fun myExample_worksOnPortraitPhone() {
        ...
    }

}

তারপর আপনি নির্দিষ্ট ডিভাইসগুলি ফিল্টার করার জন্য পরীক্ষা চালানোর সময় android.testInstrumentationRunnerArguments.annotation প্রোপার্টি ব্যবহার করতে পারেন। উদাহরণস্বরূপ, যদি আপনি Gradle-পরিচালিত ডিভাইস ব্যবহার করেন:

$ ./gradlew pixelTabletApi30DebugAndroidTest -Pandroid.testInstrumentationRunnerArguments.annotation='com.sample.TestExpandedWidth'

যদি আপনি GMD ব্যবহার না করেন এবং CI তে এমুলেটর পরিচালনা করেন, তাহলে প্রথমে নিশ্চিত করুন যে সঠিক এমুলেটর বা ডিভাইসটি প্রস্তুত এবং সংযুক্ত আছে, এবং তারপর ইন্সট্রুমেন্টেড পরীক্ষা চালানোর জন্য প্যারামিটারটি Gradle কমান্ডগুলির একটিতে পাস করুন:

$ ./gradlew connectedAndroidTest -Pandroid.testInstrumentationRunnerArguments.annotation='com.sample.TestExpandedWidth'

মনে রাখবেন যে এসপ্রেসো ডিভাইস (পরবর্তী বিভাগ দেখুন) ডিভাইসের বৈশিষ্ট্য ব্যবহার করে পরীক্ষাগুলি ফিল্টার করতে পারে।

এসপ্রেসো ডিভাইস

Espresso, Compose, অথবা UI Automator পরীক্ষা সহ যেকোনো ধরণের ইন্সট্রুমেন্টেড পরীক্ষা ব্যবহার করে পরীক্ষায় এমুলেটরগুলিতে ক্রিয়া সম্পাদন করতে Espresso ডিভাইস ব্যবহার করুন। এই ক্রিয়াগুলির মধ্যে স্ক্রিনের আকার সেট করা বা ফোল্ডেবল অবস্থা বা ভঙ্গি টগল করা অন্তর্ভুক্ত থাকতে পারে। উদাহরণস্বরূপ, আপনি একটি ফোল্ডেবল এমুলেটর নিয়ন্ত্রণ করতে পারেন এবং এটিকে টেবিলটপ মোডে সেট করতে পারেন। Espresso ডিভাইসে কিছু বৈশিষ্ট্যের প্রয়োজনের জন্য JUnit নিয়ম এবং টীকাও রয়েছে:

@RunWith(AndroidJUnit4::class)
class OnDeviceTest {

    @get:Rule(order=1) val activityScenarioRule = activityScenarioRule<MainActivity>()

    @get:Rule(order=2) val screenOrientationRule: ScreenOrientationRule =
        ScreenOrientationRule(ScreenOrientation.PORTRAIT)

    @Test
    fun tabletopMode_playerIsDisplayed() {
        // Set the device to tabletop mode.
        onDevice().setTabletopMode()
        onView(withId(R.id.player)).check(matches(isDisplayed()))
    }
}

মনে রাখবেন যে এসপ্রেসো ডিভাইসটি এখনও আলফা পর্যায়ে রয়েছে এবং এর নিম্নলিখিত প্রয়োজনীয়তা রয়েছে:

  • অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৮.৩ বা তার বেশি
  • অ্যান্ড্রয়েড এমুলেটর ৩৩.১.১০ বা তার বেশি
  • অ্যান্ড্রয়েড ভার্চুয়াল ডিভাইস যা API লেভেল 24 বা তার বেশি চালায়

ফিল্টার পরীক্ষা

এসপ্রেসো ডিভাইস সংযুক্ত ডিভাইসের বৈশিষ্ট্যগুলি পড়তে পারে যাতে আপনি টীকা ব্যবহার করে পরীক্ষাগুলি ফিল্টার করতে পারেন। যদি টীকাযুক্ত প্রয়োজনীয়তা পূরণ না হয়, তাহলে পরীক্ষাগুলি এড়িয়ে যাওয়া হয়।

ডিভাইসমোড অ্যানোটেশন প্রয়োজন

RequiresDeviceMode অ্যানোটেশনটি একাধিকবার ব্যবহার করে এমন একটি পরীক্ষা নির্দেশ করা যেতে পারে যা কেবলমাত্র তখনই চলবে যদি ডিভাইসে সমস্ত DeviceMode মান সমর্থিত থাকে।

class OnDeviceTest {
    ...
    @Test
    @RequiresDeviceMode(TABLETOP)
    @RequiresDeviceMode(BOOK)
    fun tabletopMode_playerIdDisplayed() {
        // Set the device to tabletop mode.
        onDevice().setTabletopMode()
        onView(withId(R.id.player)).check(matches(isDisplayed()))
    }
}

ডিসপ্লে অ্যানোটেশন প্রয়োজন

RequiresDisplay অ্যানোটেশন আপনাকে size ক্লাস ব্যবহার করে ডিভাইসের স্ক্রিনের প্রস্থ এবং উচ্চতা নির্দিষ্ট করতে দেয়, যা অফিসিয়াল window size ক্লাস অনুসরণ করে ডাইমেনশন বাকেট নির্ধারণ করে।

class OnDeviceTest {
    ...
    @Test
    @RequiresDisplay(EXPANDED, COMPACT)
    fun myScreen_expandedWidthCompactHeight() {
        ...
    }
}

ডিসপ্লের আকার পরিবর্তন করুন

রানটাইমের সময় স্ক্রিনের মাত্রা পরিবর্তন করতে setDisplaySize() পদ্ধতিটি ব্যবহার করুন। DisplaySizeRule ক্লাসের সাথে এই পদ্ধতিটি ব্যবহার করুন, যা নিশ্চিত করে যে পরীক্ষার সময় করা যেকোনো পরিবর্তন পরবর্তী পরীক্ষার আগে পূর্বাবস্থায় ফেরানো হয়েছে।

@RunWith(AndroidJUnit4::class)
class ResizeDisplayTest {

    @get:Rule(order = 1) val activityScenarioRule = activityScenarioRule<MainActivity>()

    // Test rule for restoring device to its starting display size when a test case finishes.
    @get:Rule(order = 2) val displaySizeRule: DisplaySizeRule = DisplaySizeRule()

    @Test
    fun resizeWindow_compact() {
        onDevice().setDisplaySize(
            widthSizeClass = WidthSizeClass.COMPACT,
            heightSizeClass = HeightSizeClass.COMPACT
        )
        // Verify visual attributes or state restoration.
    }
}

যখন আপনি setDisplaySize() ব্যবহার করে একটি ডিসপ্লের আকার পরিবর্তন করেন, তখন আপনি ডিভাইসের ঘনত্বকে প্রভাবিত করেন না, তাই যদি কোনও মাত্রা লক্ষ্য ডিভাইসে ফিট না হয়, তাহলে UnsupportedDeviceOperationException ব্যবহার করে পরীক্ষাটি ব্যর্থ হয়। এই ক্ষেত্রে পরীক্ষা চালানো থেকে বিরত রাখতে, RequiresDisplay অ্যানোটেশন ব্যবহার করে সেগুলি ফিল্টার করুন:

@RunWith(AndroidJUnit4::class)
class ResizeDisplayTest {

    @get:Rule(order = 1) var activityScenarioRule = activityScenarioRule<MainActivity>()

    // Test rule for restoring device to its starting display size when a test case finishes.
    @get:Rule(order = 2) var displaySizeRule: DisplaySizeRule = DisplaySizeRule()

    /**
     * Setting the display size to EXPANDED would fail in small devices, so the [RequiresDisplay]
     * annotation prevents this test from being run on devices outside the EXPANDED buckets.
     */
    @RequiresDisplay(
        widthSizeClass = WidthSizeClassEnum.EXPANDED,
        heightSizeClass = HeightSizeClassEnum.EXPANDED
    )
    @Test
    fun resizeWindow_expanded() {
        onDevice().setDisplaySize(
            widthSizeClass = WidthSizeClass.EXPANDED,
            heightSizeClass = HeightSizeClass.EXPANDED
        )
        // Verify visual attributes or state restoration.
    }
}

স্টেটরেস্টোরেশনটেস্টার

StateRestorationTester ক্লাসটি কার্যকলাপ পুনর্নির্মাণ ছাড়াই কম্পোজেবল উপাদানগুলির জন্য স্টেট পুনরুদ্ধার পরীক্ষা করার জন্য ব্যবহৃত হয়। এটি পরীক্ষাগুলিকে দ্রুত এবং আরও নির্ভরযোগ্য করে তোলে, কারণ কার্যকলাপ পুনর্নির্মাণ একাধিক সিঙ্ক্রোনাইজেশন প্রক্রিয়া সহ একটি জটিল প্রক্রিয়া:

@Test
fun compactDevice_selectedEmailEmailRetained_afterConfigChange() {
    val stateRestorationTester = StateRestorationTester(composeTestRule)

    // Set content through the StateRestorationTester object.
    stateRestorationTester.setContent {
        MyApp()
    }

    // Simulate a config change.
    stateRestorationTester.emulateSavedInstanceStateRestore()
}

উইন্ডো টেস্টিং লাইব্রেরি

উইন্ডো টেস্টিং লাইব্রেরিতে এমন ইউটিলিটি রয়েছে যা আপনাকে পরীক্ষা লিখতে সাহায্য করে যা উইন্ডো পরিচালনার সাথে সম্পর্কিত বৈশিষ্ট্যগুলির উপর নির্ভর করে বা যাচাই করে, যেমন অ্যাক্টিভিটি এম্বেডিং বা ফোল্ডেবল বৈশিষ্ট্য। এই আর্টিফ্যাক্টটি গুগলের ম্যাভেন রিপোজিটরির মাধ্যমে পাওয়া যায়।

উদাহরণস্বরূপ, আপনি FoldingFeature() ফাংশন ব্যবহার করে একটি কাস্টম FoldingFeature তৈরি করতে পারেন, যা আপনি Compose প্রিভিউতে ব্যবহার করতে পারেন। জাভাতে, createFoldingFeature() ফাংশন ব্যবহার করুন।

একটি কম্পোজ প্রিভিউতে, আপনি নিম্নলিখিত উপায়ে FoldingFeature বাস্তবায়ন করতে পারেন:

@Preview(showBackground = true, widthDp = 480, heightDp = 480)
@Composable private fun FoldablePreview() =
    MyApplicationTheme {
        ExampleScreen(
            displayFeatures = listOf(FoldingFeature(Rect(0, 240, 480, 240)))
        )
 }

এছাড়াও, আপনি TestWindowLayoutInfo() ফাংশন ব্যবহার করে UI পরীক্ষায় প্রদর্শন বৈশিষ্ট্যগুলি অনুকরণ করতে পারেন। নিম্নলিখিত উদাহরণটি স্ক্রিনের কেন্দ্রে একটি HALF_OPENED উল্লম্ব কব্জা সহ একটি FoldingFeature সিমুলেট করে, তারপর লেআউটটি প্রত্যাশিত কিনা তা পরীক্ষা করে:

রচনা করুন

import androidx.window.layout.FoldingFeature.Orientation.Companion.VERTICAL
import androidx.window.layout.FoldingFeature.State.Companion.HALF_OPENED
import androidx.window.testing.layout.FoldingFeature
import androidx.window.testing.layout.TestWindowLayoutInfo
import androidx.window.testing.layout.WindowLayoutInfoPublisherRule

@RunWith(AndroidJUnit4::class)
class MediaControlsFoldingFeatureTest {

    @get:Rule(order=1)
    val composeTestRule = createAndroidComposeRule<ComponentActivity>()

    @get:Rule(order=2)
    val windowLayoutInfoPublisherRule = WindowLayoutInfoPublisherRule()

    @Test
    fun foldedWithHinge_foldableUiDisplayed() {
        composeTestRule.setContent {
            MediaPlayerScreen()
        }

        val hinge = FoldingFeature(
            activity = composeTestRule.activity,
            state = HALF_OPENED,
            orientation = VERTICAL,
            size = 2
        )

        val expected = TestWindowLayoutInfo(listOf(hinge))
        windowLayoutInfoPublisherRule.overrideWindowLayoutInfo(expected)

        composeTestRule.waitForIdle()

        // Verify that the folding feature is detected and media controls shown.
        composeTestRule.onNodeWithTag("MEDIA_CONTROLS").assertExists()
    }
}

প্রকার

import androidx.window.layout.FoldingFeature.Orientation
import androidx.window.layout.FoldingFeature.State
import androidx.window.testing.layout.FoldingFeature
import androidx.window.testing.layout.TestWindowLayoutInfo
import androidx.window.testing.layout.WindowLayoutInfoPublisherRule

@RunWith(AndroidJUnit4::class)
class MediaControlsFoldingFeatureTest {

    @get:Rule(order=1)
    val activityRule = ActivityScenarioRule(MediaPlayerActivity::class.java)

    @get:Rule(order=2)
    val windowLayoutInfoPublisherRule = WindowLayoutInfoPublisherRule()

    @Test
    fun foldedWithHinge_foldableUiDisplayed() {
        activityRule.scenario.onActivity { activity ->
            val feature = FoldingFeature(
                activity = activity,
                state = State.HALF_OPENED,
                orientation = Orientation.VERTICAL)
            val expected = TestWindowLayoutInfo(listOf(feature))
            windowLayoutInfoPublisherRule.overrideWindowLayoutInfo(expected)
        }

        // Verify that the folding feature is detected and media controls shown.
        onView(withId(R.id.media_controls)).check(matches(isDisplayed()))
    }
}

আপনি WindowManager প্রকল্পে আরও নমুনা খুঁজে পেতে পারেন।

অতিরিক্ত সম্পদ

ডকুমেন্টেশন

নমুনা

কোডল্যাব