स्पेक्टेटियो एक खुला स्रोत परीक्षण ढांचा है जिसे वास्तविक और आभासी उपकरणों पर एंड्रॉइड ऑटोमोटिव ओएस (एएओएस) के परीक्षण के लिए विकसित किया गया है। स्पेक्टेटियो ऑटोमोटिव डिवाइस पर ऐप्स के परीक्षण के लिए एपीआई प्रदान करता है और यह एक विस्तार योग्य और स्केलेबल समाधान है जिसका उपयोग एएओएस और उसके ऐप्स की क्षमता और प्रदर्शन को सत्यापित करने के लिए किया जाता है।
उच्च स्तरीय डिज़ाइन
स्पेक्टेटियो फ्रेमवर्क विभिन्न एएओएस यूआई कार्यान्वयन के लिए अनुकूलनीय और विस्तार योग्य है। इसका उपयोग डिवाइस हार्डवेयर, एमुलेटर और वर्चुअलाइज्ड वातावरण पर AAOS की क्षमता और प्रदर्शन का परीक्षण करने के लिए किया जाता है।
निम्नलिखित चित्र स्पेक्टेटियो ढांचे के उच्च-स्तरीय डिज़ाइन की व्याख्या करता है।
चित्र 1. स्पेक्टेटियो फ्रेमवर्क उच्च स्तरीय डिज़ाइन।
यूआई ऑटोमेटर के शीर्ष पर निर्मित, स्पेक्टेटियो फ्रेमवर्क यूआई परीक्षण बनाने के लिए एपीआई का एक सेट प्रदान करता है जो एएओएस पर उपयोगकर्ता और सिस्टम ऐप्स के साथ इंटरैक्ट करता है। ऑटोमोटिव परीक्षण परीक्षण के लिए स्पेक्टेटियो फ्रेमवर्क द्वारा प्रदान किए गए एपीआई का उपयोग करते हैं, जो इन परीक्षणों को परीक्षण के तहत डिवाइस (डीयूटी) से स्वतंत्र बनाता है और समर्थित होने पर विभिन्न उपकरणों का परीक्षण करने के लिए स्केलेबल बनाता है।
चित्र 1 से पता चलता है कि स्पेक्टेटियो फ्रेमवर्क को ऐप-विशिष्ट इंटरफेस और सहायकों का उपयोग करके डायलर, मेडिसेंटर और सेटिंग्स जैसे संदर्भ ऐप्स के आधार पर मॉड्यूलर किया गया है, जिससे इसे नए ऐप्स के लिए आसानी से विस्तार योग्य बनाया जा सकता है। स्पेक्टेटियो फ्रेमवर्क सामान्य मानक और उपयोगिता सहायक वर्गों का पुन: उपयोग करता है। मानक सहायक वर्ग सभी ऐप सहायक कार्यों के लिए मूल वर्ग है और मानक कार्य प्रदान करता है जो डिवाइस विशिष्ट हैं या सभी ऐप्स पर लागू होते हैं। उपयोगिता सहायक वर्ग डिवाइस से फ़ाइलें पढ़ने या लिखने जैसी उपयोगिताएँ प्रदान करते हैं।
वास्तुकला
यूआई परीक्षण बनाने के लिए एपीआई का एक सेट प्रदान करने के लिए, स्पेक्टेटियो फ्रेमवर्क मौजूदा मानक सहायक वर्ग का विस्तार करते हुए और उपयोगिता सहायक वर्गों को आयात करते हुए ऐप-विशिष्ट इंटरफेस और सहायकों को लागू करता है।
चित्र 2 स्पेक्टेटियो फ्रेमवर्क के उच्च-स्तरीय आर्किटेक्चर और एक ऐप के परीक्षण के लिए एपीआई को लागू करने में शामिल सभी संस्थाओं को दर्शाता है।
चित्र 2. स्पेक्टेटियो फ्रेमवर्क उच्च स्तरीय वास्तुकला।
ऐप हेल्पर इंटरफ़ेस ऐप हेल्पर के कार्यान्वयन के लिए एक खाका प्रदान करता है। इसमें विभिन्न सहायक कार्य शामिल हैं जो ऐप्स का परीक्षण करने के लिए आवश्यक हैं। प्रत्येक ऐप का अपना इंटरफ़ेस होता है, जैसे IAutoSettingHelper
और IAutoDialHelper
। अधिक जानकारी और इंटरफ़ेस फ़ंक्शंस की सूची के लिए, AOSP पर ऐप हेल्पर इंटरफ़ेस फ़ंक्शंस देखें।
मानक सहायक वर्ग में मानक विशेषताएँ और फ़ंक्शन शामिल होते हैं जो डिवाइस सेटअप के लिए आवश्यक होते हैं लेकिन किसी ऐप के लिए विशिष्ट नहीं होते हैं, जैसे कि pressHome
और scroll
। मानक सहायक वर्ग को AbstractAutoStandardAppHelper.java
में परिभाषित किया गया है।
उपयोगिता सहायक वर्गों का उपयोग फ्रेमवर्क द्वारा किया जाता है। उदाहरण के लिए, AutoJsonUtility.java
एक उपयोगिता वर्ग है जो दिए गए डिवाइस JSON कॉन्फ़िगरेशन फ़ाइल को लोड करता है और रनटाइम पर फ्रेमवर्क कॉन्फ़िगरेशन को अपडेट करता है।
ऐप हेल्पर कार्यान्वयन मॉड्यूल स्पेक्टेटियो फ्रेमवर्क का मूल है। इसमें ऐप हेल्पर इंटरफ़ेस में परिभाषित सहायक कार्यों के लिए कार्यान्वयन शामिल है, जो ऑटोमोटिव डिवाइस पर ऐप्स का परीक्षण करने के लिए आवश्यक हैं। प्रत्येक ऐप का अपना कार्यान्वयन होता है, जैसे 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());
}
}
अनुकूलन
स्पेक्टेटियो फ्रेमवर्क डिवाइस यूआई से स्वतंत्र है, इसलिए यह विभिन्न यूआई और हार्डवेयर वाले उपकरणों के परीक्षण के लिए स्केलेबल है। इस स्केलेबिलिटी को प्राप्त करने के लिए, स्पेक्टेटियो संदर्भ डिवाइस के आधार पर डिफ़ॉल्ट डिवाइस कॉन्फ़िगरेशन का उपयोग करता है। गैर-डिफ़ॉल्ट डिवाइस कॉन्फ़िगरेशन का समर्थन करने के लिए, डिवाइस के लिए वांछित यूआई परिवर्तन सेट करने के लिए फ्रेमवर्क रनटाइम पर JSON कॉन्फ़िगरेशन फ़ाइल का उपयोग करता है। एक JSON कॉन्फ़िगरेशन फ़ाइल path
सेटिंग्स के साथ TEXT
, DESCRIPTION
, और RESOURCE_ID
जैसे UI तत्वों का समर्थन करती है और इसमें केवल DUT के लिए 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 | यूआई ऑटोमेटर `बायसेलेक्टर्स` के निर्माण के लिए उपयोग किया जाने वाला एक ऑब्जेक्ट जो यूआई तत्वों का चयन करता है (नीचे विस्तार से वर्णित है)। |
WORKFLOWS | उच्च-स्तरीय कार्यों को पूरा करने वाली क्रियाओं का क्रम (नीचे विस्तार से वर्णित है)। |
यूआई तत्व
प्रत्येक यूआई तत्व में एक TYPE
होता है जो निर्दिष्ट करता है कि यूआई ऑटोमेटर तत्व (जैसे संसाधन आईडी, पाठ और विवरण) और उस प्रकार से जुड़े कॉन्फ़िगरेशन मानों की पहचान करने के लिए क्या देखेगा। सामान्य तौर पर, जब भी कोई सहायक इस कॉन्फ़िगरेशन का उपयोग करके स्क्रीन पर किसी तत्व की पहचान करता है, तो उसे बिल्कुल एक तत्व मिलता है। यदि एकाधिक तत्व कॉन्फ़िगरेशन से मेल खाते हैं, तो परीक्षण में एक मनमाना तत्व का उपयोग किया जाता है। इसलिए, कॉन्फ़िगरेशन को (आम तौर पर) विशेष रूप से इतना लिखा जाना चाहिए कि यह प्रासंगिक संदर्भ में एक तत्व तक सीमित हो जाए।
मूलपाठ
यह सबसे सरल यूआई तत्व प्रकार है। यूआई तत्व की पहचान उसके टेक्स्ट से होती है और इसके सटीक मिलान की आवश्यकता होती है।
"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"
}
संसाधन_आईडी
तत्व को उसकी संसाधन आईडी से पहचानें, वैकल्पिक रूप से उस आईडी के पैकेज घटक की भी जाँच करें। 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
कुंजी में एक ऑब्जेक्ट होता है जो पूर्वज की पहचान करता है। 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
होता है। अधिकांश प्रकारों के लिए, CONFIG
एक UI_ELEMENT
कुंजी वाला एक ऑब्जेक्ट है जिसका मान UI तत्व प्रविष्टि के समान रूप लेता है (ऊपर देखें)। वे प्रकार हैं:
प्रेस देर तक दबाना क्लिक LONG_CLICK CLICK_IF_EXIST | HAS_UI_ELEMENT_IN_FOREGROUND स्क्रॉल_करें_खोजें_और_क्लिक करें 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 | यूआई एलिमेंट कॉन्फ़िगरेशन के समान फॉर्म का उपयोग करके कंटेनर को स्क्रॉल करने का संकेत देने वाली एक वस्तु (ऊपर देखें)। |
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 देखें। |
बनाएं और निष्पादित करें
स्पेक्टेटियो फ्रेमवर्क स्वचालित रूप से परीक्षण एपीके के हिस्से के रूप में बनाया गया है। परीक्षण एपीके बनाने के लिए, एओएसपी कोडबेस को स्थानीय वर्कस्टेशन पर रहना चाहिए। परीक्षण एपीके बनने के बाद, उपयोगकर्ता को डिवाइस पर एपीके इंस्टॉल करना होगा और परीक्षण निष्पादित करना होगा।
निम्नलिखित कोड नमूना एक परीक्षण एपीके के निर्माण, स्थापना और निष्पादन को दर्शाता है।
# 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 कॉन्फ़िगरेशन फ़ाइल में निर्दिष्ट नॉनडिफॉल्ट डिवाइस यूआई कॉन्फ़िगरेशन प्रदान करने के लिए आवश्यक है। यदि प्रदान नहीं किया गया है, तो फ्रेमवर्क परीक्षणों को निष्पादित करने के लिए डिफ़ॉल्ट मानों का उपयोग करता है।PATH-FOR-BUILT-TEST-APK : वह पथ जहां
make
कमांड निष्पादित होने पर टेस्ट एपीके बनाया जाता है।TEST-PACKAGE : परीक्षण पैकेज का नाम.
TEST-CLASSNAME : परीक्षण वर्ग का नाम. उदाहरण के लिए, Wifi सेटिंग्स परीक्षण के लिए, परीक्षण पैकेज
android.platform.tests
है और परीक्षण वर्ग का नामWifiSettingTest
है।
ऑटोमोटिव स्निपेट लाइब्रेरी
ऑटोमोटिव स्निपेट लाइब्रेरी एंड्रॉइड ओपन सोर्स प्रोजेक्ट (एओएसपी) के लिए एंड्रॉइड टेस्ट लाइब्रेरी का एक सेट है जिसे ऑटोमोटिव ऐप्स और सेवाओं के साथ इंटरैक्ट करने के लिए डिज़ाइन किया गया है। यह एक होस्ट (परीक्षण) मशीन से एंड्रॉइड-संचालित डिवाइस पर दूरस्थ प्रक्रिया कॉल (आरपीसी) निष्पादित करने के लिए एक सुविधाजनक तंत्र के साथ स्पेक्टेटियो का लाभ उठाता है।
शुरू हो जाओ
आरंभ करने से पहले, इन अनुभागों की समीक्षा करें.
आवश्यक शर्तें
- होस्ट मशीन पर Python 3.x स्थापित किया गया।
- आवश्यक निर्माण उपकरणों के साथ AOSP पर्यावरण सेटअप।
- एडीबी एक्सेस के साथ एक एंड्रॉइड ऑटोमोटिव डिवाइस (एमुलेटर या भौतिक डिवाइस)।
संकलन
ऑटोमोटिव स्निपेट लाइब्रेरी द्वारा प्रदान किए गए विभिन्न स्निपेट्स को संकलित करने के लिए, आप प्रदान की गई android.bp
फ़ाइल का उपयोग कर सकते हैं। एपीके को संकलित करने के लिए पिछले अनुभाग में दिए गए आदेशों का पालन करें।
तैनाती
स्निपेट लाइब्रेरीज़ को सफलतापूर्वक संकलित करने के बाद, पिछले अनुभाग में उल्लिखित adb install
कमांड का उपयोग करके परिणामी एपीके को लक्ष्य डिवाइस पर तैनात करें।
परीक्षण चलाएँ
स्निपेट लाइब्रेरी ऑटोमोटिव सिस्टम के साथ इंटरैक्ट करने के लिए कई आरपीसी तरीकों को उजागर करती है। इन विधियों को होस्ट मशीन से मोबली फ्रेमवर्क के माध्यम से लागू किया जा सकता है। यह मानते हुए कि आपके पास मोबली परीक्षण वातावरण स्थापित है, आप एक इंटरैक्टिव पायथन शेल खोलने के लिए snippet_shell.py
स्क्रिप्ट का उपयोग कर सकते हैं, जहां आप डिवाइस पर RPC विधियों को मैन्युअल रूप से लागू कर सकते हैं। उदाहरण मंगलाचरण:
python3 snippet_shell.py com.google.android.mobly.snippet.bundled -s <serial>
<serial>
डिवाइस सीरियल नंबर से बदलें, जिसे आप कई डिवाइस कनेक्ट होने पर एडीबी डिवाइस से प्राप्त कर सकते हैं।
पुस्तकालय शामिल हैं
ऑटोमोटिव स्निपेट लाइब्रेरी में निम्नलिखित स्निपेट लाइब्रेरी और सहायक शामिल हैं:
ऑटोमोटिवस्निपेट: वाहन संचालन से संबंधित एपीआई प्रदान करता है, जैसे डायलिंग, वॉल्यूम नियंत्रण, वाहन हार्ड कुंजी और मीडिया सेंटर इंटरैक्शन।
फोनस्निपेट: कॉल हैंडलिंग, संपर्क ब्राउज़िंग और एसएमएस संचालन सहित टेलीफोनी-संबंधित एपीआई प्रदान करता है।
ऑटोमोटिव स्निपेट और फ़ोनस्निपेट कुछ सामान्य तर्क साझा करते हैं। विशेष रूप से, आप ऑटोमोटिव और फोन डिवाइस को जोड़ने के लिए ब्लूटूथ से संबंधित आरसीपी कॉल पर आक्रमण कर सकते हैं। यह bt_discovery_test
दिखाता है कि कैसे।
- TEST-CLASSNAME : परीक्षण वर्ग का नाम. उदाहरण के लिए, Wifi सेटिंग्स परीक्षण के लिए, परीक्षण पैकेज
android.platform.tests
है और परीक्षण वर्ग का नामWifiSettingTest
है।