Spectatio: מסגרת לבדיקת רכב

Spectatio היא מסגרת בדיקה בקוד פתוח שפותחה לבדיקת מערכת ההפעלה Android Automotive (AAOS) במכשירים אמיתיים ווירטואליים. Spectatio מספקת ממשקי API לבדיקת אפליקציות במכשיר רכב והיא פתרון הניתן להרחבה וניתן להרחבה המשמש לאימות היכולות והביצועים של AAOS והאפליקציות שלה.

עיצוב ברמה גבוהה

המסגרת של Spectatio ניתנת להתאמה וניתנת להרחבה עבור יישומי ממשק משתמש שונים של AAOS. הוא משמש לבדיקת היכולת והביצועים של AAOS על חומרת מכשירים, אמולטורים וסביבות וירטואליות.

האיור הבא מסביר את העיצוב ברמה הגבוהה של מסגרת Spectatio.

עיצוב מסגרת של Specatio ברמה גבוהה

איור 1. עיצוב מסגרת Spectatio ברמה גבוהה.

המסגרת של Spectatio, בנויה על גבי UI Automator , מספקת קבוצה של ממשקי API לבניית מבחני ממשק משתמש המקיימים אינטראקציה עם אפליקציות משתמש ומערכת ב-AAOS. בדיקות רכב משתמשות בממשקי ה-API המסופקים על ידי מסגרת Spectatio לבדיקה, מה שהופך את הבדיקות הללו לבלתי תלויות במכשיר הנבדק (DUT) וניתנות להרחבה לבדיקת מכשירים מגוונים, אם נתמכים.

איור 1 מראה שהמסגרת של Spectatio מודולרית בהתבסס על אפליקציות ייחוס כגון Dialer, Medicenter והגדרות תוך שימוש בממשקים ועוזרים ספציפיים לאפליקציה, מה שהופך אותה לניתנת להרחבה בקלות עבור אפליקציות חדשות. המסגרת של Spectatio עושה שימוש חוזר בשיעורי התקן והמסייעים הנפוצים. מחלקת העזר הסטנדרטית היא מחלקת האב של כל פונקציות עוזר האפליקציה ומספקת פונקציות סטנדרטיות שהן ספציפיות למכשיר או ישימות באפליקציות. כיתות עוזרות השירות מספקות כלי עזר כגון קריאה או כתיבה של קבצים מהמכשיר.

ארכיטקטורה

כדי לספק קבוצה של ממשקי API לבניית מבחני ממשק משתמש, המסגרת של Spectatio מיישמת ממשקים ועוזרים ספציפיים לאפליקציה תוך הרחבת מחלקת העזר הסטנדרטית הקיימת וייבוא ​​מחלקות העזר.

איור 2 ממחיש את הארכיטקטורה ברמה הגבוהה של מסגרת Spectatio וכל הישויות המעורבות בהטמעת ממשקי API לבדיקת אפליקציה.

אדריכלות ברמה גבוהה של מסגרת Spectatio

איור 2. ארכיטקטורת מסגרת של Spectatio ברמה גבוהה.

ממשק ה-App Helper מספק שרטוט ליישום מסייע לאפליקציה. הוא מורכב מפונקציות עוזר שונות הדרושות לבדיקת אפליקציות. לכל אפליקציה יש ממשק משלה, כגון 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 תומך ברכיבי ממשק משתמש כמו TEXT , DESCRIPTION ו- RESOURCE_ID , יחד עם הגדרות path ועליו להכיל רק את המידע על השינויים בממשק המשתמש עבור DUT. שאר רכיבי ממשק המשתמש משתמשים בערכי תצורת ברירת המחדל הניתנים במסגרת.

תצורות ברירת מחדל של מכשיר

קובץ התצורה לדוגמה הבא של 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 אובייקט המשמש לבניית UI Automator `BySelectors` שבוחרים ברכיבי UI (מתואר בפירוט בהמשך).
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": {
    "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 . עבור רוב ה-TYPEs, ה- CONFIG הוא אובייקט עם מפתח UI_ELEMENT שהערך שלו מקבל את אותה צורה כמו ערך רכיב UI (ראה למעלה). הסוגים האלה הם:

ללחוץ
LONG_PRESS
נְקִישָׁה
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

עבור שאר הTYPEs, פרטי התצורה הם:

לְהִתְנַגֵד תיאור
COMMAND אובייקט עם ערך TEXT המכיל את הפקודה לביצוע.
HAS_PACKAGE_IN_FOREGROUND אובייקט עם ערך TEXT המכיל את החבילה.
SWIPE השמט את CONFIG key עבור פעולת SWIPE . זה משתמש רק 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

אחד מהבאים:

  • FULL : תנועת החלקה מקצה המסך לקצה המסך

    אוֹ,
  • DEFAULT : מסך מקצה לקצה מסך, עם מאגר של חמישה (5) פיקסלים בכל צד.

    אוֹ,
  • THREE_QUARTER , HALF או QUARTER : תנועת החלקה מסיימת חמישה (5) פיקסלים מקצה המסך, ומתחילה בנקודה כזו שתכסה את המרחק המצוין של המסך.
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 כדי לבדוק את הגדרות ה-Wi-Fi כפי שצוינו בקובץ Android.bp . ניתן למצוא את שם ה-APK בקובץ Android.bp המתאים עבור מבחן הרכב .

  • DEVICE-SERIAL : המזהה הסדרתי של ה-DUT. פרמטר זה אינו נדרש אם רק מכשיר אחד מחובר למארח.

  • config-file-path : פרמטר אופציונלי שנדרש רק כדי לספק תצורות ממשק משתמש לא ברירת מחדל של המכשיר כפי שצוין בקובץ התצורה של JSON . אם לא מסופק, המסגרת משתמשת בערכי ברירת מחדל לביצוע הבדיקות.

  • PATH-FOR-BUILT-TEST-APK : הנתיב שבו נבנה ה-APK לבדיקה בעת ביצוע הפקודה make .

  • TEST-PACKAGE : שם חבילת הבדיקה.

  • TEST-CLASSNAME : שם מחלקת המבחן. לדוגמה, עבור מבחן הגדרות Wifi , חבילת הבדיקה היא android.platform.tests ושם מחלקת הבדיקה הוא WifiSettingTest .

ספריית קטעי רכב

ספריית קטעי הרכב לרכב היא קבוצה של ספריות בדיקות אנדרואיד עבור פרויקט הקוד הפתוח של Android (AOSP) שנועדה לקיים אינטראקציה עם אפליקציות ושירותי רכב. הוא ממנף את Spectatio עם מנגנון נוח לביצוע קריאות פרוצדורות מרחוק (RPCs) ממכשיר מארח (בדיקה) למכשיר המופעל על ידי אנדרואיד.

להתחיל

לפני שתתחיל, עיין בסעיפים אלה.

דרישות מוקדמות

  • Python 3.x מותקן במחשב המארח.
  • הגדרת סביבת AOSP עם כלי בנייה נחוצים.
  • מכשיר אנדרואיד לרכב (אמולטור או מכשיר פיזי) עם גישת adb.

הַהדָרָה

כדי להרכיב את הקטעים השונים שסופקו על ידי ספריית קטעי הרכב, אתה יכול להשתמש בקובץ android.bp שסופק. בצע את הפקודות בסעיף הקודם כדי להדר את ה-APK.

פְּרִיסָה

לאחר הידור מוצלח של ספריות הקטעים, פרוס את ה-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 אם מחוברים מספר מכשירים.

ספריות כלולות

ספריית קטעי הרכב כוללת את ספריות הקטעים והעוזרים הבאים:

  • AutomotiveSnippet: מספק ממשקי API הקשורים לפעולות הרכב, כגון חיוג, בקרת עוצמת הקול, מקשים קשיחים לרכב ואינטראקציה במרכז המדיה.

  • PhoneSnippet: מספק ממשקי API הקשורים לטלפוניה, כולל טיפול בשיחות, גלישה באנשי קשר ופעולות SMS.

קטע ה-Automotive ו-PhoneSnippet חולקים היגיון משותף. באופן ספציפי, אתה יכול לפלוש לשיחות RCP הקשורות ל-Bluetooth כדי להתאים בין רכב למכשיר טלפון. bt_discovery_test זה מראה כיצד.