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

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

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

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

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

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

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

  1. টেস্ট ডিভাইসটিকে কমান্ড পাঠানোর অনুমতি দিতে, androidTest সোর্স সেটের ম্যানিফেস্ট ফাইলে INTERNET এবং ACCESS_NETWORK_STATE পারমিশনগুলো যোগ করুন:

      <uses-permission android:name="android.permission.INTERNET" />
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
  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.0.1")
    }

    গ্রুভি

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

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

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

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

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

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

    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)
    }
    
  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() {
  ...
}