আপনার অ্যাপের কার্যকলাপ পরীক্ষা করুন

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

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

বিশেষ করে, ‘অ্যাক্টিভিটি লাইফসাইকেল’ -এ বর্ণিত ঘটনাগুলোর প্রতিক্রিয়ায় আপনার অ্যাক্টিভিটি যেন সঠিকভাবে কাজ করে, তা নিশ্চিত করা গুরুত্বপূর্ণ।

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

কম্পোজে টেস্টিং কার্যক্রম

Jetpack Compose দিয়ে তৈরি কোনো অ্যাপ পরীক্ষা করার সময়, আপনি সাধারণত আপনার অ্যাক্টিভিটি চালু করতে এবং UI কম্পোনেন্টগুলোর সাথে ইন্টারঅ্যাক্ট করতে createAndroidComposeRule ব্যবহার করেন।

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

কম্পোজ টেস্ট রুল স্বয়ংক্রিয়ভাবে আপনার জন্য এই সিনারিওটি ​​র‍্যাপ ও পরিচালনা করে। এই গাইড জুড়ে, আধুনিক UI টেস্টিং এবং স্ট্যান্ডার্ড লাইফসাইকেল ম্যানেজমেন্টের মধ্যে ব্যবধান পূরণের জন্য নিম্নলিখিত প্যাটার্নটির ব্যবহার দেখতে পাবেন:

@get:Rule
val composeTestRule = createAndroidComposeRule<MyActivity>()

@Test fun testEvent() {
    val scenario = composeTestRule.activityRule.scenario

    // ...
}

একটি কার্যকলাপের অবস্থা চালনা করুন

আপনার অ্যাপের অ্যাক্টিভিটিগুলো পরীক্ষা করার একটি গুরুত্বপূর্ণ দিক হলো সেগুলোকে নির্দিষ্ট স্টেটে রাখা। আপনার পরীক্ষার এই ‘প্রদত্ত’ অংশটি নির্ধারণ করতে, AndroidX Test লাইব্রেরির অংশ ActivityScenario এর ইনস্ট্যান্স ব্যবহার করুন। এই ক্লাসটি ব্যবহার করে, আপনি আপনার অ্যাক্টিভিটিকে এমন স্টেটে রাখতে পারেন যা ডিভাইস-স্তরের ইভেন্টগুলোকে অনুকরণ করে।

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

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

একটি কার্যকলাপ তৈরি করুন

পরীক্ষাধীন অ্যাক্টিভিটিটি তৈরি করতে, নিম্নলিখিত কোড স্নিপেটে দেখানো কোডটি যোগ করুন:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
       launchActivity<MyActivity>().use {
       }
    }
}

অ্যাক্টিভিটি তৈরি করার পর, ActivityScenario অ্যাক্টিভিটিটিকে RESUMED অবস্থায় নিয়ে যায়। এই অবস্থাটি নির্দেশ করে যে আপনার অ্যাক্টিভিটিটি চলছে এবং ব্যবহারকারীদের কাছে দৃশ্যমান। এই অবস্থায়, আপনি Compose টেস্টিং API ব্যবহার করে আপনার অ্যাক্টিভিটির কম্পোজেবলগুলোর সাথে স্বাধীনভাবে ইন্টারঅ্যাক্ট করতে পারেন।

গুগলের পরামর্শ হলো, টেস্ট শেষ হলে অ্যাক্টিভিটিটির close কল করা উচিত। এটি সংশ্লিষ্ট রিসোর্সগুলো পরিষ্কার করে এবং আপনার টেস্টের স্থিতিশীলতা উন্নত করে। ActivityScenario Closeable ইমপ্লিমেন্ট করা আছে, তাই আপনি use এক্সটেনশনটি প্রয়োগ করতে পারেন যাতে অ্যাক্টিভিটিটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়।

বিকল্পভাবে, আপনি প্রতিটি পরীক্ষার আগে স্বয়ংক্রিয়ভাবে অ্যাক্টিভিটি চালু করতে, টিয়ারডাউন পরিচালনা করতে এবং আপনাকে Compose UI টেস্টিং মেথড ও অন্তর্নিহিত ActivityScenario উভয়টিতে অ্যাক্সেস দেওয়ার জন্য createAndroidComposeRule ব্যবহার করতে পারেন। নিম্নলিখিত উদাহরণটি দেখায় কিভাবে একটি নিয়ম সংজ্ঞায়িত করতে হয় এবং তা থেকে একটি সিনারিওর ইনস্ট্যান্স পেতে হয়:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @get:Rule
    val composeTestRule = createAndroidComposeRule<MyActivity>()

    @Test fun testEvent() {
        val scenario = composeTestRule.activityRule.scenario
    }
}

কার্যকলাপটিকে একটি নতুন অবস্থায় নিয়ে যান

অ্যাক্টিভিটিকে CREATED বা STARTED মতো অন্য কোনো অবস্থায় নিয়ে যেতে moveToState কল করুন। এই অ্যাকশনটি এমন একটি পরিস্থিতি অনুকরণ করে যেখানে আপনার অ্যাক্টিভিটি অন্য কোনো অ্যাপ বা সিস্টেম অ্যাকশনের দ্বারা বাধাগ্রস্ত হয়ে যথাক্রমে থেমে যায় বা বিরতি নেয়।

নিম্নলিখিত কোড স্নিপেটে moveToState এর একটি উদাহরণ ব্যবহার দেখানো হয়েছে:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.moveToState(State.CREATED)
        }
    }
}

বর্তমান কার্যকলাপের অবস্থা নির্ধারণ করুন

পরীক্ষাধীন কোনো অ্যাক্টিভিটির বর্তমান অবস্থা নির্ধারণ করতে, আপনার ActivityScenario অবজেক্টের মধ্যে থাকা state ফিল্ডের মানটি নিন। পরীক্ষাধীন কোনো অ্যাক্টিভিটির অবস্থা যাচাই করা বিশেষভাবে সহায়ক হয় যখন অ্যাক্টিভিটিটি অন্য কোনো অ্যাক্টিভিটিতে রিডাইরেক্ট করে বা নিজে থেকেই শেষ হয়ে যায়, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.onActivity { activity ->
              startActivity(Intent(activity, MyOtherActivity::class.java))
            }

            val originalActivityState = scenario.state
        }
    }
}

কার্যকলাপটি পুনরায় তৈরি করুন

যখন কোনো ডিভাইসে রিসোর্স কম থাকে, তখন সিস্টেম একটি অ্যাক্টিভিটি বন্ধ করে দিতে পারে, যার ফলে ব্যবহারকারী আপনার অ্যাপে ফিরে এলে অ্যাপটিকে সেই অ্যাক্টিভিটিটি পুনরায় তৈরি করতে হয়। এই পরিস্থিতিগুলো অনুকরণ করতে, recreate কল করুন:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.recreate()
        }
    }
}

ActivityScenario ক্লাসটি অ্যাক্টিভিটির সংরক্ষিত ইনস্ট্যান্স স্টেট এবং @NonConfigurationInstance দ্বারা অ্যানোটেড যেকোনো অবজেক্ট বজায় রাখে। এই অবজেক্টগুলো আপনার পরীক্ষাধীন অ্যাক্টিভিটির নতুন ইনস্ট্যান্সে লোড হয়।

কার্যকলাপের ফলাফল পুনরুদ্ধার করুন

একটি সমাপ্ত অ্যাক্টিভিটির সাথে সম্পর্কিত ফলাফল কোড বা ডেটা পেতে, আপনার ActivityScenario অবজেক্টের মধ্যে থাকা result ফিল্ডের মানটি নিন। createAndroidComposeRule ব্যবহার করে, আপনি সহজেই সেই UI অ্যাকশনটি ট্রিগার করতে পারেন যা অ্যাক্টিভিটিটি শেষ করে, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @get:Rule
    val composeTestRule = createAndroidComposeRule<MyActivity>()

    @Test fun testResult() {
        composeTestRule.onNodeWithTag("finish_button").performClick()

        val scenario = composeTestRule.activityRule.scenario
        val resultCode = scenario.result.resultCode
        val resultData = scenario.result.resultData
    }
}

অ্যাক্টিভিটিতে অ্যাকশন ট্রিগার করুন

ActivityScenario অন্তর্ভুক্ত সমস্ত মেথডই ব্লকিং কল, তাই এপিআই অনুযায়ী এগুলিকে ইন্সট্রুমেন্টেশন থ্রেডে চালাতে হয়।

আপনার পরীক্ষাধীন অ্যাক্টিভিটিতে অ্যাকশন ট্রিগার করতে, আপনার কম্পোজেবলগুলোর সাথে ইন্টারঅ্যাক্ট করার জন্য কম্পোজ টেস্টিং এপিআই ব্যবহার করুন:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @get:Rule
    val composeTestRule = createAndroidComposeRule<MyActivity>()

    @Test fun testEvent() {
        composeTestRule.onNodeWithText("Refresh").performClick()
    }
}

তবে, যদি আপনার অ্যাক্টিভিটির মধ্যেই কোনো মেথড কল করার প্রয়োজন হয়, তাহলে আপনি onActivity ব্যবহার করে তা নিরাপদে করতে পারেন:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.onActivity { activity ->
              activity.handleSwipeToRefresh()
            }
        }
    }
}

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

পরীক্ষা সম্পর্কে আরও তথ্যের জন্য, নিম্নলিখিত অতিরিক্ত উৎসগুলো দেখুন:

ডকুমেন্টেশন