আপনার অ্যাপের মধ্যে প্রতিটি ব্যবহারকারীর মিথস্ক্রিয়ার জন্য অ্যাক্টিভিটিগুলি কন্টেইনার হিসেবে কাজ করে, তাই ডিভাইস-স্তরের ইভেন্টগুলির সময় আপনার অ্যাপের অ্যাক্টিভিটিগুলি কীভাবে আচরণ করে তা পরীক্ষা করা গুরুত্বপূর্ণ, যেমন নিম্নলিখিত:
- অন্য একটি অ্যাপ, যেমন ডিভাইসের ফোন অ্যাপ, আপনার অ্যাপের কার্যকলাপে বাধা সৃষ্টি করে।
- সিস্টেমটি আপনার কার্যকলাপ ধ্বংস করে এবং পুনরায় তৈরি করে।
- ব্যবহারকারী আপনার কার্যকলাপকে একটি নতুন উইন্ডোিং পরিবেশে রাখে, যেমন পিকচার-ইন-পিকচার (PIP) অথবা মাল্টি-উইন্ডো।
বিশেষ করে, "The activity lifecycle" -এ বর্ণিত ঘটনাগুলির প্রতিক্রিয়ায় আপনার কার্যকলাপ সঠিকভাবে আচরণ করছে কিনা তা নিশ্চিত করা গুরুত্বপূর্ণ।
এই নির্দেশিকাটি বর্ণনা করে যে কীভাবে আপনার অ্যাপের জীবনচক্রের বিভিন্ন অবস্থার মধ্য দিয়ে যাওয়ার সময় ডেটা অখণ্ডতা এবং একটি ভাল ব্যবহারকারীর অভিজ্ঞতা বজায় রাখার ক্ষমতা মূল্যায়ন করবেন।
একটি কার্যকলাপের অবস্থা নির্দেশ করুন
আপনার অ্যাপের কার্যকলাপ পরীক্ষা করার একটি গুরুত্বপূর্ণ দিক হল আপনার অ্যাপের কার্যকলাপগুলিকে নির্দিষ্ট অবস্থায় স্থাপন করা। আপনার পরীক্ষার এই "প্রদত্ত" অংশটি সংজ্ঞায়িত করতে, AndroidX টেস্ট লাইব্রেরির অংশ ActivityScenario এর উদাহরণ ব্যবহার করুন। এই ক্লাসটি ব্যবহার করে, আপনি আপনার কার্যকলাপকে এমন অবস্থায় রাখতে পারেন যা ডিভাইস-স্তরের ইভেন্টগুলিকে অনুকরণ করে।
ActivityScenario হল একটি ক্রস-প্ল্যাটফর্ম API যা আপনি স্থানীয় ইউনিট পরীক্ষা এবং অন-ডিভাইস ইন্টিগ্রেশন পরীক্ষা উভয় ক্ষেত্রেই ব্যবহার করতে পারেন। একটি বাস্তব বা ভার্চুয়াল ডিভাইসে, ActivityScenario থ্রেড সুরক্ষা প্রদান করে, আপনার পরীক্ষার ইন্সট্রুমেন্টেশন থ্রেড এবং পরীক্ষার অধীনে আপনার কার্যকলাপ চালানো থ্রেডের মধ্যে ইভেন্টগুলিকে সিঙ্ক্রোনাইজ করে।
পরীক্ষার অধীনে থাকা কোনও কার্যকলাপ ধ্বংস বা তৈরি হওয়ার সময় কীভাবে আচরণ করে তা মূল্যায়নের জন্য API বিশেষভাবে উপযুক্ত। এই বিভাগটি এই API এর সাথে সম্পর্কিত সবচেয়ে সাধারণ ব্যবহারের ঘটনাগুলি উপস্থাপন করে।
একটি কার্যকলাপ তৈরি করুন
পরীক্ষার অধীনে কার্যকলাপ তৈরি করতে, নিম্নলিখিত স্নিপেটে দেখানো কোডটি যোগ করুন:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { } } }
অ্যাক্টিভিটি তৈরি করার পর, ActivityScenario অ্যাক্টিভিটিকে RESUMED অবস্থায় রূপান্তর করে। এই অবস্থাটি নির্দেশ করে যে আপনার অ্যাক্টিভিটি চলছে এবং ব্যবহারকারীরা এটি দেখতে পাবেন। এই অবস্থায়, আপনি Espresso UI পরীক্ষা ব্যবহার করে আপনার অ্যাক্টিভিটির View এলিমেন্টগুলির সাথে ইন্টারঅ্যাক্ট করতে পারবেন।
পরীক্ষা শেষ হলে গুগল আপনাকে অ্যাক্টিভিটি close করার পরামর্শ দেয়। এটি সংশ্লিষ্ট রিসোর্সগুলি পরিষ্কার করে এবং আপনার পরীক্ষার স্থায়িত্ব উন্নত করে। ActivityScenario Closeable প্রয়োগ করে, যাতে আপনি জাভা প্রোগ্রামিং ভাষায় use এক্সটেনশন বা try-with-resources প্রয়োগ করতে পারেন, যাতে অ্যাক্টিভিটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়।
অথবা, আপনি ActivityScenarioRule ব্যবহার করে প্রতিটি পরীক্ষার আগে ActivityScenario.launch এবং test teardown-এ ActivityScenario.close কল করতে পারেন। নিম্নলিখিত উদাহরণটি দেখায় কিভাবে একটি নিয়ম সংজ্ঞায়িত করতে হয় এবং এর থেকে একটি দৃশ্যকল্পের উদাহরণ পেতে হয়:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @get:Rule var activityScenarioRule = activityScenarioRule<MyActivity>() @Test fun testEvent() { val scenario = activityScenarioRule.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 ক্ষেত্রের মান পান, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testResult() { launchActivity<MyActivity>().use { onView(withId(R.id.finish_button)).perform(click()) // Activity under test is now finished. val resultCode = scenario.result.resultCode val resultData = scenario.result.resultData } } }
কার্যকলাপে ক্রিয়াগুলি ট্রিগার করুন
ActivityScenario মধ্যে থাকা সমস্ত পদ্ধতি কল ব্লক করছে, তাই API-এর জন্য আপনাকে সেগুলি ইন্সট্রুমেন্টেশন থ্রেডে চালাতে হবে।
আপনার পরীক্ষাধীন কার্যকলাপে অ্যাকশন ট্রিগার করতে, আপনার ভিউতে থাকা উপাদানগুলির সাথে ইন্টারঅ্যাক্ট করতে Espresso ভিউ ম্যাচার ব্যবহার করুন:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { onView(withId(R.id.refresh)).perform(click()) } } }
তবে, যদি আপনার কার্যকলাপের উপর কোনও পদ্ধতি কল করার প্রয়োজন হয়, তাহলে আপনি ActivityAction প্রয়োগ করে নিরাপদে তা করতে পারেন:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { scenario -> scenario.onActivity { activity -> activity.handleSwipeToRefresh() } } } }