Spectatio एक ओपन सोर्स टेस्ट फ़्रेमवर्क है. इसे असल और वर्चुअल डिवाइसों पर, Android Automotive OS (AAOS) की जांच करने के लिए बनाया गया है. Spectatio, वाहन से जुड़े डिवाइस पर ऐप्लिकेशन की जांच करने के लिए एपीआई उपलब्ध कराता है. यह एक ऐसा समाधान है जिसे बड़े पैमाने पर इस्तेमाल किया जा सकता है और इसमें बदलाव किया जा सकता है. इसका इस्तेमाल, AAOS और इसके ऐप्लिकेशन की सुविधाओं और परफ़ॉर्मेंस की पुष्टि करने के लिए किया जाता है.
हाई-लेवल डिज़ाइन
Spectatio फ़्रेमवर्क को AAOS के यूज़र इंटरफ़ेस (यूआई) को लागू करने के लिए, कई तरह से इस्तेमाल और बड़ा किया जा सकता है. इसका इस्तेमाल, डिवाइस के हार्डवेयर, एमुलेटर, और वर्चुअलाइज़ किए गए एनवायरमेंट पर AAOS की क्षमता और परफ़ॉर्मेंस की जांच करने के लिए किया जाता है.
इस इमेज में, Spectatio फ़्रेमवर्क के हाई-लेवल डिज़ाइन के बारे में बताया गया है.
पहली इमेज. Spectatio फ़्रेमवर्क का हाई-लेवल डिज़ाइन.
Spectatio फ़्रेमवर्क, यूआई ऑटोमेट के आधार पर बनाया गया है. यह यूज़र इंटरफ़ेस (यूआई) टेस्ट बनाने के लिए एपीआई का एक सेट उपलब्ध कराता है. ये टेस्ट, AAOS पर उपयोगकर्ता और सिस्टम ऐप्लिकेशन के साथ इंटरैक्ट करते हैं. वाहन से जुड़े ऐप्लिकेशन की जांच करने के लिए, Spectatio फ़्रेमवर्क के एपीआई का इस्तेमाल किया जाता है. इससे, ये जांच, जांचे जा रहे डिवाइस (डीयूटी) से अलग हो जाती हैं. साथ ही, अगर ये जांच अलग-अलग डिवाइसों पर काम करती हैं, तो उन पर भी जांच की जा सकती है.
पहली इमेज से पता चलता है कि Spectatio फ़्रेमवर्क को डायलर, Medicenter, और सेटिंग जैसे रेफ़रंस ऐप्लिकेशन के आधार पर मॉड्यूलर किया गया है. इसमें ऐप्लिकेशन के हिसाब से इंटरफ़ेस और हेल्पर का इस्तेमाल किया गया है. इससे इसे नए ऐप्लिकेशन के लिए आसानी से बढ़ाया जा सकता है. Spectatio के फ़्रेमवर्क में, सामान्य स्टैंडर्ड और यूटिलिटी हेल्पर क्लास का फिर से इस्तेमाल किया जाता है. स्टैंडर्ड हेल्पर क्लास, ऐप्लिकेशन के सभी हेल्पर फ़ंक्शन के लिए पैरंट क्लास होती है. साथ ही, यह ऐसे स्टैंडर्ड फ़ंक्शन उपलब्ध कराती है जो डिवाइस के हिसाब से होते हैं या सभी ऐप्लिकेशन पर लागू होते हैं. यूटिलिटी हेल्पर क्लास, डिवाइस से फ़ाइलें पढ़ने या उसमें फ़ाइलें लिखने जैसी सुविधाएं उपलब्ध कराती हैं.
भवन निर्माण
यूज़र इंटरफ़ेस (यूआई) टेस्ट बनाने के लिए एपीआई का एक सेट उपलब्ध कराने के लिए, Spectatio फ़्रेमवर्क, ऐप्लिकेशन के हिसाब से इंटरफ़ेस और हेल्पर लागू करता है. साथ ही, मौजूदा स्टैंडर्ड हेल्पर क्लास को बड़ा करता है और यूटिलिटी हेल्पर क्लास इंपोर्ट करता है.
दूसरे चित्र में, Spectatio फ़्रेमवर्क के हाई-लेवल आर्किटेक्चर के साथ-साथ, ऐप्लिकेशन की जांच के लिए एपीआई लागू करने वाली सभी इकाइयों को दिखाया गया है.
दूसरी इमेज. Spectatio फ़्रेमवर्क का हाई-लेवल आर्किटेक्चर.
ऐप्लिकेशन हेल्पर इंटरफ़ेस, ऐप्लिकेशन हेल्पर को लागू करने के लिए ब्लूप्रिंट उपलब्ध कराता है. इसमें कई सहायक फ़ंक्शन होते हैं, जो ऐप्लिकेशन की जांच करने के लिए ज़रूरी होते हैं. हर ऐप्लिकेशन का अपना इंटरफ़ेस होता है, जैसे कि IAutoSettingHelper
और IAutoDialHelper
.
ज़्यादा जानकारी और इंटरफ़ेस फ़ंक्शन की सूची के लिए, AOSP पर ऐप्लिकेशन हेल्पर इंटरफ़ेस फ़ंक्शन देखें.
स्टैंडर्ड हेल्पर क्लास में ऐसे स्टैंडर्ड एट्रिब्यूट और फ़ंक्शन होते हैं जो डिवाइस सेटअप के लिए ज़रूरी होते हैं. हालांकि, ये किसी ऐप्लिकेशन के लिए खास तौर पर नहीं होते, जैसे कि pressHome
और scroll
. स्टैंडर्ड हेल्पर क्लास के बारे में AbstractAutoStandardAppHelper.java
में बताया गया है.
फ़्रेमवर्क, यूटिलिटी हेल्पर क्लास का इस्तेमाल करता है. उदाहरण के लिए, AutoJsonUtility.java
एक यूटिलिटी क्लास है, जो दिए गए डिवाइस की JSON कॉन्फ़िगरेशन फ़ाइल को लोड करती है और रनटाइम के दौरान फ़्रेमवर्क कॉन्फ़िगरेशन को अपडेट करती है.
ऐप्लिकेशन हेल्पर लागू करने वाला मॉड्यूल, Spectatio के फ़्रेमवर्क का मुख्य हिस्सा है. इसमें, ऐप्लिकेशन हेल्पर इंटरफ़ेस में बताई गई हेल्पर फ़ंक्शन को लागू करने की जानकारी होती है. ये फ़ंक्शन, वाहन से जुड़े डिवाइस पर ऐप्लिकेशन की जांच करने के लिए ज़रूरी होते हैं. हर ऐप्लिकेशन को लागू करने का अपना तरीका होता है. जैसे, SettingHelperImpl
और DialHelperImpl
. ऐप्लिकेशन की जांच करने के लिए, वाहन से जुड़ी टेस्टिंग में इनका इस्तेमाल किया जाता है. ज़्यादा जानकारी और लागू करने के तरीकों की सूची के लिए, AOSP पर ऐप्लिकेशन हेल्पर लागू करने के फ़ंक्शन देखें.
वाहन संबंधित टेस्ट, ऐप्लिकेशन से जुड़े अलग-अलग ऑपरेशन की जांच करने के लिए, ऐप्लिकेशन हेल्पर लागू करने के फ़ंक्शन का इस्तेमाल करते हैं. ऐप्लिकेशन हेल्पर लागू करने के फ़ंक्शन का ऐक्सेस पाने के लिए, HelperAccessor
क्लास का इस्तेमाल करें.
यहां दिए गए कोड में, वाहन से जुड़े सैंपल टेस्ट को सेटअप करने, उसे क्लीनअप करने, और उसे चलाने का तरीका बताया गया है.
@RunWith(AndroidJUnit4.class)
public class AutoApplicationTest {
static HelperAccessor<IAutoApplicationHelper> autoApplicationHelper =
new HelperAccessor<>(IAutoApplicationHelper.class);
public AutoApplicationTest() {
// constructor
// Initialize any attributes that are required for the test execution
}
@Before
public void beforeTest() {
// Initial setup before each test
// For example - open the app
autoApplicationHelper.open();
}
@After
public void afterTest() {
// Cleanup after each test.
// For example - exit the app
autoApplicationHelper.exit();
}
@Test
public void testApplicationFeature() {
// Test
// For example - Test if app is open
assertTrue("Application is not open.", autoApplicationHelper.isOpen());
}
}
पसंद के मुताबिक बनाएं
Spectatio फ़्रेमवर्क, डिवाइस के यूज़र इंटरफ़ेस (यूआई) से अलग होता है. इसलिए, यह अलग-अलग यूआई और हार्डवेयर वाले डिवाइसों की जांच करने के लिए स्केलेबल होता है. इस स्केलेबिलिटी को हासिल करने के लिए, Spectatio, रेफ़रंस डिवाइस के आधार पर डिफ़ॉल्ट डिवाइस कॉन्फ़िगरेशन का इस्तेमाल करता है. डिवाइस के डिफ़ॉल्ट कॉन्फ़िगरेशन के अलावा, अन्य कॉन्फ़िगरेशन के साथ काम करने के लिए, फ़्रेमवर्क रनटाइम के दौरान JSON कॉन्फ़िगरेशन फ़ाइल का इस्तेमाल करता है. इससे, डिवाइस के यूज़र इंटरफ़ेस (यूआई) में पसंद के मुताबिक बदलाव किए जा सकते हैं. JSON कॉन्फ़िगरेशन फ़ाइल में path
सेटिंग के साथ-साथ, TEXT
, DESCRIPTION
, और RESOURCE_ID
जैसे यूज़र इंटरफ़ेस (यूआई) एलिमेंट काम करते हैं. साथ ही, इसमें सिर्फ़ डीयूटी के यूआई में हुए बदलावों की जानकारी होनी चाहिए. बाकी यूज़र इंटरफ़ेस (यूआई) एलिमेंट, फ़्रेमवर्क में दी गई डिफ़ॉल्ट कॉन्फ़िगरेशन वैल्यू का इस्तेमाल करते हैं.
डिवाइस के डिफ़ॉल्ट कॉन्फ़िगरेशन
यहां दी गई 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 कॉन्फ़िगरेशन फ़ाइल का उदाहरण दिया गया है. इसमें, डिफ़ॉल्ट सेटिंग को डीयूटी की सेटिंग से बदल दिया गया है. इस उदाहरण में:
इंटरनेट सेटिंग को रेफ़रंस डिवाइसों पर नेटवर्क और इंटरनेट और डीयूटी पर कनेक्टिविटी कहा जाता है.
तारीख और समय की सेटिंग, रेफ़रंस डिवाइसों के लिए सेटिंग > तारीख और समय पर और डीयूटी के लिए सेटिंग > सिस्टम > तारीख और समय पर उपलब्ध होती हैं.
// 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` को बनाने के लिए इस्तेमाल किया जाने वाला ऑब्जेक्ट, जो यूआई एलिमेंट चुनता है. इस बारे में यहां ज़्यादा जानकारी दी गई है. |
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
होता है. ज़्यादातर टाइप के लिए, 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 |
अन्य टाइप के लिए, कॉन्फ़िगरेशन की जानकारी यह है:
ऑब्जेक्ट | ब्यौरा |
---|---|
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: डीयूटी का सीरियल आईडी. अगर होस्ट से सिर्फ़ एक डिवाइस कनेक्ट है, तो इस पैरामीटर की ज़रूरत नहीं होती.
config-file-path
: वैकल्पिक पैरामीटर, जो सिर्फ़ JSON कॉन्फ़िगरेशन फ़ाइल में बताए गए डिवाइस के यूज़र इंटरफ़ेस (यूआई) के ऐसे कॉन्फ़िगरेशन देने के लिए ज़रूरी है जो डिफ़ॉल्ट नहीं हैं. अगर यह वैल्यू नहीं दी जाती है, तो फ़्रेमवर्क, जांचों को लागू करने के लिए डिफ़ॉल्ट वैल्यू का इस्तेमाल करता है.PATH-FOR-BUILT-TEST-APK: वह पाथ जहां
make
कमांड का इस्तेमाल करने पर, जांच के लिए APK बनाया जाता है.TEST-PACKAGE: टेस्ट पैकेज का नाम.
TEST-CLASSNAME: टेस्ट क्लास का नाम. उदाहरण के लिए, वाई-फ़ाई सेटिंग टेस्ट के लिए, टेस्ट पैकेज
android.platform.tests
है और टेस्ट क्लास का नामWifiSettingTest
है.
वाहन संबंधित स्निपेट लाइब्रेरी
Automotive स्निपेट लाइब्रेरी, Android Open Source Project (AOSP) के लिए Android टेस्ट लाइब्रेरी का एक सेट है. इसे वाहन से जुड़े ऐप्लिकेशन और सेवाओं के साथ इंटरैक्ट करने के लिए डिज़ाइन किया गया है. यह होस्ट (टेस्ट) मशीन से Android डिवाइस पर रिमोट प्रोसेस कॉल (आरपीसी) को एक्ज़ीक्यूट करने के लिए, Spectatio का फ़ायदा लेता है.
शुरू करें
शुरू करने से पहले, इन सेक्शन को देखें.
ज़रूरी शर्तें
- होस्ट मशीन पर 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 का इस्तेमाल करें.
शामिल की गई लाइब्रेरी
वाहन संबंधित स्निपेट लाइब्रेरी में ये स्निपेट लाइब्रेरी और मददगार शामिल हैं:
AutomotiveSnippet: वाहन के ऑपरेशन से जुड़े एपीआई उपलब्ध कराता है. जैसे, डायल करना, वॉल्यूम कंट्रोल करना, वाहन की हार्ड बटन, और मीडिया सेंटर इंटरैक्शन.
PhoneSnippet: यह टेलीफ़ोनी से जुड़े एपीआई उपलब्ध कराता है. इनमें कॉल मैनेज करने, संपर्कों को ब्राउज़ करने, और एसएमएस से जुड़ी कार्रवाइयां शामिल हैं.
Automotive स्निपेट और PhoneSnippet में कुछ सामान्य लॉजिक होते हैं.
खास तौर पर, किसी वाहन और फ़ोन डिवाइस को जोड़ने के लिए, ब्लूटूथ से जुड़े आरसीपी कॉल पर हमला किया जा सकता है. इस bt_discovery_test
में इसका तरीका बताया गया है.
- TEST-CLASSNAME: टेस्ट क्लास का नाम. उदाहरण के लिए, वाई-फ़ाई सेटिंग टेस्ट के लिए, टेस्ट पैकेज
android.platform.tests
और टेस्ट क्लास का नामWifiSettingTest
है.