Özellik: 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, otomotiv cihazlarında uygulamaları test etmek için API'ler sağlar ve AAOS ile uygulamalarının yeteneklerini 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ına uyarlanabilir ve genişletilebilir. AAOS'nin cihaz donanımında, emülatörlerde ve sanallaştırılmış ortamlarda yeteneğini 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ı

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

UI Automator üzerine kurulu olan Spectatio çerçevesi, AAOS'teki kullanıcı ve sistem uygulamalarıyla etkileşime giren kullanıcı arayüzü testleri oluşturmak için bir dizi API sağlar. Otomotiv testlerinde, test için Spectatio çerçevesi tarafından sağlanan API'ler kullanılır. Bu sayede, testler test edilen cihazdan (DUT) bağımsız hale gelir ve destekleniyorsa çeşitli cihazları test etmek için ölçeklenebilir.

Şekil 1, Spectatio çerçevesinin, uygulamaya özel arayüzler ve yardımcılar kullanan Arama, Medicenter ve Ayarlar gibi referans uygulamalara göre modülerleştirildiğini ve bu sayede yeni uygulamalar için kolayca genişletilebildiğini gösteriyor. Spectatio çerçevesi, ortak standart ve yardımcı yardımcı sınıfları 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ı yardımcı sınıflar, cihazdaki dosyaları okuma veya dosyaya yazma gibi yardımcı programlar sağlar.

Mimari

Spectatio çerçevesi, kullanıcı arayüzü testleri oluşturmak için bir dizi API sağlamak üzere mevcut standart yardımcı sınıfı genişletirken ve yardımcı yardımcı sınıfları içe aktarırken uygulamaya özel arayüzleri ve yardımcıları uygular.

Şekil 2'de, Spectatio çerçevesinin üst düzey mimarisi ve bir uygulamayı test etmek için API'leri uygulamaya dahil olan 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 plan sağlar. Uygulamaları test etmek için gereken çeşitli yardımcı işlevlerden oluşur. Her uygulamanın kendi arayüzü vardır. Örneğin, 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 herhangi bir uygulamaya özgü olmayan standart özellikler ve işlevlerden oluşur. Örneğin, pressHome ve scroll. Standart yardımcı sınıf, AbstractAutoStandardAppHelper.java içinde tanımlanır.

Çerçeve tarafından yardımcı yardımcı sınıflar kullanılır. Örneğin, AutoJsonUtility.java, belirtilen cihaz JSON yapılandırma dosyasını yükleyen ve çalışma zamanında çerçeve yapılandırmalarını güncelleyen bir yardımcı sınıftır.

Uygulama yardımcısı uygulama modülü, Spectatio çerçevesinin temelini oluşturur. Bu arayüz, uygulama yardımcı arayüzünde tanımlanan ve otomotiv cihazlarında uygulamaları test etmek için gereken yardımcı işlevlerin uygulamasını içerir. Her uygulamanın kendi uygulaması vardır. Örneğin, SettingHelperImpl ve DialHelperImpl, uygulamaları test etmek için Otomotiv testlerinde kullanılır. Daha fazla bilgi ve uygulamaların listesi için AOSP'deki uygulama yardımcısı uygulama işlevleri bölümüne bakın.

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

Aşağıdaki kodda örnek bir otomotiv testinin kurulumu, temizlenmesi 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ın test edilmesi için ölçeklenebilir. Spectatio, bu ölçeklenebilirliği sağlamak için 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 üzere çalışma zamanında bir JSON yapılandırma dosyası kullanır. JSON yapılandırma dosyası, TEXT, DESCRIPTION ve RESOURCE_ID gibi kullanıcı arayüzü öğelerinin yanı sıra path ayarlarını destekler ve yalnızca test cihazındaki kullanıcı arayüzü değişiklikleriyle ilgili bilgileri içermelidir. Kullanıcı arayüzü öğelerinin geri kalanında, çerçevede sağlanan varsayılan yapılandırma değerleri kullanılır.

Varsayılan cihaz yapılandırmaları

Aşağıdaki örnek JSON yapılandırma dosyasında, kullanılabilir cihaz yapılandırmaları ve bunların 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 ayarlar tarafından geçersiz kılındığı JSON yapılandırma dosyası örneği gösterilmektedir. Bu örnekte:

  • İnternet ayarları, referans cihazlarda Ağ ve internet, test edilen cihazda ise Bağlantı olarak adlandırılır.

  • Tarih ve saat ayarları, referans cihazlar için Ayarlar > Tarih ve saat, test edilen cihaz için 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: Test edilen cihazın seri kimliği. Ana makineye 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 biçimi

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

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

Kullanıcı arayüzü öğeleri

Her kullanıcı arayüzü öğesinde, UI Automator'ın öğeyi tanımlamak için ne arayacağı (ör. kaynak kimliği, metin ve açıklama) ve bu türle ilişkili yapılandırma değerlerini belirten bir TYPE bulunur. Genel olarak, bir yardımcı bu yapılandırmayı kullanarak ekrandaki bir öğeyi her tanımladığında tam olarak bir öğe alır. Yapılandırmayla eşleşen birden fazla öğe varsa testte rastgele bir öğe kullanılır. Bu nedenle, yapılandırma (genellikle) ilgili bağlamdaki tek bir öğeyi daraltacak kadar spesifik olarak 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şleme gerektirir.

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

TEXT_CONTAINS

TEXT ile aynıdır. Ancak, belirtilen VALUE öğesinin eşleşmesi için yalnızca öğenin metninde bir yerde görünmesi gerekir.

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

AÇIKLAMA

Öğeyi, içerik açıklaması özelliğine göre tanımlayın. 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. İsteğe bağlı olarak bu kimliğin paket bileşenini de kontrol edebilirsiniz. PACKAGE anahtarı isteğe bağlıdır. Atlanırsa herhangi bir paket eşleşir ve yalnızca PACKAGE anahtarından sonraki kimlik kısmı dikkate alınır.:id/

    "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 olup olmamasına göre tanımlayın. Bunlar çok geniş öğe türleridir ve genellikle yalnızca başka bir öğe türünü daraltmaya yardımcı olmak için MULTIPLE içinde kullanılmalıdır. FLAG tuşu isteğe bağlıdır ve varsayılan olarak true değerine ayarlanır.

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

CLASS

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

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

HAS_ANCESTOR

Widget hiyerarşisinde üst öğelerine bakarak öğeyi tanımlayın. ANCESTOR anahtarı, üst öğeyi tanımlayan bir nesne içerir. DEPTH anahtarı, hiyerarşide ne kadar yukarıya bakılacağını belirtir. DEPTH isteğe bağlıdır ve varsayılan değeri 1'dir.

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

HAS_DESCENDANT

Hiyerarşideki alt öğelerine bakarak öğeyi tanımlayın. DESCENDANT anahtarı, aranacak alt öğeyi belirten bir nesne içerir. DEPTH anahtarı, hiyerarşide ne kadar yukarıya bakılacağını belirtir. DEPTH isteğe bağlıdır ve varsayılan değeri 1'dir.

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

MULTIPLE

Öğeyi, aynı anda geçerli olan ve karşılanması gereken birden fazla 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, RelativeLayout derinliğinde 2 metnini içeren bir Permission manager alt öğesine sahip olan bir öğeyi tanımlar.

İş akışları

İş akışı, belirli bir görevi tamamlamak için kullanılan bir dizi işlemi temsil eder. Bu işlemler, cihaz türüne göre yeterince farklılık gösterebilir ve yapılandırmada kodda olduğundan 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şlemler dizisi olduğu bir anahtar/değer çiftidir. Her işlemde NAME, TYPE, (genellikle) CONFIG ve (bazen) SWIPE_CONFIG veya SCROLL_CONFIG bulunur. Çoğu TYPE için CONFIG, değeri bir kullanıcı arayüzü öğesi girişiyle aynı biçimde olan bir UI_ELEMENT anahtarına sahip bir nesnedir (yukarıya bakın). Bu TYPE'lar şunlardır:

PRESS
LONG_PRESS
CLICK
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 TYPE'lar için yapılandırma ayrıntıları şunlardır:

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

Aşağıdaki gibi kaydırma ve kaydırma hareketleriyle ilgili işlemler için 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ı biçimde (yukarıya bakın) kaydırılacak kapsayıcıyı belirten bir nesne.
SCROLL_FORWARD, SCROLL_BACKWARD İleri ve geri kaydırma düğmeleri (SCROLL_ACTION USE_BUTTON olduğunda gereklidir).
SCROLL_MARGIN SCROLL_ACTION değeri USE_GESTURE ise kaydırma işlemini gerçekleştirmek için kullanılacak sürükleme işleminin başlatılacağı ve durdurulacağı kapsayıcı kenarından olan mesafe (isteğe bağlı, varsayılan = 10).
SCROLL_WAIT_TIME SCROLL_ACTION USE_GESTURE ise tıklanacak bir nesne aranırken kaydırma hareketleri arasında beklenecek süre (milisaniye cinsinden). (İsteğe bağlıdır, 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 beş (5) piksellik arabellek ile.

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

Oluşturma ve yürütme

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ğinde, test APK'sının oluşturulması, 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ı, otomotiv testi için ilgili Android.bp dosyasında bulunabilir.

  • DEVICE-SERIAL: Test edilen cihazın 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 belirtilen varsayılan olmayan cihaz kullanıcı arayüzü yapılandırmalarını sağlamak için gereken isteğe bağlı parametre. Belirtilmezse ç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, Kablosuz Ayarları testi için test paketi android.platform.tests, test sınıfı adı ise WifiSettingTest'dir.

Otomotiv Snippet Kitaplığı

Automotive Snippet Library, Android Açık Kaynak Projesi (AOSP) için bir dizi Android Test kitaplığıdır. Bu kitaplıklar, otomotiv uygulamaları ve hizmetleriyle etkileşim kurmak üzere tasarlanmıştır. Bir ana makineden (test) Android destekli bir cihaza uzak prosedür çağrıları (RPC'ler) yürütmek için uygun bir mekanizmayla Spectatio'dan yararlanır.

Başlayın

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

Ön koşullar

  • Ana makineye Python 3.x yüklenmiş 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 ortaya çıkan APK'ları hedef cihaza dağıtın.

Testler yapın

Snippet kitaplıkları, otomotiv sistemiyle etkileşim kurmak için çeşitli RPC yöntemleri sunar. Bu yöntemler, ana makineden Mobly çerçevesi aracılığıyla çağrılabilir. Mobly test ortamının kurulu olduğunu varsayarsak snippet_shell.py komut dosyasını kullanarak etkileşimli bir Python kabuğu açabilirsiniz. Bu kabukta, cihazda RPC yöntemlerini manuel olarak çağırabilirsiniz. Örnek çağırma:

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

<serial> yerine cihazın seri numarasını girin. Birden fazla cihaz bağlıysa adb devices komutuyla seri numarasını alabilirsiniz.

Dahil edilen kitaplıklar

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

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

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

Otomotiv snippet'i ve Telefon snippet'i bazı ortak mantıklara sahiptir. Özellikle, bir otomotiv cihazı ile bir telefon cihazını eşlemek için Bluetooth ile ilgili RCP aramalarına müdahale edebilirsiniz. Bu bt_discovery_test nasıl yapılacağını gösterir.