Spectatio: framework di test automobilistici

Spectatio è un framework di test open source sviluppato per testare Android Automotive OS (AAOS) su dispositivi reali e virtuali. Spectatio fornisce API di testare app su un dispositivo automobilistico ed è una soluzione espandibile e scalabile utilizzate per verificare le capacità e le prestazioni di AAOS e delle sue app.

Design di alto livello

Il framework Spectatio è adattabile ed espandibile per varie UI di AAOS implementazioni. Viene utilizzato per testare le funzionalità e le prestazioni di AAOS sull'hardware del dispositivo, sugli emulatori e sugli ambienti virtualizzati.

La figura seguente spiega la progettazione generale del framework Spectatio.

Spectatio Framework di alto livello

Figura 1. Spectatio framework di alto livello.

Basato su UI Automator, il framework Spectatio offre una serie di API per creare test della UI che interagiscono con le app di sistema e utente su AAOS. Auto e motori I test utilizzano le API fornite dal framework Spectatio, il che rende questi test sono indipendenti dal dispositivo sottoposto a test (DUT) e scalabili per i test da diversi dispositivi, se supportati.

La figura 1 mostra che il framework Spectatio è modularizzato in base ai riferimenti app come Telefono, Medicenter e Impostazioni che usano interfacce e helper, che lo rendono facilmente estensibile per nuove app. La Spectatio il framework riutilizza le classi helper standard e di utilità comuni. La classe helper standard è la classe padre per tutte le funzioni helper dell'app e fornisce funzioni standard specifiche per dispositivo o applicabili a tutte le app. La classi di utility helper offrono utilità come per leggere o scrivere file dal dispositivo.

Architettura

Per fornire un insieme di API per la creazione di test dell'interfaccia utente, il framework Spectatio implementa interfacce e helper specifici per le app, ampliando al contempo l'helper standard esistente e importando le classi helper di utilità.

La figura 2 illustra l'architettura generale del framework Spectatio e tutte le entità coinvolte nell'implementazione delle API per i test di un'app.

Spectatio framework architettura di alto livello

Figura 2. Spectatio framework ad alto livello.

L'interfaccia app helper fornisce un modello per l'implementazione un aiutante per le app. Consiste di varie funzioni helper necessarie per testare le app. Ogni app ha una propria interfaccia, ad esempio IAutoSettingHelper e IAutoDialHelper. Per ulteriori informazioni e per un elenco delle funzioni dell'interfaccia, consulta la sezione sulle funzioni dell'interfaccia dell'app helper su AOSP.

La classe helper standard è composta da attributi e funzioni standard, richiesti per la configurazione del dispositivo, ma non sono specifici di nessuna app, ad esempio pressHome e scroll. La classe helper standard è definita in AbstractAutoStandardAppHelper.java.

Le classi helper di utilità sono utilizzate dal framework. Per Ad esempio, AutoJsonUtility.java è un che carica il file di configurazione JSON del dispositivo e si aggiorna le configurazioni del framework in fase di runtime.

Il modulo di implementazione dell'app helper è il fulcro di Spectatio il modello di machine learning. Contiene l'implementazione per le funzioni helper definite in l'interfaccia app helper, necessarie per testare le app su un dispositivo automobilistico. Ogni app ha la propria implementazione, ad esempio SettingHelperImpl e DialHelperImpl, usato da i test di Automotive per testare le app. Per ulteriori informazioni e un elenco implementazioni, consulta le funzioni di implementazione dell'app helper su AOSP.

Test automobilistici Utilizzare le funzioni di implementazione dell'helper dell'app per testare varie operazioni correlati all'app. Utilizzare il corso HelperAccessor per accedere alle funzioni di implementazione di app helper.

Il seguente codice mostra la configurazione, la pulizia e l'esecuzione di un esempio test automobilistico.

@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());
  }
}

Personalizzazione

Il framework Spectatio è indipendente dall'interfaccia utente del dispositivo ed è quindi scalabile per testare i dispositivi con UI e hardware diversi. Per ottenere questa scalabilità, La Specifica utilizza configurazioni del dispositivo predefinite basate sul dispositivo di riferimento. A supportare configurazioni del dispositivo non predefinite, il framework utilizza un file JSON di configurazione del deployment in fase di runtime per impostare le modifiche desiderate all'interfaccia utente per il dispositivo. R Il file di configurazione JSON supporta elementi UI come TEXT, DESCRIPTION e RESOURCE_ID, insieme alle impostazioni di path e deve contenere solo le informazioni sulle modifiche all'interfaccia utente del DUT. Il resto degli elementi UI utilizza il valore predefinito di configurazione forniti nel framework.

Configurazioni predefinite del dispositivo

Il seguente file di configurazione JSON di esempio mostra il dispositivo disponibile configurazioni e i relativi valori predefiniti.

Fai clic qui per visualizzare un file JSON di esempio file di configurazione

    {
        "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"
                        }
                }
        }
}
  

Configurazioni alternative del dispositivo

Il seguente esempio di codice mostra un esempio di file di configurazione JSON in cui le impostazioni predefinite vengono sostituite dalle impostazioni sul DUT. In questo esempio:

  • Le impostazioni internet sono denominate Rete e internet su dispositivi di riferimento e Connettività sul DUT.

  • Le impostazioni di data e ora sono disponibili in Impostazioni > Data e ora di dispositivi di riferimento e in Impostazioni > Sistema > Data e ora del 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"
    },
    ....
}

Quando il file di configurazione JSON è pronto, viene fornito in fase di runtime, come mostrato in il seguente blocco di codice:

# Push The JSON configuration file to the device
adb -s DEVICE-SERIAL push PATH-OF-JSON-FILE /data/local/tmp/runtimeSpectatioConfig.json

In questo comando:

  • DEVICE-SERIAL: ID di serie del DUT. Questo parametro non è necessaria se all'host è connesso un solo dispositivo.

  • PATH-TO-JSON-FILE: percorso del file JSON sulla macchina host.

di Gemini Advanced.

Formato di configurazione

Nella configurazione sono presenti cinque oggetti di primo livello, con le seguenti chiavi e valori:

Oggetto Descrizione
PACKAGES Un oggetto che descrive il pacchetto principale per varie app, utilizzato per stabilire quando l'app è in primo piano.
ACTIONS Oggetto che indica i tipi di azioni e i parametri relativi a varie azioni. Ad esempio, se usare i pulsanti o un gesto per scorrere.
COMMANDS Un oggetto che specifica comandi che eseguono varie azioni.
UI_ELEMENTS Un oggetto utilizzato per costruire UI Automator "BySelector" che selezionano l'UI Elementi (descritti nel dettaglio di seguito).
WORKFLOWS Sequenze di azioni che eseguono attività di alto livello (descritte in di seguito).

Elementi UI

Ogni elemento UI ha un TYPE che specifica quale UI Automator cercherà per identificare l'elemento (ad esempio ID risorsa, testo e descrizione) di configurazione associati a quel tipo. In generale, ogni volta che un aiutante identifica un elemento sullo schermo usando questa configurazione, ottiene esattamente un elemento. Se più elementi corrispondono alla configurazione, ne viene attribuito uno arbitrario usato nel test. Pertanto, la configurazione dovrebbe (generalmente) essere scritta in modo da restringere il campo a un solo elemento nel contesto pertinente.

TESTO

Questo è il tipo di elemento UI più semplice. L'elemento UI è identificato dal suo testo, e richiede una corrispondenza esatta.

    "CALL_HISTORY_MENU": {
      "TYPE": "TEXT",
      "VALUE": "Recents"
    }

TEXT_CONTAINS

Uguale a TEXT, ad eccezione del fatto che il valore VALUE specificato deve essere visualizzato solo da qualche parte in il testo dell'elemento da abbinare.

    "PRIVACY_CALENDAR": {
      "TYPE": "TEXT_CONTAINS",
      "VALUE": "Calendar"
    }

DESCRIZIONE

Identifica l'elemento tramite l'attributo descrizione dei contenuti, che richiede un corrispondono.

    "APP_GRID_SCROLL_BACKWARD_BUTTON": {
      "TYPE": "DESCRIPTION",
      "VALUE": "Scroll up"
    }

ID_RISORSA

Identifica l'elemento in base al suo ID risorsa, facoltativamente controllando anche il pacchetto di quell'ID. La chiave PACKAGE è facoltativa; se omesso, qualsiasi pacchetto corrisponderà e verrà presa in considerazione solo la parte dell'ID che segue :id/.

    "APP_LIST_SCROLL_ELEMENT": {
      "TYPE": "RESOURCE_ID",
      "VALUE": "apps_grid",
      "PACKAGE": "com.android.car.carlauncher"
    }

CLICCABILI E SCORRIBILI

Identifica l'elemento a seconda che sia (o meno) cliccabile o scorrevole. Si tratta di tipi di elementi molto generici che in genere dovrebbero essere utilizzati solo in MULTIPLE per restringere più facilmente un altro tipo di elemento. La chiave FLAG è facoltativa, e il valore predefinito è true.

    "SAMPLE_ELEMENT": {
      "TYPE": "CLICKABLE",
      "FLAG": false
    }

CLASSE

Identifica l'elemento in base alla sua classe.

    "SECURITY_SETTINGS_ENTER_PASSWORD": {
      "TYPE": "CLASS",
      "VALUE": "android.widget.EditText"
    }

HAS_ANCESTOR

Identifica l'elemento osservando la gerarchia dei widget nei suoi predecessori. La La chiave ANCESTOR contiene un oggetto che identifica il predecessore. La chiave DEPTH specifica quanto deve essere visualizzata la gerarchia. DEPTH è facoltativo e ha un valore predefinito di 1.

      "SAMPLE_ELEMENT": {
      "TYPE": "HAS_ANCESTOR",
      "DEPTH": 2,
      "ANCESTOR": {
        "TYPE": "CLASS",
        "VALUE": "android.view.ViewGroup"
      }
    }

HAS_DESCENDANT

Identifica l'elemento guardando verso il basso nella gerarchia. La La chiave DESCENDANT contiene un oggetto che specifica l'asset secondario da cercare. La La chiave DEPTH specifica a che livello superiore della gerarchia deve essere applicata. DEPTH è facoltativo e ha un valore predefinito di 1.

      "SAMPLE_ELEMENT": {
      "TYPE": "HAS_DESCENDANT",
      "DEPTH": 2,
      "DESCENDANT": {
        "TYPE": "CLASS",
        "VALUE": "android.view.ViewGroup"
      }
    }

PIÙ

Identificare l'elemento in base a più condizioni simultanee, tutte devono essere soddisfatti.

      "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"
          }
        }
      ]
    }

In questo esempio, la configurazione identifica un RelativeLayout che ha un discendente alla profondità 2, con il testo Permission manager.

Workflows

Un flusso di lavoro rappresenta una sequenza di azioni utilizzate per realizzare una determinata dell'attività, che può differire abbastanza da un tipo di dispositivo all'altro ed è più flessibile da rappresentare nella configurazione che nel codice.

    "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"
          }
        }
      }
    ]
  }

Ogni flusso di lavoro è una coppia chiave-valore in cui la chiave corrisponde al nome del flusso di lavoro come un array di azioni da eseguire. Ogni azione ha un NAME, un TYPE, (di solito) CONFIG e (a volte) SWIPE_CONFIG o SCROLL_CONFIG. Per nella maggior parte dei TYPE, CONFIG è un oggetto con una chiave UI_ELEMENT il cui valore prende nella stessa forma di un elemento UI (vedi sopra). Questi TYPE sono:

PREMI
LUNGO_PREMI
CLIC
LUNGO_CLIC
CLIC_IF_EXIST
HAS_UI_ELEMENT_IN_FOREGROUND
SCROLL_TO_FIND_AND_CLICK
SCROLL_TO_FIND_AND_CLICK_IF_EXIST
SCORRI_A_FIND_AND_CLIC
SCORRI_PER_TROVARE_E_CLIC_SE_ESISTE

Per gli altri TYPE, i dettagli di configurazione sono:

Oggetto Descrizione
COMMAND Un oggetto con un valore TEXT contenente il comando da eseguire.
HAS_PACKAGE_IN_FOREGROUND Un oggetto con un valore TEXT contenente il pacchetto.
SWIPE Ometti CONFIG key per un'azione SWIPE. Questo utilizza solo SWIPE_CONFIG
WAIT_MS Un oggetto con un valore TEXT contenente il numero di millisecondi di attesa.

Le azioni correlate allo scorrimento richiedono una configurazione aggiuntiva, come indicato di seguito:

CONFIGURA_SCROLL

Oggetto Descrizione
SCROLL_ACTION USE_GESTURE o USE_BUTTON
SCROLL_DIRECTION HORIZONTAL o VERTICAL
SCROLL_ELEMENT Un oggetto che indica al container da scorrere, utilizzando la stessa forma di una UI Configurazione dell'elemento (vedi sopra).
SCROLL_FORWARD, SCROLL_BACKWARD I pulsanti di scorrimento avanti e indietro (necessari quando SCROLL_ACTION è USE_BUTTON).
SCROLL_MARGIN Se SCROLL_ACTION è USE_GESTURE, la distanza dal bordo del container per avviare e arrestare il trascinamento che verrà utilizzato eseguire lo scorrimento (facoltativo, il valore predefinito = 10).
SCROLL_WAIT_TIME Se SCROLL_ACTION è USE_GESTURE, l'ora in millisecondi di attesa tra un gesto di scorrimento e l'altro clic. (Facoltativo,valore predefinito = 1).

SCORRI_CONFIG

Oggetto Descrizione
SWIPE_DIRECTION TOP_TO_BOTTOM, BOTTOM_TO_TOP, LEFT_TO_RIGHT oppure RIGHT_TO_LEFT
SWIPE_FRACTION

Uno dei seguenti:

  • FULL: gesto di scorrimento dal bordo dello schermo al bordo dello schermo

    OPPURE,
  • DEFAULT: da bordo schermo a bordo dello schermo, con un cinque (5) su ogni lato.

    OPPURE
  • THREE_QUARTER, HALF o QUARTER: il gesto di scorrimento termina a cinque (5) pixel da dal bordo dello schermo e inizia dal punto in modo che copra la distanza dello schermo indicata.
NUMBER_OF_STEPS Il numero di passaggi da usare per eseguire lo scorrimento. Leggi i segmentSteps.

Crea ed esegui

Il framework Spectatio viene creato automaticamente come parte dell'APK di test. Per creare l'APK di test, il codebase AOSP deve trovarsi sulla workstation locale. Dopo il dell'APK di test, l'utente deve installare l'APK sul dispositivo ed eseguire test.

Il seguente esempio di codice mostra la creazione, l'installazione e l'esecuzione di un di test dell'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

In questi comandi:

  • TEST-APK-NAME: il nome dell'app da testare. Ad esempio, imposta Da TEST-APK-NAME a AndroidAutomotiveSettingsTests per testare le impostazioni Wi-Fi come specificato in Android.bp . Il nome dell'APK è indicato nel rispettivo file Android.bp per Automotive test.

  • DEVICE-SERIAL: l'ID seriale del DUT. Questo parametro non è necessaria se all'host è connesso un solo dispositivo.

  • config-file-path: parametro facoltativo obbligatorio solo per fornire configurazioni UI del dispositivo non predefinite, come specificato nella configurazione di JSON un file YAML. Se non viene specificato, il valore usa valori predefiniti per l'esecuzione dei test.

  • PATH-FOR-BUILT-TEST-APK: il percorso in cui viene creato l'APK di test. quando viene eseguito il comando make.

  • TEST-PACKAGE: il nome del pacchetto di test.

  • TEST-CLASSNAME: il nome della classe di prova. Ad esempio, per Impostazioni Wi-Fi, il pacchetto di test è android.platform.tests e il nome della classe di test è WifiSettingTest.

Raccolta di snippet Automotive

La libreria di snippet Automotive è un insieme di librerie Android Test per Android Open Source Project (AOSP) progettato per interagire con il settore auto e motori app e servizi. Sfrutta Spectatio con un comodo meccanismo per l'esecuzione di chiamate di procedura remota (RPC) da una macchina host (di test) a una Dispositivo con tecnologia Android.

Inizia

Prima di iniziare, rivedi queste sezioni.

Prerequisiti

  • Python 3.x installato sulla macchina host.
  • Configurazione dell'ambiente AOSP con gli strumenti di creazione necessari.
  • Un dispositivo Android Automotive (emulatore o dispositivo fisico) con accesso adb.

Compilation

Per compilare i vari snippet forniti dalla libreria di snippet Automotive, puoi utilizzare il file android.bp fornito. I seguenti comandi nella precedente per compilare l'APK.

Implementazione

Dopo aver compilato correttamente le librerie di snippet, esegui il deployment degli APK risultanti in il dispositivo di destinazione utilizzando il comando adb install menzionato nell'articolo .

Esegui test

Le librerie di snippet espongono diversi metodi RPC per interagire con lo strumento di un sistema operativo completo. Questi metodi possono essere richiamati tramite il framework Mobly dall’host in una macchina virtuale. Supponendo che tu abbia configurato l'ambiente di test Mobly, puoi utilizzare snippet_shell.py per aprire una shell Python interattiva in cui puoi richiamare manualmente i metodi RPC sul dispositivo. Esempio di chiamata:

python3 snippet_shell.py com.google.android.mobly.snippet.bundled -s <serial>

Sostituisci <serial> con il numero di serie del dispositivo, che puoi ottenere ai dispositivi ADB se sono connessi più dispositivi.

Librerie incluse

La libreria di snippet Automotive include le seguenti librerie di snippet e assistenti:

  • AutomotiveSnippet: fornisce API relative alle operazioni del veicolo, ad esempio composizione, controllo del volume, tasti rigidi del veicolo e interazione con il centro multimediale.

  • PhoneSnippet: Fornisce API correlate alla telefonia, tra cui gestione delle chiamate, la navigazione dei contatti e le operazioni tramite SMS.

Lo snippet Automotive e PhoneSnippet condividono una logica comune. In particolare, è possibile invadere le chiamate RCP relative al Bluetooth per accoppiare un'auto e un telefono. Questo bt_discovery_test mostra come.