Spectatio: framework de test pour l'automobile

Spectatio est un framework de test Open Source développé pour tester Android Automotive OS (AAOS) sur des appareils réels et virtuels. Spectatio fournit des API pour testant des applications sur un appareil automobile et est une solution extensible et évolutive utilisé pour vérifier la capacité et les performances d’AAOS et de ses applications.

Conception de haut niveau

Le framework Spectatio est adaptable et extensible à différentes interfaces utilisateur AAOS mises en œuvre. Il est utilisé pour tester la capacité et les performances d'AAOS sur le matériel de l'appareil, les émulateurs et les environnements virtualisés.

La figure suivante explique la conception générale du framework Spectatio.

Conception générale du framework Spectatio

Figure 1 : Conception de haut niveau du framework Spectatio

Basé sur UI Automator, le framework Spectatio fournit un ensemble d'API. pour créer des tests d'interface utilisateur qui interagissent avec les applications utilisateur et système sur AAOS. Automobile utilisent les API fournies par le framework Spectatio à des fins de test, ce qui facilite ces tests indépendamment de l'appareil testé, et ils peuvent être testés pour différents types d'appareils, le cas échéant.

La figure 1 montre que le framework Spectatio est modularisé à partir de références telles que Téléphone, Medicenter et Paramètres via des applications des interfaces et des assistants, ce qui permet de l'étendre facilement à de nouvelles applications. The Spectatio réutilise les classes d'assistance standards et utilitaires courantes. Classe d'assistance standard est la classe parente de toutes les fonctions d'assistance de l'application et fournit de fonctions standards propres à un appareil ou applicables à toutes les applications. La classes d'assistance utilitaire fournissent des utilitaires tels que en lisant ou en écrivant des fichiers depuis l'appareil.

Architecture

Pour fournir un ensemble d'API permettant de créer des tests d'interface utilisateur, le framework Spectatio implémente des interfaces et des assistants spécifiques à l'application, tout en étendant l'application auxiliaire standard existante. et en important les classes d'assistance utilitaire.

La figure 2 illustre l'architecture de haut niveau du framework Spectatio et toutes les entités impliquées dans l'implémentation d'API permettant de tester une application.

Architecture de haut niveau du framework Spectatio

Figure 2. Architecture de haut niveau du framework Spectatio

L'interface d'assistance de l'application fournit un plan d'implémentation une aide d'application. Il comprend diverses fonctions d'assistance nécessaires pour tester des applications. Chaque application possède sa propre interface, comme IAutoSettingHelper. et IAutoDialHelper. Pour en savoir plus et obtenir la liste des fonctions d'interface, consultez les fonctions de l'interface d'assistance d'application sur AOSP.

La classe d'assistance standard est constituée d'attributs et de fonctions standards requis pour la configuration de l'appareil, mais qui ne sont spécifiques à aucune application, comme pressHome et scroll. La classe d'assistance standard est définie dans AbstractAutoStandardAppHelper.java.

Les classes d'assistance utilitaire sont utilisées par le framework. Pour exemple, AutoJsonUtility.java est un classe utilitaire qui charge le fichier de configuration JSON de l'appareil donné et les mises à jour les configurations du framework au moment de l'exécution.

Le module d'implémentation de l'application d'assistance est au cœur de d'infrastructure. Il contient l'implémentation des fonctions d'assistance définies dans l'interface d'assistance d'application, qui est requise pour tester des applications sur appareil automobile. Chaque application a sa propre implémentation, comme SettingHelperImpl et DialHelperImpl utilisé par les tests Automotive pour tester les applications. Pour en savoir plus et consulter la liste consultez les fonctions d'implémentation de l'assistant d'application. sur AOSP.

Tests automobiles Utiliser les fonctions d'implémentation de l'application d'assistance pour tester différentes opérations en lien avec l'application. Utiliser la classe HelperAccessor pour accéder aux fonctions d'implémentation de l'assistant d'application.

Le code suivant montre la configuration, le nettoyage et l'exécution d'un exemple d'auto-test.

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

Personnalisation

Le framework Spectatio est indépendant de l'UI de l'appareil. Il est donc évolutif en testant des appareils avec des interfaces et du matériel variés. Pour cela, Spectatio utilise les configurations par défaut de l'appareil de référence. À sont compatibles avec les configurations d'appareil autres que celles par défaut, le framework utilise de configuration lors de l'exécution afin de définir les modifications souhaitées pour l'interface utilisateur de l'appareil. A Le fichier de configuration JSON est compatible avec des éléments d'interface utilisateur tels que TEXT, DESCRIPTION et RESOURCE_ID, ainsi que les paramètres path, et ne doit contenir que les informations sur les modifications apportées à l'interface utilisateur de l'appareil testé. Les autres éléments de l'interface utilisateur utilisent fournies dans le framework.

Configurations par défaut des appareils

L'exemple de fichier de configuration JSON suivant indique l'appareil disponible et leurs valeurs par défaut.

Cliquez ici pour afficher un exemple de code JSON fichier de configuration

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

Autres configurations d'appareil

L'exemple de code suivant montre un fichier de configuration JSON dans lequel les paramètres par défaut sont remplacés par ceux de l'appareil testé. Dans cet exemple :

  • Les paramètres Internet sont nommés Réseau et Internet sur des appareils de référence Connectivité sur l'appareil testé.

  • Les paramètres de date et d'heure sont disponibles sous Paramètres > Date et heure pour appareils de référence et sous Paramètres > Système > Date et heure de l'appareil testé.

// 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"
    },
    ....
}

Lorsque le fichier de configuration JSON est prêt, il est fourni au moment de l'exécution, comme indiqué dans le bloc de code suivant:

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

Dans cette commande :

  • DEVICE-SERIAL: identifiant de série de l'appareil testé. Ce paramètre n'est pas requise si un seul appareil est connecté à l'hôte.

  • PATH-TO-JSON-FILE: chemin d'accès du fichier JSON sur la machine hôte.

Format de la configuration

La configuration comprend cinq objets de niveau supérieur, avec les clés suivantes : et valeurs:

Objet Description
PACKAGES Objet décrivant le package principal de différentes applications, qui sont utilisés pour pour déterminer quand cette application est exécutée au premier plan.
ACTIONS Objet indiquant les types d'actions et les paramètres associés à diverses actions. Par exemple, vous pouvez choisir d'utiliser des boutons ou un geste pour faire défiler l'écran.
COMMANDS Objet spécifiant les commandes qui exécutent diverses actions.
UI_ELEMENTS Objet utilisé pour construire l'outil Automator d'UI "BySelector" qui sélectionne l'UI Éléments (décrits en détail ci-dessous).
WORKFLOWS Séquences d'actions qui accomplissent des tâches de haut niveau (décrites dans en détail ci-dessous).

Éléments de l'interface utilisateur

Chaque élément d'UI comporte un TYPE qui spécifie l'outil UI Automator rechercher pour identifier l'élément (comme l'ID de ressource, le texte et la description) ; de configuration associées à ce type. En général, dès qu'une application auxiliaire identifie un élément à l'écran à l'aide de cette configuration, il obtient exactement un élément. Si plusieurs éléments correspondent à la configuration, un élément arbitraire est utilisés dans le test. Par conséquent, la configuration doit (généralement) être écrite de manière à se limiter à un seul élément dans le contexte pertinent.

TEXTE

Il s'agit du type d'élément d'interface utilisateur le plus simple. L'élément d'interface utilisateur est identifié par son texte, et nécessite une correspondance exacte.

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

TEXTE_CONTAINS

Identique à TEXT, sauf que le VALUE spécifié ne doit apparaître qu'à un emplacement le texte de l'élément à mettre en correspondance.

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

DESCRIPTION

Il doit identifier l'élément à l'aide de son attribut description de contenu, ce qui nécessite une correspond.

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

ID_RESSOURCE

Identifiez l'élément par son ID de ressource, et vérifiez éventuellement le package de cet ID. La clé PACKAGE est facultative. En cas d'omission, tout package sera identique, et seule la partie de l'ID qui suit :id/ sera prise en compte.

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

CLIC ET FERMETURE

Identifiez l'élément selon qu'il est (ou n'est pas) cliquable ou déroulant. Il s'agit de types d'éléments très généraux et ne doivent généralement être utilisés que dans un MULTIPLE pour affiner un autre type d'élément. La clé FLAG est facultative. et défini par défaut sur true.

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

COURS

Identifier l'élément en fonction de sa classe.

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

HAS_ANCESTOR

Identifiez l'élément en consultant la hiérarchie des widgets au niveau de ses ancêtres. La La clé ANCESTOR contient un objet qui identifie l'ancêtre. La clé DEPTH spécifie à quelle hauteur regarder la hiérarchie. DEPTH est facultatif et comporte un la valeur par défaut de 1.

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

HAS_DESCENDANT

Identifiez l'élément en regardant ses enfants plus bas dans la hiérarchie. La La clé DESCENDANT contient un objet qui spécifie l'enfant à rechercher. La La clé DEPTH spécifie à quelle hauteur de la hiérarchie se situer. DEPTH est facultatif et a la valeur par défaut 1.

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

PLUSIEURS

d'identifier l'élément en fonction de plusieurs conditions simultanées ; doit être respectée.

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

Dans cet exemple, la configuration identifie un RelativeLayout ayant un descendant de profondeur 2, avec le texte Permission manager.

Workflows

Un flux de travail représente une séquence d'actions permettant d'accomplir une tâche tâche, qui peut différer suffisamment d'un type d'appareil à l'autre et est plus plus flexible pour être représentée dans la configuration que dans le code.

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

Chaque workflow est une paire clé-valeur où la clé correspond au nom du workflow et la valeur est un tableau d'actions à effectuer. Chaque action a un NAME, un TYPE, (généralement) un CONFIG et (parfois) un SWIPE_CONFIG ou un SCROLL_CONFIG. Pour la plupart des TYPE, CONFIG est un objet avec une clé UI_ELEMENT dont la valeur prend au même formulaire qu'une entrée d'élément d'interface utilisateur (voir ci-dessus). Ces TYPE sont les suivants:

APPUYER
APPUI LONGUE
CLIC
CLIC_LONG
CLIC_SI_EXISTE
HAS_UI_ÉLÉMENT_IN_FOREGROUND
DÉCOUVRIR_TO_FIND_AND_CLICK
FAIRE DÉFILER_TO_FIND_AND_CLICK_IF_EXIST
BALAYER_TO_FIND_AND_CLICK
FAITES_GLISSER_LE_FIND_ET_CLIC_SI_EXISTE

Pour les autres TYPE, les détails de la configuration sont les suivants:

Objet Description
COMMAND Un objet avec une valeur TEXT contenant la commande à exécuter.
HAS_PACKAGE_IN_FOREGROUND Un objet avec une valeur TEXT contenant le package.
SWIPE Omettez CONFIG key pour une action SWIPE. Ce utilise uniquement SWIPE_CONFIG
WAIT_MS Un objet dont la valeur TEXT contient le nombre de quelques millisecondes d'attente.

Les actions liées au défilement et au balayage nécessitent une configuration supplémentaire, comme suit:

FAIRE DÉFILER_CONFIG

Objet Description
SCROLL_ACTION USE_GESTURE ou USE_BUTTON
SCROLL_DIRECTION HORIZONTAL ou VERTICAL
SCROLL_ELEMENT Objet indiquant le conteneur à faire défiler, utilisant le même formulaire qu'une UI Configuration de l'élément (voir ci-dessus).
SCROLL_FORWARD, SCROLL_BACKWARD Les boutons de défilement avant et arrière (requis lorsque SCROLL_ACTION est USE_BUTTON).
SCROLL_MARGIN Si SCROLL_ACTION est USE_GESTURE, la distance du bord du conteneur pour démarrer et arrêter le déplacement qui sera utilisé pour effectuer le défilement (facultatif,valeur par défaut = 10).
SCROLL_WAIT_TIME Si SCROLL_ACTION est USE_GESTURE, il s'agit de l'heure de millisecondes d'attente entre les gestes de défilement lors de la recherche d'un objet cliquez dessus. (Facultatif,valeur par défaut = 1).

BALAYER_CONFIG

Objet Description
SWIPE_DIRECTION TOP_TO_BOTTOM, BOTTOM_TO_TOP, LEFT_TO_RIGHT ou RIGHT_TO_LEFT
SWIPE_FRACTION

L'un des éléments suivants:

  • FULL: geste de balayage du bord de l'écran vers le bord

    OU
  • DEFAULT: bord à l'écran, avec un trait de cinq (5) un tampon de pixels de chaque côté.

    OU
  • THREE_QUARTER, HALF ou QUARTER: le geste de balayage permet de terminer cinq (5) pixels du point de le bord de l'écran et commence au point la distance indiquée de l'écran.
NUMBER_OF_STEPS Nombre d'étapes à suivre pour effectuer le balayage. Consultez la segmentSteps.

Créer et exécuter

Le framework Spectatio est automatiquement créé avec l'APK test. Pour compiler APK de test, le codebase AOSP doit résider sur le poste de travail local. Après le l'APK test est créé, l'utilisateur doit installer l'APK sur l'appareil et exécuter la test.

L'exemple de code suivant montre le bâtiment, l'installation et l'exécution d'un APK de test.

# 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

Dans ces commandes:

  • TEST-APK-NAME: nom de l'application à tester. Par exemple, définissez TEST-APK-NAME sur AndroidAutomotiveSettingsTests pour tester les paramètres Wi-Fi comme indiqué dans le fichier Android.bp . Le nom de l'APK se trouve dans le fichier Android.bp correspondant pour le test automobile.

  • DEVICE-SERIAL: ID de série de l'appareil testé. Ce paramètre n'est pas requise si un seul appareil est connecté à l'hôte.

  • config-file-path: paramètre facultatif obligatoire uniquement pour fournir configurations d'interface utilisateur d'appareil autres que celles par défaut, comme spécifié dans la configuration JSON fichier. S'il n'est pas fourni, la valeur le framework utilise des valeurs par défaut pour exécuter les tests.

  • PATH-FOR-BUILT-TEST-APK: chemin d'accès à l'emplacement de compilation de l'APK de test lorsque la commande make est exécutée.

  • TEST-PACKAGE: nom du package de test.

  • TEST-CLASSNAME: nom de la classe de test. Par exemple, pour le champ Paramètres Wifi, le package de test est android.platform.tests et nom de la classe de test est WifiSettingTest.

Bibliothèque d'extraits pour Android Automotive

La bibliothèque d'extraits automatiques est un ensemble de bibliothèques Android Test pour la Projet Android Open Source (AOSP) conçu pour interagir avec le secteur automobile applications et services. Il exploite Spectatio à l'aide d'un mécanisme pratique permettant d'exécuter des appels de procédure à distance (RPC) depuis une machine hôte (test) vers une Appareil Android

Premiers pas

Avant de commencer, passez en revue ces sections.

Prérequis

  • Python 3.x installé sur la machine hôte
  • Configuration de l'environnement AOSP avec les outils de compilation nécessaires.
  • Un appareil Android Automotive (émulateur ou appareil physique) avec accès à adb

Compilation

Pour compiler les différents extraits fournis par la bibliothèque d'extraits automatiques, vous peut utiliser le fichier android.bp fourni. Les commandes suivantes pour compiler l'APK.

Déploiement

Une fois les bibliothèques d'extraits compilées, déployez les APK obtenus l'appareil cible à l'aide de la commande adb install mentionnée à l'étape précédente .

Exécuter des tests

Les bibliothèques d'extraits proposent plusieurs méthodes RPC pour interagir avec l'API du système d'exploitation. Ces méthodes peuvent être appelées via le framework Mobly à partir de l'hôte machine. Si l'environnement de test Mobly est configuré, vous pouvez utiliser snippet_shell.py pour ouvrir un shell Python interactif, dans lequel vous pouvez à appeler manuellement des méthodes RPC sur l'appareil. Exemple d'appel:

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

Remplacez <serial> par le numéro de série de l'appareil, que vous pouvez obtenir à l'aide de appareils adb si plusieurs appareils sont connectés.

Bibliothèques incluses

Elle inclut les bibliothèques d'extraits automatiques suivantes : assistants:

  • AutomotiveSnippet: fournit des API liées au fonctionnement des véhicules, comme les appels, le contrôle du volume, les touches physiques du véhicule et l'interaction avec le centre multimédia.

  • PhoneSnippet: fournit des API de téléphonie, telles que la gestion des appels, la navigation des contacts et les opérations SMS.

L'extrait Automotive et PhoneSnippet partagent une logique commune. Plus précisément, vous pouvez contourner les appels RCP liés au Bluetooth pour associer et un téléphone. Cet bt_discovery_test vous montre comment procéder.