Spectatio হল একটি ওপেন সোর্স টেস্ট ফ্রেমওয়ার্ক যা বাস্তব এবং ভার্চুয়াল ডিভাইসে Android Automotive OS (AAOS) পরীক্ষা করার জন্য তৈরি করা হয়েছে। Spectatio একটি স্বয়ংচালিত ডিভাইসে অ্যাপ্লিকেশন পরীক্ষা করার জন্য API প্রদান করে এবং এটি AAOS এবং এর অ্যাপ্লিকেশনগুলির সক্ষমতা এবং কার্যকারিতা যাচাই করার জন্য ব্যবহৃত একটি প্রসারিত এবং মাপযোগ্য সমাধান।
উচ্চ-স্তরের নকশা
Spectatio ফ্রেমওয়ার্ক বিভিন্ন AAOS UI বাস্তবায়নের জন্য অভিযোজিত এবং প্রসারণযোগ্য। এটি ডিভাইস হার্ডওয়্যার, এমুলেটর এবং ভার্চুয়ালাইজড পরিবেশে AAOS-এর ক্ষমতা এবং কর্মক্ষমতা পরীক্ষা করার জন্য ব্যবহৃত হয়।
নিচের চিত্রটি স্পেকট্যাটিও ফ্রেমওয়ার্কের উচ্চ-স্তরের নকশা ব্যাখ্যা করে।
চিত্র 1. স্পেক্টেটিও ফ্রেমওয়ার্ক উচ্চ-স্তরের নকশা।
UI অটোমেটরের উপরে নির্মিত, Spectatio ফ্রেমওয়ার্ক UI পরীক্ষা তৈরি করতে API-এর একটি সেট সরবরাহ করে যা AAOS-এ ব্যবহারকারী এবং সিস্টেম অ্যাপগুলির সাথে ইন্টারঅ্যাক্ট করে। স্বয়ংচালিত পরীক্ষাগুলি পরীক্ষার জন্য Spectatio ফ্রেমওয়ার্ক দ্বারা প্রদত্ত API ব্যবহার করে, যা এই পরীক্ষাগুলিকে পরীক্ষার (DUT) অধীনে ডিভাইস থেকে স্বাধীন করে এবং সমর্থিত হলে বিভিন্ন ডিভাইস পরীক্ষা করার জন্য মাপযোগ্য করে তোলে।
চিত্র 1 দেখায় যে Spectatio ফ্রেমওয়ার্কটি রেফারেন্স অ্যাপগুলির উপর ভিত্তি করে মডুলারাইজ করা হয়েছে যেমন ডায়ালার, মেডিসেন্টার, এবং অ্যাপ-নির্দিষ্ট ইন্টারফেস এবং সাহায্যকারী ব্যবহার করে সেটিংস, এটি নতুন অ্যাপগুলির জন্য সহজেই প্রসারিত করে। Spectatio ফ্রেমওয়ার্ক সাধারণ স্ট্যান্ডার্ড এবং ইউটিলিটি হেল্পার ক্লাস পুনরায় ব্যবহার করে। স্ট্যান্ডার্ড হেল্পার ক্লাস হল সমস্ত অ্যাপ হেল্পার ফাংশনগুলির জন্য প্যারেন্ট ক্লাস এবং স্ট্যান্ডার্ড ফাংশনগুলি প্রদান করে যা ডিভাইস নির্দিষ্ট বা অ্যাপ জুড়ে প্রযোজ্য। ইউটিলিটি হেল্পার ক্লাসগুলি ডিভাইস থেকে ফাইল পড়া বা লেখার মতো ইউটিলিটি প্রদান করে।
স্থাপত্য
UI পরীক্ষা তৈরির জন্য API-এর একটি সেট প্রদান করতে, Spectatio ফ্রেমওয়ার্ক অ্যাপ-নির্দিষ্ট ইন্টারফেস এবং সাহায্যকারী প্রয়োগ করে যখন বিদ্যমান স্ট্যান্ডার্ড হেল্পার ক্লাস প্রসারিত করে এবং ইউটিলিটি হেল্পার ক্লাস আমদানি করে।
চিত্র 2 স্পেকট্যাটিও ফ্রেমওয়ার্কের উচ্চ-স্তরের আর্কিটেকচার এবং একটি অ্যাপ পরীক্ষা করার জন্য এপিআই বাস্তবায়নে জড়িত সমস্ত সত্তাকে চিত্রিত করে।
চিত্র 2. স্পেকট্যাটিও ফ্রেমওয়ার্ক উচ্চ-স্তরের আর্কিটেকচার।
অ্যাপ হেল্পার ইন্টারফেস একটি অ্যাপ হেল্পার বাস্তবায়নের জন্য একটি ব্লুপ্রিন্ট প্রদান করে। এটি বিভিন্ন সহায়ক ফাংশন নিয়ে গঠিত যা অ্যাপ পরীক্ষা করার জন্য প্রয়োজন। প্রতিটি অ্যাপের নিজস্ব ইন্টারফেস আছে, যেমন IAutoSettingHelper
এবং IAutoDialHelper
। আরও তথ্যের জন্য এবং ইন্টারফেস ফাংশনগুলির একটি তালিকার জন্য, AOSP-এ অ্যাপ হেল্পার ইন্টারফেস ফাংশনগুলি দেখুন৷
স্ট্যান্ডার্ড হেল্পার ক্লাসে স্ট্যান্ডার্ড অ্যাট্রিবিউট এবং ফাংশন থাকে যা ডিভাইস সেটআপের জন্য প্রয়োজন কিন্তু কোনো অ্যাপের জন্য নির্দিষ্ট নয়, যেমন pressHome
এবং scroll
। স্ট্যান্ডার্ড হেল্পার ক্লাস AbstractAutoStandardAppHelper.java
এ সংজ্ঞায়িত করা হয়েছে।
ইউটিলিটি হেল্পার ক্লাস ফ্রেমওয়ার্ক দ্বারা ব্যবহৃত হয়। উদাহরণস্বরূপ, AutoJsonUtility.java
হল একটি ইউটিলিটি ক্লাস যা প্রদত্ত ডিভাইস JSON কনফিগারেশন ফাইল লোড করে এবং রানটাইমে ফ্রেমওয়ার্ক কনফিগারেশন আপডেট করে।
অ্যাপ হেল্পার ইমপ্লিমেন্টেশন মডিউল হল Spectatio ফ্রেমওয়ার্কের মূল। এটিতে অ্যাপ হেল্পার ইন্টারফেসে সংজ্ঞায়িত হেল্পার ফাংশনগুলির বাস্তবায়ন রয়েছে, যা একটি স্বয়ংচালিত ডিভাইসে অ্যাপ পরীক্ষা করার জন্য প্রয়োজনীয়। প্রতিটি অ্যাপের নিজস্ব প্রয়োগ রয়েছে, যেমন SettingHelperImpl
এবং DialHelperImpl
, অ্যাপগুলি পরীক্ষা করার জন্য অটোমোটিভ পরীক্ষা দ্বারা ব্যবহৃত হয়। আরও তথ্যের জন্য এবং বাস্তবায়নের তালিকার জন্য, AOSP-এ অ্যাপ সহায়ক বাস্তবায়ন ফাংশন দেখুন।
স্বয়ংচালিত পরীক্ষাগুলি অ্যাপ সম্পর্কিত বিভিন্ন ক্রিয়াকলাপ পরীক্ষা করার জন্য অ্যাপ সহায়ক বাস্তবায়ন ফাংশন ব্যবহার করে। অ্যাপ সাহায্যকারী বাস্তবায়ন ফাংশন অ্যাক্সেস পেতে HelperAccessor
ক্লাস ব্যবহার করুন।
নিম্নলিখিত কোডটি একটি নমুনা স্বয়ংচালিত পরীক্ষার সেটআপ, পরিষ্কার এবং সম্পাদন দেখায়।
@RunWith(AndroidJUnit4.class)
public class AutoApplicationTest {
static HelperAccessor<IAutoApplicationHelper> autoApplicationHelper =
new HelperAccessor<>(IAutoApplicationHelper.class);
public AutoApplicationTest() {
// constructor
// Initialize any attributes that are required for the test execution
}
@Before
public void beforeTest() {
// Initial setup before each test
// For example - open the app
autoApplicationHelper.open();
}
@After
public void afterTest() {
// Cleanup after each test.
// For example - exit the app
autoApplicationHelper.exit();
}
@Test
public void testApplicationFeature() {
// Test
// For example - Test if app is open
assertTrue("Application is not open.", autoApplicationHelper.isOpen());
}
}
কাস্টমাইজেশন
Spectatio ফ্রেমওয়ার্ক ডিভাইস UI থেকে স্বাধীন, তাই এটি বিভিন্ন UI এবং হার্ডওয়্যার সহ ডিভাইসগুলি পরীক্ষা করার জন্য স্কেলযোগ্য। এই পরিমাপযোগ্যতা অর্জন করতে, রেফারেন্স ডিভাইসের উপর ভিত্তি করে Spectatio ডিফল্ট ডিভাইস কনফিগারেশন ব্যবহার করে। নন-ডিফল্ট ডিভাইস কনফিগারেশন সমর্থন করতে, ফ্রেমওয়ার্ক ডিভাইসের জন্য পছন্দসই UI পরিবর্তন সেট করতে রানটাইমে একটি JSON কনফিগারেশন ফাইল ব্যবহার করে। একটি JSON কনফিগারেশন ফাইল path
সেটিংস সহ TEXT
, DESCRIPTION
, এবং RESOURCE_ID
মতো UI উপাদানগুলিকে সমর্থন করে এবং DUT-এর জন্য শুধুমাত্র UI পরিবর্তনগুলি সম্পর্কে তথ্য থাকতে হবে৷ বাকি UI উপাদানগুলি ফ্রেমওয়ার্কে প্রদত্ত ডিফল্ট কনফিগারেশন মান ব্যবহার করে।
ডিফল্ট ডিভাইস কনফিগারেশন
নিম্নলিখিত নমুনা JSON কনফিগারেশন ফাইল উপলব্ধ ডিভাইস কনফিগারেশন এবং তাদের ডিফল্ট মান দেখায়.
একটি নমুনা JSON কনফিগারেশন ফাইল প্রদর্শন করতে এখানে ক্লিক করুন
{ "SETTINGS": { "APPLICATION_CONFIG": { "SETTINGS_TITLE_TEXT": "Settings", "SETTINGS_PACKAGE": "com.android.car.settings", "SETTINGS_RRO_PACKAGE": "com.android.car.settings.googlecarui.rro", "OPEN_SETTINGS_COMMAND": "am start -a android.settings.SETTINGS", "OPEN_QUICK_SETTINGS_COMMAND": "am start -n com.android.car.settings/com.android.car.settings.common.CarSettingActivity" }, "QUICK_SETTINGS": { "OPEN_MORE_SETTINGS": { "TYPE": "RESOURCE_ID", "VALUE": "toolbar_menu_item_1", "PACKAGE": "com.android.car.settings" }, "NIGHT_MODE": { "TYPE": "TEXT", "VALUE": "Night mode" } }, "DISPLAY": { "PATH": "Settings > Display", "OPTIONS": [ "Brightness level" ], "BRIGHTNESS_LEVEL": { "TYPE": "RESOURCE_ID", "VALUE": "seekbar", "PACKAGE": "com.android.car.settings" } }, "SOUND": { "PATH": "Settings > Sound", "OPTIONS": [ "Media volume", "Alarm volume" ] }, "NETWORK_AND_INTERNET": { "PATH": "Settings > Network & internet", "OPTIONS": [ ], "TOGGLE_WIFI": { "TYPE": "RESOURCE_ID", "VALUE": "master_switch", "PACKAGE": "com.android.car.settings" } }, "BLUETOOTH": { "PATH": "Settings > Bluetooth", "OPTIONS": [ ], "TOGGLE_BLUETOOTH": { "TYPE": "RESOURCE_ID", "VALUE": "car_ui_toolbar_menu_item_switch", "PACKAGE": "com.android.car.settings" } }, "APPS_AND_NOTIFICATIONS": { "PATH": "Settings > Apps & notifications", "OPTIONS": [ ], "SHOW_ALL_APPS": { "TYPE": "TEXT", "VALUE": "Show all apps" }, "ENABLE_DISABLE_BUTTON": { "TYPE": "RESOURCE_ID", "VALUE": "car_ui_toolbar_menu_item_text", "PACKAGE": "com.android.car.settings" }, "DISABLE_BUTTON_TEXT": { "TYPE": "TEXT", "VALUE": "Disable" }, "ENABLE_BUTTON_TEXT": { "TYPE": "TEXT", "VALUE": "Enable" }, "DISABLE_APP_BUTTON": { "TYPE": "TEXT", "VALUE": "DISABLE APP" }, "FORCE_STOP_BUTTON": { "TYPE": "TEXT", "VALUE": "Force stop" }, "OK_BUTTON": { "TYPE": "TEXT", "VALUE": "OK" }, "PERMISSIONS_MENU": { "TYPE": "TEXT", "VALUE": "Permissions" }, "ALLOW_BUTTON": { "TYPE": "TEXT", "VALUE": "Allow" }, "DENY_BUTTON": { "TYPE": "TEXT", "VALUE": "Deny" }, "DENY_ANYWAY_BUTTON": { "TYPE": "TEXT", "VALUE": "Deny anyway" } }, "DATE_AND_TIME": { "PATH": "Settings > Date & time", "OPTIONS": [ "Automatic date & time", "Automatic time zone" ], "AUTOMATIC_DATE_AND_TIME": { "TYPE": "TEXT", "VALUE": "Automatic date & time" }, "AUTOMATIC_TIME_ZONE": { "TYPE": "TEXT", "VALUE": "Automatic time zone" }, "SET_DATE": { "TYPE": "TEXT", "VALUE": "Set date" }, "SET_TIME": { "TYPE": "TEXT", "VALUE": "Set time" }, "SELECT_TIME_ZONE": { "TYPE": "TEXT", "VALUE": "Select time zone" }, "USE_24_HOUR_FORMAT": { "TYPE": "TEXT", "VALUE": "Use 24-hour format" }, "OK_BUTTON": { "TYPE": "RESOURCE_ID", "VALUE": "toolbar_menu_item_0", "PACKAGE": "com.android.car.settings" }, "NUMBER_PICKER_WIDGET": { "TYPE": "CLASS", "VALUE": "android.widget.NumberPicker" }, "EDIT_TEXT_WIDGET": { "TYPE": "CLASS", "VALUE": "android.widget.EditText" } }, "USERS": { "PATH": "Settings > Users", "OPTIONS": [ "Guest" ] }, "ACCOUNTS": { "PATH": "Settings > Accounts", "OPTIONS": [ "Automatically sync data" ], "ADD_ACCOUNT": { "TYPE": "TEXT", "VALUE": "ADD ACCOUNT" }, "ADD_GOOGLE_ACCOUNT": { "TYPE": "TEXT", "VALUE": "Google" }, "SIGN_IN_ON_CAR_SCREEN": { "TYPE": "TEXT", "VALUE": "Sign in on car screen" }, "GOOGLE_SIGN_IN_SCREEN": { "TYPE": "TEXT", "VALUE": "Sign in to your Google Account" }, "ENTER_EMAIL": { "TYPE": "CLASS", "VALUE": "android.widget.EditText" }, "ENTER_PASSWORD": { "TYPE": "CLASS", "VALUE": "android.widget.EditText" }, "NEXT_BUTTON": { "TYPE": "TEXT", "VALUE": "Next" }, "DONE_BUTTON": { "TYPE": "TEXT", "VALUE": "Done" }, "REMOVE_BUTTON": { "TYPE": "TEXT", "VALUE": "Remove" }, "REMOVE_ACCOUNT_BUTTON": { "TYPE": "TEXT", "VALUE": "Remove Account" } }, "SYSTEM": { "PATH": "Settings > System", "OPTIONS": [ "About", "Legal information" ], "ABOUT_MENU": { "TYPE": "TEXT", "VALUE": "About" }, "RESET_OPTIONS_MENU": { "TYPE": "TEXT", "VALUE": "Reset options" }, "LANGUAGES_AND_INPUT_MENU": { "TYPE": "TEXT", "VALUE": "Languages & input" }, "DEVICE_MODEL": { "TYPE": "TEXT", "VALUE": "Model" }, "ANDROID_VERSION": { "TYPE": "TEXT", "VALUE": "Android version" }, "ANDROID_SECURITY_PATCH_LEVEL": { "TYPE": "TEXT", "VALUE": "Android security patch level" }, "KERNEL_VERSION": { "TYPE": "TEXT", "VALUE": "Kernel version" }, "BUILD_NUMBER": { "TYPE": "TEXT", "VALUE": "Build number" }, "RECYCLER_VIEW_WIDGET": { "TYPE": "CLASS", "VALUE": "androidx.recyclerview.widget.RecyclerView" }, "RESET_NETWORK": { "TYPE": "TEXT", "VALUE": "Reset network" }, "RESET_SETTINGS": { "TYPE": "TEXT", "VALUE": "RESET SETTINGS" }, "RESET_APP_PREFERENCES": { "TYPE": "TEXT", "VALUE": "Reset app preferences" }, "RESET_APPS": { "TYPE": "TEXT", "VALUE": "RESET APPS" }, "LANGUAGES_MENU": { "TYPE": "TEXT", "VALUE": "Languages" }, "LANGUAGES_MENU_IN_SELECTED_LANGUAGE": { "TYPE": "TEXT", "VALUE": "Idiomas" } }, "SECURITY": { "PATH": "Settings > Security", "OPTIONS": [ ], "TITLE": { "TYPE": "RESOURCE_ID", "VALUE": "car_ui_toolbar_title", "PACKAGE": "com.android.car.settings.googlecarui.rro" }, "CHOOSE_LOCK_TYPE": { "TYPE": "TEXT", "VALUE": "Choose a lock type" }, "LOCK_TYPE_PASSWORD": { "TYPE": "TEXT", "VALUE": "Password" }, "LOCK_TYPE_PIN": { "TYPE": "TEXT", "VALUE": "PIN" }, "LOCK_TYPE_NONE": { "TYPE": "TEXT", "VALUE": "None" }, "CONTINUE_BUTTON": { "TYPE": "TEXT", "VALUE": "Continue" }, "CONFIRM_BUTTON": { "TYPE": "TEXT", "VALUE": "Confirm" }, "ENTER_PASSWORD": { "TYPE": "CLASS", "VALUE": "android.widget.EditText" }, "PIN_PAD": { "TYPE": "RESOURCE_ID", "VALUE": "pin_pad", "PACKAGE": "com.android.car.settings" }, "ENTER_PIN_BUTTON": { "TYPE": "RESOURCE_ID", "VALUE": "key_enter", "PACKAGE": "com.android.car.settings" }, "REMOVE_BUTTON": { "TYPE": "TEXT", "VALUE": "Remove" } } }, "PHONE": { "APPLICATION_CONFIG": { "DIAL_PACKAGE": "com.android.car.dialer", "PHONE_ACTIVITY": "com.android.car.dialer/.ui.TelecomActivity", "OPEN_DIAL_PAD_COMMAND": "am start -a android.intent.action.DIAL" }, "IN_CALL_VIEW": { "DIALED_CONTACT_TITLE": { "TYPE": "RESOURCE_ID", "VALUE": "user_profile_title", "PACKAGE": "com.android.car.dialer" }, "DIALED_CONTACT_NUMBER": { "TYPE": "RESOURCE_ID", "VALUE": "user_profile_phone_number", "PACKAGE": "com.android.car.dialer" }, "END_CALL": { "TYPE": "RESOURCE_ID", "VALUE": "end_call_button", "PACKAGE": "com.android.car.dialer" }, "MUTE_CALL": { "TYPE": "RESOURCE_ID", "VALUE": "mute_button", "PACKAGE": "com.android.car.dialer" }, "SWITCH_TO_DIAL_PAD": { "TYPE": "RESOURCE_ID", "VALUE": "toggle_dialpad_button", "PACKAGE": "com.android.car.dialer" }, "CHANGE_VOICE_CHANNEL": { "TYPE": "RESOURCE_ID", "VALUE": "voice_channel_view", "PACKAGE": "com.android.car.dialer" }, "VOICE_CHANNEL_CAR": { "TYPE": "TEXT", "VALUE": "Car speakers" }, "VOICE_CHANNEL_PHONE": { "TYPE": "TEXT", "VALUE": "Phone" } }, "DIAL_PAD_VIEW": { "DIAL_PAD_MENU": { "TYPE": "TEXT", "VALUE": "Dial Pad" }, "DIAL_PAD_FRAGMENT": { "TYPE": "RESOURCE_ID", "VALUE": "dialpad_fragment", "PACKAGE": "com.android.car.dialer" }, "DIALED_NUMBER": { "TYPE": "RESOURCE_ID", "VALUE": "title", "PACKAGE": "com.android.car.dialer" }, "MAKE_CALL": { "TYPE": "RESOURCE_ID", "VALUE": "call_button", "PACKAGE": "com.android.car.dialer" }, "DELETE_NUMBER": { "TYPE": "RESOURCE_ID", "VALUE": "delete_button", "PACKAGE": "com.android.car.dialer" } }, "CONTACTS_VIEW": { "CONTACTS_MENU": { "TYPE": "TEXT", "VALUE": "Contacts" }, "CONTACT_INFO": { "TYPE": "RESOURCE_ID", "VALUE": "call_action_id", "PACKAGE": "com.android.car.dialer" }, "CONTACT_NAME": { "TYPE": "RESOURCE_ID", "VALUE": "title", "PACKAGE": "com.android.car.dialer" }, "CONTACT_DETAIL": { "TYPE": "RESOURCE_ID", "VALUE": "show_contact_detail_id", "PACKAGE": "com.android.car.dialer" }, "ADD_CONTACT_TO_FAVORITE": { "TYPE": "RESOURCE_ID", "VALUE": "contact_details_favorite_button", "PACKAGE": "com.android.car.dialer" }, "SEARCH_CONTACT": { "TYPE": "RESOURCE_ID", "VALUE": "menu_item_search", "PACKAGE": "com.android.car.dialer" }, "CONTACT_SEARCH_BAR": { "TYPE": "RESOURCE_ID", "VALUE": "car_ui_toolbar_search_bar", "PACKAGE": "com.android.car.dialer" }, "SEARCH_RESULT": { "TYPE": "RESOURCE_ID", "VALUE": "contact_name", "PACKAGE": "com.android.car.dialer" }, "CONTACT_SETTINGS": { "TYPE": "RESOURCE_ID", "VALUE": "menu_item_setting", "PACKAGE": "com.android.car.dialer" }, "CONTACT_ORDER": { "TYPE": "TEXT", "VALUE": "Contact order" }, "SORT_BY_FIRST_NAME": { "TYPE": "TEXT", "VALUE": "First name" }, "SORT_BY_LAST_NAME": { "TYPE": "TEXT", "VALUE": "Last Name" }, "CONTACT_TYPE_WORK": { "TYPE": "TEXT", "VALUE": "Work" }, "CONTACT_TYPE_MOBILE": { "TYPE": "TEXT", "VALUE": "Mobile" }, "CONTACT_TYPE_HOME": { "TYPE": "TEXT", "VALUE": "Home" } }, "CALL_HISTORY_VIEW": { "CALL_HISTORY_MENU": { "TYPE": "TEXT", "VALUE": "Recents" }, "CALL_HISTORY_INFO": { "TYPE": "RESOURCE_ID", "VALUE": "call_action_id", "PACKAGE": "com.android.car.dialer" } }, "FAVORITES_VIEW": { "FAVORITES_MENU": { "TYPE": "TEXT", "VALUE": "Favorites" } } }, "NOTIFICATIONS": { "APPLICATION_CONFIG": { "OPEN_NOTIFICATIONS_COMMAND": "service call statusbar 1" }, "EXPANDED_NOTIFICATIONS_SCREEN": { "NOTIFICATION_VIEW": { "TYPE": "RESOURCE_ID", "VALUE": "notification_view", "PACKAGE": "com.android.systemui" }, "CLEAR_ALL_BUTTON": { "TYPE": "RESOURCE_ID", "VALUE": "clear_all_button", "PACKAGE": "com.android.systemui" }, "STATUS_BAR": { "TYPE": "RESOURCE_ID", "VALUE": "car_top_navigation_bar_container", "PACKAGE": "com.android.systemui" }, "APP_ICON": { "TYPE": "RESOURCE_ID", "VALUE": "app_icon", "PACKAGE": "com.android.systemui" }, "APP_NAME": { "TYPE": "RESOURCE_ID", "VALUE": "header_text", "PACKAGE": "com.android.systemui" }, "NOTIFICATION_TITLE": { "TYPE": "RESOURCE_ID", "VALUE": "notification_body_title", "PACKAGE": "com.android.systemui" }, "NOTIFICATION_BODY": { "TYPE": "RESOURCE_ID", "VALUE": "notification_body_content", "PACKAGE": "com.android.systemui" }, "CARD_VIEW": { "TYPE": "RESOURCE_ID", "VALUE": "card_view", "PACKAGE": "com.android.systemui" } } }, "MEDIA_CENTER": { "APPLICATION_CONFIG": { "MEDIA_CENTER_PACKAGE": "com.android.car.media", "MEDIA_ACTIVITY": "com.android.bluetooth/com.android.bluetooth.avrcpcontroller.BluetoothMediaBrowserService" }, "MEDIA_CENTER_SCREEN": { "PLAY_PAUSE_BUTTON": { "TYPE": "RESOURCE_ID", "VALUE": "play_pause_stop", "PACKAGE": "com.android.car.media" }, "NEXT_BUTTON": { "TYPE": "RESOURCE_ID", "VALUE": "skip_next", "PACKAGE": "com.android.car.media" }, "PREVIOUS_BUTTON": { "TYPE": "RESOURCE_ID", "VALUE": "skip_prev", "PACKAGE": "com.android.car.media" }, "SHUFFLE_BUTTON": { "TYPE": "RESOURCE_ID", "VALUE": "overflow_on", "PACKAGE": "com.android.car.media" }, "PLAY_QUEUE_BUTTON": { "TYPE": "RESOURCE_ID", "VALUE": "play_queue", "PACKAGE": "com.android.car.media" }, "MINIMIZED_MEDIA_CONTROLS": { "TYPE": "RESOURCE_ID", "VALUE": "minimized_playback_controls", "PACKAGE": "com.android.car.media" }, "TRACK_NAME": { "TYPE": "RESOURCE_ID", "VALUE": "title", "PACKAGE": "com.android.car.media" }, "TRACK_NAME_MINIMIZED_CONTROL": { "TYPE": "RESOURCE_ID", "VALUE": "minimized_control_bar_title", "PACKAGE": "com.android.car.media" }, "BACK_BUTTON": { "TYPE": "DESCRIPTION", "VALUE": "Back" } }, "MEDIA_CENTER_ON_HOME_SCREEN": { "PLAY_PAUSE_BUTTON": { "TYPE": "RESOURCE_ID", "VALUE": "play_pause_stop", "PACKAGE": "com.android.car.carlauncher" }, "NEXT_BUTTON": { "TYPE": "RESOURCE_ID", "VALUE": "skip_next", "PACKAGE": "com.android.car.carlauncher" }, "PREVIOUS_BUTTON": { "TYPE": "RESOURCE_ID", "VALUE": "skip_prev", "PACKAGE": "com.android.car.carlauncher" }, "TRACK_NAME": { "TYPE": "RESOURCE_ID", "VALUE": "title", "PACKAGE": "com.android.car.carlauncher" } } } }
বিকল্প ডিভাইস কনফিগারেশন
নিম্নলিখিত কোড নমুনা JSON কনফিগারেশন ফাইলের একটি উদাহরণ দেখায় যেখানে ডিফল্ট সেটিংস DUT এর সেটিংস দ্বারা ওভাররাইড করা হয়। এই উদাহরণে:
ইন্টারনেট সেটিংসের নাম দেওয়া হয়েছে নেটওয়ার্ক এবং রেফারেন্স ডিভাইসে ইন্টারনেট এবং DUT-তে সংযোগ ।
তারিখ এবং সময় সেটিংস রেফারেন্স ডিভাইসের জন্য সেটিংস > তারিখ এবং সময় এবং সেটিংস > সিস্টেম > DUT-এর জন্য তারিখ ও সময় পাওয়া যায়।
// Default configuration file
{
....
"SECURITY_SETTINGS_SCROLL_ELEMENT": {
"TYPE": "RESOURCE_ID",
"VALUE": "fragment_container",
},
....
}
// JSON configuration file for non-reference device
{
....
"SECURITY_SETTINGS_SCROLL_ELEMENT": {
"TYPE": "RESOURCE_ID",
"VALUE": "car_ui_recycler_view"
},
....
}
JSON কনফিগারেশন ফাইলটি প্রস্তুত হলে, এটি নিম্নলিখিত কোড ব্লকে দেখানো হিসাবে রানটাইমে প্রদান করা হয়:
# Push The JSON configuration file to the device
adb -s DEVICE-SERIAL push PATH-OF-JSON-FILE /data/local/tmp/runtimeSpectatioConfig.json
এই আদেশে:
DEVICE-SERIAL : DUT-এর সিরিয়াল আইডি। শুধুমাত্র একটি ডিভাইস হোস্টের সাথে সংযুক্ত থাকলে এই প্যারামিটারের প্রয়োজন হয় না।
PATH-TO-JSON-FILE : হোস্ট মেশিনে JSON ফাইলের পাথ।
কনফিগারেশন বিন্যাস
নিম্নলিখিত কী এবং মান সহ কনফিগারেশনে পাঁচটি শীর্ষ-স্তরের বস্তু রয়েছে:
অবজেক্ট | বর্ণনা |
---|---|
PACKAGES | বিভিন্ন অ্যাপের প্রধান প্যাকেজ বর্ণনা করে এমন একটি বস্তু, যা সেই অ্যাপটি কখন অগ্রভাগে থাকে তা নির্ধারণ করতে ব্যবহৃত হয়। |
ACTIONS | বিভিন্ন ক্রিয়াকলাপের ধরন এবং পরামিতি নির্দেশ করে এমন একটি বস্তু। উদাহরণস্বরূপ, স্ক্রোল করার জন্য বোতাম বা অঙ্গভঙ্গি ব্যবহার করবেন কিনা। |
COMMANDS | একটি বস্তু নির্দেশ করে যা বিভিন্ন ক্রিয়া সম্পাদন করে। |
UI_ELEMENTS | UI অটোমেটর `BySelectors` নির্মাণ করতে ব্যবহৃত একটি বস্তু যা UI উপাদান নির্বাচন করে (নীচে বিস্তারিত বর্ণনা করা হয়েছে)। |
WORKFLOWS | কর্মের ক্রম যা উচ্চ-স্তরের কাজগুলি সম্পন্ন করে (নীচে বিশদে বর্ণনা করা হয়েছে)। |
UI উপাদান
প্রতিটি UI উপাদানের একটি TYPE
থাকে যা নির্দিষ্ট করে যে UI অটোমেটর উপাদানটি সনাক্ত করতে কী সন্ধান করবে (যেমন রিসোর্স আইডি, পাঠ্য এবং বিবরণ) এবং সেই ধরণের সাথে সম্পর্কিত কনফিগারেশন মানগুলি। সাধারণভাবে, যখনই একজন সাহায্যকারী এই কনফিগারেশনটি ব্যবহার করে স্ক্রিনে একটি উপাদান সনাক্ত করে, তখন এটি ঠিক একটি উপাদান পায়। যদি একাধিক উপাদান কনফিগারেশনের সাথে মেলে তবে পরীক্ষায় একটি নির্বিচারে ব্যবহার করা হয়। অতএব, কনফিগারেশনটি (সাধারণত) বিশেষভাবে যথেষ্ট পরিমাণে লেখা উচিত যাতে এটি প্রাসঙ্গিক প্রসঙ্গে একটি উপাদানে সংকুচিত হয়।
টেক্সট
এটি হল সবচেয়ে সহজ UI উপাদানের ধরন। UI উপাদানটি এর পাঠ্য দ্বারা চিহ্নিত করা হয় এবং একটি সঠিক মিল প্রয়োজন৷
"CALL_HISTORY_MENU": {
"TYPE": "TEXT",
"VALUE": "Recents"
}
TEXT_CONTAINS
TEXT
এর মতোই, শুধুমাত্র নির্দিষ্ট VALUE
উপাদানটির পাঠ্যের সাথে মিলিত হওয়ার জন্য কোথাও উপস্থিত হওয়া প্রয়োজন।
"PRIVACY_CALENDAR": {
"TYPE": "TEXT_CONTAINS",
"VALUE": "Calendar"
}
বর্ণনা
উপাদানটিকে এর বিষয়বস্তু বর্ণনা বৈশিষ্ট্য দ্বারা চিহ্নিত করুন, একটি সঠিক মিল প্রয়োজন।
"APP_GRID_SCROLL_BACKWARD_BUTTON": {
"TYPE": "DESCRIPTION",
"VALUE": "Scroll up"
}
RESOURCE_ID
উপাদানটিকে তার রিসোর্স আইডি দ্বারা চিহ্নিত করুন, ঐচ্ছিকভাবে সেই আইডির প্যাকেজ উপাদানটিও পরীক্ষা করে। PACKAGE
কী ঐচ্ছিক; যদি বাদ দেওয়া হয়, যে কোনো প্যাকেজ মিলবে, এবং শুধুমাত্র নিম্নলিখিত আইডির অংশ :id/
বিবেচনা করা হবে।
"APP_LIST_SCROLL_ELEMENT": {
"TYPE": "RESOURCE_ID",
"VALUE": "apps_grid",
"PACKAGE": "com.android.car.carlauncher"
}
ক্লিকযোগ্য, স্ক্রলযোগ্য
এটি ক্লিকযোগ্য বা স্ক্রোলযোগ্য কিনা তার উপর ভিত্তি করে উপাদানটি সনাক্ত করুন। এগুলি খুবই বিস্তৃত উপাদানের ধরন, এবং সাধারণত অন্য উপাদানের ধরনকে সংকুচিত করতে সাহায্য করার জন্য শুধুমাত্র একটি MULTIPLE
ব্যবহার করা উচিত। FLAG
কী ঐচ্ছিক, এবং ডিফল্ট থেকে true
।
"SAMPLE_ELEMENT": {
"TYPE": "CLICKABLE",
"FLAG": false
}
ক্লাস
এর ক্লাসের উপর ভিত্তি করে উপাদানটি সনাক্ত করুন।
"SECURITY_SETTINGS_ENTER_PASSWORD": {
"TYPE": "CLASS",
"VALUE": "android.widget.EditText"
}
HAS_ANCESTOR
এর পূর্বপুরুষদের উইজেট অনুক্রমটি দেখে উপাদানটিকে সনাক্ত করুন। ANCESTOR
কী একটি বস্তু ধারণ করে যা পূর্বপুরুষকে সনাক্ত করে। DEPTH
কী নির্দেশ করে যে অনুক্রমটি কতটা উপরে দেখতে হবে। DEPTH
ঐচ্ছিক এবং একটি ডিফল্ট মান 1
।
"SAMPLE_ELEMENT": {
"TYPE": "HAS_ANCESTOR",
"DEPTH": 2,
"ANCESTOR": {
"TYPE": "CLASS",
"VALUE": "android.view.ViewGroup"
}
}
HAS_DESCENDANT
উপাদানটিকে তার সন্তানদের অনুক্রমটি নিচে দেখে শনাক্ত করুন। DESCENDANT
কী এমন একটি বস্তু ধারণ করে যা শিশুর সন্ধান করতে নির্দিষ্ট করে। DEPTH
কী নির্দেশ করে যে অনুক্রমটি কতটা উপরে দেখতে হবে। DEPTH
ঐচ্ছিক এবং একটি ডিফল্ট মান 1
।
"SAMPLE_ELEMENT": {
"TYPE": "HAS_DESCENDANT",
"DEPTH": 2,
"DESCENDANT": {
"TYPE": "CLASS",
"VALUE": "android.view.ViewGroup"
}
}
একাধিক
একাধিক যুগপত অবস্থার উপর ভিত্তি করে উপাদানটি সনাক্ত করুন, যার সবকটি অবশ্যই পূরণ করতে হবে।
"APP_INFO_SETTINGS_PERMISSION_MANAGER": {
"TYPE": "MULTIPLE",
"SPECIFIERS": [
{
"TYPE": "CLASS",
"VALUE": "android.widget.RelativeLayout"
},
{
"TYPE": "HAS_DESCENDANT",
"MAX_DEPTH": 2,
"DESCENDANT": {
"TYPE": "TEXT",
"VALUE": "Permission manager"
}
}
]
}
এই উদাহরণে, কনফিগারেশনটি একটি RelativeLayout
চিহ্নিত করে যেটির depth 2
-এ একটি বংশধর রয়েছে, যার পাঠ্য Permission manager
রয়েছে।
কর্মপ্রবাহ
একটি ওয়ার্কফ্লো একটি নির্দিষ্ট কাজ সম্পন্ন করতে ব্যবহৃত ক্রিয়াগুলির একটি ক্রম প্রতিনিধিত্ব করে, যা ডিভাইসের প্রকার থেকে ডিভাইসের প্রকারে যথেষ্ট আলাদা হতে পারে এবং কোডের তুলনায় কনফিগারেশনে উপস্থাপন করার জন্য আরও নমনীয়।
"WORKFLOWS": {
"OPEN_SOUND_SETTINGS_WORKFLOW": [
{
"NAME": "Go to Home",
"TYPE": "PRESS",
"CONFIG": {
"TEXT": "HOME"
}
},
{
"NAME": "Open Settings",
"TYPE": "COMMAND",
"CONFIG": {
"TEXT": "am start -a android.settings.SETTINGS"
}
},
{
"NAME": "Open Sound Settings",
"TYPE": "SCROLL_TO_FIND_AND_CLICK",
"CONFIG": {
"UI_ELEMENT": {
"TYPE": "TEXT",
"VALUE": "Sound"
}
},
"SCROLL_CONFIG": {
"SCROLL_ACTION": "USE_GESTURE",
"SCROLL_DIRECTION": "VERTICAL",
"SCROLL_ELEMENT": {
"TYPE": "RESOURCE_ID",
"VALUE": "car_ui_recycler_view"
}
}
}
]
}
প্রতিটি ওয়ার্কফ্লো হল একটি কী-মান পেয়ার যেখানে কী হল ওয়ার্কফ্লোয়ের নাম এবং মান হল কর্ম সম্পাদনের একটি অ্যারে৷ প্রতিটি কর্মের একটি NAME
, একটি TYPE
, (সাধারণত) একটি CONFIG
এবং (কখনও কখনও) একটি SWIPE_CONFIG
বা SCROLL_CONFIG
থাকে। বেশিরভাগ TYPE-এর জন্য, CONFIG
হল একটি UI_ELEMENT
কী সহ একটি বস্তু যার মান একটি UI এলিমেন্ট এন্ট্রির মতো একই রূপ নেয় (উপরে দেখুন)। এই প্রকারগুলি হল:
প্রেস করুন LONG_PRESS ক্লিক করুন LONG_CLICK CLICK_IF_EXIST | HAS_UI_ELEMENT_IN_FOREGROUND SCROLL_TO_FIND_AND_CLICK করুন SCROLL_TO_FIND_AND_CLICK_IF_EXIST SWIPE_TO_FIND_AND_CLICK SWIPE_TO_FIND_AND_CLICK_IF_EXIST |
অন্যান্য প্রকারের জন্য, কনফিগারেশনের বিবরণ হল:
অবজেক্ট | বর্ণনা |
---|---|
COMMAND | একটি TEXT মান সহ একটি অবজেক্ট যাতে এক্সিকিউট করার কমান্ড থাকে। |
HAS_PACKAGE_IN_FOREGROUND | প্যাকেজ ধারণকারী একটি TEXT মান সহ একটি বস্তু৷ |
SWIPE | একটি SWIPE অ্যাকশনের জন্য CONFIG key বাদ দিন। এটি শুধুমাত্র SWIPE_CONFIG ব্যবহার করে |
WAIT_MS | অপেক্ষা করার জন্য মিলিসেকেন্ডের সংখ্যা ধারণকারী একটি TEXT মান সহ একটি বস্তু৷ |
স্ক্রোল- এবং সোয়াইপ-সম্পর্কিত ক্রিয়াগুলির জন্য অতিরিক্ত কনফিগারেশন প্রয়োজন, নিম্নরূপ:
SCROLL_CONFIG
অবজেক্ট | বর্ণনা |
---|---|
SCROLL_ACTION | হয় USE_GESTURE বা USE_BUTTON |
SCROLL_DIRECTION | হয় HORIZONTAL বা VERTICAL |
SCROLL_ELEMENT | UI এলিমেন্ট কনফিগারেশনের মতো একই ফর্ম ব্যবহার করে স্ক্রোল করার জন্য কন্টেইনারকে নির্দেশ করে এমন একটি বস্তু (উপরে দেখুন)। |
SCROLL_FORWARD , SCROLL_BACKWARD | ফরোয়ার্ড এবং ব্যাকওয়ার্ড স্ক্রোল বোতাম ( SCROLL_ACTION USE_BUTTON হলে প্রয়োজনীয়)। |
SCROLL_MARGIN | যদি SCROLL_ACTION হয় USE_GESTURE , ড্র্যাগটি শুরু এবং বন্ধ করার জন্য কন্টেইনারের প্রান্ত থেকে দূরত্ব যা স্ক্রোলটি সম্পাদন করতে ব্যবহৃত হবে ( ঐচ্ছিক, ডিফল্ট = 10)। |
SCROLL_WAIT_TIME | যদি SCROLL_ACTION হয় USE_GESTURE , ক্লিক করার জন্য একটি বস্তু অনুসন্ধান করার সময় স্ক্রোল অঙ্গভঙ্গির মধ্যে অপেক্ষা করার সময় মিলিসেকেন্ডে। ( ঐচ্ছিক, ডিফল্ট = 1)। |
SWIPE_CONFIG
অবজেক্ট | বর্ণনা |
---|---|
SWIPE_DIRECTION | হয় TOP_TO_BOTTOM , BOTTOM_TO_TOP , LEFT_TO_RIGHT , অথবা RIGHT_TO_LEFT |
SWIPE_FRACTION | নিম্নলিখিতগুলির মধ্যে একটি :
|
NUMBER_OF_STEPS | সোয়াইপ করার জন্য ব্যবহৃত ধাপের সংখ্যা। segmentSteps দেখুন। |
নির্মাণ এবং কার্যকর
Spectatio ফ্রেমওয়ার্ক স্বয়ংক্রিয়ভাবে পরীক্ষার APK এর অংশ হিসাবে তৈরি করা হয়েছে। পরীক্ষার APK তৈরি করতে, AOSP কোডবেস অবশ্যই স্থানীয় ওয়ার্কস্টেশনে থাকতে হবে। পরীক্ষার APK তৈরি হওয়ার পরে, ব্যবহারকারীকে অবশ্যই ডিভাইসে APK ইনস্টল করতে হবে এবং পরীক্ষাটি চালাতে হবে।
নিম্নলিখিত কোড নমুনা একটি পরীক্ষা APK এর বিল্ডিং, ইনস্টলেশন এবং সম্পাদন দেখায়।
# Build Test APK make TEST-APK-NAME
# Install Test APK adb -s DEVICE-SERIAL install -r PATH-FOR-BUILT-TEST-APK
# Execute Test with the JSON file adb -s DEVICE-SERIAL shell am instrument -w -r -e debug false -e config-file-path /data/local/tmp/jsonFile.json -e class TEST-PACKAGE.TEST-CLASSNAME TEST-PACKAGE/androidx.test.runner.AndroidJUnitRunner
এই আদেশগুলিতে:
TEST-APK-NAME : যে অ্যাপটি পরীক্ষা করা হবে তার নাম। উদাহরণস্বরূপ,
Android.bp
ফাইলে উল্লিখিত Wi-Fi সেটিংস পরীক্ষা করতে TEST-APK-NAMEAndroidAutomotiveSettingsTests
এ সেট করুন৷ স্বয়ংচালিত পরীক্ষার জন্য APK-এর নাম সংশ্লিষ্টAndroid.bp
ফাইলে পাওয়া যাবে।DEVICE-SERIAL : DUT-এর সিরিয়াল আইডি। শুধুমাত্র একটি ডিভাইস হোস্টের সাথে সংযুক্ত থাকলে এই প্যারামিটারের প্রয়োজন হয় না।
config-file-path
: ঐচ্ছিক পরামিতি যা শুধুমাত্র JSON কনফিগারেশন ফাইলে উল্লেখিত ননডিফল্ট ডিভাইস UI কনফিগারেশন প্রদানের জন্য প্রয়োজন। প্রদান না করা হলে, ফ্রেমওয়ার্ক পরীক্ষা চালানোর জন্য ডিফল্ট মান ব্যবহার করে।PATH-FOR-BUILT-TEST-APK :
make
কমান্ডটি কার্যকর করার সময় যে পাথটি পরীক্ষা APK তৈরি করা হয়।TEST-PACKAGE : টেস্ট প্যাকেজের নাম।
TEST-CLASSNAME : পরীক্ষার ক্লাসের নাম। উদাহরণস্বরূপ, ওয়াইফাই সেটিংস পরীক্ষার জন্য, পরীক্ষার প্যাকেজটি হল
android.platform.tests
এবং পরীক্ষার ক্লাসের নাম হলWifiSettingTest
।
অটোমোটিভ স্নিপেট লাইব্রেরি
অটোমোটিভ স্নিপেট লাইব্রেরি হল Android ওপেন সোর্স প্রজেক্ট (AOSP) এর জন্য Android টেস্ট লাইব্রেরির একটি সেট যা স্বয়ংচালিত অ্যাপ এবং পরিষেবাগুলির সাথে ইন্টারঅ্যাক্ট করার জন্য ডিজাইন করা হয়েছে। এটি একটি হোস্ট (পরীক্ষা) মেশিন থেকে একটি অ্যান্ড্রয়েড-চালিত ডিভাইসে দূরবর্তী পদ্ধতি কল (RPCs) চালানোর জন্য একটি সুবিধাজনক প্রক্রিয়া সহ Spectatio ব্যবহার করে।
শুরু করুন
আপনি শুরু করার আগে, এই বিভাগগুলি পর্যালোচনা করুন।
পূর্বশর্ত
- পাইথন 3.x হোস্ট মেশিনে ইনস্টল করা আছে।
- প্রয়োজনীয় বিল্ড সরঞ্জাম সহ AOSP পরিবেশ সেটআপ।
- অ্যাডবি অ্যাক্সেস সহ একটি অ্যান্ড্রয়েড অটোমোটিভ ডিভাইস (এমুলেটর বা শারীরিক ডিভাইস)।
সংকলন
অটোমোটিভ স্নিপেট লাইব্রেরি প্রদত্ত বিভিন্ন স্নিপেট কম্পাইল করতে, আপনি প্রদত্ত android.bp
ফাইলটি ব্যবহার করতে পারেন। APK কম্পাইল করার জন্য পূর্ববর্তী বিভাগে নিম্নলিখিত কমান্ডগুলি।
স্থাপনা
স্নিপেট লাইব্রেরিগুলি সফলভাবে কম্পাইল করার পরে, পূর্ববর্তী বিভাগে উল্লিখিত adb install
কমান্ড ব্যবহার করে লক্ষ্য ডিভাইসে ফলিত APKগুলি স্থাপন করুন।
পরীক্ষা চালান
স্নিপেট লাইব্রেরিগুলি স্বয়ংচালিত সিস্টেমের সাথে ইন্টারঅ্যাক্ট করার জন্য বেশ কয়েকটি RPC পদ্ধতি প্রকাশ করে। এই পদ্ধতিগুলি হোস্ট মেশিন থেকে মোবলি ফ্রেমওয়ার্কের মাধ্যমে আহ্বান করা যেতে পারে। আপনি Mobly পরীক্ষার পরিবেশ সেট আপ করেছেন বলে ধরে নিন, আপনি একটি ইন্টারেক্টিভ পাইথন শেল খুলতে snippet_shell.py
স্ক্রিপ্ট ব্যবহার করতে পারেন, যেখানে আপনি ডিভাইসে ম্যানুয়ালি RPC পদ্ধতি ব্যবহার করতে পারেন। আমন্ত্রণের উদাহরণ:
python3 snippet_shell.py com.google.android.mobly.snippet.bundled -s <serial>
<serial>
ডিভাইসের সিরিয়াল নম্বর দিয়ে প্রতিস্থাপন করুন, যেটি আপনি adb ডিভাইসের মাধ্যমে পেতে পারেন যদি একাধিক ডিভাইস সংযুক্ত থাকে।
লাইব্রেরি অন্তর্ভুক্ত
অটোমোটিভ স্নিপেট লাইব্রেরিতে নিম্নলিখিত স্নিপেট লাইব্রেরি এবং সাহায্যকারী অন্তর্ভুক্ত রয়েছে:
অটোমোটিভ স্নিপেট: যানবাহন ক্রিয়াকলাপের সাথে সম্পর্কিত API প্রদান করে, যেমন ডায়ালিং, ভলিউম নিয়ন্ত্রণ, গাড়ির হার্ড কী, এবং মিডিয়া সেন্টার ইন্টারঅ্যাকশন।
PhoneSnippet: কল হ্যান্ডলিং, পরিচিতি ব্রাউজিং এবং SMS অপারেশন সহ টেলিফোনি-সম্পর্কিত API প্রদান করে।
অটোমোটিভ স্নিপেট এবং ফোনস্নিপেট কিছু সাধারণ যুক্তি শেয়ার করে। বিশেষত, আপনি একটি স্বয়ংচালিত এবং একটি ফোন ডিভাইস যুক্ত করতে ব্লুটুথ-সম্পর্কিত RCP কলগুলিকে আক্রমণ করতে পারেন। এই bt_discovery_test
দেখায় কিভাবে।
- TEST-CLASSNAME : পরীক্ষার ক্লাসের নাম। উদাহরণস্বরূপ, ওয়াইফাই সেটিংস পরীক্ষার জন্য, পরীক্ষার প্যাকেজটি হল
android.platform.tests
এবং পরীক্ষার ক্লাসের নাম হলWifiSettingTest
।