UI Automator হল Google-এর একটি ফ্রেমওয়ার্ক যা Android অ্যাপ্লিকেশনের স্বয়ংক্রিয় UI টেস্টিংয়ের জন্য যা সিস্টেম লেভেলে কাজ করে এবং একটি单一 অ্যাপের বাইরে ইন্টারফেস উপাদানের সাথে যোগাযোগ করতে পারে। Espresso-এর বিপরীতে, UI Automator কোনো নির্দিষ্ট অ্যাপ্লিকেশনের প্রক্রিয়ার সাথে আবদ্ধ নয়: এটি সিস্টেম ডায়ালগ, নোটিফিকেশন শেড খুলতে পারে এবং অ্যাপ্লিকেশনের মধ্যে সুইচ করতে পারে। Google Android Developers-এর মতে, UI Automator ডিভাইসের UI ট্রি অ্যাক্সেস করতে স্ট্যান্ডার্ড Accessibility Service ব্যবহার করে।
মুখ্য বিষয়
UI Automator হল Android-এর ফাংশনাল UI টেস্টিংয়ের জন্য একটি ফ্রেমওয়ার্ক যা অপারেটিং সিস্টেম লেভেলে কাজ করে। এটি ডিভাইস স্ক্রিনের যেকোনো উপাদান অ্যাক্সেস করার জন্য API প্রদান করে, তা যেকোনো অ্যাপ্লিকেশনেরই হোক না কেন — সিস্টেম স্ট্যাটাস বার, পারমিশন ডায়ালগ, হোম স্ক্রিন এবং থার্ড-পার্টি অ্যাপ সহ। এটি একে একক অ্যাপের বাইরে যাওয়া পরিস্থিতি টেস্ট করার জন্য অপরিহার্য করে তোলে।
স্থাপত্যিকভাবে, UI Automator Accessibility Service ব্যবহার করে — একই সার্ভিস যা TalkBack, Switch Access এবং অন্যান্য অ্যাক্সেসিবিলিটি টুল ব্যবহার করে। এই সার্ভিসের মাধ্যমে, ফ্রেমওয়ার্ক বর্তমান স্ক্রিনের সম্পূর্ণ UI কম্পোনেন্ট ট্রি পায় এবং তাদের উপর ক্রিয়া করার অনুমতি দেয়: ট্যাপ করা, সোয়াইপ করা, টেক্সট ইনপুট এবং লং প্রেস করা।
UI Automator প্রথম Android 4.3 (API 18)-এ আবির্ভূত হয় এবং তারপর থেকে এটি ক্রস-অ্যাপ্লিকেশন টেস্টিংয়ের জন্য Google-এর অফিসিয়াল টুল হিসেবে Android Testing Support Library-এর অংশ। AndroidX Test-এ, এটি একটি পৃথক আর্টিফ্যাক্ট androidx.test.uiautomator:uiautomator সংস্করণ 2.3.0 (2024) হিসেবে উপলব্ধ, যা API 18 থেকে সমস্ত Android সংস্করণ সমর্থন করে।
কাজের নীতি: UI Automator বর্তমান স্ক্রিনের অ্যাক্সেসিবিলিটি ট্রি স্ক্যান করার উপর ভিত্তি করে। যখন findObject(selector) মেথড কল করা হয়, ফ্রেমওয়ার্ক View অনুক্রম অতিক্রম করে, UiSelector শর্তের সাথে মেলে এমন প্রথম উপাদান খুঁজে পায় এবং একটি UiObject রিটার্ন করে — প্রকৃত View-এর সাথে যোগাযোগের জন্য একটি প্রক্সি।
একটি সাধারণ UI Automator টেস্ট UiDevice ইনস্ট্যান্স প্রাপ্তির মাধ্যমে শুরু হয়, যা ফিজিক্যাল ডিভাইসকে প্রতিনিধিত্ব করে। UiDevice উপাদান খোঁজার, বাটন প্রেস (হোম, ব্যাক, রিসেন্ট) পরিচালনা করার, স্ক্রিন ঘোরানোর এবং স্ক্রিনশট নেওয়ার পদ্ধতি প্রদান করে। UiSelector-এর মাধ্যমে একটি উপাদান খোঁজার পর, UiObject-এ ক্রিয়া সম্পাদন করা হয়।
নীচের উদাহরণে, টেস্টটি Settings অ্যাপ খোলে, টেক্সট দ্বারা “ব্যাটারি” আইটেম খুঁজে পায় এবং ট্যাপ করে। UI Automator-এর Activity চালু করার প্রয়োজন নেই — এটি ডিভাইসের যেকোনো স্ক্রিনের সাথে কাজ করে, থার্ড-পার্টি অ্যাপ সহ।
val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
// সেটিংস স্ক্রিন খুলুন
device.pressHome()
device.wait(Until.hasObject(UiSelector().text("সেটিংস")), 2000)
// "ব্যাটারি" আইটেম খুঁজুন এবং ট্যাপ করুন
val batteryItem = device.findObject(
UiSelector().text("ব্যাটারি")
)
batteryItem.clickAndWait(Until.newWindow(), 3000)
UiDevice হল ডিভাইসের সাথে যোগাযোগের জন্য প্রধান ক্লাস। এটি উপাদান খোঁজার, হার্ডওয়্যার বাটন প্রেস (হোম, ব্যাক, মেনু, ভলিউম) সিমুলেট করার, পাওয়ার পরিচালনা করার, স্ক্রিনশট নেওয়ার এবং নির্দিষ্ট স্ক্রিন অবস্থার জন্য অপেক্ষা করার পদ্ধতি প্রদান করে। UiDevice প্রতি টেস্টে একবার তৈরি হয় এবং সমস্ত অপারেশনের জন্য পুনরায় ব্যবহার করা হয়।
UiSelector হল UI উপাদান খোঁজার জন্য একটি ফ্লুয়েন্ট API। Espresso ViewMatchers-এর বিপরীতে, UiSelector-এর কম্পাইলেশনের প্রয়োজন নেই — খোঁজার শর্তগুলি মেথড চেইনের মাধ্যমে গঠিত হয়: text(), className(), description(), resourceId(), index()। একাধিক শর্ত লজিক্যাল AND-এর মাধ্যমে স্বয়ংক্রিয়ভাবে একত্রিত হয়।
| UiSelector মেথড | উদ্দেশ্য |
|---|---|
| text(String) | সঠিক এলিমেন্ট টেক্সট দ্বারা খোঁজা |
| textContains(String) | আংশিক টেক্সট মিলিয়ে খোঁজা |
| resourceId(String) | রিসোর্স ID দ্বারা খোঁজা (যেমন, com.example:id/button) |
| className(String) | View ক্লাস নাম দ্বারা খোঁজা |
| description(String) | content-description দ্বারা খোঁজা |
| childSelector(selector) | কন্টেইনারের ভিতরে চাইল্ড এলিমেন্ট খোঁজা |
যখন স্ক্রিনে একই টেক্সট সহ একাধিক উপাদান থাকে, UiSelector মানদণ্ড একত্রিত করার অনুমতি দেয়: ID দ্বারা একটি কন্টেইনার খুঁজুন, তারপর এর ভিতরে — টেক্সট এবং ক্লাস দ্বারা একটি উপাদান। এটি পছন্দসই কম্পোনেন্টের অনন্য সনাক্তকরণ নিশ্চিত করে। childSelector মেথড খোঁজার পরিধি একটি নির্দিষ্ট কন্টেইনারে সীমাবদ্ধ করে, UI ট্রিতে নেভিগেশন দ্রুত করে।
val scrollView = device.findObject(
UiSelector().resourceId("android:id/list")
)
// তালিকার ভিতরে, "Wi-Fi" টেক্সট সহ উপাদান খুঁজুন
val wifiItem = scrollView.findObject(
UiSelector().text("Wi-Fi")
wifiItem.click()
ক্রস-অ্যাপ্লিকেশন (আন্তঃ-অ্যাপ্লিকেশন) টেস্টিং হল প্রধান বৈশিষ্ট্য যার জন্য UI Automator বেছে নেওয়া হয়। ফ্রেমওয়ার্ক অ্যাপের মধ্যে সুইচ করতে পারে, ব্রাউজারের মাধ্যমে OAuth লগইন টেস্ট করতে পারে, সিস্টেম ডায়ালগ (অনুমতি, অ্যাপ নির্বাচক) পরীক্ষা করতে পারে এবং সিস্টেম স্ট্যাটাস বার, নোটিফিকেশন প্যানেল এবং লক স্ক্রিনের সাথে যোগাযোগ করতে পারে।
একটি সাধারণ ক্রস-অ্যাপ টেস্ট পরিস্থিতি: অ্যাপটি OAuth অনুমোদনের জন্য একটি ব্রাউজার খোলে, ব্যবহারকারী তাদের লগইন এবং পাসওয়ার্ড প্রবেশ করান, এবং ব্রাউজারটি অ্যাপে ফিরে রিডাইরেক্ট করে। UI Automator প্রক্রিয়াগুলির মধ্যে সুইচ করে, ব্রাউজারে ইনপুট ফিল্ড খুঁজে পায়, সেগুলি পূরণ করে এবং “সাইন ইন”-এ ট্যাপ করে।
// ব্রাউজার প্রদর্শিত হওয়ার অপেক্ষা
device.wait(Until.hasObject(
UiSelector().packageName("com.android.chrome")
), 5000)
// ব্রাউজারে ইমেইল ইনপুট ফিল্ড খোঁজা
val emailField = device.findObject(
UiSelector().className("android.widget.EditText").instance(0)
)
emailField.text = "user@example.com"
UI Automator সিস্টেম ডায়ালগ পরীক্ষা এবং বন্ধ করতে পারে — অবস্থান অনুমতি, নোটিফিকেশন, ফাইল অ্যাক্সেস। প্রথম লঞ্চ পরিস্থিতি টেস্ট করার জন্য এটি গুরুত্বপূর্ণ যখন সিস্টেম ক্রমান্বয়ে একাধিক অনুমতি অনুরোধ করে। UI Automator ছাড়া, এই ধরনের পরিস্থিতি স্বয়ংক্রিয় করা যায় না কারণ সিস্টেম ডায়ালগ অ্যাপ্লিকেশনের প্রক্রিয়ার অন্তর্গত নয়।
পছন্দ UI Automator এবং Espresso-এর মধ্যে টেস্টিং পরিস্থিতির উপর নির্ভর করে। Espresso স্বয়ংক্রিয় সিঙ্ক্রোনাইজেশন এবং ন্যূনতম boilerplate সহ একক অ্যাপ টেস্টিংয়ের জন্য অপ্টিমাইজ করা। UI Automator সেই পরিস্থিতির জন্য উপযুক্ত যেখানে সিস্টেম, ব্রাউজার বা একাধিক অ্যাপের সাথে যোগাযোগের প্রয়োজন হয়।
| মানদণ্ড | UI Automator | Espresso |
|---|---|---|
| পরিধি | সম্পূর্ণ ডিভাইস, একাধিক অ্যাপ | একক অ্যাপ |
| সিঙ্ক্রোনাইজেশন | ম্যানুয়াল (অপেক্ষা, স্লিপ) | স্বয়ংক্রিয় (Idling Resource) |
| গতি | ধীর (সার্ভিসের মাধ্যমে অ্যাক্সেস) | দ্রুত (প্রক্রিয়ার ভিতরে কাজ করে) |
| সিস্টেম UI | সমর্থন করে (নোটিফিকেশন, দ্রুত সেটিংস) | সমর্থন করে না |
| খোঁজার নির্ভুলতা | বৈশিষ্ট্য দ্বারা UiSelector | টাইপ এবং অনুক্রম দ্বারা ViewMatchers |
| স্থিতিশীলতা | কম (সময়ের উপর নির্ভরশীল) | উচ্চ (স্বয়ংক্রিয় অপেক্ষা) |
ব্যবহারে, এই ফ্রেমওয়ার্কগুলি প্রায়শই একসাথে ব্যবহার করা হয়: Espresso উচ্চ স্থিতিশীলতার সাথে প্রধান অ্যাপের UI টেস্ট কভার করে, যখন UI Automator অ্যাপের সীমানার বাইরে যাওয়া পরিস্থিতির জন্য ব্যবহৃত হয় — OAuth লগইন, সিস্টেম অনুমতি, Share Intent নিয়ে কাজ করা। এই সংমিশ্রণ ন্যূনতম টেস্ট রক্ষণাবেক্ষণ খরচে সর্বাধিক UI কভারেজ প্রদান করে।
ইন্টিগ্রেশন UI Automator-এর build.gradle-এ নির্ভরতা যোগ করার মাধ্যমে করা হয়। ফ্রেমওয়ার্কটি AndroidX Test-এর অংশ এবং ম্যানিফেস্টে অতিরিক্ত অনুমতির প্রয়োজন নেই — ইন্সট্রুমেন্টেড টেস্ট চালু হলে Accessibility Service-এ অ্যাক্সেস স্বয়ংক্রিয়ভাবে কনফিগার হয়।
সর্বনিম্ন কনফিগারেশনে uiautomator আর্টিফ্যাক্ট এবং স্ট্যান্ডার্ড AndroidJUnitRunner টেস্ট রানার অন্তর্ভুক্ত। UI Automator টেস্টগুলি src/androidTest ডিরেক্টরিতে রাখা হয় এবং Android API 18+ চালানো ইমুলেটর বা ফিজিক্যাল ডিভাইসে চালানো হয়।
dependencies {
androidTestImplementation("androidx.test.uiautomator:uiautomator:2.3.0")
androidTestImplementation("androidx.test.ext:junit:1.2.1")
androidTestImplementation("androidx.test:runner:1.6.1")
}
UiDevice ইনস্ট্যান্স পেতে InstrumentationRegistry.getInstrumentation() ব্যবহার করা হয়। UiDevice setUp() মেথডে একবার তৈরি করা উচিত এবং ডিভাইস সংস্থান সংরক্ষণের জন্য ক্লাসের সমস্ত টেস্টে পুনরায় ব্যবহার করা উচিত। এটি মনে রাখা গুরুত্বপূর্ণ যে UiDevice থ্রেড-সেফ নয় — সমস্ত অপারেশন টেস্ট মেথডের একই থ্রেডে সম্পাদন করা উচিত। প্রতিটি টেস্টে নতুন UiDevice তৈরি করা ওভারহেড সৃষ্টি করে এবং এক্সিকিউশন ধীর করে দেয়। beforeClass মেথডে একবার UiDevice তৈরি করে টেস্ট ক্লাসের সমস্ত টেস্টের জন্য পুনরায় ব্যবহার করার পরামর্শ দেওয়া হয়।
Espresso-এর বিপরীতে, UI Automator-এ স্বয়ংক্রিয় সিঙ্ক্রোনাইজেশন নেই। উপাদান প্রদর্শিত হওয়ার জন্য অপেক্ষা করতে UiDevice.wait(condition, timeout) মেথড Until অবজেক্টের সাথে ব্যবহার করা হয়: Until.findObject(selector), Until.hasObject(selector), Until.gone(selector)। সঠিক অপেক্ষা ছাড়া, রেস কন্ডিশনের কারণে টেস্টগুলি অস্থির হয়ে যায় — খোঁজার সময় একটি উপাদান স্ক্রিনে উপস্থিত নাও হতে পারে। স্থিতিশীলতার জন্য কমপক্ষে 3–5 সেকেন্ডের টাইমআউট সেট করার পরামর্শ দেওয়া হয়।
সচরাচর জিজ্ঞাসা
UI Automator Accessibility Service স্তরে কাজ করে এবং যেকোনো অ্যাপের সাথে যোগাযোগ করতে পারে। Espresso একটি单一 অ্যাপের প্রক্রিয়ার ভিতরে কাজ করে এবং UI থ্রেডের সাথে স্বয়ংক্রিয় সিঙ্ক্রোনাইজেশন ব্যবহার করে। UI Automator ক্রস-অ্যাপ পরিস্থিতির জন্য ভাল, যেখানে Espresso স্থিতিশীল একক-অ্যাপ টেস্টের জন্য ভাল।
হ্যাঁ, UI Automator Android API 18+ চালানো সমস্ত ডিভাইসে কাজ করে। এটির রুট অ্যাক্সেসের প্রয়োজন নেই — এটি স্ট্যান্ডার্ড Accessibility Service ব্যবহার করে, যা টেস্ট চালু করার সময় Instrumentation-এর মাধ্যমে সক্রিয় হয়।
UI Automator বর্তমান স্ক্রিনের সম্পূর্ণ UI কম্পোনেন্ট ট্রি পেতে Accessibility Service ব্যবহার করে। তারপর UiSelector এই ট্রি অতিক্রম করে এবং নির্দিষ্ট মানদণ্ড: টেক্সট, ক্লাস, ID, content-description বা তাদের সংমিশ্রণ দ্বারা উপাদান খুঁজে পায়।
হ্যাঁ, UiDevice.takeScreenshot(storePath) মেথড বর্তমান স্ক্রিনের স্ক্রিনশট নেওয়ার এবং ফাইলে সংরক্ষণ করার অনুমতি দেয়। এটি ডিবাগিংয়ের জন্য দরকারী: যখন একটি টেস্ট ব্যর্থ হয়, আপনি স্ক্রিনশট সংরক্ষণ করতে পারেন এবং স্ক্রিন অবস্থা বিশ্লেষণ করতে পারেন।
UI Automator-এ স্বয়ংক্রিয় সিঙ্ক্রোনাইজেশন নেই, তাই টেস্টগুলি সময়ের প্রতি সংবেদনশীল। যদি একটি অ্যানিমেশন শেষ না হয় বা View এখনও রেন্ডার না হয়, findObject উপাদান খুঁজে নাও পেতে পারে। সমাধান হল পর্যাপ্ত টাইমআউট সহ UiDevice.wait() ব্যবহার করা।
সারসংক্ষেপ
UI Automator টুলসেট সমস্ত মূল ক্রস-অ্যাপ্লিকেশন টেস্টিং পরিস্থিতি কভার করে এবং সিস্টেম স্তরে Android অটোমেশনের জন্য মানদণ্ড।
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন