Spectatio एक ओपन सोर्स टेस्ट फ़्रेमवर्क है. इसे असली और वर्चुअल डिवाइसों पर Android Automotive OS (AAOS) की टेस्टिंग के लिए बनाया गया है. Spectatio, ऑटोमोटिव डिवाइस पर ऐप्लिकेशन की टेस्टिंग के लिए एपीआई उपलब्ध कराता है. यह एक ऐसा समाधान है जिसे बढ़ाया और स्केल किया जा सकता है. इसका इस्तेमाल, AAOS और उसके ऐप्लिकेशन की परफ़ॉर्मेंस और क्षमता की पुष्टि करने के लिए किया जाता है.
हाई-लेवल डिज़ाइन
Spectatio फ़्रेमवर्क को अलग-अलग AAOS यूज़र इंटरफ़ेस (यूआई) के लिए इस्तेमाल किया जा सकता है. साथ ही, इसे बढ़ाया भी जा सकता है. इसका इस्तेमाल, डिवाइस के हार्डवेयर, एम्युलेटर, और वर्चुअलाइज़ किए गए एनवायरमेंट पर AAOS की क्षमता और परफ़ॉर्मेंस की जांच करने के लिए किया जाता है.
इस इमेज में, Spectatio फ़्रेमवर्क के हाई-लेवल डिज़ाइन के बारे में बताया गया है.
पहली इमेज. Spectatio फ़्रेमवर्क का हाई-लेवल डिज़ाइन.
Spectatio फ़्रेमवर्क, UI Automator पर आधारित है. यह यूज़र इंटरफ़ेस (यूआई) टेस्ट बनाने के लिए एपीआई का एक सेट उपलब्ध कराता है. ये टेस्ट, AAOS पर उपयोगकर्ता और सिस्टम ऐप्लिकेशन के साथ इंटरैक्ट करते हैं. Automotive टेस्ट के लिए, Spectatio फ़्रेमवर्क के उपलब्ध कराए गए एपीआई का इस्तेमाल किया जाता है. इससे ये टेस्ट, टेस्ट किए जा रहे डिवाइस (डीयूटी) से अलग हो जाते हैं. साथ ही, अगर ये एपीआई काम करते हैं, तो अलग-अलग डिवाइसों की जांच करने के लिए इन्हें बढ़ाया जा सकता है.
पहली इमेज में दिखाया गया है कि Spectatio फ़्रेमवर्क को, Dialer, Medicenter, और Settings जैसे रेफ़रंस ऐप्लिकेशन के आधार पर मॉड्यूलर बनाया गया है. इसमें ऐप्लिकेशन के हिसाब से इंटरफ़ेस और हेल्पर का इस्तेमाल किया जाता है. इससे, नए ऐप्लिकेशन के लिए इसे आसानी से बढ़ाया जा सकता है. Spectatio फ़्रेमवर्क, सामान्य स्टैंडर्ड और यूटिलिटी हेल्पर क्लास का फिर से इस्तेमाल करता है. स्टैंडर्ड हेल्पर क्लास, ऐप्लिकेशन के सभी हेल्पर फ़ंक्शन के लिए पैरंट क्लास होती है. यह ऐसे स्टैंडर्ड फ़ंक्शन उपलब्ध कराती है जो डिवाइस के हिसाब से होते हैं या सभी ऐप्लिकेशन पर लागू होते हैं. उपयोगिता हेल्पर क्लास, डिवाइस से फ़ाइलें पढ़ने या लिखने जैसी सुविधाएं उपलब्ध कराती हैं.
भवन निर्माण
Spectatio फ़्रेमवर्क, यूज़र इंटरफ़ेस (यूआई) टेस्ट बनाने के लिए एपीआई का एक सेट उपलब्ध कराता है. इसके लिए, यह ऐप्लिकेशन के हिसाब से इंटरफ़ेस और हेल्पर लागू करता है. साथ ही, मौजूदा स्टैंडर्ड हेल्पर क्लास को बढ़ाता है और यूटिलिटी हेल्पर क्लास इंपोर्ट करता है.
दूसरी इमेज में, Spectatio फ़्रेमवर्क का हाई-लेवल आर्किटेक्चर दिखाया गया है. साथ ही, ऐप्लिकेशन की टेस्टिंग के लिए एपीआई लागू करने में शामिल सभी इकाइयों के बारे में बताया गया है.
दूसरी इमेज. Spectatio फ़्रेमवर्क का हाई-लेवल आर्किटेक्चर.
ऐप्लिकेशन हेल्पर इंटरफ़ेस, ऐप्लिकेशन हेल्पर को लागू करने के लिए ब्लूप्रिंट उपलब्ध कराता है. इसमें कई हेल्पर फ़ंक्शन होते हैं, जो ऐप्लिकेशन की टेस्टिंग के लिए ज़रूरी होते हैं. हर ऐप्लिकेशन का अपना इंटरफ़ेस होता है. जैसे, IAutoSettingHelper
और IAutoDialHelper
.
ज़्यादा जानकारी और इंटरफ़ेस फ़ंक्शन की सूची के लिए, AOSP पर ऐप्लिकेशन हेल्पर इंटरफ़ेस फ़ंक्शन देखें.
स्टैंडर्ड हेल्पर क्लास में स्टैंडर्ड एट्रिब्यूट और फ़ंक्शन होते हैं. ये डिवाइस सेटअप करने के लिए ज़रूरी होते हैं, लेकिन किसी ऐप्लिकेशन के लिए खास नहीं होते. जैसे, pressHome
और scroll
. स्टैंडर्ड हेल्पर क्लास को AbstractAutoStandardAppHelper.java
में तय किया गया है.
फ़्रेमवर्क, यूटिलिटी हेल्पर क्लास का इस्तेमाल करता है. उदाहरण के लिए, AutoJsonUtility.java
एक यूटिलिटी क्लास है. यह दी गई डिवाइस JSON कॉन्फ़िगरेशन फ़ाइल को लोड करती है और रनटाइम के दौरान फ़्रेमवर्क कॉन्फ़िगरेशन को अपडेट करती है.
ऐप्लिकेशन हेल्पर को लागू करने वाला मॉड्यूल, Spectatio फ़्रेमवर्क का मुख्य हिस्सा होता है. इसमें ऐप्लिकेशन हेल्पर इंटरफ़ेस में तय किए गए हेल्पर फ़ंक्शन को लागू करने की जानकारी होती है. ये फ़ंक्शन, किसी Automotive डिवाइस पर ऐप्लिकेशन की टेस्टिंग के लिए ज़रूरी होते हैं. हर ऐप्लिकेशन के लिए, लागू करने का तरीका अलग-अलग होता है. जैसे, SettingHelperImpl
और
DialHelperImpl
. इनका इस्तेमाल, ऐप्लिकेशन की जांच करने के लिए Automotive टेस्ट में किया जाता है. ज़्यादा जानकारी और लागू करने के तरीकों की सूची के लिए, 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 फ़्रेमवर्क, डिवाइस के यूज़र इंटरफ़ेस (यूआई) से अलग होता है. इसलिए, अलग-अलग यूज़र इंटरफ़ेस (यूआई) और हार्डवेयर वाले डिवाइसों की टेस्टिंग के लिए, इसका इस्तेमाल किया जा सकता है. स्केल करने की इस सुविधा को उपलब्ध कराने के लिए, 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 पर मौजूद सेटिंग से बदला गया है. इस उदाहरण में:
रेफ़रंस डिवाइसों पर इंटरनेट सेटिंग का नाम नेटवर्क और इंटरनेट है. वहीं, 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 |
इस ऑब्जेक्ट का इस्तेमाल, यूज़र इंटरफ़ेस (यूआई) ऑटोमेटर `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
}
CLASS
क्लास के आधार पर एलिमेंट की पहचान करता है.
"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"
}
}
MULTIPLE
एक साथ कई शर्तों के आधार पर एलिमेंट की पहचान करना. इन सभी शर्तों का पूरा होना ज़रूरी है.
"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
कुंजी होती है. इसकी वैल्यू, यूज़र इंटरफ़ेस (यूआई) एलिमेंट की एंट्री (ऊपर देखें) के जैसी होती है. ये टाइप हैं:
PRESS LONG_PRESS CLICK 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 |
अन्य TYPE के लिए, कॉन्फ़िगरेशन की जानकारी यह है:
ऑब्जेक्ट | ब्यौरा |
---|---|
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 देखें.
|
बनाना और लागू करना
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
फ़ाइल में बताई गई वाई-फ़ाई सेटिंग की जांच करने के लिए, TEST-APK-NAME कोAndroidAutomotiveSettingsTests
पर सेट करें. APK का नाम, ऑटोमोटिव टेस्ट के लिएAndroid.bp
फ़ाइल में देखा जा सकता है.DEVICE-SERIAL: DUT का सीरियल आईडी. अगर होस्ट से सिर्फ़ एक डिवाइस कनेक्ट है, तो इस पैरामीटर की ज़रूरत नहीं होती.
config-file-path
: यह एक ज़रूरी पैरामीटर है. इसका इस्तेमाल सिर्फ़ डिवाइस के यूज़र इंटरफ़ेस (यूआई) के नॉनडिफ़ॉल्ट कॉन्फ़िगरेशन देने के लिए किया जाता है. ये कॉन्फ़िगरेशन, JSON कॉन्फ़िगरेशन फ़ाइल में दिए गए होते हैं. अगर यह जानकारी नहीं दी जाती है, तो फ़्रेमवर्क, टेस्ट को लागू करने के लिए डिफ़ॉल्ट वैल्यू का इस्तेमाल करता है.PATH-FOR-BUILT-TEST-APK: यह वह पाथ है जहां
make
कमांड के चालू होने पर, टेस्ट APK बनाया जाता है.TEST-PACKAGE: टेस्ट पैकेज का नाम.
TEST-CLASSNAME: टेस्ट क्लास का नाम. उदाहरण के लिए, वाई-फ़ाई सेटिंग की जांच के लिए, टेस्ट पैकेज
android.platform.tests
है और टेस्ट क्लास का नामWifiSettingTest
है.
ऑटोमोटिव स्निपेट लाइब्रेरी
Automotive Snippet Library, Android Test लाइब्रेरी का एक सेट है. इसे Android Open Source Project (AOSP) के लिए बनाया गया है. इसका इस्तेमाल, Automotive ऐप्लिकेशन और सेवाओं के साथ इंटरैक्ट करने के लिए किया जाता है. यह Spectatio का इस्तेमाल करता है. इसमें होस्ट (टेस्ट) मशीन से Android डिवाइस पर रिमोट प्रोसीज़र कॉल (आरपीसी) को एक्ज़ीक्यूट करने के लिए, एक आसान तरीका उपलब्ध होता है.
शुरू करें
शुरू करने से पहले, इन सेक्शन को देखें.
ज़रूरी शर्तें
- होस्ट मशीन पर Python 3.x इंस्टॉल हो.
- ज़रूरी बिल्ड टूल के साथ AOSP एनवायरमेंट सेटअप किया गया हो.
- adb ऐक्सेस वाला Android Automotive डिवाइस (इम्यूलेटर या फ़िज़िकल डिवाइस).
कंपाइलेशन
ऑटोमोटिव स्निपेट लाइब्रेरी में दिए गए अलग-अलग स्निपेट को कंपाइल करने के लिए, दी गई android.bp
फ़ाइल का इस्तेमाल किया जा सकता है. पिछले सेक्शन में दिए गए इन निर्देशों का पालन करके, APK को कंपाइल करें.
डिप्लॉयमेंट
स्निपेट लाइब्रेरी को कंपाइल करने के बाद, पिछले सेक्शन में बताई गई adb install
कमांड का इस्तेमाल करके, टारगेट डिवाइस पर नतीजे के तौर पर मिले APK डिप्लॉय करें.
टेस्ट चलाना
स्निपेट लाइब्रेरी, ऑटोमोटिव सिस्टम के साथ इंटरैक्ट करने के लिए कई आरपीसी तरीके उपलब्ध कराती हैं. इन तरीकों को होस्ट मशीन से Mobly फ़्रेमवर्क के ज़रिए लागू किया जा सकता है. मान लें कि आपने Mobly टेस्ट एनवायरमेंट सेट अप कर लिया है. ऐसे में, इंटरैक्टिव Python शेल खोलने के लिए, snippet_shell.py
स्क्रिप्ट का इस्तेमाल किया जा सकता है. यहां डिवाइस पर आरपीसी के तरीकों को मैन्युअल तरीके से लागू किया जा सकता है. फ़ंक्शन को कॉल करने का उदाहरण:
python3 snippet_shell.py com.google.android.mobly.snippet.bundled -s <serial>
<serial>
को डिवाइस के सीरियल नंबर से बदलें. अगर एक से ज़्यादा डिवाइस कनेक्ट हैं, तो adb devices की मदद से सीरियल नंबर पाया जा सकता है.
शामिल की गई लाइब्रेरी
Automotive Snippet Library में ये स्निपेट लाइब्रेरी और हेल्पर शामिल हैं:
AutomotiveSnippet: यह वाहन के ऑपरेशन से जुड़े एपीआई उपलब्ध कराता है. जैसे, डायल करना, वॉल्यूम कंट्रोल करना, वाहन के हार्ड की, और मीडिया सेंटर के साथ इंटरैक्ट करना.
PhoneSnippet: यह टेलीफ़ोनी से जुड़े एपीआई उपलब्ध कराता है. इनमें कॉल हैंडलिंग, संपर्क ब्राउज़ करना, और एसएमएस से जुड़ी कार्रवाइयां शामिल हैं.
ऑटोमोटिव स्निपेट और फ़ोन स्निपेट में कुछ लॉजिक एक जैसे होते हैं.
खास तौर पर, ब्लूटूथ से जुड़े आरसीपी कॉल में दख़ल दिया जा सकता है, ताकि कार और फ़ोन को कनेक्ट किया जा सके. इस bt_discovery_test
में इसका तरीका बताया गया है.
- TEST-CLASSNAME: टेस्ट क्लास का नाम. उदाहरण के लिए, वाई-फ़ाई सेटिंग टेस्ट के लिए, टेस्ट पैकेज
android.platform.tests
है और टेस्ट क्लास का नामWifiSettingTest
है.