UI অটোমেটর দিয়ে স্বয়ংক্রিয় পরীক্ষা লিখুন

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

UI অটোমেটর টেস্টিং ফ্রেমওয়ার্ক হল একটি ইন্সট্রুমেন্টেশন-ভিত্তিক API এবং AndroidJUnitRunner টেস্ট রানারের সাথে কাজ করে। এটি অস্বচ্ছ বক্স-শৈলী স্বয়ংক্রিয় পরীক্ষা লেখার জন্য উপযুক্ত, যেখানে পরীক্ষার কোড লক্ষ্য অ্যাপের অভ্যন্তরীণ বাস্তবায়ন বিবরণের উপর নির্ভর করে না।

UI অটোমেটর পরীক্ষার কাঠামোর মূল বৈশিষ্ট্যগুলির মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:

  • রাষ্ট্রীয় তথ্য পুনরুদ্ধার করতে এবং লক্ষ্য ডিভাইসে ক্রিয়াকলাপ সম্পাদন করার জন্য একটি API। আরও তথ্যের জন্য, ডিভাইসের অবস্থা অ্যাক্সেস করা দেখুন।
  • API যেগুলি ক্রস-অ্যাপ UI পরীক্ষা সমর্থন করে। আরও তথ্যের জন্য, UI অটোমেটর API দেখুন।

ডিভাইসের অবস্থা অ্যাক্সেস করা হচ্ছে

UI অটোমেটর টেস্টিং ফ্রেমওয়ার্ক যে ডিভাইসে টার্গেট অ্যাপটি চলছে তাতে অ্যাক্সেস এবং অপারেশন করার জন্য একটি UiDevice ক্লাস প্রদান করে। আপনি বর্তমান স্থিতিবিন্যাস বা প্রদর্শন আকারের মতো ডিভাইসের বৈশিষ্ট্যগুলি অ্যাক্সেস করতে এর পদ্ধতিগুলিকে কল করতে পারেন। UiDevice ক্লাস আপনাকে নিম্নলিখিত ক্রিয়াগুলি সম্পাদন করতে দেয়:

  1. ডিভাইস ঘূর্ণন পরিবর্তন.
  2. হার্ডওয়্যার কী টিপুন, যেমন "ভলিউম আপ"।
  3. পিছনে, হোম বা মেনু বোতাম টিপুন।
  4. বিজ্ঞপ্তি ছায়া খুলুন.
  5. বর্তমান উইন্ডোর একটি স্ক্রিনশট নিন।

উদাহরণস্বরূপ, একটি হোম বোতাম প্রেস অনুকরণ করতে, UiDevice.pressHome() পদ্ধতিতে কল করুন।

UI অটোমেটর 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 অটোমেটরের সাথে আপনার UI পরীক্ষা তৈরি করার আগে, AndroidX টেস্টের জন্য সেট আপ প্রকল্পে বর্ণিত হিসাবে আপনার পরীক্ষার উত্স কোডের অবস্থান এবং প্রকল্প নির্ভরতাগুলি কনফিগার করা নিশ্চিত করুন৷

আপনার অ্যান্ড্রয়েড অ্যাপ মডিউলের build.gradle ফাইলে, আপনাকে অবশ্যই UI Automator লাইব্রেরিতে একটি নির্ভরতা রেফারেন্স সেট করতে হবে:

কোটলিন

dependencies {
  ...
  androidTestImplementation('androidx.test.uiautomator:uiautomator:2.3.0-alpha03')
}

গ্রোভি

dependencies {
  ...
  androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.3.0-alpha03'
}

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

একটি ডিভাইসে UI পরিদর্শন করুন

আপনার পরীক্ষা ডিজাইন করার আগে, ডিভাইসে দৃশ্যমান UI উপাদানগুলি পরিদর্শন করুন। আপনার UI অটোমেটর পরীক্ষাগুলি এই উপাদানগুলি অ্যাক্সেস করতে পারে তা নিশ্চিত করতে, এই উপাদানগুলিতে দৃশ্যমান পাঠ্য লেবেল, android:contentDescription মান বা উভয়ই আছে কিনা তা পরীক্ষা করুন৷

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

uiautomatorviewer টুল চালু করতে:

  1. একটি শারীরিক ডিভাইসে লক্ষ্য অ্যাপ্লিকেশন চালু করুন.
  2. ডিভাইসটিকে আপনার ডেভেলপমেন্ট মেশিনের সাথে সংযুক্ত করুন।
  3. একটি টার্মিনাল উইন্ডো খুলুন এবং <android-sdk>/tools/ ডিরেক্টরিতে নেভিগেট করুন।
  4. এই কমান্ড দিয়ে টুল চালান:
 $ uiautomatorviewer

আপনার অ্যাপ্লিকেশনের জন্য UI বৈশিষ্ট্য দেখতে:

  1. uiautomatorviewer ইন্টারফেসে, ডিভাইস স্ক্রিনশট বোতামে ক্লিক করুন।
  2. uiautomatorviewer টুল দ্বারা চিহ্নিত UI উপাদানগুলি দেখতে বাঁ-হাতের প্যানেলে স্ন্যাপশটের উপর ঘোরান৷ বৈশিষ্ট্যগুলি নীচের ডানদিকের প্যানেলে এবং উপরের ডানদিকের প্যানেলে লেআউট শ্রেণিবিন্যাস তালিকাভুক্ত করা হয়েছে৷
  3. ঐচ্ছিকভাবে, UI অটোমেটরের কাছে অ্যাক্সেসযোগ্য নয় এমন UI উপাদানগুলি দেখতে টগল NAF নোড বোতামে ক্লিক করুন। এই উপাদানগুলির জন্য শুধুমাত্র সীমিত তথ্য উপলব্ধ হতে পারে।

অ্যান্ড্রয়েড দ্বারা প্রদত্ত সাধারণ ধরণের UI উপাদানগুলি সম্পর্কে জানতে, ব্যবহারকারী ইন্টারফেস দেখুন।

আপনার কার্যকলাপ অ্যাক্সেসযোগ্য নিশ্চিত করুন

UI অটোমেটর টেস্ট ফ্রেমওয়ার্ক অ্যাপ্লিকেশানগুলিতে আরও ভাল পারফর্ম করে যেগুলি Android অ্যাক্সেসিবিলিটি বৈশিষ্ট্যগুলি প্রয়োগ করেছে৷ আপনি যখন View টাইপের UI উপাদান বা SDK থেকে View -এর একটি সাবক্লাস ব্যবহার করেন, তখন আপনাকে অ্যাক্সেসিবিলিটি সমর্থন প্রয়োগ করতে হবে না, কারণ এই ক্লাসগুলি ইতিমধ্যেই আপনার জন্য এটি করেছে।

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

  1. একটি কংক্রিট ক্লাস তৈরি করুন যা ExploreByTouchHelper প্রসারিত করে।
  2. setAccessibilityDelegate() কল করে একটি নির্দিষ্ট কাস্টম UI উপাদানের সাথে আপনার নতুন ক্লাসের একটি উদাহরণ সংযুক্ত করুন।

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

একটি UI অটোমেটর পরীক্ষার ক্লাস তৈরি করুন

আপনার UI অটোমেটর পরীক্ষার ক্লাসটি JUnit 4 পরীক্ষার ক্লাসের মতোই লেখা উচিত। JUnit 4 পরীক্ষার ক্লাস তৈরি করা এবং JUnit 4 দাবী এবং টীকা ব্যবহার সম্পর্কে আরও জানতে, একটি যন্ত্রযুক্ত ইউনিট টেস্ট ক্লাস তৈরি করুন দেখুন।

আপনার পরীক্ষার ক্লাস সংজ্ঞার শুরুতে @RunWith(AndroidJUnit4.class) টীকা যোগ করুন। এছাড়াও আপনাকে আপনার ডিফল্ট টেস্ট রানার হিসাবে AndroidJUnitRunner ক্লাস, AndroidX টেস্টে প্রদত্ত, নির্দিষ্ট করতে হবে। ডিভাইস বা এমুলেটরে রান UI অটোমেটর পরীক্ষায় এই ধাপটি আরও বিশদে বর্ণনা করা হয়েছে।

আপনার UI অটোমেটর পরীক্ষার ক্লাসে নিম্নলিখিত প্রোগ্রামিং মডেলটি প্রয়োগ করুন:

  1. getInstance() পদ্ধতিতে কল করে এবং আর্গুমেন্ট হিসাবে একটি ইন্সট্রুমেন্টেশন অবজেক্ট পাস করে আপনি যে ডিভাইসটি পরীক্ষা করতে চান সেটি অ্যাক্সেস করতে একটি UiDevice অবজেক্ট পান।
  2. একটি UI উপাদান অ্যাক্সেস করতে একটি UiObject2 অবজেক্ট পান যা ডিভাইসে প্রদর্শিত হয় (উদাহরণস্বরূপ, অগ্রভাগে বর্তমান দৃশ্য), findObject() পদ্ধতিতে কল করে।
  3. একটি UiObject2 পদ্ধতিতে কল করে সেই UI উপাদানটিতে সঞ্চালনের জন্য একটি নির্দিষ্ট ব্যবহারকারীর মিথস্ক্রিয়া অনুকরণ করুন; উদাহরণস্বরূপ, স্ক্রোল করতে scrollUntil() এবং একটি পাঠ্য ক্ষেত্র সম্পাদনা করতে setText() কল করুন। আপনি একাধিক UI উপাদান বা ব্যবহারকারীর ক্রিয়াগুলির ক্রম জড়িত আরও জটিল ব্যবহারকারীর মিথস্ক্রিয়া পরীক্ষা করার জন্য প্রয়োজনীয় হিসাবে 2 এবং 3 ধাপে বারবার API-কে কল করতে পারেন।
  4. এই ব্যবহারকারীর ইন্টারঅ্যাকশনগুলি সঞ্চালিত হওয়ার পরে, UI প্রত্যাশিত অবস্থা বা আচরণ প্রতিফলিত করে কিনা তা পরীক্ষা করুন৷

এই পদক্ষেপগুলি নীচের বিভাগে আরও বিশদে কভার করা হয়েছে।

UI উপাদান অ্যাক্সেস করুন

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

ডিভাইসের হোম স্ক্রীন থেকে আপনার পরীক্ষা শুরু করা ভাল অভ্যাস। হোম স্ক্রীন থেকে (বা ডিভাইসে আপনি বেছে নেওয়া অন্য কোনো শুরুর অবস্থান), আপনি নির্দিষ্ট 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 অটোমেটর ফ্রেমওয়ার্কের প্রয়োজন।

একটি UiObject2 পুনরুদ্ধার করতে findObject() পদ্ধতি ব্যবহার করুন যা একটি প্রদত্ত নির্বাচক মানদণ্ডের সাথে মেলে এমন একটি দৃশ্যকে উপস্থাপন করে। আপনি প্রয়োজন অনুসারে আপনার অ্যাপ পরীক্ষার অন্যান্য অংশে তৈরি করা UiObject2 দৃষ্টান্তগুলি পুনরায় ব্যবহার করতে পারেন। মনে রাখবেন যে UI অটোমেটর পরীক্ষার ফ্রেমওয়ার্ক একটি UI উপাদানে ক্লিক করতে বা কোনও সম্পত্তি জিজ্ঞাসা করতে আপনার পরীক্ষা যখনই একটি UiObject2 উদাহরণ ব্যবহার করে তখনই একটি ম্যাচের জন্য বর্তমান প্রদর্শন অনুসন্ধান করে।

নিম্নলিখিত স্নিপেটটি দেখায় যে কীভাবে আপনার পরীক্ষা 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 উপাদান অ্যাক্সেস করতে চান, একটি BySelector দৃষ্টান্ত তৈরি করতে By ক্লাস ব্যবহার করুন। BySelector প্রদর্শিত UI-তে নির্দিষ্ট উপাদানগুলির জন্য একটি প্রশ্ন উপস্থাপন করে।

যদি একাধিক মিলে যাওয়া উপাদান পাওয়া যায়, তাহলে বিন্যাস অনুক্রমের প্রথম মিলে যাওয়া উপাদানটিকে লক্ষ্য UiObject2 হিসাবে ফেরত দেওয়া হয়। একটি BySelector নির্মাণ করার সময়, আপনি আপনার অনুসন্ধানকে পরিমার্জিত করতে একাধিক বৈশিষ্ট্য একসাথে চেইন করতে পারেন। যদি কোনো মিলে যাওয়া UI উপাদান না পাওয়া যায়, তাহলে একটি null ফেরত দেওয়া হয়।

আপনি একাধিক BySelector দৃষ্টান্ত নেস্ট করতে hasChild() বা hasDescendant() পদ্ধতি ব্যবহার করতে পারেন। উদাহরণ স্বরূপ, নিচের কোডের উদাহরণটি দেখায় যে কিভাবে আপনার পরীক্ষাটি প্রথম ListView খুঁজে পেতে একটি সার্চ নির্দিষ্ট করতে পারে যাতে টেক্সট প্রপার্টির সাথে একটি চাইল্ড UI উপাদান রয়েছে।

কোটলিন


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 অবজেক্ট পাওয়া গেলে, আপনি সেই বস্তুর দ্বারা উপস্থাপিত UI উপাদানটিতে ব্যবহারকারীর মিথস্ক্রিয়া সঞ্চালনের জন্য UiObject2 ক্লাসের পদ্ধতিগুলিকে কল করতে পারেন। আপনি যেমন কর্ম নির্দিষ্ট করতে পারেন:

  • click() : UI উপাদানের দৃশ্যমান সীমানার কেন্দ্রে ক্লিক করে।
  • drag() : এই বস্তুটিকে নির্বিচারে স্থানাঙ্কে টেনে আনে।
  • setText() : ক্ষেত্রের বিষয়বস্তু সাফ করার পরে একটি সম্পাদনাযোগ্য ক্ষেত্রে পাঠ্য সেট করে। বিপরীতভাবে, clear() পদ্ধতি একটি সম্পাদনাযোগ্য ক্ষেত্রে বিদ্যমান পাঠ্য সাফ করে।
  • swipe() : নির্দিষ্ট দিকের দিকে সোয়াইপ ক্রিয়া সম্পাদন করে।
  • scrollUntil() : Condition বা EventCondition সন্তুষ্ট না হওয়া পর্যন্ত নির্দিষ্ট দিকের দিকে স্ক্রোল ক্রিয়া সম্পাদন করে।

UI অটোমেটর টেস্টিং ফ্রেমওয়ার্ক getContext() এর মাধ্যমে একটি কনটেক্সট অবজেক্ট পেয়ে শেল কমান্ড ব্যবহার না করে একটি ইন্টেন্ট পাঠাতে বা একটি কার্যকলাপ চালু করতে দেয়।

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

কোটলিন


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 অটোমেটর আপনার অ্যাপের বাইরের সিস্টেম উপাদান সহ স্ক্রিনের সমস্ত কিছুর সাথে ইন্টারঅ্যাক্ট করতে পারে, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে:

কোটলিন


// 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());

পরিবর্তনের জন্য অপেক্ষা করুন

ডিস্টার্ব বন্ধ করুন
চিত্র 1. UI অটোমেটর একটি পরীক্ষা ডিভাইসে বিরক্ত করবেন না মোড বন্ধ করে।

স্ক্রীন ট্রানজিশনে সময় লাগতে পারে এবং তাদের সময়কালের ভবিষ্যদ্বাণী করা অবিশ্বস্ত, তাই অপারেশন সম্পাদন করার পরে আপনার UI অটোমেটর অপেক্ষা করা উচিত। UI অটোমেটর এর জন্য একাধিক পদ্ধতি প্রদান করে:

নিম্নলিখিত কোড স্নিপেট দেখায় কিভাবে UI অটোমেটর ব্যবহার করে সিস্টেম সেটিংসে ট্রানজিশনের জন্য অপেক্ষা করে এমন 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 অটোমেটর ব্যবহার সম্পর্কে আরও তথ্যের জন্য, নিম্নলিখিত সংস্থানগুলি দেখুন৷

রেফারেন্স ডকুমেন্টেশন:

নমুনা