এসপ্রেসো ডিভাইস API দিয়ে স্ক্রিন কনফিগারেশন পরিবর্তনের বিরুদ্ধে পরীক্ষা করুন

ডিভাইসটির সাধারণ কনফিগারেশন পরিবর্তন, যেমন রোটেশন এবং স্ক্রিন আনফোল্ডিং, ঘটলে আপনার অ্যাপ পরীক্ষা করার জন্য Espresso Device API ব্যবহার করুন। আপনার Jetpack Compose টেস্টিং রুলগুলোর পাশাপাশি ডিভাইস-স্তরের অ্যাকশনগুলো সম্পাদন করার জন্য Espresso Device API হলো প্রস্তাবিত টুল। আপনি যদি Jetpack Compose-এর জন্য UI টেস্ট লিখতে নতুন হন, তাহলে “Testing your Compose layout” দেখুন।

Espresso ডিভাইস API আপনাকে একটি ভার্চুয়াল ডিভাইসে কনফিগারেশন পরিবর্তন ট্রিগার করতে এবং আপনার টেস্টগুলো সিনক্রোনাসভাবে চালাতে দেয়, ফলে একবারে কেবল একটি UI অ্যাকশন বা অ্যাসারশন ঘটে এবং আপনার টেস্টের ফলাফল আরও নির্ভরযোগ্য হয়। আপনি যদি Espresso দিয়ে UI টেস্ট লিখতে নতুন হন, তবে এর ডকুমেন্টেশন দেখুন।

এসপ্রেসো ডিভাইস এপিআই ব্যবহার করার জন্য আপনার নিম্নলিখিত জিনিসগুলির প্রয়োজন হবে:

  • অ্যান্ড্রয়েড স্টুডিও ইগুয়ানা বা উচ্চতর সংস্করণ
  • অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৮.৩ বা তার উচ্চতর সংস্করণ
  • অ্যান্ড্রয়েড এমুলেটর ৩৩.১.১০ বা উচ্চতর
  • অ্যান্ড্রয়েড ভার্চুয়াল ডিভাইস যা এপিআই লেভেল ২৪ বা তার উচ্চতর সংস্করণে চলে

এসপ্রেসো ডিভাইস এপিআই-এর জন্য আপনার প্রজেক্টটি সেট আপ করুন।

আপনার প্রজেক্টটি Espresso Device API সমর্থন করার জন্য সেট আপ করতে, নিম্নলিখিতগুলি করুন:

  1. টেস্ট ডিভাইসটিতে কমান্ড পাঠানোর অনুমতি দিতে, androidTest সোর্স সেটের ম্যানিফেস্ট ফাইলে প্রয়োজনীয় নেটওয়ার্ক পারমিশনগুলো যোগ করুন:

      <uses-permission android:name="android.permission.INTERNET" />
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    

    আপনার টেস্ট যদি অ্যান্ড্রয়েড ১৭ (এপিআই লেভেল ৩৭) বা তার উচ্চতর সংস্করণকে টার্গেট করে, তাহলে আপনাকে অবশ্যই ACCESS_LOCAL_NETWORK পারমিশনটিও ডিক্লেয়ার করতে হবে:

      <uses-permission android:name="android.permission.ACCESS_LOCAL_NETWORK" />
    
  2. gradle.properties ফাইলে enableEmulatorControl পরীক্ষামূলক ফ্ল্যাগটি সক্রিয় করুন:

      android.experimental.androidTest.enableEmulatorControl=true
    
  3. মডিউল-স্তরের বিল্ড স্ক্রিপ্টে emulatorControl অপশনটি সক্রিয় করুন:

    কোটলিন

      testOptions {
        emulatorControl {
          enable = true
        }
      }
      

    গ্রুভি

      testOptions {
        emulatorControl {
          enable = true
        }
      }
      
  4. মডিউল-স্তরের বিল্ড স্ক্রিপ্টে, আপনার প্রজেক্টে Espresso Device লাইব্রেরিটি ইম্পোর্ট করুন:

    কোটলিন

    dependencies {
      androidTestImplementation("androidx.test.espresso:espresso-device:1.1.0")
    }

    গ্রুভি

    dependencies {
      androidTestImplementation 'androidx.test.espresso:espresso-device:1.1.0'
    }

সাধারণ কনফিগারেশন পরিবর্তনের বিরুদ্ধে পরীক্ষা করুন

Espresso ডিভাইস API-তে একাধিক স্ক্রিন ওরিয়েন্টেশন এবং ফোল্ডেবল স্টেট রয়েছে, যা ব্যবহার করে আপনি ডিভাইস কনফিগারেশনে পরিবর্তন আনতে পারেন। নিম্নলিখিত উদাহরণগুলিতে দেখানো হয়েছে কীভাবে এই ডিভাইস স্টেটগুলি ট্রিগার করতে হয় এবং Compose টেস্ট রুল ব্যবহার করে এর ফলে সৃষ্ট UI পরিবর্তনগুলি যাচাই করতে হয়।

স্ক্রিন ঘূর্ণনের বিরুদ্ধে পরীক্ষা

স্ক্রিন রোটেশন পরীক্ষা করার জন্য, আপনি পরীক্ষার সময় ডিভাইসের ওরিয়েন্টেশন নির্ধারণ করতে ScreenOrientationRule ক্লাসটি ব্যবহার করতে পারেন।

ডিভাইসের স্ক্রিন ঘুরলে আপনার অ্যাপের কী পরিবর্তন হয়, তা পরীক্ষা করার একটি উদাহরণ এখানে দেওয়া হলো:

  1. প্রথমে, আপনার Compose টেস্ট রুলটি সংজ্ঞায়িত করুন এবং ডিভাইসটিকে একটি সামঞ্জস্যপূর্ণ প্রারম্ভিক অবস্থায় (যেমন পোর্ট্রেট মোড) সেট করতে ScreenOrientationRule ক্লাসটি ব্যবহার করুন:

    import androidx.compose.ui.test.assertIsDisplayed
    import androidx.compose.ui.test.assertDoesNotExist
    import androidx.compose.ui.test.junit4.createComposeRule
    import androidx.compose.ui.test.onNodeWithTag
    import androidx.test.espresso.device.EspressoDevice.onDevice
    import androidx.test.espresso.device.action.ScreenOrientation
    import androidx.test.espresso.device.rules.ScreenOrientationRule
    import org.junit.Rule
    import org.junit.Test
    
    class MyConfigurationTest {
    
        // 1. Define the Compose test rule
        @get:Rule
        val composeTestRule = createComposeRule()
    
        // 2. Define the Espresso Device rule for a consistent starting state
        @get:Rule
        val screenOrientationRule = ScreenOrientationRule(ScreenOrientation.PORTRAIT)
    }
    

    আপনার টেস্ট যদি অ্যান্ড্রয়েড ১৭ (এপিআই লেভেল ৩৭) বা তার উচ্চতর সংস্করণকে টার্গেট করে, তাহলে এসপ্রেসো ডিভাইস এপিআই-এর জন্য ACCESS_LOCAL_NETWORK পারমিশন প্রয়োজন। ScreenOrientationRule রুলটি রান করার আগে আপনাকে অবশ্যই এই পারমিশনটি দেওয়া নিশ্চিত করতে হবে। প্রথমে GrantPermissionRule রুলটি রান করার জন্য JUnit-এর RuleChain ব্যবহার করুন:

    import androidx.test.rule.GrantPermissionRule
    import org.junit.rules.RuleChain
    
    class MyConfigurationTest {
        val grantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.ACCESS_LOCAL_NETWORK)
        val composeTestRule = createComposeRule()
        val screenOrientationRule = ScreenOrientationRule(ScreenOrientation.PORTRAIT)
    
        @get:Rule
        val chain = RuleChain
            .outerRule(grantPermissionRule)
            .around(composeTestRule)
            .around(screenOrientationRule)
    }
    
  2. এমন একটি টেস্ট তৈরি করুন যা টেস্ট চলাকালীন ডিভাইসটিকে ল্যান্ডস্কেপ ওরিয়েন্টেশনে সেট করে:

    @Test
    fun myRotationTest() {
      ...
      // Sets the device to landscape orientation during test execution.
      onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE)
      ...
    }
    
  3. স্ক্রিনটি ঘোরার পরে, আপনার কম্পোজেবলগুলো প্রত্যাশা অনুযায়ী নতুন অবস্থার সাথে খাপ খাইয়ে নিচ্ছে কিনা তা পরীক্ষা করতে composeTestRule ব্যবহার করুন।

    @Test
    fun myRotationTest() {
      ...
      // Sets the device to landscape orientation during test execution.
      onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE)
      composeTestRule.onNodeWithTag("NavRail").assertIsDisplayed()
      composeTestRule.onNodeWithTag("BottomBar").assertDoesNotExist()
    }
    

স্ক্রিন ভাঁজ খোলার বিরুদ্ধে পরীক্ষা

আপনার অ্যাপটি কোনো ফোল্ডেবল ডিভাইসে থাকলে এবং স্ক্রিনটি খুলে গেলে কী হয়, তা পরীক্ষা করার একটি উদাহরণ এখানে দেওয়া হলো:

  1. প্রথমে, ডিভাইসটি ভাঁজ করা অবস্থায় onDevice().setClosedMode() কল করে পরীক্ষা করুন। নিশ্চিত করুন যে আপনার কম্পোজেবলগুলো স্ক্রিনের ছোট প্রস্থের সাথে মানিয়ে নিচ্ছে।

    @Test
    fun myUnfoldedTest() {
      onDevice().setClosedMode()
      composeTestRule.onNodeWithTag("BottomBar").assertIsDisplayed()
      composeTestRule.onNodeWithTag("NavRail").assertDoesNotExist()
      ...
    }
    
  2. সম্পূর্ণরূপে উন্মোচিত অবস্থায় যেতে, onDevice().setFlatMode() কল করুন। কম্পোজেবলগুলো প্রসারিত সাইজ ক্লাসের সাথে খাপ খাইয়ে নিচ্ছে কিনা তা পরীক্ষা করুন।

    @Test
    fun myUnfoldedTest() {
      onDevice().setClosedMode()
      ...
      onDevice().setFlatMode()
      composeTestRule.onNodeWithTag("NavRail").assertIsDisplayed()
      composeTestRule.onNodeWithTag("BottomBar").assertDoesNotExist()
    }
    

আপনার পরীক্ষার জন্য কোন কোন ডিভাইস প্রয়োজন তা নির্দিষ্ট করুন।

আপনি যদি এমন কোনো ডিভাইসে ভাঁজ করার ক্রিয়া সম্পাদনকারী পরীক্ষা চালান যা ভাঁজযোগ্য নয়, তাহলে পরীক্ষাটি সম্ভবত ব্যর্থ হবে। শুধুমাত্র চলমান ডিভাইসের জন্য প্রাসঙ্গিক পরীক্ষাগুলো সম্পাদন করতে, @RequiresDeviceMode অ্যানোটেশনটি ব্যবহার করুন। টেস্ট রানার স্বয়ংক্রিয়ভাবে সেইসব ডিভাইসে পরীক্ষা চালানো এড়িয়ে যায় যেগুলো পরীক্ষাধীন কনফিগারেশন সমর্থন করে না। আপনি প্রতিটি পরীক্ষায় বা একটি সম্পূর্ণ টেস্ট ক্লাসে ডিভাইসের প্রয়োজনীয়তার নিয়মটি যোগ করতে পারেন।

উদাহরণস্বরূপ, কোনো পরীক্ষা শুধুমাত্র সেইসব ডিভাইসে চালানোর জন্য নির্দিষ্ট করতে, যেগুলো ভাঁজ খুলে সমতল অবস্থায় আসতে পারে, আপনার পরীক্ষায় নিম্নলিখিত @RequiresDeviceMode কোডটি যোগ করুন:

@Test
@RequiresDeviceMode(mode = FLAT)
fun myUnfoldedTest() {
  ...
}