spectatio एक ओपन सोर्स टेस्ट फ़्रेमवर्क है, जिसे Android की जांच करने के लिए बनाया गया है असल और वर्चुअल डिवाइसों पर Automotive OS (AAOS). spectatio के लिए एपीआई उपलब्ध कराना यह सुविधा, ऑटोमोटिव डिवाइस पर ऐप्लिकेशन की टेस्टिंग कर रही है. इसे बढ़ाया जा सकता है और इसे बड़े पैमाने पर इस्तेमाल किया जा सकता है इसका इस्तेमाल AAOS और इसके ऐप्लिकेशन की क्षमता और परफ़ॉर्मेंस की पुष्टि करने के लिए किया जाता है.
बेहतरीन डिज़ाइन
spectatio के फ़्रेमवर्क को ज़रूरत के मुताबिक बनाया जा सकता है. साथ ही, इसे कई AAOS यूज़र इंटरफ़ेस (यूआई) के लिए बड़ा किया जा सकता है लागू करना. इसका इस्तेमाल एएओएस की क्षमता और परफ़ॉर्मेंस की जांच करने के लिए किया जाता है उपयोगकर्ता, डिवाइस के हार्डवेयर, एम्युलेटर, और वर्चुअलाइज़्ड एनवायरमेंट पर काम करते हैं.
नीचे दिए गए डायग्राम में, स्पेक्टिओ फ़्रेमवर्क के हाई-लेवल डिज़ाइन के बारे में बताया गया है.
पहला डायग्राम. स्पेक्टेशियो फ़्रेमवर्क का हाई-लेवल डिज़ाइन.
यूज़र इंटरफ़ेस (यूआई) Automator पर बना, spectatio फ़्रेमवर्क में एपीआई का सेट उपलब्ध होता है AAOS पर उपयोगकर्ता और सिस्टम ऐप्लिकेशन के साथ इंटरैक्ट करने वाले यूज़र इंटरफ़ेस (यूआई) की जांच करने के लिए. ऑटोमोटिव का सामान टेस्ट, परीक्षण के लिए spectatio फ़्रेमवर्क के ज़रिए दिए गए API का इस्तेमाल करते हैं, जो ये टेस्ट, किसी भी डिवाइस पर टेस्ट (डीयूटी) के तहत किए जा सकते हैं. साथ ही, इन्हें टेस्ट करने के लिए बढ़ाया जा सकता है अगर यह सुविधा काम करती है, तो अलग-अलग डिवाइस पर.
पहली इमेज में दिखाया गया है कि रेफ़रंस के आधार पर स्पेक्टेशियो फ़्रेमवर्क को मॉड्यूलराइज़ किया गया है खास ऐप्लिकेशन का इस्तेमाल करने वाले डायलर, मेडिसेंटर, और सेटिंग जैसे ऐप्लिकेशन इंटरफ़ेस और हेल्पर भी हैं, जिससे इसे नए ऐप्लिकेशन के लिए आसानी से बढ़ाया जा सकता है. द स्पेक्टैटियो फ़्रेमवर्क, सामान्य स्टैंडर्ड और यूटिलिटी हेल्पर क्लास का फिर से इस्तेमाल करता है. स्टैंडर्ड हेल्पर क्लास सभी ऐप्लिकेशन हेल्पर फ़ंक्शन के लिए पैरंट क्लास है और ऐसे स्टैंडर्ड फ़ंक्शन जो किसी डिवाइस के लिए होते हैं या सभी ऐप्लिकेशन पर लागू होते हैं. कॉन्टेंट बनाने उपयोगिता हेल्पर क्लास डिवाइस से फ़ाइलें पढ़ना या लिखना.
भवन निर्माण
यूज़र इंटरफ़ेस (यूआई) टेस्ट बनाने के लिए, एपीआई का सेट उपलब्ध कराने के लिए, spectatio फ़्रेमवर्क को ऐप्लिकेशन के लिए खास तौर पर बनाए गए इंटरफ़ेस और हेल्पर, जो मौजूदा स्टैंडर्ड हेल्पर को बढ़ाएं क्लास और यूटिलिटी हेल्पर क्लास को आयात करना.
इमेज 2 में स्पेक्टेशियो फ़्रेमवर्क के हाई-लेवल आर्किटेक्चर को दिखाया गया है और किसी ऐप्लिकेशन की जांच करने के लिए एपीआई लागू करने में शामिल सभी इकाइयां.
दूसरा डायग्राम. स्पेक्टैटियो फ़्रेमवर्क का हाई-लेवल आर्किटेक्चर.
ऐप्लिकेशन हेल्पर इंटरफ़ेस, एक ब्लूप्रिंट उपलब्ध कराता है.
एक ऐप्लिकेशन हेल्पर है. इसमें कई तरह के हेल्पर फ़ंक्शन शामिल हैं, जिन्हें
इस्तेमाल कर सकते हैं. हर ऐप्लिकेशन का अपना इंटरफ़ेस होता है, जैसे कि IAutoSettingHelper
और IAutoDialHelper
.
इंटरफ़ेस फ़ंक्शन की ज़्यादा जानकारी और एओएसपी पर ऐप्लिकेशन हेल्पर इंटरफ़ेस फ़ंक्शन देखें.
स्टैंडर्ड हेल्पर क्लास में स्टैंडर्ड एट्रिब्यूट और फ़ंक्शन होते हैं
डिवाइस सेटअप के लिए ज़रूरी है, लेकिन किसी ऐप्लिकेशन के लिए खास नहीं है, जैसे कि pressHome
और scroll
. स्टैंडर्ड हेल्पर क्लास की जानकारी AbstractAutoStandardAppHelper.java
में दी गई है.
यूटिलिटी हेल्पर क्लास का इस्तेमाल, फ़्रेमवर्क में किया जाता है. इसके लिए
उदाहरण के लिए, AutoJsonUtility.java
यूटिलिटी क्लास, जो डिवाइस की JSON कॉन्फ़िगरेशन फ़ाइल और अपडेट को लोड करती है
रनटाइम पर फ़्रेमवर्क के कॉन्फ़िगरेशन को पूरा करता है.
ऐप्लिकेशन को लागू करने में मदद करने वाला मॉड्यूल, spectatio का मुख्य हिस्सा है
फ़्रेमवर्क शामिल है. इसमें हेल्पर फ़ंक्शन को लागू किया गया है
ऐप हेल्पर इंटरफ़ेस, जो किसी पर ऐप्लिकेशन का टेस्ट करने के लिए ज़रूरी है
ऑटोमोटिव डिवाइस. हर ऐप्लिकेशन को खुद लागू किया जाता है, जैसे कि SettingHelperImpl
और
DialHelperImpl
इस्तेमाल करने वाले
ऐप्लिकेशन की टेस्टिंग के लिए ऑटोमोटिव टेस्ट. और जानें और
लागू करने के लिए, ऐप्लिकेशन हेल्पर लागू करने के फ़ंक्शन देखें
'एओएसपी पर'.
वाहन संबंधित जांच
अलग-अलग ऑपरेशन की जांच करने के लिए, ऐप्लिकेशन हेल्पर लागू फ़ंक्शन का इस्तेमाल करें
से जुड़ा हुआ है. 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 का फ़्रेमवर्क, डिवाइस के यूज़र इंटरफ़ेस (यूआई) से अलग है. इसलिए, इसे
विभिन्न यूज़र इंटरफ़ेस (यूआई) और हार्डवेयर वाले टेस्टिंग डिवाइस. बड़े स्तर पर इस सुविधा को हासिल करने के लिए,
spectatio में, रेफ़रंस डिवाइस के आधार पर डिफ़ॉल्ट रूप से डिवाइस कॉन्फ़िगरेशन इस्तेमाल किए जाते हैं. यहां की यात्रा पर हूं
जो डिफ़ॉल्ट डिवाइस कॉन्फ़िगरेशन के साथ काम नहीं करते हैं, उनके लिए फ़्रेमवर्क JSON का इस्तेमाल करता है
कॉन्फ़िगरेशन फ़ाइल का इस्तेमाल करती है. ऐप्लिकेशन
JSON कॉन्फ़िगरेशन फ़ाइल, TEXT
, DESCRIPTION
, और जैसे यूज़र इंटरफ़ेस (यूआई) एलिमेंट के साथ काम करती है
RESOURCE_ID
, path
सेटिंग के साथ और इसमें सिर्फ़ जानकारी होनी चाहिए
डीयूटी के यूज़र इंटरफ़ेस (यूआई) में हुए बदलावों के बारे में जानकारी. यूज़र इंटरफ़ेस (यूआई) के बाकी एलिमेंट में डिफ़ॉल्ट वैल्यू का इस्तेमाल किया जाता है
कॉन्फ़िगरेशन वैल्यू दी गई हैं.
डिफ़ॉल्ट डिवाइस कॉन्फ़िगरेशन
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 पर कनेक्टिविटी.
तारीख और समय की सेटिंग, सेटिंग > इसके लिए तारीख और समय और सेटिंग > सिस्टम > डीयूटी की तारीख और समय.
// 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 |
यूज़र इंटरफ़ेस (यूआई) चुनने पर, यूज़र इंटरफ़ेस (यूआई) Automator `BySelectors` बनाने के लिए इस्तेमाल किया गया ऑब्जेक्ट एलिमेंट (इनके बारे में नीचे बताया गया है). |
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"
}
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
की पहचान करता है जिसमें
2
की गहराई में डिसेंडेंट, जिसमें Permission manager
टेक्स्ट है.
Workflows
वर्कफ़्लो किसी खास कार्रवाई को पूरा करने के लिए इस्तेमाल की जाने वाली कार्रवाइयों का क्रम दिखाता है टास्क, डिवाइस टाइप के हिसाब से अलग-अलग हो सकते हैं. कोड की तुलना में कॉन्फ़िगरेशन में दिखाने के लिए सुविधाजनक होना चाहिए.
"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
कुंजी वाला एक ऑब्जेक्ट होता है, जिसका मान
यूज़र इंटरफ़ेस (यूआई) एलिमेंट एंट्री की तरह ही होना चाहिए (ऊपर देखें). वे TYPE हैं:
PRESS LONG_PRESS क्लिक LONG_Click Click_IF_EXIST |
HAS_UI_ELEMENT_IN_FOREGROUND SCROLL_TO_ चेकआउट_AND_क्लिक स्कैन स्वाइप करें |
अन्य 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 |
एक ऑब्जेक्ट जो कंटेनर को स्क्रोल करने के बारे में बता रहा है. यह यूज़र इंटरफ़ेस (यूआई) जैसा ही है एलिमेंट कॉन्फ़िगरेशन (ऊपर देखें). |
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: जांच किए जाने वाले ऐप्लिकेशन का नाम. उदाहरण के लिए, वाई-फ़ाई सेटिंग टेस्ट करने के लिए, TEST-APK-NAME से
AndroidAutomotiveSettingsTests
पर जैसा किAndroid.bp
में बताया गया है फ़ाइल से लिए जाते हैं. APK का नाम, इससे जुड़ीAndroid.bp
फ़ाइल में मिल सकता है ऑटोमोटिव टेस्ट.DEVICE-SERIAL: डीयूटी का सीरियल आईडी. यह पैरामीटर नहीं है तब ज़रूरी होता है, जब होस्ट से सिर्फ़ एक डिवाइस कनेक्ट हो.
config-file-path
: वैकल्पिक पैरामीटर, जो सिर्फ़ जानकारी देने के लिए ज़रूरी होता है डिवाइस के यूज़र इंटरफ़ेस (यूआई) के ऐसे कॉन्फ़िगरेशन जो डिफ़ॉल्ट नहीं हैं, जैसा कि JSON कॉन्फ़िगरेशन में बताया गया है फ़ाइल में सेव किया जाएगा. अगर यह पैरामीटर उपलब्ध नहीं कराया जाता, तो फ़्रेमवर्क, जांच के लिए डिफ़ॉल्ट वैल्यू का इस्तेमाल करता है.PATH-FOR-BUILT-TEST-APK: वह पाथ जहां जांच वाला APK बनाया गया है जब
make
निर्देश को लागू किया जाता है.TEST-PACKAGE: जांच पैकेज का नाम.
TEST-CLASSNAME: टेस्ट क्लास का नाम. उदाहरण के लिए, Wifi सेटिंग परीक्षण, परीक्षण पैकेज
android.platform.tests
है और टेस्ट क्लास का नामWifiSettingTest
है.
ऑटोमोटिव स्निपेट लाइब्रेरी
ऑटोमोटिव स्निपेट लाइब्रेरी, Android टेस्ट लाइब्रेरी का एक सेट है Android ओपन सोर्स प्रोजेक्ट (AOSP) जिसे ऑटोमोटिव के साथ इंटरैक्ट करने के लिए डिज़ाइन किया गया है किस तरह के ऐप्लिकेशन और सेवाएँ उपलब्ध कराते हैं. यह एक सुविधाजनक सिस्टम के साथ spectatio का इस्तेमाल करता है किसी होस्ट (टेस्ट) मशीन से रिमोट प्रोसेस (RPC) कॉल Android-पावर्ड डिवाइस.
शुरू करें
शुरू करने से पहले, इन सेक्शन को देखें.
ज़रूरी शर्तें
- होस्ट मशीन पर Python 3.x इंस्टॉल किया गया.
- ज़रूरी बिल्ड टूल के साथ AOSP एनवायरमेंट का सेटअप.
- Android Automotive डिवाइस (एम्युलेटर या फ़िज़िकल डिवाइस) जिसके पास adb का ऐक्सेस हो.
कंपाइलेशन
Automotive स्निपेट लाइब्रेरी से मिले कई स्निपेट को कंपाइल करने के लिए, आपको
दी गई android.bp
फ़ाइल का इस्तेमाल कर सकते हैं. पिछले वाक्य में दिए गए निर्देशों का पालन करना
सेक्शन बनाना होगा.
डिप्लॉयमेंट
स्निपेट लाइब्रेरी को कंपाइल करने के बाद, नतीजे के तौर पर मिलने वाले APKs को इन कामों के लिए डिप्लॉय करें
लक्ष्य डिवाइस पिछले में बताए गए adb install
निर्देश का इस्तेमाल कर रहा है
सेक्शन में जाएं.
टेस्ट करना
स्निपेट लाइब्रेरी, वाहन संबंधित कई RPC तरीकों की जानकारी देती हैं
सिस्टम. ये तरीके, होस्ट के Mobly फ़्रेमवर्क के ज़रिए इस्तेमाल किए जा सकते हैं
मशीन. यह मानते हुए कि आपने Mobly टेस्ट एनवायरमेंट सेट अप कर लिया है,
snippet_shell.py
स्क्रिप्ट, ताकि इंटरैक्टिव Python शेल खोलने के लिए, इनका इस्तेमाल किया जा सके
मैन्युअल तरीके से RPC तरीकों को शुरू कर सकें. शुरू करने का उदाहरण:
python3 snippet_shell.py com.google.android.mobly.snippet.bundled -s <serial>
<serial>
की जगह पर डिवाइस का सीरियल नंबर डालें
adb डिवाइसेस कनेक्ट हैं.
ये लाइब्रेरी शामिल हैं
ऑटोमोटिव स्निपेट लाइब्रेरी में नीचे दी गई स्निपेट लाइब्रेरी और मददगार:
Automotiveस्निपेट: वाहन की कार्रवाइयों से जुड़े एपीआई मुहैया कराता है, जैसे डायलिंग, आवाज़ कंट्रोल, गाड़ी की हार्ड बटन, और मीडिया सेंटर इंटरैक्शन.
फ़ोन स्निपेट: यह टेलीफ़ोनी से जुड़े एपीआई देता है, जिसमें कॉल हैंडलिंग, और एसएमएस कार्रवाइयां.
ऑटोमोटिव स्निपेट और फ़ोन स्निपेट के लिए कुछ बातें एक जैसी हैं.
खास तौर पर, किसी वाहन को जोड़ने के लिए, ब्लूटूथ से जुड़े आरसीपी कॉल को रोका जा सकता है
एक फ़ोन डिवाइस. इस bt_discovery_test
में इसका तरीका बताया गया है.
- TEST-CLASSNAME: टेस्ट क्लास का नाम. उदाहरण के लिए,
वाई-फ़ाई सेटिंग टेस्ट,
टेस्ट पैकेज
android.platform.tests
है और टेस्ट क्लास का नामWifiSettingTest
है.