Spectatio は、実際のデバイスと仮想デバイスで Android Automotive OS(AAOS)をテストするために開発されたオープンソースのテスト フレームワークです。Spectatio が提供する API を使用して、 車載デバイスでアプリをテストできる、拡張可能でスケーラブルなソリューション AAOS とそのアプリの機能とパフォーマンスを検証するために使用されます。
設計の概要
Spectatio フレームワークは、さまざまな AAOS UI の実装に適用し、拡張することが可能です。AAOS の機能とパフォーマンスをテストするために使用されます。 仮想環境で実行できます
次の図は、Spectatio フレームワークの設計の概要を示しています。
図 1. Spectatio フレームワークの設計の概要。
Spectatio フレームワークは UI Automator 上に構築され、一連の API を提供します。 を使用して、AAOS でユーザーアプリやシステムアプリとやり取りする UI テストを作成できます。自動車 Spectatio フレームワークが提供する API をテストに使用することで、 これらのテストはテスト対象デバイス(DUT)から独立しており、テストに 多様なデバイスに対応できます
図 1 は、アプリ固有のインターフェースとヘルパーを使用して、電話アプリ、Medicenter、設定などのリファレンス アプリを基に Spectatio フレームワークをモジュール化し、新しいアプリ用に簡単に拡張できることを示しています。Spectatio フレームワークは、一般的な標準ヘルパークラスとユーティリティ ヘルパークラスを再利用します。標準ヘルパークラス すべてのアプリヘルパー関数の親クラスであり、 デバイス固有またはアプリ全体に適用される標準の機能。ユーティリティ ヘルパークラスは、デバイスからのファイルの読み取りや書き込みなどを行うユーティリティを提供します。
アーキテクチャ
UI テストを作成するための API セットを提供するため、Spectatio フレームワークは アプリ固有のインターフェースとヘルパーに加え、既存の標準ヘルパーを拡張する ユーティリティ ヘルパークラスをインポートします。
図 2 は、Spectatio フレームワークのアーキテクチャの概要と アプリをテストするための API の実装に関連するすべてのエンティティ。
図 2. Spectatio フレームワークのアーキテクチャの概要。
アプリヘルパー インターフェースは、
使用できます。これは、アプリのテストに必要なさまざまなヘルパー関数で構成されます。各アプリには、IAutoSettingHelper
や IAutoDialHelper
などの固有のインターフェースがあります。インターフェース関数の詳細とリストについては、AOSP のアプリヘルパー インターフェース関数をご覧ください。
標準ヘルパークラスは、pressHome
や scroll
のように、デバイスのセットアップに必要だがアプリに固有ではない標準の属性と関数で構成されます。標準ヘルパークラスは AbstractAutoStandardAppHelper.java
で定義されます。
ユーティリティ ヘルパークラスはフレームワークによって使用されます。対象
たとえば、AutoJsonUtility.java
は
指定されたデバイスの JSON 構成ファイルを読み込み、そのファイルを更新するユーティリティ クラスです。
フレームワーク構成を実行時に定義できます。
アプリヘルパー実装モジュールは Spectatio の
説明します。これには、
アプリヘルパー インターフェース。
対応しています。アプリごとに、SettingHelperImpl
などの独自の実装があります。
および
DialHelperImpl
,
使用者
アプリをテストするための Automotive テスト。P-MAX の詳細と
アプリヘルパーの実装関数をご覧ください。
をご覧ください。
自動車テスト
アプリヘルパーの実装関数を使用して、さまざまなオペレーションをテストする
表示されます。HelperAccessor
クラスを使用する
アプリヘルパーの実装関数にアクセスできるようにします。
次のコードは、サンプル Automotive テストのセットアップ、クリーンアップ、実行を示しています。
@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());
}
}
カスタマイズ
Spectatio フレームワークはデバイス UI から独立しているため、さまざまな UI とハードウェアでデバイスをテストできるスケーラビリティを備えています。このスケーラビリティを実現するために
Spectatio は参照デバイスに基づくデフォルトのデバイス設定を使用します。宛先
サポートしている場合、フレームワークでは JSON を使用します。
構成ファイルを使用して、デバイスに必要な UI の変更を設定します。
JSON 構成ファイルは、TEXT
、DESCRIPTION
、
RESOURCE_ID
(path
設定を含む)で、情報のみを含む
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 構成ファイルの例です。この例では
インターネット設定は、ネットワークと参照デバイス上のインターネット DUT の接続。
日付と時刻の設定は、[設定] >日時: [設定] >システム >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"
},
....
}
JSON 構成ファイルの準備ができると、以下に示すように、実行時に提供されます。 次のコードブロックを使用します。
# Push The JSON configuration file to the device
adb -s DEVICE-SERIAL push PATH-OF-JSON-FILE /data/local/tmp/runtimeSpectatioConfig.json
コマンドの内容:
DEVICE-SERIAL: DUT のシリアル ID。このパラメータは ホストに接続されているデバイスが 1 台だけの場合はこれが必要です。
PATH-TO-JSON-FILE: ホストマシン上の JSON ファイルのパス。
構成の形式
この構成には 5 つの最上位オブジェクトがあり、各オブジェクトには次のキーがあります。 と値:
オブジェクト | 説明 |
---|---|
PACKAGES |
さまざまなアプリのメイン パッケージを記述するオブジェクト。 アプリがフォアグラウンドにあるかどうかを判別します。 |
ACTIONS |
さまざまなアクションのアクション タイプとパラメータを示すオブジェクト。 たとえば、スクロールにボタンとジェスチャーのどちらを使用するかを指定します。 |
COMMANDS |
さまざまなアクションを実行するコマンドを指定するオブジェクト。 |
UI_ELEMENTS |
UI を選択する UI Automator「BySelectors」の作成に使用されるオブジェクト 要素(詳細については後述)。 |
WORKFLOWS |
おおまかなタスクを完了するための一連のアクション( 以下で詳しく説明しています)。 |
UI 要素
各 UI 要素には、UI Automator が検索する対象を指定する TYPE
があります。
要素(リソース ID、テキスト、説明など)を識別し、
そのタイプに関連付けられた構成値を確認できます。通常、ヘルパーが
この設定を使用して画面上の要素を識別すると、
1 つの要素で表します複数の要素が構成に一致する場合、任意の要素が
使用されます。したがって、構成は通常、構成を記述する必要があり、
関連するコンテキストの要素を 1 つに絞り込むことができます。
テキスト
これは最もシンプルな UI 要素タイプです。UI 要素はそのテキスト、 完全に一致する必要があります
"CALL_HISTORY_MENU": {
"TYPE": "TEXT",
"VALUE": "Recents"
}
テキストのコンテキスト
TEXT
と同じですが、指定した VALUE
が
照合する要素のテキスト。
"PRIVACY_CALENDAR": {
"TYPE": "TEXT_CONTAINS",
"VALUE": "Calendar"
}
説明
コンテンツの説明属性で要素を識別するため、正確な 一致します。
"APP_GRID_SCROLL_BACKWARD_BUTTON": {
"TYPE": "DESCRIPTION",
"VALUE": "Scroll up"
}
RESOURCE_ID
リソース ID で要素を識別します。必要に応じてパッケージのチェックも行います
その ID の要素が含まれますPACKAGE
キーは省略可能です。省略した場合、任意のパッケージは
:id/
に続く ID の部分のみが考慮されます。
"APP_LIST_SCROLL_ELEMENT": {
"TYPE": "RESOURCE_ID",
"VALUE": "apps_grid",
"PACKAGE": "com.android.car.carlauncher"
}
クリック可能、スクロール可能
クリック可能またはスクロール可能かどうかで要素を識別します。
これらは非常に広範な要素型であり、通常は
MULTIPLE
: 別の要素タイプを絞り込むことができます。FLAG
キーは省略可能です。
デフォルトは true
です。
"SAMPLE_ELEMENT": {
"TYPE": "CLICKABLE",
"FLAG": false
}
クラス
クラスに基づいて要素を識別します。
"SECURITY_SETTINGS_ENTER_PASSWORD": {
"TYPE": "CLASS",
"VALUE": "android.widget.EditText"
}
HAS_ANCESTOR
祖先でウィジェットの階層を検索して、要素を特定します。「
ANCESTOR
キーは、祖先を識別するオブジェクトを保持します。DEPTH
キー
どこまで階層を
検索するかを指定しますDEPTH
は省略可能で、
1
のデフォルト値。
"SAMPLE_ELEMENT": {
"TYPE": "HAS_ANCESTOR",
"DEPTH": 2,
"ANCESTOR": {
"TYPE": "CLASS",
"VALUE": "android.view.ViewGroup"
}
}
HAS_DESCENDANT(降順)
階層の子を参照して要素を特定します。「
DESCENDANT
キーは、検索する子を指定するオブジェクトを保持します。「
DEPTH
キーは、検索する階層の最上位を指定します。DEPTH
は任意であり、
デフォルト値は 1
です。
"SAMPLE_ELEMENT": {
"TYPE": "HAS_DESCENDANT",
"DEPTH": 2,
"DESCENDANT": {
"TYPE": "CLASS",
"VALUE": "android.view.ViewGroup"
}
}
複数
複数の同時条件に基づいて要素を特定します。条件はすべて 満たす必要があります
"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"
}
}
]
}
この例では、この構成で識別される RelativeLayout
には、
テキスト Permission manager
を持つ、深さ 2
の子孫となります。
Workflows
ワークフローは、特定のタスクを実行するために使用される一連のアクションを表します。 タスクはデバイスの種類によってかなり異なる場合があり、 コードよりも構成で柔軟に表現できます。
"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"
}
}
}
]
}
各ワークフローは Key-Value ペアで、キーはワークフローの名前で、
値は実行するアクションの配列です。各アクションには NAME
、TYPE
、
(通常は)CONFIG
、そして(場合によっては)SWIPE_CONFIG
または SCROLL_CONFIG
です。対象
ほとんどの TYPE で、CONFIG
は UI_ELEMENT
キーを持つオブジェクトであり、その値は
UI 要素エントリと同じ形式です(上記参照)。そのタイプは次のとおりです。
押す 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 |
他の TYPE の場合、設定の詳細は次のとおりです。
オブジェクト | 説明 |
---|---|
COMMAND |
実行するコマンドを含む TEXT 値を持つオブジェクト。 |
HAS_PACKAGE_IN_FOREGROUND |
パッケージを含む TEXT 値を持つオブジェクト。 |
SWIPE |
SWIPE アクションでは CONFIG key を省略します。この
SWIPE_CONFIG のみを使用 |
WAIT_MS |
TEXT 値に次の値を含むオブジェクト。
ミリ秒単位の待機時間です。 |
スクロールやスワイプ関連の操作には、以下のような追加の設定が必要です。
スクロール設定
オブジェクト | 説明 |
---|---|
SCROLL_ACTION |
USE_GESTURE または USE_BUTTON |
SCROLL_DIRECTION |
HORIZONTAL または VERTICAL |
SCROLL_ELEMENT |
スクロールするコンテナを示すオブジェクト(UI と同じフォームを使用) 要素の設定(上記参照)。 |
SCROLL_FORWARD 、SCROLL_BACKWARD |
前後スクロール ボタン(
SCROLL_ACTION は USE_BUTTON です)。 |
SCROLL_MARGIN |
SCROLL_ACTION が USE_GESTURE の場合、距離
使用するドラッグの開始と停止をコンテナの端から
スクロールを実行します(省略可、デフォルト = 10)。 |
SCROLL_WAIT_TIME |
SCROLL_ACTION が USE_GESTURE の場合、時刻
(ミリ秒単位)
。
(省略可、デフォルトは 1)。 |
スワイプの設定
オブジェクト | 説明 |
---|---|
SWIPE_DIRECTION |
TOP_TO_BOTTOM 、BOTTOM_TO_TOP 、
LEFT_TO_RIGHT または RIGHT_TO_LEFT |
SWIPE_FRACTION |
次のいずれかです。
|
NUMBER_OF_STEPS |
スワイプを実行するために使用されるステップ数。
segmentSteps をご覧ください。
|
ビルドして実行する
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: テスト対象アプリの名前。たとえば、
Android.bp
ファイルで指定された Wi-Fi 設定をテストするには、TEST-APK-NAME をAndroidAutomotiveSettingsTests
に設定します。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: テストクラスの名前。たとえば、 Wi-Fi 設定テストの場合、テスト パッケージは
android.platform.tests
、 テストクラス名はWifiSettingTest
です。
Automotive スニペット ライブラリ
Automotive Snippet Library は、Android アプリの 自動車とやり取りするために設計された Android オープンソース プロジェクト(AOSP) 提供する方法を学びます。Spectatio を活用し リモート プロシージャ コール(RPC)を実行して、 Android デバイス。
始める
始める前に、以下のセクションを確認してください。
前提条件
- ホストマシンに Python 3.x がインストールされていること。
- 必要なビルドツールを使用した AOSP 環境のセットアップ。
- adb にアクセスできる Android 自動車デバイス(エミュレータまたは実機)。
コンパイル
Automotive Snippet Library で提供されるさまざまなスニペットをコンパイルするには、
提供された android.bp
ファイルを使用できます。前のスライドの
セクションを開いて APK をコンパイルします。
デプロイ
スニペット ライブラリが正常にコンパイルされたら、生成された APK を
前述の adb install
コマンドを使用して対象デバイスを指定します。
できます。
テストを実行する
スニペット ライブラリは、自動車とやり取りするためのいくつかの RPC メソッドを公開しています。
ありませんこれらのメソッドは、ホストから Mobly フレームワークを介して呼び出すことができます。
あります。Mobly テスト環境をセットアップ済みの場合、
snippet_shell.py
スクリプトを使用して、インタラクティブな Python シェルを開きます。ここでは、
RPC メソッドを手動で呼び出します。呼び出しの例:
python3 snippet_shell.py com.google.android.mobly.snippet.bundled -s <serial>
<serial>
は、デバイスのシリアル番号に置き換えます。これは次で取得できます。
adb デバイス。
含まれるライブラリ
Automotive スニペット ライブラリには、次のスニペット ライブラリと helpers:
AutomotiveSnippet: 車両の操作に関連する次のような API を提供します。 ダイヤル、音量調節、車両のハードキー、メディア センターの操作。
PhoneSnippet: 通話の処理、 連絡先のブラウジング、SMS 操作 などです
Automotive スニペットと PhoneSnippet には共通のロジックがあります。
具体的には、Bluetooth 関連の RCP 通話を侵害して自動車とペア設定できます。
用意していますこちらのbt_discovery_test
でその方法をご確認ください。
- TEST-CLASSNAME: テストクラスの名前。たとえば、Wi-Fi 設定テストの場合、テスト パッケージ名は
android.platform.tests
で、テストクラス名はWifiSettingTest
です。