UI Automator হল একটি UI টেস্টিং ফ্রেমওয়ার্ক যা সিস্টেম এবং ইনস্টল করা অ্যাপ জুড়ে ক্রস-অ্যাপ ফাংশনাল UI টেস্টিংয়ের জন্য উপযুক্ত। UI Automator API গুলি আপনাকে কোনও ডিভাইসে দৃশ্যমান উপাদানগুলির সাথে ইন্টারঅ্যাক্ট করতে দেয়, কোনও Activity ফোকাসে থাকুক না কেন, তাই এটি আপনাকে সেটিংস মেনু খোলার মতো ক্রিয়াকলাপ সম্পাদন করতে দেয় অথবা একটি পরীক্ষা ডিভাইসে অ্যাপ লঞ্চার। আপনার পরীক্ষাটি সেই উপাদানে প্রদর্শিত পাঠ্য বা এর বিষয়বস্তুর বিবরণের মতো সুবিধাজনক বর্ণনাকারী ব্যবহার করে একটি UI কম্পোনেন্ট খুঁজে পেতে পারে।
UI Automator টেস্টিং ফ্রেমওয়ার্ক একটি ইন্সট্রুমেন্টেশন-ভিত্তিক API এবং AndroidJUnitRunner টেস্ট রানারের সাথে কাজ করে। এটি অস্বচ্ছ বক্স-স্টাইলের স্বয়ংক্রিয় পরীক্ষা লেখার জন্য উপযুক্ত, যেখানে পরীক্ষার কোড লক্ষ্য অ্যাপের অভ্যন্তরীণ বাস্তবায়ন বিবরণের উপর নির্ভর করে না।
UI অটোমেটর টেস্টিং ফ্রেমওয়ার্কের মূল বৈশিষ্ট্যগুলির মধ্যে রয়েছে:
- টার্গেট ডিভাইসে স্থিতি তথ্য পুনরুদ্ধার এবং ক্রিয়াকলাপ সম্পাদনের জন্য একটি API। আরও তথ্যের জন্য, ডিভাইসের স্থিতি অ্যাক্সেস করা দেখুন।
- ক্রস-অ্যাপ UI পরীক্ষা সমর্থন করে এমন API। আরও তথ্যের জন্য, UI Automator API দেখুন।
ডিভাইসের অবস্থা অ্যাক্সেস করা হচ্ছে
UI Automator টেস্টিং ফ্রেমওয়ার্কটি একটি UiDevice ক্লাস প্রদান করে যা টার্গেট অ্যাপটি যে ডিভাইসে চলছে সেখানে অ্যাক্সেস এবং ক্রিয়াকলাপ সম্পাদন করে। আপনি বর্তমান ওরিয়েন্টেশন বা ডিসপ্লে আকারের মতো ডিভাইসের বৈশিষ্ট্যগুলি অ্যাক্সেস করার জন্য এর পদ্ধতিগুলিকে কল করতে পারেন। UiDevice ক্লাস আপনাকে নিম্নলিখিত ক্রিয়াগুলি সম্পাদন করতে দেয়:
- ডিভাইসের ঘূর্ণন পরিবর্তন করুন।
- "ভলিউম আপ" এর মতো হার্ডওয়্যার কী টিপুন।
- পিছনে, হোম, অথবা মেনু বোতাম টিপুন।
- বিজ্ঞপ্তির শেডটি খুলুন।
- বর্তমান উইন্ডোটির একটি স্ক্রিনশট নিন।
উদাহরণস্বরূপ, হোম বোতাম টিপে সিমুলেট করতে, UiDevice.pressHome() পদ্ধতিটি কল করুন।
UI অটোমেটর API গুলি
UI Automator API গুলি আপনাকে আপনার লক্ষ্যবস্তু করা অ্যাপটির বাস্তবায়নের বিশদ সম্পর্কে না জেনেই শক্তিশালী পরীক্ষা লিখতে দেয়। আপনি একাধিক অ্যাপ জুড়ে UI উপাদানগুলি ক্যাপচার এবং পরিচালনা করতে এই API গুলি ব্যবহার করতে পারেন:
-
UiObject2: ডিভাইসে দৃশ্যমান একটি UI উপাদান প্রতিনিধিত্ব করে। -
BySelector: UI উপাদানগুলির সাথে মিলের মানদণ্ড নির্দিষ্ট করে। -
By: সংক্ষিপ্তভাবেBySelectorতৈরি করে। -
Configurator: আপনাকে UI অটোমেটর পরীক্ষা চালানোর জন্য মূল প্যারামিটার সেট করতে দেয়।
উদাহরণস্বরূপ, নিম্নলিখিত কোডটি দেখায় যে কীভাবে আপনি একটি পরীক্ষামূলক স্ক্রিপ্ট লিখতে পারেন যা ডিভাইসে একটি Gmail অ্যাপ খুলবে:
কোটলিন
device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
device.pressHome()
val gmail: UiObject2 = device.findObject(By.text("Gmail"))
// Perform a click and wait until the app is opened.
val opened: Boolean = gmail.clickAndWait(Until.newWindow(), 3000)
assertThat(opened).isTrue()
জাভা
device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
device.pressHome();
UiObject2 gmail = device.findObject(By.text("Gmail"));
// Perform a click and wait until the app is opened.
Boolean opened = gmail.clickAndWait(Until.newWindow(), 3000);
assertTrue(opened);
UI অটোমেটর সেট আপ করুন
UI Automator দিয়ে আপনার UI পরীক্ষা তৈরি করার আগে, Set up project for AndroidX Test -এ বর্ণিত পদ্ধতিতে আপনার পরীক্ষার সোর্স কোডের অবস্থান এবং প্রকল্প নির্ভরতা কনফিগার করতে ভুলবেন না।
আপনার অ্যান্ড্রয়েড অ্যাপ মডিউলের build.gradle ফাইলে, আপনাকে UI Automator লাইব্রেরিতে একটি নির্ভরতা রেফারেন্স সেট করতে হবে:
কোটলিন
dependencies { ... androidTestImplementation("androidx.test.uiautomator:uiautomator:2.3.0") }
খাঁজকাটা
dependencies { ... androidTestImplementation "androidx.test.uiautomator:uiautomator:2.3.0" }
আপনার UI Automator পরীক্ষাটি অপ্টিমাইজ করার জন্য, আপনাকে প্রথমে লক্ষ্য অ্যাপের UI উপাদানগুলি পরীক্ষা করতে হবে এবং নিশ্চিত করতে হবে যে সেগুলি অ্যাক্সেসযোগ্য। এই অপ্টিমাইজেশন টিপসগুলি পরবর্তী দুটি বিভাগে বর্ণনা করা হয়েছে।
একটি ডিভাইসের UI পরীক্ষা করুন
আপনার পরীক্ষাটি ডিজাইন করার আগে, ডিভাইসে দৃশ্যমান UI উপাদানগুলি পরীক্ষা করুন। আপনার UI Automator পরীক্ষাগুলি এই উপাদানগুলি অ্যাক্সেস করতে পারে তা নিশ্চিত করতে, এই উপাদানগুলিতে দৃশ্যমান টেক্সট লেবেল, android:contentDescription মান, অথবা উভয়ই আছে কিনা তা পরীক্ষা করুন।
uiautomatorviewer টুলটি লেআউট হায়ারার্কি পরিদর্শন করার জন্য এবং ডিভাইসের অগ্রভাগে দৃশ্যমান UI উপাদানগুলির বৈশিষ্ট্যগুলি দেখার জন্য একটি সুবিধাজনক ভিজ্যুয়াল ইন্টারফেস প্রদান করে। এই তথ্য আপনাকে UI Automator ব্যবহার করে আরও সূক্ষ্ম পরীক্ষা তৈরি করতে দেয়। উদাহরণস্বরূপ, আপনি একটি UI নির্বাচক তৈরি করতে পারেন যা একটি নির্দিষ্ট দৃশ্যমান বৈশিষ্ট্যের সাথে মেলে।
uiautomatorviewer টুলটি চালু করতে:
- একটি ফিজিক্যাল ডিভাইসে টার্গেট অ্যাপটি চালু করুন।
- ডিভাইসটি আপনার ডেভেলপমেন্ট মেশিনের সাথে সংযুক্ত করুন।
- একটি টার্মিনাল উইন্ডো খুলুন এবং
<android-sdk>/tools/ডিরেক্টরিতে নেভিগেট করুন। - এই কমান্ড দিয়ে টুলটি চালান:
$ uiautomatorviewer
আপনার অ্যাপ্লিকেশনের UI বৈশিষ্ট্যগুলি দেখতে:
-
uiautomatorviewerইন্টারফেসে, ডিভাইস স্ক্রিনশট বোতামে ক্লিক করুন। -
uiautomatorviewerটুল দ্বারা চিহ্নিত UI উপাদানগুলি দেখতে বাম-হাতের প্যানেলে স্ন্যাপশটের উপর কার্সার রাখুন। বৈশিষ্ট্যগুলি নীচের ডান-হাতের প্যানেলে এবং লেআউট অনুক্রম উপরের ডান-হাতের প্যানেলে তালিকাভুক্ত করা হয়েছে। - ঐচ্ছিকভাবে, UI Automator-এর অ্যাক্সেসযোগ্য নয় এমন UI উপাদানগুলি দেখতে Toggle NAF Nodes বোতামে ক্লিক করুন। এই উপাদানগুলির জন্য কেবলমাত্র সীমিত তথ্য উপলব্ধ থাকতে পারে।
অ্যান্ড্রয়েড দ্বারা প্রদত্ত সাধারণ ধরণের UI উপাদান সম্পর্কে জানতে, ব্যবহারকারী ইন্টারফেস দেখুন।
আপনার কার্যকলাপ অ্যাক্সেসযোগ্য কিনা তা নিশ্চিত করুন
UI Automator পরীক্ষার কাঠামোটি এমন অ্যাপগুলিতে আরও ভালো পারফর্ম করে যেগুলিতে Android অ্যাক্সেসিবিলিটি বৈশিষ্ট্যগুলি বাস্তবায়িত হয়েছে। যখন আপনি View ধরণের UI উপাদানগুলি ব্যবহার করেন, অথবা SDK থেকে View এর একটি উপশ্রেণী ব্যবহার করেন, তখন আপনাকে অ্যাক্সেসিবিলিটি সহায়তা বাস্তবায়নের প্রয়োজন হয় না, কারণ এই ক্লাসগুলি ইতিমধ্যেই আপনার জন্য এটি করে ফেলেছে।
তবে কিছু অ্যাপ ব্যবহারকারীর অভিজ্ঞতা আরও সমৃদ্ধ করার জন্য কাস্টম UI উপাদান ব্যবহার করে। এই ধরনের উপাদানগুলি স্বয়ংক্রিয় অ্যাক্সেসিবিলিটি সহায়তা প্রদান করবে না। যদি আপনার অ্যাপে SDK থেকে নয় এমন একটি সাবক্লাসের View উদাহরণ থাকে, তাহলে নিম্নলিখিত পদক্ষেপগুলি সম্পন্ন করে এই উপাদানগুলিতে অ্যাক্সেসিবিলিটি বৈশিষ্ট্যগুলি যোগ করুন:
- ExploreByTouchHelper প্রসারিত করে এমন একটি নির্দিষ্ট ক্লাস তৈরি করুন।
- setAccessibilityDelegate() কল করে আপনার নতুন ক্লাসের একটি ইনস্ট্যান্সকে একটি নির্দিষ্ট কাস্টম UI এলিমেন্টের সাথে সংযুক্ত করুন।
কাস্টম ভিউ এলিমেন্টে অ্যাক্সেসিবিলিটি বৈশিষ্ট্য যোগ করার বিষয়ে অতিরিক্ত নির্দেশিকা পেতে, অ্যাক্সেসিবিলিটি কাস্টম ভিউ তৈরি করা দেখুন। অ্যান্ড্রয়েডে অ্যাক্সেসিবিলিটির জন্য সাধারণ সেরা অনুশীলন সম্পর্কে আরও জানতে, অ্যাপগুলিকে আরও অ্যাক্সেসিবিলিটি করা দেখুন।
একটি UI অটোমেটর পরীক্ষা ক্লাস তৈরি করুন
আপনার UI Automator টেস্ট ক্লাসটি JUnit 4 টেস্ট ক্লাসের মতোই লেখা উচিত। JUnit 4 টেস্ট ক্লাস তৈরি এবং JUnit 4 অ্যাসারেন্স এবং অ্যানোটেশন ব্যবহার সম্পর্কে আরও জানতে, Create an Instrumented Unit Test Class দেখুন।
আপনার টেস্ট ক্লাসের সংজ্ঞার শুরুতে @RunWith(AndroidJUnit4.class) অ্যানোটেশন যোগ করুন। আপনার ডিফল্ট টেস্ট রানার হিসেবে AndroidX টেস্টে প্রদত্ত AndroidJUnitRunner ক্লাসটিও নির্দিষ্ট করতে হবে। এই ধাপটি Run UI Automator tests on a device or emulator -এ আরও বিস্তারিতভাবে বর্ণনা করা হয়েছে।
আপনার UI Automator পরীক্ষা ক্লাসে নিম্নলিখিত প্রোগ্রামিং মডেলটি বাস্তবায়ন করুন:
- আপনি যে ডিভাইসটি পরীক্ষা করতে চান সেটি অ্যাক্সেস করার জন্য একটি
UiDeviceঅবজেক্ট পান, getInstance() পদ্ধতিটি কল করে এবং এটিকে একটি ইন্সট্রুমেন্টেশন অবজেক্টকে আর্গুমেন্ট হিসেবে পাস করে। - findObject() পদ্ধতিটি কল করে ডিভাইসে প্রদর্শিত একটি UI উপাদান (উদাহরণস্বরূপ, ফোরগ্রাউন্ডে বর্তমান ভিউ) অ্যাক্সেস করার জন্য একটি
UiObject2অবজেক্ট পান। - একটি
UiObject2পদ্ধতি কল করে সেই UI কম্পোনেন্টে পারফর্ম করার জন্য একটি নির্দিষ্ট ব্যবহারকারীর ইন্টারঅ্যাকশন সিমুলেট করুন; উদাহরণস্বরূপ, স্ক্রোল করতে scrollUntil() কল করুন এবং একটি টেক্সট ফিল্ড সম্পাদনা করতে setText() কল করুন। একাধিক UI কম্পোনেন্ট বা ব্যবহারকারীর ক্রিয়াগুলির ক্রম জড়িত আরও জটিল ব্যবহারকারীর ইন্টারঅ্যাকশন পরীক্ষা করার জন্য আপনি ধাপ 2 এবং 3-এ API গুলিকে বারবার কল করতে পারেন। - এই ব্যবহারকারীর মিথস্ক্রিয়াগুলি সম্পাদন করার পরে, UI প্রত্যাশিত অবস্থা বা আচরণ প্রতিফলিত করে কিনা তা পরীক্ষা করুন।
এই ধাপগুলি নীচের বিভাগগুলিতে আরও বিশদে আলোচনা করা হয়েছে।
UI উপাদানগুলি অ্যাক্সেস করুন
UiDevice অবজেক্ট হল ডিভাইসের অবস্থা অ্যাক্সেস এবং পরিচালনা করার প্রাথমিক উপায়। আপনার পরীক্ষাগুলিতে, আপনি বর্তমান ওরিয়েন্টেশন বা ডিসপ্লে আকারের মতো বিভিন্ন বৈশিষ্ট্যের অবস্থা পরীক্ষা করার জন্য UiDevice পদ্ধতি ব্যবহার করতে পারেন। আপনার পরীক্ষাটি UiDevice অবজেক্ট ব্যবহার করে ডিভাইস-স্তরের ক্রিয়া সম্পাদন করতে পারে, যেমন ডিভাইসটিকে একটি নির্দিষ্ট ঘূর্ণনে বাধ্য করা, D-প্যাড হার্ডওয়্যার বোতাম টিপে দেওয়া এবং হোম এবং মেনু বোতাম টিপে দেওয়া।
ডিভাইসের হোম স্ক্রিন থেকে পরীক্ষা শুরু করা ভালো অভ্যাস। হোম স্ক্রিন থেকে (অথবা ডিভাইসে আপনার বেছে নেওয়া অন্য কোনও শুরুর অবস্থান থেকে), আপনি নির্দিষ্ট UI উপাদান নির্বাচন এবং ইন্টারঅ্যাক্ট করার জন্য UI Automator API দ্বারা প্রদত্ত পদ্ধতিগুলিকে কল করতে পারেন।
নিম্নলিখিত কোড স্নিপেটটি দেখায় কিভাবে আপনার পরীক্ষাটি UiDevice এর একটি উদাহরণ পেতে পারে এবং একটি হোম বোতাম টিপে সিমুলেট করতে পারে:
কোটলিন
import org.junit.Before
import androidx.test.runner.AndroidJUnit4
import androidx.test.uiautomator.UiDevice
import androidx.test.uiautomator.By
import androidx.test.uiautomator.Until
...
private const val BASIC_SAMPLE_PACKAGE = "com.example.android.testing.uiautomator.BasicSample"
private const val LAUNCH_TIMEOUT = 5000L
private const val STRING_TO_BE_TYPED = "UiAutomator"
@RunWith(AndroidJUnit4::class)
@SdkSuppress(minSdkVersion = 18)
class ChangeTextBehaviorTest2 {
private lateinit var device: UiDevice
@Before
fun startMainActivityFromHomeScreen() {
// Initialize UiDevice instance
device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
// Start from the home screen
device.pressHome()
// Wait for launcher
val launcherPackage: String = device.launcherPackageName
assertThat(launcherPackage, notNullValue())
device.wait(
Until.hasObject(By.pkg(launcherPackage).depth(0)),
LAUNCH_TIMEOUT
)
// Launch the app
val context = ApplicationProvider.getApplicationContext<Context>()
val intent = context.packageManager.getLaunchIntentForPackage(
BASIC_SAMPLE_PACKAGE).apply {
// Clear out any previous instances
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
}
context.startActivity(intent)
// Wait for the app to appear
device.wait(
Until.hasObject(By.pkg(BASIC_SAMPLE_PACKAGE).depth(0)),
LAUNCH_TIMEOUT
)
}
}
জাভা
import org.junit.Before;
import androidx.test.runner.AndroidJUnit4;
import androidx.test.uiautomator.UiDevice;
import androidx.test.uiautomator.By;
import androidx.test.uiautomator.Until;
...
@RunWith(AndroidJUnit4.class)
@SdkSuppress(minSdkVersion = 18)
public class ChangeTextBehaviorTest {
private static final String BASIC_SAMPLE_PACKAGE
= "com.example.android.testing.uiautomator.BasicSample";
private static final int LAUNCH_TIMEOUT = 5000;
private static final String STRING_TO_BE_TYPED = "UiAutomator";
private UiDevice device;
@Before
public void startMainActivityFromHomeScreen() {
// Initialize UiDevice instance
device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
// Start from the home screen
device.pressHome();
// Wait for launcher
final String launcherPackage = device.getLauncherPackageName();
assertThat(launcherPackage, notNullValue());
device.wait(Until.hasObject(By.pkg(launcherPackage).depth(0)),
LAUNCH_TIMEOUT);
// Launch the app
Context context = ApplicationProvider.getApplicationContext();
final Intent intent = context.getPackageManager()
.getLaunchIntentForPackage(BASIC_SAMPLE_PACKAGE);
// Clear out any previous instances
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(intent);
// Wait for the app to appear
device.wait(Until.hasObject(By.pkg(BASIC_SAMPLE_PACKAGE).depth(0)),
LAUNCH_TIMEOUT);
}
}
উদাহরণে, @SdkSuppress(minSdkVersion = 18) স্টেটমেন্ট নিশ্চিত করতে সাহায্য করে যে পরীক্ষাগুলি শুধুমাত্র Android 4.3 (API লেভেল 18) বা তার বেশি সংস্করণের ডিভাইসগুলিতেই চলবে, যেমনটি UI Automator ফ্রেমওয়ার্কের প্রয়োজন।
findObject() পদ্ধতি ব্যবহার করে UiObject2 পুনরুদ্ধার করুন যা একটি নির্দিষ্ট নির্বাচক মানদণ্ডের সাথে মেলে এমন একটি ভিউ উপস্থাপন করে। প্রয়োজনে আপনি আপনার অ্যাপ পরীক্ষার অন্যান্য অংশে তৈরি UiObject2 ইনস্ট্যান্সগুলি পুনরায় ব্যবহার করতে পারেন। মনে রাখবেন যে UI Automator টেস্ট ফ্রেমওয়ার্ক প্রতিবার যখন আপনার পরীক্ষায় UiObject2 ইনস্ট্যান্স ব্যবহার করে একটি UI উপাদানে ক্লিক করে বা কোনও বৈশিষ্ট্য অনুসন্ধান করে তখন একটি মিলের জন্য বর্তমান ডিসপ্লে অনুসন্ধান করে।
নিচের স্নিপেটটি দেখায় যে কীভাবে আপনার পরীক্ষাটি UiObject2 ইনস্ট্যান্স তৈরি করতে পারে যা একটি অ্যাপে একটি বাতিল বোতাম এবং একটি ঠিক আছে বোতাম উপস্থাপন করে।
কোটলিন
val okButton: UiObject2 = device.findObject(
By.text("OK").clazz("android.widget.Button")
)
// Simulate a user-click on the OK button, if found.
if (okButton != null) {
okButton.click()
}
জাভা
UiObject2 okButton = device.findObject(
By.text("OK").clazz("android.widget.Button")
);
// Simulate a user-click on the OK button, if found.
if (okButton != null) {
okButton.click();
}
একটি নির্বাচক নির্দিষ্ট করুন
যদি আপনি কোনও অ্যাপের একটি নির্দিষ্ট UI উপাদান অ্যাক্সেস করতে চান, তাহলে By ক্লাস ব্যবহার করে একটি BySelector ইনস্ট্যান্স তৈরি করুন। BySelector প্রদর্শিত UI-তে নির্দিষ্ট উপাদানগুলির জন্য একটি কোয়েরি উপস্থাপন করে।
যদি একাধিক মিলে যাওয়া উপাদান পাওয়া যায়, তাহলে লেআউট অনুক্রমের প্রথম মিলে যাওয়া উপাদানটি লক্ষ্য UiObject2 হিসেবে ফেরত পাঠানো হবে। একটি BySelector তৈরি করার সময়, আপনি আপনার অনুসন্ধানকে আরও পরিমার্জিত করার জন্য একাধিক বৈশিষ্ট্য একত্রিত করতে পারেন। যদি কোনও মিলে যাওয়া UI উপাদান না পাওয়া যায়, তাহলে একটি null ফেরত পাঠানো হবে।
একাধিক BySelector ইনস্ট্যান্স নেস্ট করার জন্য আপনি hasChild() অথবা hasDescendant() পদ্ধতি ব্যবহার করতে পারেন। উদাহরণস্বরূপ, নিম্নলিখিত কোড উদাহরণটি দেখায় যে কীভাবে আপনার পরীক্ষাটি টেক্সট প্রপার্টি সহ একটি চাইল্ড UI উপাদান সহ প্রথম ListView খুঁজে পেতে একটি অনুসন্ধান নির্দিষ্ট করতে পারে।
কোটলিন
val listView: UiObject2 = device.findObject(
By.clazz("android.widget.ListView")
.hasChild(
By.text("Apps")
)
)
জাভা
UiObject2 listView = device.findObject(
By.clazz("android.widget.ListView")
.hasChild(
By.text("Apps")
)
);
আপনার নির্বাচক মানদণ্ডে অবজেক্টের অবস্থা নির্দিষ্ট করা কার্যকর হতে পারে। উদাহরণস্বরূপ, যদি আপনি সমস্ত চেক করা উপাদানের একটি তালিকা নির্বাচন করতে চান যাতে আপনি সেগুলি সাফ করতে পারেন, তাহলে আর্গুমেন্টটি সত্যে সেট করে checked() পদ্ধতিটি কল করুন।
কর্ম সম্পাদন করুন
একবার আপনার পরীক্ষায় UiObject2 অবজেক্ট পাওয়া গেলে, আপনি UiObject2 ক্লাসের পদ্ধতিগুলিকে কল করে সেই অবজেক্ট দ্বারা প্রতিনিধিত্ব করা UI কম্পোনেন্টে ব্যবহারকারীর ইন্টারঅ্যাকশন সম্পাদন করতে পারেন। আপনি এই ধরনের ক্রিয়াগুলি নির্দিষ্ট করতে পারেন:
-
click(): UI উপাদানের দৃশ্যমান সীমানার কেন্দ্রে ক্লিক করে। -
drag(): এই বস্তুটিকে ইচ্ছামত স্থানাঙ্কে টেনে আনে। -
setText(): ক্ষেত্রের বিষয়বস্তু মুছে ফেলার পর, একটি সম্পাদনাযোগ্য ক্ষেত্রে টেক্সট সেট করে। বিপরীতে,clear()পদ্ধতিটি একটি সম্পাদনাযোগ্য ক্ষেত্রে বিদ্যমান টেক্সট মুছে ফেলে। -
swipe(): নির্দিষ্ট দিকে সোয়াইপ ক্রিয়া সম্পাদন করে। -
scrollUntil():ConditionবাEventConditionসন্তুষ্ট না হওয়া পর্যন্ত নির্দিষ্ট দিকে স্ক্রোল করার ক্রিয়া সম্পাদন করে।
UI Automator টেস্টিং ফ্রেমওয়ার্ক আপনাকে getContext() এর মাধ্যমে একটি Context অবজেক্ট পেয়ে শেল কমান্ড ব্যবহার না করেই একটি Intent পাঠাতে বা একটি Activity চালু করতে দেয়।
নিচের স্নিপেটটি দেখায় কিভাবে আপনার পরীক্ষাটি পরীক্ষামূলকভাবে অ্যাপটি চালু করার জন্য একটি Intent ব্যবহার করতে পারে। এই পদ্ধতিটি তখন কার্যকর যখন আপনি কেবল ক্যালকুলেটর অ্যাপটি পরীক্ষা করতে আগ্রহী হন এবং লঞ্চার সম্পর্কে চিন্তা করেন না।
কোটলিন
fun setUp() {
...
// Launch a simple calculator app
val context = getInstrumentation().context
val intent = context.packageManager.getLaunchIntentForPackage(CALC_PACKAGE).apply {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
}
// Clear out any previous instances
context.startActivity(intent)
device.wait(Until.hasObject(By.pkg(CALC_PACKAGE).depth(0)), TIMEOUT)
}
জাভা
public void setUp() {
...
// Launch a simple calculator app
Context context = getInstrumentation().getContext();
Intent intent = context.getPackageManager()
.getLaunchIntentForPackage(CALC_PACKAGE);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
// Clear out any previous instances
context.startActivity(intent);
device.wait(Until.hasObject(By.pkg(CALC_PACKAGE).depth(0)), TIMEOUT);
}
ফলাফল যাচাই করুন
InstrumentationTestCase TestCase প্রসারিত করে, যাতে আপনি স্ট্যান্ডার্ড JUnit Assert পদ্ধতি ব্যবহার করে পরীক্ষা করতে পারেন যে অ্যাপের UI উপাদানগুলি প্রত্যাশিত ফলাফল প্রদান করে।
নিচের স্নিপেটটি দেখায় কিভাবে আপনার পরীক্ষাটি একটি ক্যালকুলেটর অ্যাপে বেশ কয়েকটি বোতাম খুঁজে বের করতে পারে, সেগুলিতে ক্রমানুসারে ক্লিক করতে পারে, তারপর সঠিক ফলাফল প্রদর্শিত হচ্ছে কিনা তা যাচাই করতে পারে।
কোটলিন
private const val CALC_PACKAGE = "com.myexample.calc"
fun testTwoPlusThreeEqualsFive() {
// Enter an equation: 2 + 3 = ?
device.findObject(By.res(CALC_PACKAGE, "two")).click()
device.findObject(By.res(CALC_PACKAGE, "plus")).click()
device.findObject(By.res(CALC_PACKAGE, "three")).click()
device.findObject(By.res(CALC_PACKAGE, "equals")).click()
// Verify the result = 5
val result: UiObject2 = device.findObject(By.res(CALC_PACKAGE, "result"))
assertEquals("5", result.text)
}
জাভা
private static final String CALC_PACKAGE = "com.myexample.calc";
public void testTwoPlusThreeEqualsFive() {
// Enter an equation: 2 + 3 = ?
device.findObject(By.res(CALC_PACKAGE, "two")).click();
device.findObject(By.res(CALC_PACKAGE, "plus")).click();
device.findObject(By.res(CALC_PACKAGE, "three")).click();
device.findObject(By.res(CALC_PACKAGE, "equals")).click();
// Verify the result = 5
UiObject2 result = device.findObject(By.res(CALC_PACKAGE, "result"));
assertEquals("5", result.getText());
}
একটি ডিভাইস বা এমুলেটরে UI অটোমেটর পরীক্ষা চালান
আপনি অ্যান্ড্রয়েড স্টুডিও থেকে অথবা কমান্ড-লাইন থেকে UI অটোমেটর পরীক্ষা চালাতে পারেন। আপনার প্রোজেক্টে ডিফল্ট ইন্সট্রুমেন্টেশন রানার হিসেবে AndroidJUnitRunner উল্লেখ করতে ভুলবেন না।
আরও উদাহরণ
সিস্টেম UI এর সাথে ইন্টারঅ্যাক্ট করুন
UI Automator স্ক্রিনের সবকিছুর সাথে ইন্টারঅ্যাক্ট করতে পারে, আপনার অ্যাপের বাইরের সিস্টেম উপাদানগুলি সহ, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে:
কোটলিন
// Opens the System Settings. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) device.executeShellCommand("am start -a android.settings.SETTINGS")
জাভা
// Opens the System Settings. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); device.executeShellCommand("am start -a android.settings.SETTINGS");
কোটলিন
// Opens the notification shade. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) device.openNotification()
জাভা
// Opens the notification shade. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); device.openNotification();
কোটলিন
// Opens the Quick Settings shade. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) device.openQuickSettings()
জাভা
// Opens the Quick Settings shade. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); device.openQuickSettings();
কোটলিন
// Get the system clock. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) UiObject2 clock = device.findObject(By.res("com.android.systemui:id/clock")) print(clock.getText())
জাভা
// Get the system clock. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); UiObject2 clock = device.findObject(By.res("com.android.systemui:id/clock")); print(clock.getText());
পরিবর্তনের জন্য অপেক্ষা করুন

স্ক্রিন ট্রানজিশনে সময় লাগতে পারে এবং এর সময়কাল ভবিষ্যদ্বাণী করা অবিশ্বাস্য, তাই অপারেশন করার পরে আপনার UI Automator কে অপেক্ষা করতে হবে। UI Automator এর জন্য একাধিক পদ্ধতি প্রদান করে:
-
UiDevice.performActionAndWait(Runnable action, EventCondition<U> condition, long timeout): উদাহরণস্বরূপ, একটি বোতামে ক্লিক করে একটি নতুন উইন্ডো প্রদর্শিত না হওয়া পর্যন্ত অপেক্ষা করতে,device.performActionAndWait(() -> button.click(), Until.newWindow(), timeout)এ কল করুন। -
UiDevice.wait(Condition<Object, U> condition, long timeout): উদাহরণস্বরূপ, ডিভাইসে একটি নির্দিষ্টUiObject2না আসা পর্যন্ত অপেক্ষা করতে,device.wait(Until.hasObject(By.text("my_text")), timeout); -
UiObject2.wait(@NonNull Condition<Object, U> condition, long timeout): উদাহরণস্বরূপ, একটি চেকবক্স চেক না হওয়া পর্যন্ত অপেক্ষা করতে,checkbox.wait(Until.checked(true), timeout);কল করুন। -
UiObject2.clickAndWait(@NonNull EventCondition<U> condition, long timeout): উদাহরণস্বরূপ, একটি বোতামে ক্লিক করে একটি নতুন উইন্ডো প্রদর্শিত না হওয়া পর্যন্ত অপেক্ষা করতে,button.clickAndWait(Until.newWindow(), timeout); -
UiObject2.scrollUntil(@NonNull Direction direction, @NonNull Condition<Object, U> condition): উদাহরণস্বরূপ, একটি নতুন অবজেক্ট প্রদর্শিত না হওয়া পর্যন্ত নিচে স্ক্রোল করতে,object.scrollUntil(Direction.DOWN, Until.hasObject(By.text('new_obj')));কল করুন। -
UiObject2.scrollUntil(@NonNull Direction direction, @NonNull EventCondition<U> condition): উদাহরণস্বরূপ, নীচে স্ক্রোল করতে,object.scrollUntil(Direction.DOWN, Until.scrollFinished(Direction.DOWN));
নিম্নলিখিত কোড স্নিপেটটি দেখায় কিভাবে UI Automator ব্যবহার করে সিস্টেম সেটিংসে performActionAndWait() পদ্ধতি ব্যবহার করে ডু নট ডিস্টার্ব মোড বন্ধ করতে হয় যা ট্রানজিশনের জন্য অপেক্ষা করে:
কোটলিন
@Test @SdkSuppress(minSdkVersion = 21) @Throws(Exception::class) fun turnOffDoNotDisturb() { device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) device.performActionAndWait({ try { device.executeShellCommand("am start -a android.settings.SETTINGS") } catch (e: IOException) { throw RuntimeException(e) } }, Until.newWindow(), 1000) // Check system settings has been opened. Assert.assertTrue(device.hasObject(By.pkg("com.android.settings"))) // Scroll the settings to the top and find Notifications button var scrollableObj: UiObject2 = device.findObject(By.scrollable(true)) scrollableObj.scrollUntil(Direction.UP, Until.scrollFinished(Direction.UP)) val notificationsButton = scrollableObj.findObject(By.text("Notifications")) // Click the Notifications button and wait until a new window is opened. device.performActionAndWait({ notificationsButton.click() }, Until.newWindow(), 1000) scrollableObj = device.findObject(By.scrollable(true)) // Scroll down until it finds a Do Not Disturb button. val doNotDisturb = scrollableObj.scrollUntil( Direction.DOWN, Until.findObject(By.textContains("Do Not Disturb")) ) device.performActionAndWait({ doNotDisturb.click() }, Until.newWindow(), 1000) // Turn off the Do Not Disturb. val turnOnDoNotDisturb = device.findObject(By.text("Turn on now")) turnOnDoNotDisturb?.click() Assert.assertTrue(device.wait(Until.hasObject(By.text("Turn off now")), 1000)) }
জাভা
@Test @SdkSuppress(minSdkVersion = 21) public void turnOffDoNotDisturb() throws Exception{ device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); device.performActionAndWait(() -> { try { device.executeShellCommand("am start -a android.settings.SETTINGS"); } catch (IOException e) { throw new RuntimeException(e); } }, Until.newWindow(), 1000); // Check system settings has been opened. assertTrue(device.hasObject(By.pkg("com.android.settings"))); // Scroll the settings to the top and find Notifications button UiObject2 scrollableObj = device.findObject(By.scrollable(true)); scrollableObj.scrollUntil(Direction.UP, Until.scrollFinished(Direction.UP)); UiObject2 notificationsButton = scrollableObj.findObject(By.text("Notifications")); // Click the Notifications button and wait until a new window is opened. device.performActionAndWait(() -> notificationsButton.click(), Until.newWindow(), 1000); scrollableObj = device.findObject(By.scrollable(true)); // Scroll down until it finds a Do Not Disturb button. UiObject2 doNotDisturb = scrollableObj.scrollUntil(Direction.DOWN, Until.findObject(By.textContains("Do Not Disturb"))); device.performActionAndWait(()-> doNotDisturb.click(), Until.newWindow(), 1000); // Turn off the Do Not Disturb. UiObject2 turnOnDoNotDisturb = device.findObject(By.text("Turn on now")); if(turnOnDoNotDisturb != null) { turnOnDoNotDisturb.click(); } assertTrue(device.wait(Until.hasObject(By.text("Turn off now")), 1000)); }
অতিরিক্ত সম্পদ
অ্যান্ড্রয়েড পরীক্ষায় UI অটোমেটর ব্যবহার সম্পর্কে আরও তথ্যের জন্য, নিম্নলিখিত সংস্থানগুলি দেখুন।
রেফারেন্স ডকুমেন্টেশন:
নমুনা
- বেসিক স্যাম্পল : বেসিক UI অটোমেটর নমুনা।