Spectatio: Otomotiv Test Çerçevesi

Spectatio, Android Automotive OS'yi (AAOS) gerçek ve sanal cihazlarda test etmek için geliştirilmiş açık kaynaklı bir test çerçevesidir. Spectatio, uygulamaları bir otomotiv cihazında test etmek için API'ler sağlar ve AAOS ile uygulamalarının kapasitesini ve performansını doğrulamak için kullanılan genişletilebilir ve ölçeklenebilir bir çözümdür.

Üst düzey tasarım

Spectatio çerçevesi çeşitli AAOS UI uygulamaları için uyarlanabilir ve genişletilebilir. AAOS'un cihaz donanımı, emülatörler ve sanallaştırılmış ortamlardaki kapasitesini ve performansını test etmek için kullanılır.

Aşağıdaki şekil Spectatio çerçevesinin üst düzey tasarımını açıklamaktadır.

Spectatio çerçevesi üst düzey tasarım

Şekil 1. Spectatio çerçevesinin üst düzey tasarımı.

UI Automator'ın üzerine inşa edilen Spectatio çerçevesi, AAOS'ta kullanıcı ve sistem uygulamalarıyla etkileşime giren UI testleri oluşturmak için bir dizi API sağlar. Otomotiv testleri, test için Spectatio çerçevesi tarafından sağlanan API'leri kullanır; bu, bu testleri test edilen cihazdan (DUT) bağımsız hale getirir ve destekleniyorsa çeşitli cihazları test etmek için ölçeklenebilir hale getirir.

Şekil 1, Spectatio çerçevesinin Dialer, Medicenter ve Settings gibi referans uygulamalara dayalı olarak uygulamaya özel arayüzler ve yardımcılar kullanılarak modüler hale getirildiğini ve böylece yeni uygulamalar için kolayca genişletilebildiğini göstermektedir. Spectatio çerçevesi, ortak standart ve yardımcı program yardımcı sınıflarını yeniden kullanır. Standart yardımcı sınıf, tüm uygulama yardımcı işlevleri için ana sınıftır ve aygıta özgü veya uygulamalar arasında geçerli olan standart işlevler sağlar. Yardımcı program yardımcı sınıfları, aygıttan dosya okuma veya yazma gibi yardımcı programlar sağlar.

Mimari

Spectatio çerçevesi, kullanıcı arayüzü testleri oluşturmaya yönelik bir dizi API sağlamak için uygulamaya özel arayüzler ve yardımcılar uygularken mevcut standart yardımcı sınıfını genişletir ve yardımcı program yardımcı sınıflarını içe aktarır.

Şekil 2, Spectatio çerçevesinin üst düzey mimarisini ve bir uygulamayı test etmek için API'lerin uygulanmasında yer alan tüm varlıkları göstermektedir.

Spectatio çerçevesi üst düzey mimarisi

Şekil 2. Spectatio çerçevesinin üst düzey mimarisi.

Uygulama yardımcı arayüzü, bir uygulama yardımcısının uygulanması için bir plan sağlar. Uygulamaları test etmek için gerekli olan çeşitli yardımcı işlevlerden oluşur. Her uygulamanın IAutoSettingHelper ve IAutoDialHelper gibi kendi arayüzü vardır. Daha fazla bilgi ve arayüz işlevlerinin bir listesi için AOSP'deki uygulama yardımcı arayüz işlevlerine bakın.

Standart yardımcı sınıf, cihaz kurulumu için gerekli olan ancak pressHome ve scroll gibi herhangi bir uygulamaya özel olmayan standart özniteliklerden ve işlevlerden oluşur. Standart yardımcı sınıf AbstractAutoStandardAppHelper.java tanımlanmıştır.

Yardımcı program yardımcı sınıfları çerçeve tarafından kullanılır. Örneğin, AutoJsonUtility.java , verilen aygıt JSON yapılandırma dosyasını yükleyen ve çalışma zamanında çerçeve yapılandırmalarını güncelleyen bir yardımcı program sınıfıdır.

Uygulama yardımcı uygulama modülü Spectatio çerçevesinin çekirdeğidir. Bir otomotiv cihazındaki uygulamaları test etmek için gerekli olan, uygulama yardımcı arayüzünde tanımlanan yardımcı işlevlerin uygulamasını içerir. Her uygulamanın, Otomotiv testleri tarafından uygulamaları test etmek için kullanılan SettingHelperImpl ve DialHelperImpl gibi kendi uygulaması vardır. Daha fazla bilgi ve uygulamaların bir listesi için AOSP'deki uygulama yardımcı uygulama işlevlerine bakın.

Otomotiv Testleri, uygulamayla ilgili çeşitli işlemleri test etmek için uygulama yardımcı uygulama işlevlerini kullanır. Uygulama yardımcı uygulama işlevlerine erişim kazanmak için HelperAccessor sınıfını kullanın.

Aşağıdaki kod örnek bir otomotiv testinin kurulumunu, temizliğini ve yürütülmesini gösterir.

@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 application
    autoApplicationHelper.open();
  }

  @After
  public void afterTest() {
    // Cleanup after each test.
    // For example - exit the application
    autoApplicationHelper.exit();
  }

  @Test
  public void testApplicationFeature() {
    // Test
    // For example - Test if application is open
    assertTrue("Application is not open.", autoApplicationHelper.isOpen());
  }
}

Özelleştirme

Spectatio çerçevesi, cihazın kullanıcı arayüzünden bağımsız olduğundan, çeşitli kullanıcı arayüzleri ve donanıma sahip cihazları test etmek için ölçeklenebilir. Bu ölçeklenebilirliğe ulaşmak için Spectatio, referans cihaza dayalı varsayılan cihaz konfigürasyonlarını kullanır. Varsayılan olmayan cihaz yapılandırmalarını desteklemek için çerçeve, cihaz için istenen kullanıcı arayüzü değişikliklerini ayarlamak üzere çalışma zamanında bir JSON yapılandırma dosyası kullanır. JSON yapılandırma dosyası, path ayarlarıyla birlikte TEXT , DESCRIPTION ve RESOURCE_ID gibi kullanıcı arayüzü öğelerini destekler ve yalnızca DUT için kullanıcı arayüzü değişiklikleriyle ilgili bilgileri içermelidir. Kullanıcı arayüzü öğelerinin geri kalanı, çerçevede sağlanan varsayılan yapılandırma değerlerini kullanır.

Varsayılan cihaz yapılandırmaları

Aşağıdaki örnek JSON yapılandırma dosyası, mevcut cihaz yapılandırmalarını ve bunların varsayılan değerlerini gösterir.

Örnek JSON yapılandırma dosyasını görüntülemek için burayı tıklayın

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

Alternatif cihaz konfigürasyonları

Aşağıdaki kod örneği, varsayılan ayarların DUT'taki ayarlar tarafından geçersiz kılındığı JSON yapılandırma dosyası örneğini gösterir. Bu örnekte:

  • İnternet ayarları, referans cihazlarda Ağ ve internet , DUT'ta ise Bağlantı olarak adlandırılır.

  • Tarih ve saat ayarlarına referans cihazları için Ayarlar > Tarih ve saat bölümünden ve DUT için Ayarlar > Sistem > Tarih ve saat bölümünden ulaşılabilir.

// Default configuration file
{
    ....
    "SECURITY_SETTINGS_SCROLL_ELEMENT": {
      "TYPE": "RESOURCE_ID",
      "VALUE": "fragment_container",
    },
    ....
}

// JSON configuration file for non-reference device
{
    ....
    "SECURITY_SETTINGS_SCROLL_ELEMENT": {
      "TYPE": "RESOURCE_ID",
      "VALUE": "car_ui_recycler_view"
    },
    ....
}

JSON yapılandırma dosyası hazır olduğunda aşağıdaki kod bloğunda gösterildiği gibi çalışma zamanında sağlanır:

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

Bu komutta:

  • DEVICE-SERIAL : DUT'un seri kimliği. Ana bilgisayara yalnızca bir cihaz bağlıysa bu parametre gerekli değildir.

  • PATH-TO-JSON-FILE : Ana makinedeki JSON dosyasının yolu.

Yapılandırma formatı

Yapılandırmada aşağıdaki anahtarlara ve değerlere sahip beş üst düzey nesne vardır:

Nesne Tanım
PACKAGES Çeşitli uygulamaların ana paketini tanımlayan ve o uygulamanın ne zaman ön planda olduğunu belirlemek için kullanılan bir nesne.
ACTIONS Çeşitli eylemler için eylem türlerini ve parametrelerini gösteren bir nesne. Örneğin, kaydırmak için düğmelerin mi yoksa bir hareketin mi kullanılacağı.
COMMANDS Çeşitli eylemleri gerçekleştiren komutları belirten bir nesne.
UI_ELEMENTS UI Öğelerini seçen UI Automator "BySelectors"ı oluşturmak için kullanılan bir nesne (aşağıda ayrıntılı olarak açıklanmıştır).
WORKFLOWS Üst düzey görevleri gerçekleştiren eylem dizileri (aşağıda ayrıntılı olarak açıklanmıştır).

Kullanıcı Arayüzü Öğeleri

Her UI Öğesinin, UI Automator'ın öğeyi (kaynak kimliği, metin ve açıklama gibi) ve o türle ilişkili yapılandırma değerlerini tanımlamak için neyi arayacağını belirten bir TYPE vardır. Genel olarak, bir yardımcı bu yapılandırmayı kullanarak ekrandaki bir öğeyi tanımladığında tam olarak bir öğe alır. Birden fazla öğenin konfigürasyonla eşleşmesi durumunda testte rastgele bir öğe kullanılır. Bu nedenle, konfigürasyon (genellikle) ilgili bağlamda tek bir öğeye daraltacak kadar spesifik olarak yazılmalıdır.

METİN

Bu en basit UI Öğesi türüdür. Kullanıcı Arayüzü Öğesi, metniyle tanımlanır ve tam bir eşleşme gerektirir.

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

TEXT_CONTAINS

Belirtilen VALUE yalnızca eşleştirilecek öğenin metninin herhangi bir yerinde görünmesi gerekmesi dışında TEXT ile aynıdır.

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

TANIM

Öğeyi, tam eşleşme gerektiren içerik açıklaması özelliğine göre tanımlayın.

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

RESOURCE_ID

Öğeyi kaynak kimliğine göre tanımlayın ve isteğe bağlı olarak bu kimliğin paket bileşenini de kontrol edin. PACKAGE tuşu isteğe bağlıdır; atlanırsa herhangi bir paket eşleşecek ve kimliğin yalnızca :id/ den sonraki kısmı dikkate alınacaktır.

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

TIKLANABİLİR, KAYDIRILABİLİR

Öğeyi, tıklanabilir veya kaydırılabilir olmasına (veya olmamasına) göre tanımlayın. Bunlar çok geniş öğe türleridir ve genellikle başka bir öğe türünü daraltmaya yardımcı olmak için yalnızca MULTIPLE kullanılmalıdır. FLAG anahtarı isteğe bağlıdır ve varsayılan olarak true şeklindedir.

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

SINIF

Öğeyi sınıfına göre tanımlayın.

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

HAS_ANCESTOR

Öğeyi, widget hiyerarşisini atalarına bakarak tanımlayın. ANCESTOR anahtarı, atayı tanımlayan bir nesneyi tutar. DEPTH tuşu hiyerarşinin ne kadar yukarısına bakılacağını belirtir. DEPTH isteğe bağlıdır ve varsayılan değeri 1 .

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

HAS_DESCENDANT

Öğeyi, hiyerarşideki alt öğelerine bakarak tanımlayın. DESCENDANT anahtarı, aranacak çocuğu belirten bir nesneyi tutar. DEPTH tuşu hiyerarşinin ne kadar yukarısına bakılacağını belirtir. DEPTH isteğe bağlıdır ve varsayılan değeri 1 .

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

ÇOKLU

Öğeyi, hepsinin karşılanması gereken birden fazla eşzamanlı koşula göre tanımlayın.

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

Bu örnekte yapılandırma, derinlik 2 bir alt öğeye sahip olan ve Permission manager metnini içeren bir RelativeLayout tanımlar.

İş akışları

İş akışı, belirli bir görevi gerçekleştirmek için kullanılan, aygıt türünden aygıt türüne yeterince farklılık gösterebilen ve yapılandırmada temsil edilmesi koddan daha esnek olan bir dizi eylemi temsil eder.

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

Her iş akışı, anahtarın iş akışının adı ve değerin gerçekleştirilecek eylemler dizisi olduğu bir anahtar/değer çiftidir. Her eylemin bir NAME , bir TYPE , (genellikle) bir CONFIG ve (bazen) bir SWIPE_CONFIG veya SCROLL_CONFIG vardır. Çoğu TYPE için CONFIG , değeri bir UI Öğesi girişiyle aynı formu alan UI_ELEMENT anahtarına sahip bir nesnedir (yukarıya bakın). Bu TİPLER şunlardır:

BASMAK
UZUN BASMA
TIKLAMAK
LONG_CLICK
CLICK_IF_EXIST
HAS_UI_ELEMENT_IN_FOREGROUND
SCROLL_TO_FIND_AND_CLICK
SCROLL_TO_FIND_AND_CLICK_IF_EXIST
SWIPE_TO_FIND_AND_CLICK
SWIPE_TO_FIND_AND_CLICK_IF_EXIST

Diğer TİPler için konfigürasyon ayrıntıları şunlardır:

Nesne Tanım
COMMAND Yürütülecek komutu içeren TEXT değerine sahip bir nesne.
HAS_PACKAGE_IN_FOREGROUND Paketi içeren TEXT değerine sahip bir nesne.
SWIPE SWIPE eylemi için CONFIG key atlayın. Bu yalnızca SWIPE_CONFIG kullanır
WAIT_MS Beklenecek milisaniye sayısını içeren TEXT değerine sahip bir nesne.

Kaydırma ve kaydırmayla ilgili eylemler aşağıdaki gibi ek yapılandırma gerektirir:

SCROLL_CONFIG

Nesne Tanım
SCROLL_ACTION USE_GESTURE veya USE_BUTTON
SCROLL_DIRECTION HORIZONTAL veya VERTICAL
SCROLL_ELEMENT Kullanıcı Arayüzü Öğesi yapılandırmasıyla aynı formu kullanan, kaydırılacak kabı belirten bir nesne (yukarıya bakın).
SCROLL_FORWARD , SCROLL_BACKWARD İleri ve geri kaydırma düğmeleri ( SCROLL_ACTION USE_BUTTON olduğunda gereklidir).
SCROLL_MARGIN SCROLL_ACTION USE_GESTURE ise, kaydırmayı gerçekleştirmek için kullanılacak sürüklemeyi başlatmak ve durdurmak için kabın kenarından olan mesafe ( İsteğe bağlı, varsayılan = 10).
SCROLL_WAIT_TIME SCROLL_ACTION USE_GESTURE ise tıklatılacak bir nesneyi ararken kaydırma hareketleri arasında beklenecek milisaniye cinsinden süre. ( İsteğe bağlı, varsayılan = 1).

SWIPE_CONFIG

Nesne Tanım
SWIPE_DIRECTION TOP_TO_BOTTOM , BOTTOM_TO_TOP , LEFT_TO_RIGHT veya RIGHT_TO_LEFT
SWIPE_FRACTION

Aşağıdakilerden biri :

  • FULL : Hareketi ekran kenarından ekran kenarına doğru kaydırın

    VEYA,
  • DEFAULT : Her iki tarafta beş (5) piksel arabellek ile ekran kenarından ekran kenarına.

    VEYA,
  • THREE_QUARTER , HALF veya QUARTER : Kaydırma hareketi ekranın kenarından beş (5) piksel uzakta bitirir ve ekranda belirtilen mesafeyi kapsayacak şekilde başlar.
NUMBER_OF_STEPS Kaydırmayı gerçekleştirmek için kullanılacak adım sayısı. segmentSteps bakın.

Oluşturun ve yürütün

Spectatio çerçevesi, test APK'sının bir parçası olarak otomatik olarak oluşturulur. Test APK'sını oluşturmak için AOSP kod tabanının yerel iş istasyonunda bulunması gerekir. Test APK'sı oluşturulduktan sonra kullanıcının APK'yı cihaza yüklemesi ve testi yürütmesi gerekir.

Aşağıdaki kod örneği bir test APK'sının oluşturulmasını, kurulmasını ve yürütülmesini gösterir.

# 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

Bu komutlarda:

  • TEST-APK-NAME : Test edilecek uygulamanın adı. Örneğin, Wi-Fi ayarlarını Android.bp dosyasında belirtildiği şekilde test etmek için TEST-APK-NAME AndroidAutomotiveSettingsTests olarak ayarlayın. APK'nın adı Otomotiv testi için ilgili Android.bp dosyasında bulunabilir.

  • DEVICE-SERIAL : DUT'un seri kimliği. Ana bilgisayara yalnızca bir cihaz bağlıysa bu parametre gerekli değildir.

  • config-file-path : JSON yapılandırma dosyasında belirtildiği gibi yalnızca varsayılan olmayan cihaz kullanıcı arayüzü yapılandırmalarını sağlamak için gerekli olan isteğe bağlı parametre. Sağlanmadığı takdirde çerçeve, testleri yürütmek için varsayılan değerleri kullanır.

  • PATH-FOR-BUILT-TEST-APK : make komutu yürütüldüğünde test APK'sının oluşturulduğu yol.

  • TEST-PACKAGE : Test paketinin adı.

  • TEST-CLASSNAME : Test sınıfının adı. Örneğin, Wifi Ayarları testi için test paketi android.platform.tests ve test sınıfı adı WifiSettingTest şeklindedir.

Otomotiv Parçacık Kitaplığı

Otomotiv Parçacık Kitaplığı, otomotiv uygulamaları ve hizmetleriyle etkileşimde bulunmak üzere tasarlanmış Android Açık Kaynak Projesi (AOSP) için bir dizi Android Test kitaplığıdır. Bir ana bilgisayar (test) makinesinden Android destekli bir cihaza uzaktan prosedür çağrıları (RPC'ler) yürütmek için uygun bir mekanizma ile Spectatio'dan yararlanır.

Başlarken

Başlamadan önce bu bölümleri inceleyin.

Önkoşullar

  • Ana makinede Python 3.x yüklü.
  • Gerekli derleme araçlarıyla AOSP ortamı kurulumu.
  • Adb erişimi olan bir Android otomotiv cihazı (emülatör veya fiziksel cihaz).

Derleme

Automotive Snippet Library tarafından sağlanan çeşitli parçacıkları derlemek için sağlanan android.bp dosyasını kullanabilirsiniz. APK'yi derlemek için önceki bölümdeki komutları takip edin.

Dağıtım

Snippet kitaplıklarını başarıyla derledikten sonra, önceki bölümde bahsedilen adb install komutunu kullanarak ortaya çıkan APK'ları hedef cihaza dağıtın.

Testleri çalıştır

Parçacık kitaplıkları, otomotiv sistemiyle etkileşime geçmek için çeşitli RPC yöntemlerini açığa çıkarır. Bu yöntemler ana makineden Mobly çerçevesi aracılığıyla çağrılabilir. Mobly test ortamını kurduğunuzu varsayarsak, snippet_shell.py betiğini kullanarak etkileşimli bir Python kabuğu açabilirsiniz; burada cihazda RPC yöntemlerini manuel olarak çağırabilirsiniz. Örnek çağrı:

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

<serial> ifadesini, birden fazla cihaz bağlıysa adb devices ile alabileceğiniz cihaz seri numarasıyla değiştirin.

Dahil edilen kütüphaneler

Otomotiv Parçacık Kitaplığı aşağıdaki parçacık kitaplıklarını ve yardımcıları içerir:

  • AutomotiveSnippet: Arama, ses kontrolü, araç sabit tuşları ve medya merkezi etkileşimi gibi araç işlemleriyle ilgili API'ler sağlar.

  • PhoneSnippet: Arama yönetimi, kişilere göz atma ve SMS işlemleri dahil olmak üzere telefonla ilgili API'ler sağlar.

Otomotiv pasajı ve PhoneSnippet'in bazı ortak mantığı vardır. Özellikle, bir araba ile bir telefon cihazını eşleştirmek için Bluetooth ile ilgili RCP çağrılarına izin verebilirsiniz. Bu bt_discovery_test bunun nasıl olduğunu gösterir.