Spectatioは、実デバイスと仮想デバイスでAndroid Automotive OS(AAOS)をテストするために開発されたオープンソースのテストフレームワークです。 Spectatioは、自動車デバイスでアプリをテストするためのAPIを提供し、AAOSとそのアプリの機能とパフォーマンスを検証するために使用される拡張可能でスケーラブルなソリューションです。
ハイレベルなデザイン
Spectatioフレームワークは、さまざまなAAOSUI実装に適応および拡張可能です。これは、デバイスハードウェア、エミュレーター、および仮想化環境でAAOSの機能とパフォーマンスをテストするために使用されます。
次の図は、Spectatioフレームワークの高レベルの設計を説明しています。

図1.Spectatioフレームワークの高レベルの設計
UI Automator上に構築されたSpectatioフレームワークは、AAOS上のユーザーおよびシステムアプリと対話するUIテストを構築するための一連のAPIを提供します。自動車テストでは、Spectatioフレームワークによって提供されるAPIをテストに使用します。これにより、これらのテストはテスト対象デバイス(DUT)から独立し、サポートされている場合はさまざまなデバイスをテストするためにスケーラブルになります。
図1は、Spectatioフレームワークが、Dialer、Medicenter、Settingsなどの参照アプリに基づいてアプリ固有のインターフェイスとヘルパーを使用してモジュール化されていることを示しています。これにより、新しいアプリに簡単に拡張できます。 Spectatioフレームワークは、共通の標準およびユーティリティヘルパークラスを再利用します。標準ヘルパークラスは、すべてのアプリケーションヘルパー関数の親クラスであり、デバイス固有またはアプリ全体に適用可能な標準関数を提供します。ユーティリティヘルパークラスは、デバイスからのファイルの読み取りや書き込みなどのユーティリティを提供します。
建築
UIテストを構築するための一連のAPIを提供するために、Spectatioフレームワークは、既存の標準ヘルパークラスを拡張し、ユーティリティヘルパークラスをインポートしながら、アプリ固有のインターフェイスとヘルパーを実装します。
次の図は、Spectatioフレームワークの高レベルのアーキテクチャと、アプリをテストするためのAPIの実装に関与するすべてのエンティティを説明しています。

図2.Spectatioフレームワークの高レベルアーキテクチャ
アプリケーションヘルパーインターフェイスは、アプリケーションヘルパーの実装の青写真を提供します。これは、アプリのテストに必要なさまざまなヘルパー関数で構成されています。各アプリには、 IAutoSettingHelperやIAutoDialHelperなどの独自のインターフェイスがあります。詳細およびインターフェイス機能のリストについては、AOSPのアプリケーションヘルパーインターフェイス機能を参照してください。
標準ヘルパークラスは、デバイスのセットアップに必要であるが、 pressHomeやscrollなどのアプリに固有ではない標準の属性と機能で構成されています。標準ヘルパークラスは、 AbstractAutoStandardAppHelper.javaで定義されています。
ユーティリティヘルパークラスは、フレームワークによって使用されます。たとえば、 AutoJsonUtility.javaは
指定されたデバイスのJSON構成ファイルをロードし、実行時にフレームワーク構成を更新するユーティリティクラス。
アプリケーションヘルパー実装モジュールは、Spectatioフレームワークの中核です。これには、自動車デバイスでアプリをテストするために必要な、アプリケーションヘルパーインターフェイスで定義されたヘルパー関数の実装が含まれています。各アプリには、アプリをテストするための自動車テストで使用される、 SettingHelperImplやDialHelperImplなどの独自の実装があります。詳細と実装のリストについては、AOSPの「アプリケーションヘルパー実装関数」を参照してください。
Automotive Testsは、アプリケーションヘルパーの実装機能を使用して、アプリに関連するさまざまな操作をテストします。 HelperAccessorクラスを使用して、アプリケーションヘルパー実装関数にアクセスします。
次のコードは、サンプルの自動車テストのセットアップ、クリーンアップ、および実行を示しています。
@RunWith(AndroidJUnit4.class)
public class AutoApplicationTest {
static HelperAccessor<IAutoApplicationHelper> autoApplicationHelper =
new HelperAccessor<>(IAutoApplicationHelper.class);
public AutoApplicationTest() {
// constructor
// Initialize any attributes that are required for the test execution
}
@Before
public void beforeTest() {
// Initial setup before each test
// For example - open the application
autoApplicationHelper.open();
}
@After
public void afterTest() {
// Cleanup after each test.
// For example - exit the application
autoApplicationHelper.exit();
}
@Test
public void testApplicationFeature() {
// Test
// For example - Test if application is open
assertTrue("Application is not open.", autoApplicationHelper.isOpen());
}
}
カスタマイズ
SpectatioフレームワークはデバイスUIから独立しているため、さまざまなUIとハードウェアを備えたデバイスをテストするためにスケーラブルです。このスケーラビリティを実現するために、Spectatioは参照デバイスに基づくデフォルトのデバイス構成を使用します。デフォルト以外のデバイス構成をサポートするために、フレームワークは実行時にJSON構成ファイルを使用して、デバイスに必要なUIの変更を設定します。 JSON構成ファイルは、 path設定とともにTEXT 、 DESCRIPTION 、 RESOURCE_IDなどのUI要素をサポートし、DUTのUI変更に関する情報のみを含める必要があります。残りのUI要素は、フレームワークで提供されるデフォルトの構成値を使用します。
デフォルトのデバイス構成
次のサンプルJSON構成ファイルは、使用可能なデバイス構成とそのデフォルト値を示しています。
プラス記号をクリックして、サンプルのJSON構成ファイルを表示します
{
"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"
}
}
}
}
デフォルト以外のデバイス構成
次のコードサンプルは、デフォルト設定がDUTの設定によって上書きされるJSON構成ファイルの例を示しています。この例では:
- インターネット設定は、参照デバイスでは
Network & internet、DUTではConnectivityと呼ばれます。 - 日付と時刻の設定は、
Settings > Date and time]およびSettings > System > Date and time]で利用できます。
# JSON configuration file for Reference Device
{
....
"NETWORK_AND_INTERNET_SETTINGS": {
"path": "Settings > Network & internet"
},
"DATE_AND_TIME_SETTINGS": {
"path": "Settings > Date and time"
},
....
}
# JSON configuration file for non-reference device
{
....
"NETWORK_AND_INTERNET_SETTINGS": {
"path": "Settings > Connectivity"
},
"DATE_AND_TIME_SETTINGS": {
"path": "Settings > System > Date and time"
},
....
}
JSON構成ファイルの準備ができると、次のコードブロックに示すように、実行時に提供されます。
# Push The JSON configuration file to the device
adb -s DEVICE-SERIAL push PATH-OF-JSON-FILE /data/local/tmp/jsonFile.json
これらのコマンドでは:
- PATH-TO-JSON-FILE :ホストマシン上のJSONファイルのパス。
- DEVICE-SERIAL :DUTのシリアルID。ホストに接続されているデバイスが1つだけの場合、このパラメーターは必要ありません。
構築と実行
Spectatioフレームワークは、テストAPKの一部として自動的に構築されます。テストAPKをビルドするには、AOSPコードベースがローカルワークステーションに存在する必要があります。テストAPKがビルドされたら、ユーザーはデバイスにAPKをインストールして、テストを実行する必要があります。
次のコードサンプルは、テストAPKの構築、インストール、および実行を示しています。
# Build Test APK
make TEST-APK-NAME
# Install Test APK
adb -s DEVICE-SERIAL install -r PATH-FOR-BUILT-TEST-APK
# Execute Test with the JSON file
adb -s DEVICE-SERIAL shell am instrument -w -r -e debug false -e config-file-path /data/local/tmp/jsonFile.json -e class TEST-PACKAGE.TEST-CLASSNAME TEST-PACKAGE/androidx.test.runner.AndroidJUnitRunner
これらのコマンドでは:
TEST-APK-NAME :テストするアプリの名前。たとえば、 TEST-APK-NAMEを
AndroidAutomotiveSettingsTestsに設定して、Android.bpファイルで指定されているWi-Fi設定をテストします。 APKの名前は、 AutomotiveテストのそれぞれのAndroid.bpファイルにあります。DEVICE-SERIAL :DUTのシリアルID。ホストに接続されているデバイスが1つだけの場合、このパラメーターは必要ありません。
config-file-path: JSON構成ファイルで指定されているデフォルト以外のデバイスUI構成を提供するためにのみ必要なオプションのパラメーター。指定しない場合、フレームワークはテストの実行にデフォルト値を使用します。PATH-FOR-BUILT-TEST-APK :
makeコマンドの実行時にテストAPKがビルドされるパス。TEST-PACKAGE :テストパッケージの名前。
TEST-CLASSNAME :テストクラスの名前。たとえば、 Wifi設定テストの場合、テストパッケージは
android.platform.testsであり、テストクラス名はWifiSettingTestです。