Spectatio: platforma do testów motoryzacyjnych

Spectatio to platforma testowa typu open source opracowana do testowania Androida. Automotive OS (AAOS) na urządzeniach rzeczywistych i wirtualnych. Spectatio udostępnia interfejsy API testowania aplikacji na urządzeniu samochodowym; jest to elastyczne i skalowalne rozwiązanie, służy do weryfikacji możliwości i wydajności AAOS oraz jego aplikacji.

Projektowanie wysokiego poziomu

Platformę Spectatio można dostosowywać i rozwijać pod kątem różnych UI systemu AAOS implementacji. Służy do testowania możliwości i wydajności AAOS na sprzęcie, emulatorach i wirtualizowanych środowiskach.

Na ilustracji poniżej przedstawiono ogólny projekt platformy Spectatio.

Wysoki poziom platformy Spectatio

Rysunek 1. Ogólny projekt platformy Spectatio.

Platforma Spectatio powstała jako uzupełnienie interfejsu UI Automator i udostępnia zestaw interfejsów API do tworzenia testów interfejsu, które współdziałają z aplikacjami użytkownika i systemowymi w AAOS. Motoryzacja Testy korzystają z interfejsów API udostępnianych przez platformę Spectatio, te testy są niezależne od testowanego urządzenia i można je skalować na różnych urządzeniach (jeśli są obsługiwane).

Rysunek 1 pokazuje, że platforma Spectatio jest modułowa na podstawie odwołania np. Telefon, Centrum Mediolanu i Ustawienia, z interfejsami i elementami pomocniczymi, które można łatwo rozszerzyć na nowe aplikacje. Spectatio korzysta z popularnych klas obiektów pomocniczych i klas pomocniczych. Standardowa klasa pomocnicza to klasa nadrzędna dla wszystkich funkcji pomocniczych aplikacji i zapewnia standardowych funkcji, które są zależne od urządzenia lub mają zastosowanie w różnych aplikacjach. klasy pomocnicze udostępniają takie narzędzia jak do odczytywania i zapisywania plików na urządzeniu.

Architektura

Aby udostępnić zestaw interfejsów API do tworzenia testów UI, platforma Spectatio implementuje interfejsów i pomocników w przypadku określonych aplikacji przy jednoczesnym rozbudowaniu istniejącego standardowego pomocnika i zaimportować klasy pomocnicze.

Rysunek 2 ilustruje ogólną architekturę platformy Spectatio wszystkie podmioty zaangażowane w implementację interfejsów API na potrzeby testowania aplikacji.

Architektura wysokiego poziomu platformy Spectatio

Rysunek 2. Architektura wysokiego poziomu Spectatio.

Interfejs Asystenta aplikacji zawiera plan implementacji jako asystenta aplikacji. Składa się z różnych funkcji pomocniczych, które są niezbędne do testowania aplikacji. Każda aplikacja ma własny interfejs, np. IAutoSettingHelper i IAutoDialHelper. Więcej informacji oraz listę funkcji interfejsu znajdziesz w artykule o funkcjach interfejsu Asystenta aplikacji w AOSP.

Standardowa klasa pomocnicza składa się ze standardowych atrybutów i funkcji, które są są wymagane do konfiguracji urządzenia, ale nie dotyczą żadnej konkretnej aplikacji, np. pressHome i scroll. Standardowa klasa pomocnicza jest zdefiniowana w AbstractAutoStandardAppHelper.java.

Platforma używa klas pomocniczych narzędzi. Dla: na przykład AutoJsonUtility.java to klasa narzędzia, która wczytuje plik konfiguracji JSON danego urządzenia i aktualizuje go konfiguracji platformy w czasie działania.

Moduł implementacji Asystenta aplikacji to podstawowy element Spectatio platformy. Zawiera on implementację funkcji pomocniczych zdefiniowanych w interfejsu pomocniczego, który jest wymagany do testowania aplikacji do samochodu. Każda aplikacja ma własną implementację, np. SettingHelperImpl oraz DialHelperImpl, używane przez testów aplikacji w branży motoryzacyjnej. Więcej informacji oraz listę zapoznaj się z funkcjami implementacji Asystenta aplikacji w AOSP.

Testy motoryzacyjne używanie funkcji implementacji Asystenta aplikacji do testowania różnych operacji związane z aplikacją. Korzystanie z zajęć w HelperAccessor aby uzyskać dostęp do funkcji implementacji pomocniczej aplikacji.

Ten kod przedstawia konfigurację, czyszczenie i wykonanie przykładu testów motoryzacyjnych.

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

Dostosowywanie

Platforma Spectatio jest niezależna od interfejsu urządzenia, więc można ją skalować z urządzeniami do testowania z różnymi interfejsami i sprzętem. Aby osiągnąć tę skalowalność, Spectatio używa domyślnych konfiguracji urządzeń na podstawie urządzenia referencyjnego. Do obsługuje konfiguracje urządzeń inne niż domyślne, platforma korzysta z kodu JSON pliku konfiguracji w czasie działania, aby ustawić żądane zmiany interfejsu użytkownika urządzenia. O Plik konfiguracji JSON obsługuje elementy interfejsu takie jak TEXT, DESCRIPTION i Pole RESOURCE_ID, razem z ustawieniami path, musi zawierać wyłącznie informacje o zmianach w interfejsie dla DUT. Pozostałe elementy interfejsu używają wartości domyślnych. dostępne w ramach platformy.

Domyślne konfiguracje urządzeń

Poniższy przykładowy plik konfiguracji JSON pokazuje dostępne urządzenie konfiguracji i ich wartościach domyślnych.

Kliknij tutaj, aby wyświetlić przykładowy plik JSON plik konfiguracji

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

Konfiguracje alternatywne

Poniższy przykładowy kod to przykład pliku konfiguracji JSON, w którym ustawienia domyślne zostaną zastąpione przez ustawienia urządzenia mobilnego. W tym przykładzie:

  • Ustawienia internetowe to Sieć z internetu na urządzeniach referencyjnych Połączenia na urządzeniach DUT.

  • Ustawienia daty i godziny są dostępne w sekcji Ustawienia > Data i godzina dla oraz w sekcji Ustawienia > System > Data i godzina przeprowadzki.

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

Gotowy plik konfiguracji JSON jest udostępniany w czasie działania, jak pokazano w tym artykule następujący blok kodu:

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

W tym poleceniu:

  • DEVICE-SERIAL: identyfikator seryjny urządzenia pokładowego (DUT). Ten parametr nie jest wymagane, jeśli z hostem jest połączone tylko jedno urządzenie.

  • PATH-TO-JSON-FILE: ścieżka pliku JSON na hoście.

.

Format konfiguracji

W konfiguracji jest 5 obiektów najwyższego poziomu z następującymi kluczami i wartości:

Obiekt Opis
PACKAGES Obiekt opisujący główny pakiet różnych aplikacji służących do i określania, kiedy aplikacja działa na pierwszym planie.
ACTIONS Obiekt wskazujący typy działań i parametry różnych działań. Możesz na przykład używać przycisków lub gestów do przewijania.
COMMANDS Obiekt określający polecenia wykonujące różne działania.
UI_ELEMENTS Obiekt używany do tworzenia obiektu UI Automator `BySelectors`, który wybiera interfejs Elementy (opisane szczegółowo poniżej).
WORKFLOWS Sekwencje działań prowadzących do zadań wysokiego poziomu (opisane w szczegóły poniżej).

Elementy interfejsu

Każdy element interfejsu ma parametr TYPE, który określa, czego będzie szukać Automator UI identyfikować element (np. identyfikator zasobu, tekst i opis), a także wartości konfiguracji powiązanych z tym typem. Ogólnie rzecz biorąc, gdy pomocnik identyfikuje element na ekranie za pomocą tej konfiguracji, uzyskuje dokładnie jeden element. Jeśli do konfiguracji pasuje wiele elementów, każdy z nich ma postać używane w teście. Dlatego konfiguracja powinna być zapisana. na tyle, że zawęża się do jednego elementu w odpowiednim kontekście.

TEKST

Jest to najprostszy typ elementu interfejsu. Element interfejsu jest identyfikowany przez tekst, i wymaga dokładnego dopasowania.

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

TEXT_CONTAINS

Tak samo jak TEXT, z tą różnicą, że określony element VALUE musi występować tylko gdzieś w tekst elementu, który ma zostać dopasowany.

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

OPIS

Można wskazać element na podstawie jego atrybutu opisu treści, wymagając dokładnego dopasowania.

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

IDENTYFIKATOR_ZASOBU

Zidentyfikuj element na podstawie jego identyfikatora zasobu, opcjonalnie sprawdzając pakiet danego identyfikatora. Klucz PACKAGE jest opcjonalny. w przypadku jego pominięcia dowolny pakiet i uwzględniana będzie tylko część identyfikatora po :id/.

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

KLIKALNE, PRZEWIJANE

Zidentyfikuj element na podstawie tego, czy można go kliknąć lub przewijać. Są to bardzo ogólne typy elementów i zwykle należy ich używać MULTIPLE, aby zawęzić zakres danych do innego typu elementu. Klucz FLAG jest opcjonalny. i ustawia domyślną wartość true.

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

ZAJĘCIA

Identyfikuj element na podstawie jego klasy.

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

HAS_ANCESTOR

Zidentyfikuj element, wyszukując hierarchię widżetów na jego elementy nadrzędne. Klucz ANCESTOR zawiera obiekt, który identyfikuje element nadrzędny. Klucz DEPTH określa, jak daleko w hierarchii należy sięgać. Atrybut DEPTH jest opcjonalny i zawiera: wartość domyślna to 1.

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

HAS_DESCENDANT

Zidentyfikuj element, sprawdzając hierarchię jego elementów podrzędnych. Klucz DESCENDANT zawiera obiekt, który wskazuje obiekt podrzędny do wyszukania. Klucz DEPTH określa, jak daleko w hierarchii należy się patrzeć. Pole DEPTH jest opcjonalne i ma domyślną wartość 1.

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

WIELE

Określ pierwiastek na podstawie wielu jednoczesnych warunków, z których wszystkie musi być spełniony.

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

W tym przykładzie konfiguracja identyfikuje RelativeLayout z parametrem element podrzędny na głębokości 2, który zawiera tekst Permission manager.

Workflows

Przepływ pracy reprezentuje sekwencję działań wykorzystywanych do realizacji określonego celu które może różnić się w zależności od typu urządzenia i jest bardziej reprezentować je w konfiguracji, a nie w kodzie.

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

Każdy przepływ pracy jest parą klucz-wartość, w której klucz to nazwa przepływu pracy jest tablicą działań, które mają zostać wykonane. Każda akcja ma atrybuty NAME, TYPE, (zwykle) CONFIG, a czasami SWIPE_CONFIG lub SCROLL_CONFIG. Dla: dla większości TYPE, CONFIG jest obiektem z kluczem UI_ELEMENT, którego wartość przyjmuje taki sam jak element interfejsu (patrz wyżej). Te TYPE to:

NACIŚNIJ
DŁUGIE_NACIŚNIENIE
KLIKNIĘCIE
DŁUGIE_KLIKNIĘCIE
KLIKNIJ_JEŻELI_ISTNIEJE
HAS_UI_ELEMENT_IN_FOREGROUND
PRZEWIŃ_DO_ZNAJDU_I_KLIKNIĘCIE
PRZEWIŃ_DO_ZNAJDŹ_I_KLIKNIĘCIE_JEŻELI_ISTNIEJE
PRZEWIŃ_DO_ZNAJDZENIA_I_KLIKNIĘCIE
PRZEWIŃ_DO_ZNAJDŹ_I_KLIKNIĘCIE_JEŻELI_ISTNIEJE

W przypadku pozostałych TYPE szczegóły konfiguracji:

Obiekt Opis
COMMAND Obiekt z wartością TEXT zawierający polecenie do wykonania.
HAS_PACKAGE_IN_FOREGROUND Obiekt z wartością TEXT zawierający pakiet.
SWIPE Pomiń CONFIG key w przypadku działania SWIPE. Ten używa tylko SWIPE_CONFIG
WAIT_MS Obiekt z wartością TEXT zawierającą liczbę milisekundy oczekiwania.

Działania związane z przewijaniem i przesuwaniem wymagają dodatkowej konfiguracji:

PRZEWIŃ_KONFIGURACJĘ

Obiekt Opis
SCROLL_ACTION Może to być USE_GESTURE lub USE_BUTTON.
SCROLL_DIRECTION Może to być HORIZONTAL lub VERTICAL.
SCROLL_ELEMENT Obiekt wskazujący kontener do przewinięcia, przy użyciu tej samej formy jak w interfejsie Konfiguracja elementu (patrz wyżej).
SCROLL_FORWARD, SCROLL_BACKWARD przyciski przewijania do przodu i do tyłu (wymagane, gdy SCROLL_ACTION to USE_BUTTON).
SCROLL_MARGIN Jeśli SCROLL_ACTION to USE_GESTURE, odległość od krawędzi kontenera, aby rozpocząć i zatrzymać przeciąganie, które zostanie użyte aby przewijać (opcjonalnie,domyślnie = 10).
SCROLL_WAIT_TIME Jeśli SCROLL_ACTION to USE_GESTURE, godzina w: milisekundy oczekiwania między gestami przewijania podczas wyszukiwania obiektu, kliknij. (Opcjonalne,wartość domyślna = 1).

PRZEWIŃ_KONFIGURACJĘ

Obiekt Opis
SWIPE_DIRECTION Może to być TOP_TO_BOTTOM, BOTTOM_TO_TOP, LEFT_TO_RIGHT lub RIGHT_TO_LEFT
SWIPE_FRACTION

Jedna z tych wartości:

  • FULL: gest przesunięcia od krawędzi ekranu do krawędzi ekranu

    LUB
  • DEFAULT: od krawędzi ekranu do krawędzi ekranu, w postaci 5 (5) z bufora pikseli po każdej stronie.

    LUB
  • THREE_QUARTER, HALF lub QUARTER: gest przesuwania kończy się o 5 (5) pikseli od krawędzie ekranu i zaczynają w takim punkcie, aby zasłaniały pokazuje odległość od ekranu.
NUMBER_OF_STEPS Liczba kroków do wykonania przesunięcia. Zobacz segmentSteps.

Kompilowanie i uruchamianie

Platforma Spectatio jest tworzona automatycznie jako część testowego pakietu APK. Tworzenie testowy plik APK, baza kodu AOSP musi znajdować się na lokalnej stacji roboczej. Po został utworzony testowy plik APK, użytkownik musi zainstalować go na urządzeniu i wykonać test.

Poniższy przykładowy kod pokazuje kompilację, instalację i wykonanie testowy plik 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

W tych poleceniach:

  • TEST-APK-NAME: nazwa aplikacji, która ma zostać przetestowana. Na przykład ustaw TEST-APK-NAME do AndroidAutomotiveSettingsTests, by przetestować ustawienia Wi-Fi zgodnie z opisem w Android.bp . Nazwę pakietu APK znajdziesz w odpowiednim pliku Android.bp dla: Test motoryzacyjny.

  • DEVICE-SERIAL: identyfikator seryjny urządzenia DUT. Ten parametr nie jest wymagane, jeśli z hostem jest połączone tylko jedno urządzenie.

  • config-file-path: parametr opcjonalny, który jest wymagany tylko do podania konfiguracje interfejsu użytkownika inne niż domyślne określone w konfiguracji JSON. . Jeśli nie zostanie podany, parametr platforma używa wartości domyślnych do wykonywania testów.

  • PATH-FOR-BUILT-TEST-APK: ścieżka do tworzenia testowego pakietu APK. po wykonaniu polecenia make.

  • TEST-PACKAGE: nazwa pakietu testowego.

  • TEST-CLASSNAME: nazwa klasy testowej. Na przykład w przypadku parametru Ustawienia Wi-Fi, pakiet testowy to android.platform.tests, a nazwa zajęć testowych to WifiSettingTest.

Biblioteka fragmentów treści dotyczących samochodów

Biblioteka fragmentów kodu Automotive to zbiór bibliotek testów Androida do wykorzystania Android Open Source Project (AOSP) zaprojektowany z myślą o interakcjach z motoryzacją aplikacji i usług. Wykorzystuje Spectatio w wygodnym mechanizmie do wykonywania zdalnych wywołań procedur (RPC) z hosta (testowego) do Urządzenie z systemem Android.

Rozpocznij

Zanim zaczniesz, przejrzyj te sekcje.

Wymagania wstępne

  • Python 3.x został zainstalowany na hoście.
  • Konfiguracja środowiska AOSP za pomocą niezbędnych narzędzi do kompilacji.
  • Urządzenie samochodowe z Androidem (emulator lub urządzenie fizyczne) z dostępem do adb.

Kompilacja

Aby skompilować różne fragmenty kodu z biblioteki fragmentów kodu Automotive, można użyć dostarczonego pliku android.bp. Następujące polecenia z poprzedniej wersji i skompilować plik APK.

Wdrażanie

Po skompilowaniu bibliotek fragmentu kodu wdróż powstałe pliki APK w urządzenie docelowe za pomocą wspomnianego w poprzednim artykule polecenia adb install .

Przeprowadzanie testów

Biblioteki fragmentów udostępniają kilka metod RPC do interakcji z mechanizmem samochodowym systemu. Te metody można wywoływać przy użyciu platformy Mobly z poziomu hosta na komputerze. Jeśli masz skonfigurowane środowisko testowe Mobly, możesz użyć snippet_shell.py, aby otworzyć interaktywną powłokę w języku Python, w której możesz ręcznie wywołać metody RPC na urządzeniu. Przykład wywołania:

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

Zastąp <serial> numerem seryjnym urządzenia, który uzyskasz w urządzenia adb, jeśli są połączone więcej niż 1 urządzenie.

Uwzględnione biblioteki

Biblioteka fragmentów kodu Automotive zawiera następujące biblioteki fragmentów i pomocnicy:

  • AutomotiveSnippet: udostępnia interfejsy API związane z działaniem pojazdów, takie jak: wybieranie numeru, regulację głośności, twarde klawisze w samochodzie i interakcję z centrum multimedialnym.

  • PhoneSnippet: udostępnia interfejsy API związane z telefonami, w tym obsługę połączeń, przeglądanie kontaktów i operacje SMS.

Fragmenty kodu samochodowego i fragment kodu z numerem telefonu mają wspólną logikę. Dotyczy to m.in. inicjowania wywołań RCP dotyczących Bluetootha w celu parowania i telefonie. bt_discovery_test pokazuje, jak to zrobić.