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

চিত্র ১. স্পেকট্যাটিও ফ্রেমওয়ার্কের উচ্চ-স্তরের নকশা।
UI Automator- এর উপর ভিত্তি করে নির্মিত Spectatio ফ্রেমওয়ার্কটি AAOS-এর ইউজার ও সিস্টেম অ্যাপের সাথে ইন্টারঅ্যাক্ট করে এমন UI টেস্ট তৈরির জন্য একগুচ্ছ API প্রদান করে। অটোমোটিভ টেস্টগুলো পরীক্ষার জন্য Spectatio ফ্রেমওয়ার্ক দ্বারা প্রদত্ত API ব্যবহার করে, যা এই টেস্টগুলোকে পরীক্ষাধীন ডিভাইস (DUT) থেকে স্বাধীন করে তোলে এবং সমর্থিত হলে বিভিন্ন ডিভাইস পরীক্ষা করার জন্য স্কেলেবল করে।
চিত্র ১ দেখায় যে, স্পেকটেশিও ফ্রেমওয়ার্কটি ডায়ালার, মেডিসেন্টার এবং সেটিংস-এর মতো রেফারেন্স অ্যাপের উপর ভিত্তি করে অ্যাপ-নির্দিষ্ট ইন্টারফেস এবং হেল্পার ব্যবহার করে মডিউলারাইজ করা হয়েছে, যা এটিকে নতুন অ্যাপের জন্য সহজে সম্প্রসারণযোগ্য করে তোলে। স্পেকটেশিও ফ্রেমওয়ার্কটি সাধারণ স্ট্যান্ডার্ড এবং ইউটিলিটি হেল্পার ক্লাসগুলো পুনঃব্যবহার করে। স্ট্যান্ডার্ড হেল্পার ক্লাসটি হলো সমস্ত অ্যাপ হেল্পার ফাংশনের প্যারেন্ট ক্লাস এবং এটি এমন স্ট্যান্ডার্ড ফাংশন সরবরাহ করে যা ডিভাইস-নির্দিষ্ট অথবা বিভিন্ন অ্যাপে প্রযোজ্য। ইউটিলিটি হেল্পার ক্লাসগুলো ডিভাইস থেকে ফাইল পড়া বা লেখার মতো ইউটিলিটি সরবরাহ করে।
স্থাপত্য
UI টেস্ট তৈরির জন্য একগুচ্ছ API সরবরাহ করতে, Spectatio ফ্রেমওয়ার্কটি বিদ্যমান স্ট্যান্ডার্ড হেল্পার ক্লাসকে এক্সটেন্ড করার এবং ইউটিলিটি হেল্পার ক্লাসগুলোকে ইম্পোর্ট করার পাশাপাশি অ্যাপ-নির্দিষ্ট ইন্টারফেস ও হেল্পার ইমপ্লিমেন্ট করে।
চিত্র ২-এ স্পেকটেশিও ফ্রেমওয়ার্কের উচ্চ-স্তরের স্থাপত্য এবং একটি অ্যাপ পরীক্ষা করার জন্য এপিআই বাস্তবায়নে জড়িত সমস্ত উপাদান দেখানো হয়েছে।

চিত্র ২. স্পেকটাটিও ফ্রেমওয়ার্কের উচ্চ-স্তরের স্থাপত্য।
অ্যাপ হেল্পার ইন্টারফেসটি একটি অ্যাপ হেল্পার বাস্তবায়নের জন্য একটি নীলনকশা প্রদান করে। এতে বিভিন্ন হেল্পার ফাংশন থাকে যা অ্যাপ পরীক্ষা করার জন্য প্রয়োজন। প্রতিটি অ্যাপের নিজস্ব ইন্টারফেস থাকে, যেমন IAutoSettingHelper এবং IAutoDialHelper । আরও তথ্যের জন্য এবং ইন্টারফেস ফাংশনগুলির তালিকার জন্য, AOSP-তে অ্যাপ হেল্পার ইন্টারফেস ফাংশনগুলি দেখুন।
স্ট্যান্ডার্ড হেল্পার ক্লাসে এমন সব স্ট্যান্ডার্ড অ্যাট্রিবিউট এবং ফাংশন থাকে যা ডিভাইস সেটআপের জন্য প্রয়োজনীয় কিন্তু কোনো নির্দিষ্ট অ্যাপের জন্য নয়, যেমন pressHome এবং scroll । স্ট্যান্ডার্ড হেল্পার ক্লাসটি AbstractAutoStandardAppHelper.java ফাইলে সংজ্ঞায়িত করা আছে।
ইউটিলিটি হেল্পার ক্লাসগুলো ফ্রেমওয়ার্ক দ্বারা ব্যবহৃত হয়। উদাহরণস্বরূপ, AutoJsonUtility.java হলো একটি ইউটিলিটি ক্লাস যা প্রদত্ত ডিভাইস JSON কনফিগারেশন ফাইলটি লোড করে এবং রানটাইমে ফ্রেমওয়ার্ক কনফিগারেশনগুলো আপডেট করে।
অ্যাপ হেল্পার ইমপ্লিমেন্টেশন মডিউল হলো স্পেকটেশিও ফ্রেমওয়ার্কের মূল অংশ। এতে অ্যাপ হেল্পার ইন্টারফেসে সংজ্ঞায়িত হেল্পার ফাংশনগুলোর ইমপ্লিমেন্টেশন রয়েছে, যা একটি অটোমোটিভ ডিভাইসে অ্যাপ পরীক্ষা করার জন্য প্রয়োজন। প্রতিটি অ্যাপের নিজস্ব ইমপ্লিমেন্টেশন রয়েছে, যেমন SettingHelperImpl এবং DialHelperImpl , যা অ্যাপগুলো পরীক্ষা করার জন্য অটোমোটিভ টেস্ট দ্বারা ব্যবহৃত হয়। আরও তথ্যের জন্য এবং ইমপ্লিমেন্টেশনগুলোর তালিকার জন্য, 'on 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());
}
}
কাস্টমাইজেশন
স্পেকটেশিও ফ্রেমওয়ার্কটি ডিভাইসের UI থেকে স্বাধীন, তাই এটি বিভিন্ন UI এবং হার্ডওয়্যারযুক্ত ডিভাইস পরীক্ষার জন্য স্কেলেবল। এই স্কেলেবিলিটি অর্জনের জন্য, স্পেকটেশিও রেফারেন্স ডিভাইসের উপর ভিত্তি করে ডিফল্ট ডিভাইস কনফিগারেশন ব্যবহার করে। নন-ডিফল্ট ডিভাইস কনফিগারেশন সমর্থন করার জন্য, ফ্রেমওয়ার্কটি রানটাইমে একটি JSON কনফিগারেশন ফাইল ব্যবহার করে ডিভাইসের জন্য কাঙ্ক্ষিত UI পরিবর্তনগুলো সেট করে। একটি JSON কনফিগারেশন ফাইল TEXT , DESCRIPTION , এবং RESOURCE_ID মতো UI এলিমেন্টগুলোকে path সেটিংস সহ সমর্থন করে এবং এতে অবশ্যই শুধুমাত্র 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-এর সেটিংস দ্বারা ওভাররাইড করা হয়। এই উদাহরণে:
রেফারেন্স ডিভাইসগুলিতে ইন্টারনেট সেটিংসের নাম নেটওয়ার্ক ও ইন্টারনেট এবং ডিইউটি-তে কানেক্টিভিটি ।
রেফারেন্স ডিভাইসগুলির জন্য তারিখ ও সময়ের সেটিংস Settings > Date and time- এ এবং DUT-এর জন্য Settings > System > Date and time- এ পাওয়া যায়।
// 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 : ডিইউটি-এর সিরিয়াল আইডি। হোস্টের সাথে কেবল একটি ডিভাইস সংযুক্ত থাকলে এই প্যারামিটারটির প্রয়োজন হয় না।
PATH-TO-JSON-FILE : হোস্ট মেশিনে থাকা JSON ফাইলের পাথ।
কনফিগারেশন ফরম্যাট
কনফিগারেশনে পাঁচটি শীর্ষ-স্তরের অবজেক্ট রয়েছে, যেগুলোর কী এবং ভ্যালুগুলো নিম্নরূপ:
| বস্তু | বর্ণনা |
|---|---|
PACKAGES | বিভিন্ন অ্যাপের প্রধান প্যাকেজ বর্ণনা করে এমন একটি অবজেক্ট, যা দিয়ে নির্ধারণ করা হয় কখন সেই অ্যাপটি ফোরগ্রাউন্ডে রয়েছে। |
ACTIONS | একটি অবজেক্ট যা বিভিন্ন ক্রিয়ার ধরন ও প্যারামিটার নির্দেশ করে। যেমন, স্ক্রল করার জন্য বাটন ব্যবহার করা হবে নাকি জেসচার। |
COMMANDS | এমন একটি অবজেক্ট যা বিভিন্ন কাজ সম্পাদনকারী কমান্ডসমূহ নির্দিষ্ট করে। |
UI_ELEMENTS | `BySelectors` নামক UI অটোমেটর তৈরি করতে ব্যবহৃত একটি অবজেক্ট, যা UI এলিমেন্টসমূহ নির্বাচন করে (নিচে বিস্তারিতভাবে বর্ণনা করা হয়েছে)। |
WORKFLOWS | উচ্চ-স্তরের কাজ সম্পন্নকারী কর্মের ক্রম (যা নিচে বিস্তারিতভাবে বর্ণনা করা হয়েছে)। |
UI উপাদান
প্রতিটি UI এলিমেন্টের একটি TYPE থাকে, যা নির্দিষ্ট করে দেয় যে এলিমেন্টটিকে শনাক্ত করার জন্য UI Automator কী খুঁজবে (যেমন রিসোর্স আইডি, টেক্সট এবং ডেসক্রিপশন) এবং সেই টাইপের সাথে যুক্ত কনফিগারেশন ভ্যালুগুলো কী। সাধারণত, যখনই কোনো হেল্পার এই কনফিগারেশন ব্যবহার করে স্ক্রিনে কোনো এলিমেন্ট শনাক্ত করে, তখন এটি ঠিক একটি এলিমেন্টই পায়। যদি একাধিক এলিমেন্ট কনফিগারেশনের সাথে মিলে যায়, তবে টেস্টের জন্য যেকোনো একটি এলিমেন্ট ব্যবহার করা হয়। তাই, কনফিগারেশনটি (সাধারণত) যথেষ্ট সুনির্দিষ্টভাবে লেখা উচিত, যাতে এটি প্রাসঙ্গিক প্রেক্ষাপটে একটিমাত্র এলিমেন্টে সীমাবদ্ধ থাকে।
পাঠ্য
এটি সবচেয়ে সরল UI এলিমেন্ট টাইপ। UI এলিমেন্টটি তার টেক্সট দ্বারা চিহ্নিত করা হয় এবং এর জন্য একটি হুবহু মিল প্রয়োজন।
"CALL_HISTORY_MENU": {
"TYPE": "TEXT",
"VALUE": "Recents"
}
পাঠ্য_ধারণ করে
TEXT মতোই, তবে পার্থক্য হলো, মেলানোর জন্য নির্দিষ্ট VALUE এলিমেন্টের টেক্সটের মধ্যে শুধু কোনো এক জায়গায় থাকলেই চলবে।
"PRIVACY_CALENDAR": {
"TYPE": "TEXT_CONTAINS",
"VALUE": "Calendar"
}
বর্ণনা
এলিমেন্টটিকে তার কন্টেন্ট ডেসক্রিপশন অ্যাট্রিবিউটের মাধ্যমে শনাক্ত করুন, যার জন্য হুবহু মিল থাকা আবশ্যক।
"APP_GRID_SCROLL_BACKWARD_BUTTON": {
"TYPE": "DESCRIPTION",
"VALUE": "Scroll up"
}
রিসোর্স_আইডি
এলিমেন্টটিকে তার রিসোর্স আইডি দ্বারা শনাক্ত করুন, ঐচ্ছিকভাবে সেই আইডির প্যাকেজ অংশটিও যাচাই করতে পারেন। 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 শনাক্ত করে যার 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 এলিমেন্ট এন্ট্রির (উপরে দেখুন) মতোই গঠন নেয়। সেই TYPE-গুলো হলো:
| প্রেস লং_প্রেস ক্লিক করুন লং_ক্লিক যদি বিদ্যমান থাকে তবে ক্লিক করুন | HAS_UI_ELEMENT_IN_FOREGROUND খুঁজে পেতে স্ক্রোল করুন এবং ক্লিক করুন স্ক্রোল করে খুঁজুন এবং বিদ্যমান থাকলে ক্লিক করুন খুঁজে পেতে ও ক্লিক করতে সোয়াইপ করুন খুঁজে পেতে সোয়াইপ করুন এবং বিদ্যমান থাকলে ক্লিক করুন |
অন্যান্য TYPE-গুলোর জন্য কনফিগারেশনের বিবরণ হলো:
| বস্তু | বর্ণনা |
|---|---|
COMMAND | একটি অবজেক্ট যার TEXT ভ্যালুতে কার্যকর করার জন্য কমান্ডটি থাকে। |
HAS_PACKAGE_IN_FOREGROUND | একটি অবজেক্ট যার TEXT ভ্যালুতে প্যাকেজটি থাকে। |
SWIPE | SWIPE করার জন্য CONFIG key বাদ দিন। এতে শুধু SWIPE_CONFIG ব্যবহৃত হয়। |
WAIT_MS | একটি অবজেক্ট যার TEXT ভ্যালুতে অপেক্ষা করার জন্য মিলিসেকেন্ডের সংখ্যা থাকে। |
স্ক্রল এবং সোয়াইপ-সম্পর্কিত ক্রিয়াকলাপগুলির জন্য নিম্নলিখিতভাবে অতিরিক্ত কনফিগারেশন প্রয়োজন:
স্ক্রোল_কনফিগ
| বস্তু | বর্ণনা |
|---|---|
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 হয়, তাহলে স্ক্রল করার জন্য ব্যবহৃত ড্র্যাগটি শুরু ও শেষ করার জন্য কন্টেইনারের প্রান্ত থেকে দূরত্ব ( ঐচ্ছিক, ডিফল্ট = ১০)। |
SCROLL_WAIT_TIME | যদি SCROLL_ACTION USE_GESTURE হয়, তাহলে ক্লিক করার জন্য কোনো অবজেক্ট খোঁজার সময় স্ক্রল জেসচারগুলোর মধ্যে অপেক্ষার সময় (মিলিসেকেন্ডে)। ( ঐচ্ছিক, ডিফল্ট = ১)। |
সোয়াইপ_কনফিগ
| বস্তু | বর্ণনা |
|---|---|
SWIPE_DIRECTION | হয় TOP_TO_BOTTOM , BOTTOM_TO_TOP , বাম LEFT_TO_RIGHT , অথবা RIGHT_TO_LEFT |
SWIPE_FRACTION | নিম্নলিখিতগুলির মধ্যে একটি :
|
NUMBER_OF_STEPS | সোয়াইপটি সম্পন্ন করতে ব্যবহৃত ধাপের সংখ্যা। segmentSteps দেখুন। |
নির্মাণ ও বাস্তবায়ন
টেস্ট APK-এর অংশ হিসেবে Spectatio ফ্রেমওয়ার্কটি স্বয়ংক্রিয়ভাবে বিল্ড করা হয়। টেস্ট 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ফাইলে নির্দিষ্ট করা ওয়াই-ফাই সেটিংস পরীক্ষা করার জন্য TEST-APK-NAME হিসেবেAndroidAutomotiveSettingsTestsসেট করুন। অটোমোটিভ পরীক্ষার জন্য এপিকে-এর নামটি সংশ্লিষ্ট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।
অটোমোটিভ স্নিপেট লাইব্রেরি
অটোমোটিভ স্নিপেট লাইব্রেরি হলো অ্যান্ড্রয়েড ওপেন সোর্স প্রজেক্ট (AOSP)-এর জন্য তৈরি অ্যান্ড্রয়েড টেস্ট লাইব্রেরির একটি সেট, যা অটোমোটিভ অ্যাপ এবং পরিষেবাগুলির সাথে ইন্টারঅ্যাক্ট করার জন্য ডিজাইন করা হয়েছে। এটি একটি হোস্ট (টেস্ট) মেশিন থেকে অ্যান্ড্রয়েড-চালিত ডিভাইসে রিমোট প্রসিডিউর কল (RPC) কার্যকর করার জন্য একটি সুবিধাজনক পদ্ধতির মাধ্যমে স্পেকটেশিও (Spectatio) ব্যবহার করে।
শুরু করুন
শুরু করার আগে এই বিভাগগুলো পর্যালোচনা করুন।
পূর্বশর্ত
- হোস্ট মেশিনে পাইথন ৩.x ইনস্টল করা আছে।
- প্রয়োজনীয় বিল্ড টুলসহ AOSP এনভায়রনমেন্ট সেটআপ করা হয়েছে।
- adb অ্যাক্সেস সহ একটি অ্যান্ড্রয়েড অটোমোটিভ ডিভাইস (এমুলেটর বা ফিজিক্যাল ডিভাইস)।
সংকলন
অটোমোটিভ স্নিপেট লাইব্রেরি দ্বারা প্রদত্ত বিভিন্ন স্নিপেট কম্পাইল করার জন্য, আপনি প্রদত্ত android.bp ফাইলটি ব্যবহার করতে পারেন। APK কম্পাইল করতে পূর্ববর্তী বিভাগের কমান্ডগুলো অনুসরণ করুন।
মোতায়েন
স্নিপেট লাইব্রেরিগুলো সফলভাবে কম্পাইল করার পর, পূর্ববর্তী বিভাগে উল্লিখিত adb install কমান্ডটি ব্যবহার করে প্রাপ্ত APK ফাইলগুলো টার্গেট ডিভাইসে ডেপ্লয় করুন।
পরীক্ষা চালান
স্নিপেট লাইব্রেরিগুলো অটোমোটিভ সিস্টেমের সাথে ইন্টারঅ্যাক্ট করার জন্য বেশ কিছু RPC মেথড প্রদান করে। এই মেথডগুলো হোস্ট মেশিন থেকে Mobly ফ্রেমওয়ার্কের মাধ্যমে কল করা যায়। ধরে নেওয়া যাক, আপনার Mobly টেস্ট এনভায়রনমেন্ট সেট আপ করা আছে, সেক্ষেত্রে আপনি snippet_shell.py স্ক্রিপ্টটি ব্যবহার করে একটি ইন্টারেক্টিভ পাইথন শেল খুলতে পারেন, যেখানে আপনি ডিভাইসে ম্যানুয়ালি RPC মেথডগুলো কল করতে পারবেন। কল করার উদাহরণ:
python3 snippet_shell.py com.google.android.mobly.snippet.bundled -s <serial>
<serial> জায়গায় ডিভাইসের সিরিয়াল নম্বরটি বসান, যা একাধিক ডিভাইস সংযুক্ত থাকলে adb devices কমান্ডের মাধ্যমে পাওয়া যাবে।
অন্তর্ভুক্ত লাইব্রেরি
অটোমোটিভ স্নিপেট লাইব্রেরিতে নিম্নলিখিত স্নিপেট লাইব্রেরি এবং হেল্পারগুলো অন্তর্ভুক্ত রয়েছে:
AutomotiveSnippet: গাড়ির বিভিন্ন কার্যক্রম, যেমন ডায়ালিং, ভলিউম নিয়ন্ত্রণ, গাড়ির হার্ড কী এবং মিডিয়া সেন্টারের সাথে ইন্টারঅ্যাকশন সম্পর্কিত এপিআই (API) প্রদান করে।
ফোনস্নিপেট: কল হ্যান্ডলিং, কন্ট্যাক্ট ব্রাউজিং এবং এসএমএস অপারেশন সহ টেলিফোনি-সম্পর্কিত এপিআই প্রদান করে।
Automotive স্নিপেট এবং PhoneSnippet-এর মধ্যে কিছু সাধারণ লজিক রয়েছে। বিশেষত, আপনি একটি অটোমোটিভ এবং একটি ফোন ডিভাইস পেয়ার করার জন্য ব্লুটুথ-সম্পর্কিত RCP কলগুলিতে হস্তক্ষেপ করতে পারেন। এই bt_discovery_test দেখায় কীভাবে এটি করতে হয়।
- TEST-CLASSNAME : টেস্ট ক্লাসের নাম। উদাহরণস্বরূপ, ওয়াইফাই সেটিংস টেস্টের জন্য, টেস্ট প্যাকেজটি হলো
android.platform.testsএবং টেস্ট ক্লাসের নাম হলোWifiSettingTest।