Android বিভিন্ন ধরনের টুল ও API প্রদান করে যা আপনাকে বিভিন্ন স্ক্রিন ও উইন্ডো সাইজের জন্য টেস্ট তৈরি করতে সাহায্য করতে পারে।
DeviceConfigurationOverride
DeviceConfigurationOverride কম্পোজেবল আপনাকে
কনফিগারেশন অ্যাট্রিবিউট ওভাররাইড করতে দেয় যাতে কম্পোজ লেআউটে একাধিক স্ক্রিন ও উইন্ডো সাইজ পরীক্ষা করা যায়। 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.
}
এছাড়াও, আপনি এই কম্পোজেবল ব্যবহার করে ফন্ট স্কেল, থিম এবং অন্যান্য প্রপার্টি সেট করতে পারেন যা আপনি বিভিন্ন উইন্ডো সাইজে পরীক্ষা করতে চাইতে পারেন।
Robolectric
JVM-এ কম্পোজ বা ভিউ-ভিত্তিক UI পরীক্ষা চালাতে Robolectric ব্যবহার করুন লোকালি—কোনও ডিভাইস বা এমুলেটরের প্রয়োজন নেই। অন্যান্য উপযোগী প্রপার্টি ছাড়াও, নির্দিষ্ট স্ক্রিন সাইজ ব্যবহার করার জন্য আপনি Robolectric কনফিগার করতে পারবেন।
Now in Android থেকে নেওয়া নিম্নলিখিত উদাহরণে, Robolectric-কে ৪৮০ dpi রেজোলিউশন সহ ১০০০x১০০০ 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() নতুন কনফিগারেশনের সাথে সিস্টেম এবং
অ্যাপ্লিকেশন রিসোর্স আপডেট করে কিন্তু অ্যাক্টিভ অ্যাক্টিভিটি বা অন্যান্য কম্পোনেন্টে কোনও অ্যাকশন
ট্রিগার করে না।
আপনি Robolectric ডিভাইস কনফিগারেশন ডকুমেন্টেশন থেকে আরও জানতে পারবেন।
Gradle-এর ম্যানেজ করা ডিভাইস
Gradle-এর ম্যানেজ করা ডিভাইস (GMD) Android Gradle প্লাগ-ইন আপনাকে এমুলেটর এবং আসল ডিভাইসের স্পেসিফিকেশন নির্ধারণ করতে দেয় যেখানে আপনার ইনস্ট্রুমেন্টেড টেস্ট রান করে। বিভিন্ন স্ক্রিন সাইজের ডিভাইসের জন্য স্পেসিফিকেশন তৈরি করুন যাতে এমন একটি টেস্টিং স্ট্র্যাটেজি প্রয়োগ করা যায় যেখানে নির্দিষ্ট স্ক্রিন সাইজে নির্দিষ্ট টেস্ট রান করা যায়। কন্টিনিউয়াস ইন্টিগ্রেশন (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"
}
}
}
}
}
আপনি testing-samples প্রোজেক্টে GMD-এর একাধিক উদাহরণ দেখতে পাবেন।
Firebase Test Lab
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 ডিভাইস (পরবর্তী বিভাগ দেখুন) ডিভাইসের প্রপার্টি ব্যবহার করে টেস্ট ফিল্টার করতে পারে।
Espresso ডিভাইস
Espresso, Compose বা UI Automator টেস্ট সহ যেকোনও ধরনের ইনস্ট্রুমেন্টেড টেস্ট ব্যবহার করে টেস্টে এমুলেটরে অ্যাকশন পারফর্ম করতে Espresso Device ব্যবহার করুন। এইসব অ্যাকশনের মধ্যে স্ক্রিনের সাইজ সেট করা বা ফোল্ডেবল স্ট্যাটাস বা পশ্চার টগল করা অন্তর্ভুক্ত থাকতে পারে। যেমন, আপনি একটি ফোল্ডেবল এমুলেটর কন্ট্রোল করতে পারেন এবং এটিকে টেবিলটপ মোডে সেট করতে পারেন। 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()))
}
}
মনে রাখবেন যে Espresso Device এখনও আলফা স্টেজে আছে এবং নিম্নলিখিত প্রয়োজনীয়তা আছে:
- Android Gradle প্লাগ-ইন 8.3 বা তার পরবর্তী ভার্সন
- Android Emulator 33.1.10 বা তার পরের যেকোনও ভার্সন
- Android ভার্চুয়াল ডিভাইস যা API লেভেল ২৪ বা তার পরবর্তী যেকোনও ভার্সনে চলে
টেস্ট ফিল্টার করুন
Espresso Device কানেক্ট করা ডিভাইসের প্রপার্টি পড়তে পারে যাতে আপনি অ্যানোটেশন ব্যবহার করে টেস্ট ফিল্টার করতে পারেন। অ্যানোটেট করা প্রয়োজনীয়তা পূরণ না হলে, টেস্ট এড়িয়ে যাওয়া হয়।
RequiresDeviceMode অ্যানোটেশন
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 annotation
RequiresDisplay অ্যানোটেশন আপনাকে সাইজ ক্লাস ব্যবহার করে ডিভাইসের স্ক্রিনের প্রস্থ ও উচ্চতা নির্দিষ্ট করতে দেয়, যা অফিসিয়াল উইন্ডো সাইজ ক্লাস অনুযায়ী ডাইমেনশন বাকেট নির্ধারণ করে।
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
অ্যাক্টিভিটি আবার তৈরি না করেই কম্পোজেবল কম্পোনেন্টের জন্য
স্টেট রিস্টোরেশন পরীক্ষা করতে 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()
}
উইন্ডো টেস্টিং লাইব্রেরি
উইন্ডো টেস্টিং লাইব্রেরিতে এমন ইউটিলিটি আছে যা আপনাকে এমন টেস্ট লিখতে সাহায্য করে যা উইন্ডো ম্যানেজমেন্টের সাথে সম্পর্কিত ফিচার, যেমন অ্যাক্টিভিটি এম্বেডিং বা ফোল্ডেবল ফিচারের উপর নির্ভর করে বা তা যাচাই করে। আর্টিফ্যাক্টটি Google-এর Maven রিপোজিটরি-এর মাধ্যমে উপলভ্য।
যেমন, আপনি FoldingFeature() ফাংশন ব্যবহার করে কাস্টম FoldingFeature তৈরি করতে পারেন, যা আপনি কম্পোজ প্রিভিউতে ব্যবহার করতে পারবেন। Java-তে,
createFoldingFeature() ফাংশন ব্যবহার করুন।
Compose প্রিভিউতে, আপনি নিম্নলিখিত উপায়ে 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 প্রোজেক্টে আরও স্যাম্পেল খুঁজে পাবেন।
অতিরিক্ত রিসোর্স
ডকুমেন্টেশন
- বড় স্ক্রিনের অ্যাপ কোয়ালিটি সংক্রান্ত নির্দেশিকা
- Android-এ অ্যাপ টেস্ট করা
- আপনার Compose লেআউট টেস্ট করা
নমুনা
- WindowManager স্যাম্পেল
- Espresso ডিভাইসের স্যাম্পেল
- Now In Android
- বিভিন্ন স্ক্রিন সাইজ যাচাই করতে স্ক্রিনশট টেস্টিং ব্যবহার করে
কোডল্যাবস