Spectatio: Framework pengujian otomotif

Spectatio adalah framework pengujian open source yang dikembangkan untuk menguji Android Automotive OS (AAOS) di perangkat nyata dan virtual. Spectatio menyediakan API untuk menguji aplikasi di perangkat otomotif serta merupakan solusi yang dapat diperluas dan skalabel yang digunakan untuk memverifikasi kemampuan dan kinerja AAOS serta aplikasinya.

Desain tingkat tinggi

Framework Spectatio dapat disesuaikan dan diperluas untuk berbagai UI AAOS implementasi yang tepat. Protokol ini digunakan untuk menguji kemampuan dan performa AAOS pada perangkat keras, emulator, dan lingkungan virtual.

Gambar berikut menjelaskan desain tingkat tinggi framework Spectatio.

Desain tingkat tinggi framework spektatio

Gambar 1. Desain tingkat tinggi framework Spectatio.

Dibangun berdasarkan UI Automator, framework Spectatio menyediakan serangkaian API untuk membangun pengujian UI yang berinteraksi dengan aplikasi pengguna dan sistem di AAOS. Otomotif menggunakan API yang disediakan oleh framework Spectatio untuk pengujian, yang memungkinkan pengujian ini secara terpisah dari perangkat yang sedang diuji (DUT) dan dapat diskalakan untuk diuji di berbagai perangkat, jika didukung.

Gambar 1 menunjukkan bahwa framework Spectatio dimodularisasi berdasarkan referensi aplikasi seperti Telepon, Medicenter, dan Setelan yang menggunakan aplikasi tertentu antarmuka dan helper, sehingga mudah diperluas untuk aplikasi baru. The Spectatio {i>framework<i} menggunakan kembali kelas pembantu utilitas dan standar yang umum. Class helper standar adalah class induk untuk semua fungsi bantuan aplikasi dan menyediakan fungsi standar yang khusus untuk perangkat atau yang berlaku di seluruh aplikasi. Tujuan class helper utilitas menyediakan utilitas seperti membaca atau menulis file dari perangkat.

Arsitektur

Untuk menyediakan kumpulan API guna membangun pengujian UI, framework Spectatio mengimplementasikan antarmuka khusus aplikasi dan helper saat memperluas helper standar yang ada dan mengimpor class helper utilitas.

Gambar 2 mengilustrasikan arsitektur tingkat tinggi dari kerangka kerja Spectatio dan semua entity yang terlibat dalam implementasi API untuk menguji aplikasi.

Arsitektur tingkat tinggi framework spektatio

Gambar 2. Arsitektur tingkat tinggi framework Spectatio.

Antarmuka helper aplikasi menyediakan cetak biru untuk implementasi pembantu aplikasi. Terdiri dari berbagai fungsi bantuan yang diperlukan untuk menguji aplikasi. Setiap aplikasi memiliki antarmuka sendiri, seperti IAutoSettingHelper dan IAutoDialHelper. Untuk mengetahui informasi selengkapnya dan daftar fungsi antarmuka, lihat fungsi antarmuka helper aplikasi di AOSP.

Class bantuan standar terdiri dari atribut dan fungsi standar yang diperlukan untuk penyiapan perangkat, tetapi tidak spesifik untuk aplikasi apa pun, seperti pressHome dan scroll. Class bantuan standar ditentukan di AbstractAutoStandardAppHelper.java.

Class helper utilitas digunakan oleh framework. Sebagai contoh, AutoJsonUtility.java adalah class utilitas yang memuat update dan file konfigurasi JSON perangkat yang diberikan konfigurasi framework pada runtime.

Modul implementasi helper aplikasi adalah inti dari Spectatio Google Workspace for Education. Ini berisi implementasi untuk fungsi bantuan yang ditentukan di antarmuka helper aplikasi, yang diperlukan untuk menguji aplikasi pada perangkat otomotif. Setiap aplikasi memiliki implementasinya sendiri, seperti SettingHelperImpl dan DialHelperImpl, digunakan oleh pengujian Automotive untuk menguji aplikasi. Untuk informasi lebih lanjut dan daftar implementasi, lihat fungsi implementasi helper aplikasi ‘di AOSP.

Pengujian Otomotif menggunakan fungsi implementasi bantuan aplikasi untuk menguji berbagai operasi yang berkaitan dengan aplikasi. Menggunakan class HelperAccessor untuk mendapatkan akses ke fungsi implementasi bantuan aplikasi.

Kode berikut menunjukkan penyiapan, pembersihan, dan eksekusi contoh pengujian otomotif.

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

Penyesuaian

Framework Spectatio tidak bergantung pada UI perangkat, sehingga skalabel perangkat pengujian dengan beragam UI dan perangkat keras. Untuk mencapai skalabilitas ini, Spectatio menggunakan konfigurasi perangkat default berdasarkan perangkat referensi. Kepada mendukung konfigurasi perangkat non-default, framework ini menggunakan JSON file konfigurasi saat runtime untuk menyetel perubahan UI yang diinginkan bagi perangkat. J File konfigurasi JSON mendukung elemen UI seperti TEXT, DESCRIPTION, dan RESOURCE_ID, beserta setelan path dan hanya boleh berisi informasi tentang perubahan UI untuk DUT. Elemen UI lainnya menggunakan nilai konfigurasi yang disediakan dalam framework.

Konfigurasi perangkat default

Contoh file konfigurasi JSON berikut menunjukkan perangkat yang tersedia konfigurasi dan nilai defaultnya.

Klik di sini untuk menampilkan contoh JSON file konfigurasi

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

Konfigurasi perangkat alternatif

Contoh kode berikut menunjukkan contoh file konfigurasi JSON dengan setelan default diganti oleh setelan pada DUT. Dalam contoh ini:

  • Setelan Internet diberi nama Jaringan & internet di perangkat referensi dan Konektivitas di DUT.

  • Setelan tanggal dan waktu tersedia di Setelan > Tanggal dan waktu untuk perangkat referensi dan di Setelan > Sistem > Tanggal dan waktu untuk DUT.

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

Jika sudah siap, file konfigurasi JSON akan disediakan saat runtime seperti yang ditunjukkan di blok kode berikut:

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

Dalam perintah ini:

  • DEVICE-SERIAL: ID Seri DUT. Parameter ini bukan diperlukan jika hanya ada satu perangkat yang terhubung ke {i>host<i}.

  • PATH-TO-JSON-FILE: Jalur file JSON di mesin host.

Format konfigurasi

Ada lima objek tingkat teratas dalam konfigurasi, dengan kunci berikut dan nilai:

Objek Deskripsi
PACKAGES Objek yang menjelaskan paket utama untuk berbagai aplikasi, yang digunakan untuk menentukan kapan aplikasi itu berada di latar depan.
ACTIONS Objek yang menunjukkan jenis dan parameter tindakan untuk berbagai tindakan. Misalnya, apakah akan menggunakan tombol atau gestur untuk men-scroll.
COMMANDS Objek yang menentukan perintah yang melakukan berbagai tindakan.
UI_ELEMENTS Objek yang digunakan untuk membuat `BySelectors` UI Automator yang memilih UI Elemen (dijelaskan secara mendetail di bawah).
WORKFLOWS Urutan tindakan yang menyelesaikan tugas tingkat tinggi (dijelaskan di detail di bawah).

Elemen UI

Setiap elemen UI memiliki TYPE yang menentukan apa yang akan dicari UI Automator untuk mengidentifikasi elemen (seperti ID resource, teks, dan deskripsi) serta nilai konfigurasi yang terkait dengan jenis tersebut. Secara umum, setiap kali pembantu mengidentifikasi elemen pada layar menggunakan konfigurasi ini, maka akan satu elemen. Jika beberapa elemen cocok dengan konfigurasi, elemen arbitrer yang digunakan dalam pengujian. Oleh karena itu, konfigurasi (umumnya) harus ditulis cukup spesifik sehingga mempersempit ke satu elemen dalam konteks yang relevan.

TEKS

Ini adalah jenis elemen UI yang paling sederhana. Elemen UI diidentifikasi berdasarkan teksnya, dan memerlukan kecocokan persis.

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

TEXT_CONTAINS

Sama seperti TEXT, kecuali bahwa VALUE yang ditentukan hanya perlu muncul di suatu tempat di teks elemen yang akan dicocokkan.

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

DESKRIPSI

Identifikasi elemen menurut atribut deskripsi kontennya, yang membutuhkan yang cocok.

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

ID_RESOURCE

Identifikasi elemen berdasarkan ID resource-nya, jika perlu, periksa juga paketnya ID tersebut. Kunci PACKAGE bersifat opsional; jika dihilangkan, paket apa pun akan cocok, dan hanya bagian dari ID setelah :id/ yang akan dipertimbangkan.

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

DAPAT DIKLIK, DAPAT DIKLIK

Identifikasi elemen berdasarkan apakah elemen tersebut dapat diklik atau tidak dapat diklik atau tidak dapat di-scroll. Ini adalah jenis elemen yang sangat luas, dan umumnya hanya boleh digunakan dalam MULTIPLE untuk membantu mempersempit jenis elemen lain. Kunci FLAG bersifat opsional, dan defaultnya adalah true.

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

KELAS

Identifikasi elemen berdasarkan class-nya.

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

HAS_ANCESTOR

Identifikasi elemen dengan melihat hierarki widget pada ancestor-nya. Tujuan Kunci ANCESTOR menyimpan objek yang mengidentifikasi ancestor. Kunci DEPTH menentukan seberapa jauh hierarki yang akan dilihat. DEPTH bersifat opsional dan memiliki nilai default sebesar 1.

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

HAS_DESCENDAN

Identifikasi elemen dengan melihat hierarki pada turunannya. Tujuan Kunci DESCENDANT menyimpan objek yang menentukan turunan yang akan dicari. Tujuan Tombol DEPTH menentukan seberapa jauh hierarki yang akan dilihat. DEPTH bersifat opsional dan memiliki nilai default 1.

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

BEBERAPA

Identifikasi elemen berdasarkan beberapa kondisi simultan, yang semuanya harus dipenuhi.

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

Dalam contoh ini, konfigurasi mengidentifikasi RelativeLayout yang memiliki turunan pada kedalaman 2, yang memiliki teks Permission manager.

Workflows

Alur kerja mewakili urutan tindakan yang digunakan untuk menyelesaikan tugas, yang mungkin cukup berbeda dari satu jenis perangkat ke jenis perangkat yang lain dan lebih fleksibel untuk ditampilkan dalam konfigurasi daripada dalam kode.

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

Setiap alur kerja adalah pasangan nilai kunci dengan kuncinya adalah nama alur kerja dan nilainya adalah array tindakan yang akan dilakukan. Setiap tindakan memiliki NAME, TYPE, (biasanya) CONFIG, dan (terkadang) SWIPE_CONFIG atau SCROLL_CONFIG. Sebagai sebagian besar TYPE, CONFIG adalah objek dengan kunci UI_ELEMENT yang nilainya menggunakan bentuk yang sama dengan entri elemen UI (lihat di atas). JENIS tersebut adalah:

TEKAN
LONG_PRESS
KLIK
LONG_KLIK
KLIK_IF_EXIST
HAS_UI_ELEMENT_IN_FOREGROUND
SCROLL_TO_FIND_AND_KLIK
SCROLL_TO_FIND_AND_CLICK_IF_EXIST
SWIPE_TO_FIND_AND_KLIK
SWIPE_TO_FIND_AND_CLICK_IF_EXIST

Untuk TYPE lainnya, detail konfigurasinya adalah:

Objek Deskripsi
COMMAND Objek dengan nilai TEXT yang berisi perintah untuk dieksekusi.
HAS_PACKAGE_IN_FOREGROUND Objek dengan nilai TEXT yang berisi paket.
SWIPE Hapus CONFIG key untuk tindakan SWIPE. Ini hanya menggunakan SWIPE_CONFIG
WAIT_MS Objek dengan nilai TEXT yang berisi jumlah milidetik untuk menunggu.

Tindakan terkait scroll dan geser memerlukan konfigurasi tambahan, sebagai berikut:

KONFIGUR_SCROLL

Objek Deskripsi
SCROLL_ACTION Berupa USE_GESTURE atau USE_BUTTON
SCROLL_DIRECTION Berupa HORIZONTAL atau VERTICAL
SCROLL_ELEMENT Objek yang menunjukkan container untuk di-scroll, menggunakan bentuk yang sama dengan UI Konfigurasi elemen (lihat di atas).
SCROLL_FORWARD, SCROLL_BACKWARD Tombol gulir maju dan mundur (diperlukan saat SCROLL_ACTION adalah USE_BUTTON).
SCROLL_MARGIN Jika SCROLL_ACTION adalah USE_GESTURE, jaraknya dari tepi container untuk memulai dan menghentikan penarikan yang akan digunakan untuk melakukan scroll (Opsional, default = 10).
SCROLL_WAIT_TIME Jika SCROLL_ACTION adalah USE_GESTURE, waktu dalam milidetik untuk menunggu di antara gestur scroll saat menelusuri objek untuk klik. (Opsional, default = 1).

USAP_KONFIGURASI

Objek Deskripsi
SWIPE_DIRECTION Berupa TOP_TO_BOTTOM, BOTTOM_TO_TOP, LEFT_TO_RIGHT, atau RIGHT_TO_LEFT
SWIPE_FRACTION

Salah satu dari opsi berikut:

  • FULL: Geser gestur dari tepi layar ke tepi layar

    ATAU,
  • DEFAULT: Tepi layar ke tepi layar, dengan lima (5) {i>buffer<i} piksel di setiap sisi.

    ATAU,
  • THREE_QUARTER, HALF, atau QUARTER: Gestur geser untuk menyelesaikan lima (5) piksel dari tepi layar, dan mulai pada titik yang menutupi bagian menunjukkan jarak layar.
NUMBER_OF_STEPS Jumlah langkah yang akan digunakan untuk melakukan geser. Lihat segmentSteps.

Membangun dan menjalankan

Framework Spectatio otomatis dibuat sebagai bagian dari APK pengujian. Untuk membangun APK pengujian, codebase AOSP harus berada di workstation lokal. Setelah APK pengujian dibuat, pengguna harus menginstal APK pada perangkat dan menjalankan uji coba.

Contoh kode berikut menunjukkan pembuatan, pemasangan, dan eksekusi sebuah APK pengujian.

# 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

Dalam perintah ini:

  • TEST-APK-NAME: Nama aplikasi yang akan diuji. Misalnya, tetapkan TEST-APK-NAME ke AndroidAutomotiveSettingsTests untuk menguji setelan Wi-Fi sebagaimana ditentukan dalam Android.bp . Nama APK dapat ditemukan dalam file Android.bp masing-masing untuk pengujian Otomotif.

  • DEVICE-SERIAL: ID seri DUT. Parameter ini tidak diperlukan jika hanya ada satu perangkat yang terhubung ke {i>host<i}.

  • config-file-path: Parameter opsional yang diperlukan hanya untuk memberikan konfigurasi UI perangkat non-default seperti yang ditetapkan dalam konfigurasi JSON file. Jika tidak diberikan, menggunakan nilai {i>default<i} untuk menjalankan pengujian.

  • PATH-FOR-BUILT-TEST-APK: Jalur tempat dibuatnya APK pengujian saat perintah make dieksekusi.

  • TEST-PACKAGE: Nama paket pengujian.

  • TEST-CLASSNAME: Nama class pengujian. Misalnya, untuk Setelan Wi-Fi, paket pengujiannya adalah android.platform.tests dan nama class pengujian adalah WifiSettingTest.

Library Cuplikan Otomotif

Library Cuplikan Otomotif adalah kumpulan library Pengujian Android untuk Project Open Source Android (AOSP) yang dirancang untuk berinteraksi dengan otomotif aplikasi dan layanan. Solusi ini memanfaatkan Spectatio dengan mekanisme yang mudah untuk menjalankan panggilan prosedur jarak jauh (RPC) dari mesin host (pengujian) ke Perangkat yang didukung Android.

Memulai

Sebelum memulai, tinjau bagian ini.

Prasyarat

  • Python 3.x yang diinstal pada mesin host.
  • Penyiapan lingkungan AOSP dengan alat build yang diperlukan.
  • Perangkat otomotif Android (emulator atau perangkat fisik) dengan akses adb.

Kompilasi

Untuk mengompilasi berbagai cuplikan yang disediakan oleh Automotive Snippet Library, Anda dapat menggunakan file android.bp yang disediakan. Mengikuti perintah di bagian untuk mengompilasi APK.

Penerapan

Setelah berhasil mengompilasi library cuplikan, deploy APK yang dihasilkan ke perangkat target menggunakan perintah adb install yang disebutkan di bagian sebelumnya bagian.

Menjalankan pengujian

Library cuplikan ini mengekspos beberapa metode RPC untuk berinteraksi dengan model sistem file. Metode ini bisa dipanggil melalui framework Mobly dari host mesin Linux dan Windows. Dengan asumsi Anda telah menyiapkan lingkungan pengujian Mobly, Anda dapat menggunakan Skrip snippet_shell.py untuk membuka shell Python interaktif, tempat Anda dapat memanggil metode RPC secara manual pada perangkat. Contoh panggilan:

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

Ganti <serial> dengan nomor seri perangkat, yang dapat Anda gunakan perangkat adb jika ada beberapa perangkat yang terhubung.

Library yang disertakan

Library Cuplikan Otomotif mencakup library cuplikan berikut dan helper:

  • AutomotiveSnippet: Menyediakan API yang terkait dengan operasi kendaraan, seperti panggilan, kontrol volume, tombol putar pada kendaraan, dan interaksi media center.

  • PhoneSnippet: Menyediakan API terkait telepon, termasuk penanganan panggilan, penjelajahan kontak, dan operasi SMS.

Cuplikan Automotive dan PhoneSnippet memiliki beberapa logika umum. Khususnya, Anda bisa menyerang panggilan RCP terkait Bluetooth untuk menyambungkan dan perangkat ponsel. bt_discovery_test ini menunjukkan caranya.