Özellik: Otomotiv test çerçevesi

Spectatio, Android Automotive OS'i (AAOS) gerçek ve sanal cihazlarda test etmek için geliştirilmiş açık kaynak bir test çerçevesidir. Spectatio, uygulamaları otomotiv cihazlarda test etmek için API'ler sağlar. AAOS ve 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 kullanıcı arayüzü uygulamaları için uyarlanabilir ve genişletilebilir. Cihaz donanımı, emülatör ve sanallaştırılmış ortamlarda AAOS'un kapasitesini ve performansını test etmek için kullanılır.

Aşağıdaki şekilde, Spectatio çerçevesinin üst düzey tasarımı açıklanmaktadır.

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

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

UI Automator'un üzerine inşa edilen Spectatio çerçevesi, AAOS'teki kullanıcı ve sistem uygulamalarıyla etkileşime geçen kullanıcı arayüzü 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 sayede, testler test edilen cihazdan (DUT) bağımsız olur ve destekleniyorsa çeşitli cihazları test edecek şekilde ölçeklendirilebilir.

Şekil 1'de, Spectatio çerçevesinin uygulamaya özel arayüzler ve yardımcılar kullanarak Telefon, Medicenter ve Ayarlar gibi referans uygulamalara göre modülerleştirildiği ve bu sayede yeni uygulamalar için kolayca genişletilebildiği gösterilmektedir. Spectatio çerçevesi, ortak standart ve yardımcı program sınıflarını yeniden kullanır. Standart yardımcı sınıf, tüm uygulama yardımcı işlevlerinin üst sınıfıdır ve cihaza özel veya uygulamalar genelinde geçerli olan standart işlevler sağlar. Yardımcı program sınıfları, cihazdan dosya okuma veya yazma gibi yardımcı programlar sağlar.

Mimari

Spectatio çerçevesi, kullanıcı arayüzü testleri oluşturmak için bir API grubu sağlamak amacıyla 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'de, Spectatio çerçevesinin üst düzey mimarisi ve bir uygulamayı test etmek için API'leri uygulamayla ilgili tüm öğeler gösterilmektedir.

Spectatio çerçevesinin üst düzey mimarisi

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

Uygulama yardımcısı arayüzü, uygulama yardımcısının uygulanması için bir taslak sağlar. Uygulamaları test etmek için gereken çeşitli yardımcı işlevlerden oluşur. Her uygulamanın kendi arayüzü vardır (ör. IAutoSettingHelper ve IAutoDialHelper). Daha fazla bilgi ve arayüz işlevlerinin listesi için AOSP'deki uygulama yardımcısı 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 özgü olmayan standart özelliklerden ve işlevlerden oluşur. Standart yardımcı sınıf, AbstractAutoStandardAppHelper.java adresinde tanımlanır.

Yardımcı program sınıfları çerçeve tarafından kullanılır. Örneğin, AutoJsonUtility.java, belirli bir cihazın 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ısı uygulama modülü, Spectatio çerçevesinin temelini oluşturur. Uygulama yardımcı arayüzünde tanımlanan ve uygulamaları otomotiv cihazlarda test etmek için gereken yardımcı işlevlerin uygulamasını içerir. Her uygulamanın, uygulamaları test etmek için Otomotiv testleri tarafından kullanılan SettingHelperImpl ve DialHelperImpl gibi kendi uygulaması vardır. Daha fazla bilgi ve uygulama listesini görmek için AOSP'deki uygulama yardımcısı uygulama işlevlerine bakın.

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

Aşağıdaki kodda, örnek bir otomotiv testinin kurulumu, temizliği ve yürütülmesi gösterilmektedir.

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

Özelleştirme

Spectatio çerçevesi, cihaz kullanıcı arayüzünden bağımsızdır. Bu nedenle, farklı kullanıcı arayüzlerine ve donanımlara sahip cihazları test etmek için ölçeklenebilir. Bu ölçeklenebilirliği sağlamak için Spectatio, referans cihaza dayalı varsayılan cihaz yapılandırmalarını kullanır. Varsayılan olmayan cihaz yapılandırmalarını desteklemek için çerçeve, cihazda istenen kullanıcı arayüzü değişikliklerini ayarlamak amacıyla çalışma zamanında bir JSON yapılandırma dosyası kullanır. JSON yapılandırma dosyası, path ayarlarının yanı sıra TEXT, DESCRIPTION ve RESOURCE_ID gibi kullanıcı arayüzü öğelerini destekler ve yalnızca DUT'daki 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ında, mevcut cihaz yapılandırmaları ve varsayılan değerleri gösterilmektedir.

Örnek bir 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 yapılandırmaları

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

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

  • Referans cihazlarda tarih ve saat ayarları Ayarlar > Tarih ve saat bölümünde, DUT'ta ise Ayarlar > Sistem > Tarih ve saat bölümünde bulunur.

// 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 makineye yalnızca bir cihaz bağlıysa bu parametre gerekli değildir.

  • PATH-TO-JSON-FILE: Barındıran makinedeki JSON dosyasının yolu.

Yapılandırma biçimi

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

Nesne Açıklama
PACKAGES Çeşitli uygulamalar için ana paketi tanımlayan ve söz konusu uygulamanın ne zaman ön planda olduğunu belirlemek için kullanılan bir nesne.
ACTIONS Çeşitli işlemler için işlem türlerini ve parametreleri belirten bir nesne. Örneğin, kaydırma için düğmelerin mi yoksa hareketlerin mi kullanılacağı.
COMMANDS Çeşitli işlemleri gerçekleştiren komutları belirten bir nesne.
UI_ELEMENTS Kullanıcı arayüzü öğelerini seçen UI Automator "BySelectors" öğesini oluşturmak için kullanılan bir nesne (ayrıntıları aşağıda açıklanmıştır).
WORKFLOWS Üst düzey görevleri tamamlayan işlem sıraları (aşağıda ayrıntılı olarak açıklanmıştır).

Kullanıcı arayüzü öğeleri

Her kullanıcı arayüzü öğesinin, öğeyi tanımlamak için kullanıcı arayüzü otomasyonunun neyi arayacağını (ör. kaynak kimliği, metin ve açıklama) ve bu türle ilişkili yapılandırma değerlerini belirten bir TYPE öğesi vardır. Genel olarak, yardımcılar bu yapılandırmayı kullanarak ekrandaki bir öğeyi tanımladığında tam olarak bir öğe alır. Birden fazla öğe yapılandırmayla eşleşirse testte rastgele bir öğe kullanılır. Bu nedenle yapılandırma (genellikle) ilgili bağlamda tek bir öğeye indirgenecek kadar spesifik yazılmalıdır.

METİN

Bu, en basit kullanıcı arayüzü öğesi türüdür. Kullanıcı arayüzü öğesi metniyle tanımlanır ve tam eşleşme gerektirir.

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

TEXT_CONTAINS

Belirtilen VALUE'nin, eşleştirilecek öğenin metninde yalnızca bir yerde görünmesi gerektiği dışında TEXT ile aynıdır.

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

AÇIKLAMA

Öğeyi içerik açıklaması özelliğine göre tanımlayın. Bu işlem için tam eşleşme gerekir.

    "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 anahtarı isteğe bağlıdır; atlanırsa tüm paketler eşleşir ve yalnızca kimliğin :id/'ten sonraki kısmı dikkate alınır.

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

TIKLANABİLİR, KAYAN

Öğeyi, tıklanabilir veya kaydırılabilir olup olmadığı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 içinde kullanılmalıdır. FLAG anahtarı isteğe bağlıdır ve varsayılan olarak true değerine ayarlanır.

    "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 bulun. ANCESTOR anahtarı, üst öğeyi tanımlayan bir nesne içerir. DEPTH anahtarı, hiyerarşinin ne kadar üst kısmının aranacağını belirtir. DEPTH isteğe bağlıdır ve varsayılan değeri 1'tur.

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

HAS_DESCENDANT

Hiyerarşide alt öğelerine bakarak öğeyi tanımlayın. DESCENDANT anahtarı, aranacak alt öğeyi belirten bir nesne içerir. DEPTH anahtarı, hiyerarşinin ne kadar üst kısmının aranacağını belirtir. DEPTH isteğe bağlıdır ve varsayılan değeri 1'tür.

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

ÇOKLU

Öğeyi, aynı anda birden fazla koşula göre tanımlayın. Bu koşulların tümü karşılanmalıdır.

      "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, 2 derinliğinde Permission manager metnine sahip bir alt öğesi olan bir RelativeLayout'ü tanımlar.

İş akışları

İş akışı, belirli bir görevi tamamlamak için kullanılan bir işlem sırasını temsil eder. Bu işlem sırası, cihaz türünden cihaz türüne göre yeterince farklı olabilir ve yapılandırmada koddan daha esnek bir şekilde temsil edilebilir.

    "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ı, değerin ise gerçekleştirilecek işlem dizisi olduğu bir anahtar/değer çiftidir. Her işlemde bir NAME, bir TYPE, (genellikle) bir CONFIG ve (bazen) bir SWIPE_CONFIG veya SCROLL_CONFIG bulunur. Çoğu TYPE için CONFIG, değeri kullanıcı arayüzü öğesi girişiyle aynı biçimi alan bir UI_ELEMENT anahtarına sahip bir nesnedir (yukarıya bakın). Bu TYPE'ler şunlardır:

BASMA
UZUN_BASMA
TIKLA
UZUN_TIKLA
VARSA_TIKLA
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 TYPE türleri için yapılandırma ayrıntıları şunlardır:

Nesne Açıklama
COMMAND Yürütülecek komutu içeren bir TEXT değeri olan bir nesne.
HAS_PACKAGE_IN_FOREGROUND Paketi içeren bir TEXT değeri olan nesne.
SWIPE SWIPE işlemi için CONFIG key öğesini çıkarın. Bu örnekte yalnızca SWIPE_CONFIG
WAIT_MS Beklemesi gereken milisaniye sayısını içeren bir TEXT değeri olan bir nesne.

Kaydırma ve kaydırmayla ilgili işlemler için aşağıdaki gibi ek yapılandırma gerekir:

SCROLL_CONFIG

Nesne Açıklama
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 kullanarak kaydırılacak kapsayıcıyı 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ırma işlemini gerçekleştirmek için kullanılacak sürüklemeyi başlatmak ve durdurmak üzere kapsayıcının kenarından olan mesafe (İsteğe bağlı, varsayılan = 10).
SCROLL_WAIT_TIME SCROLL_ACTION USE_GESTURE ise tıklanacak bir nesne ararken kaydırma hareketleri arasında bekleme süresi (milisaniye cinsinden). (İsteğe bağlı, varsayılan = 1).

SWIPE_CONFIG

Nesne Açıklama
SWIPE_DIRECTION TOP_TO_BOTTOM, BOTTOM_TO_TOP, LEFT_TO_RIGHT veya RIGHT_TO_LEFT
SWIPE_FRACTION

Aşağıdakilerden biri:

  • FULL: Ekran kenarından ekran kenarına kaydırma hareketi

    VEYA
  • DEFAULT: Ekran kenarından ekran kenarına, her iki tarafta da beş (5) piksellik bir arabelleğe sahip.

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

Derleme ve yürütme

Spectatio çerçevesi, test APK'sı kapsamında otomatik olarak derlenir. Test APK'sını derlemek 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 çalıştırması gerekir.

Aşağıdaki kod örneğinde, test APK'sının derlenmesi, yüklenmesi ve yürütülmesi gösterilmektedir.

# 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, Android.bp dosyasında belirtildiği gibi kablosuz ayarlarını test etmek için TEST-APK-NAME değerini AndroidAutomotiveSettingsTests olarak ayarlayın. APK'nın adını Otomotiv testi için ilgili Android.bp dosyasında bulabilirsiniz.

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

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

  • PATH-FOR-BUILT-TEST-APK: make komutu çalıştırıldığında test APK'sının derlendiği yol.

  • TEST-PACKAGE: Test paketinin adı.

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

Otomotiv Snippet Kitaplığı

Otomotiv snippet kitaplığı, otomotiv uygulamaları ve hizmetleriyle etkileşime geçmek için tasarlanmış Android Açık Kaynak Projesi (AOSP) için bir Android Test kitaplığı grubudur. Spectatio'dan, ana makineden (test) Android cihaza uzak prosedür çağrıları (RPC'ler) yürütmek için uygun bir mekanizmayla yararlanır.

Başlayın

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

Ön koşullar

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

Derleme

Otomotiv snippet kitaplığı tarafından sağlanan çeşitli snippet'leri derlemek için sağlanan android.bp dosyasını kullanabilirsiniz. APK'yı derlemek için önceki bölümdeki komutları uygulayın.

Dağıtım

snippet kitaplıklarını başarıyla derledikten sonra, önceki bölümde belirtilen adb install komutunu kullanarak elde edilen APK'ları hedef cihaza dağıtın.

Test çalıştırma

snippet kitaplıkları, otomotiv sistemiyle etkileşim kurmak için çeşitli RPC yöntemleri sağlar. Bu yöntemler, ana makineden Mobly çerçevesi aracılığıyla çağrılabilir. Mobly test ortamını oluşturduğunuzu varsayarak, cihazda RPC yöntemlerini manuel olarak çağırabileceğiniz etkileşimli bir Python kabuğu açmak için snippet_shell.py komut dosyasını kullanabilirsiniz. Örnek çağrı:

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

<serial> değerini, birden fazla cihaz bağlıysa adb devices komutuyla bulabileceğiniz cihaz seri numarasıyla değiştirin.

Dahil edilen kitaplıklar

Otomotiv snippet kitaplığı aşağıdaki snippet kitaplıklarını ve yardımcılarını içerir:

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

  • PhoneSnippet: Aramaları yönetme, kişilere göz atma ve SMS işlemleri gibi telefonla ilgili API'ler sağlar.

Otomotiv snippet'i ve PhoneSnippet bazı ortak mantığa sahiptir. Daha açık belirtmek gerekirse, bir otomotiv cihazını ve telefon cihazını eşlemek için Bluetooth ile ilgili RCP çağrılarını istila edebilirsiniz. Bu bt_discovery_test, nasıl yapılacağını gösterir.