Spectatio: Automotive 測試架構

Spectatio 是專為 Android 測試而開發的開放原始碼測試架構 Automotive OS (AAOS) 適用於實體與虛擬裝置。Spectatio 提供的 API 在車用裝置上測試應用程式,是可擴充且可擴充的解決方案 ,用於驗證 AAOS 及其應用程式的功能與效能。

整體設計

Spectatio 架構可針對各種 AAOS UI 進行調整和可展開 。用於測試 AAOS 的功能和效能 裝置硬體、模擬器和虛擬化環境

下圖說明 Spectatio 架構的整體設計。

Spectatio 架構整體設計

圖 1. Spectatio 架構整體設計。

Spectatio 架構以 UI Automator 為基礎,提供一組 API ,建構能夠與 AAOS 上使用者和系統應用程式互動的 UI 測試。汽車業 測試會使用 Spectatio 架構提供的 API 進行測試, 獨立測試,獨立於受測試 (DUT) 的裝置之外,並可彈性擴充 提供多種裝置 (如支援)

圖 1 顯示 Spectatio 架構是根據參照方式模組化 應用程式,例如 Dialer、Medicenter 和設定 介面和輔助程式,方便新應用程式延伸。守護者 架構重複使用通用的標準和公用程式輔助類別。標準輔助類別 是所有應用程式輔助函式的父項類別, 是裝置專屬或所有應用程式適用的標準功能。 公用輔助程式類別提供公用程式,例如 讀取或寫入裝置中的檔案

建築

為提供一組 API 以建構 UI 測試,Spectatio 架構會實作 應用程式專屬介面和輔助程式,同時擴充現有的標準輔助程式 類別並匯入公用程式輔助類別。

圖 2 說明瞭 Spectatio 架構的整體架構和 實作 API 以測試應用程式的所有實體。

Spectatio 架構高階架構

圖 2. Spectatio 架構高階架構。

應用程式輔助程式介面提供實作 應用程式輔助程式。當中包含各種需要的輔助函式 以測試應用程式每個應用程式都有專屬的介面,例如 IAutoSettingHelperIAutoDialHelper。 如要進一步瞭解介面和介面函式清單,請參閱 Android 開放原始碼計畫的應用程式輔助介面函式

標準輔助類別包含標準屬性和函式 與任何應用程式無關,例如 pressHomescroll。標準輔助類別是在 AbstractAutoStandardAppHelper.java 中定義。

架構會使用公用程式輔助類別。適用對象 例如,AutoJsonUtility.java 是 公用程式類別,可載入指定裝置 JSON 設定檔並更新 管理架構設定

應用程式輔助程式實作模組是 Spectatio 的核心 這個架構的重點在於其中包含了在 應用程式輔助程式介面,這是在 車用裝置。每個應用程式都有專屬的實作項目,例如 SettingHelperImplDialHelperImpl、 已使用 用於測試應用程式的 Automotive 測試。如需詳細資訊和 的實作方式,請參閱應用程式輔助程式實作函式

汽車業測試 使用應用程式輔助程式實作函式來測試各種作業 管理應用程式的相關資訊使用 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 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 變更。A 罩杯 JSON 設定檔支援 TEXTDESCRIPTION 和 「RESOURCE_ID」加上「path」設定,而且只能包含資訊 有關 DUT 使用者介面的變更。其餘 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"
                        }
                }
        }
}
  

替代裝置設定

以下程式碼範例說明瞭 JSON 設定檔,其中 DUT 上的設定會覆寫預設設定。在這個例子中:

  • 網際網路的設定屬於「網路與設定」網路 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 的序號。這個參數不是 。

  • PATH-TO-JSON-FILE:主體機器上的 JSON 檔案路徑。

,瞭解如何調查及移除這項存取權。

設定格式

設定中有五個頂層物件,並包含下列索引鍵 和價值:

物件 說明
PACKAGES 說明各種應用程式主要套件的物件,用於 判斷應用程式在前景執行的時間。
ACTIONS 表示各種動作的動作類型和參數的物件。 例如該使用按鈕還是手勢進行捲動。
COMMANDS 此物件可指定執行各種動作的指令。
UI_ELEMENTS 一種物件,用於建構選取 UI 的 UI Automator「BySelectors」 元素 (詳細說明如下)。
WORKFLOWS 完成高階任務的操作序列 (如 )。

UI 元素

每個 UI 元素都有 TYPE,用來指定 UI Automator 尋找哪個 UI 元素 找出元素 (例如資源 ID、文字和說明) 並 所有與該類型相關的設定值一般而言, 以便透過這個設定識別畫面上的元素 一個元素如果有多個元素符合設定,則任意一個元素 所用的容器。因此,設定時 準確地縮小範圍,縮小到相關情境中的一個元素。

文字

這是最簡單的 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"
      }
    }

多個

依據多個同時的條件來識別元素,這些條件皆是 必須符合的 Pod

      "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 具有 深度 2 的子系,含有 Permission manager 文字。

工作流程

工作流程代表一系列的動作,用來完成 因為這可能會與裝置類型和裝置類型之間有一定差異,而且 較彈性

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

每個工作流程都是一組鍵/值組合,鍵是工作流程的名稱 值就是要執行動作的陣列。每項動作都有 NAMETYPE、 (通常) CONFIG 和 (有時) SWIPE_CONFIGSCROLL_CONFIG。適用對象 大多數的 TYPE,CONFIG 是具有 UI_ELEMENT 鍵的物件,其值 表示與 UI 元素項目相同 (請參閱上文)。這些類型如下:

上一頁
LONG_PRESS
點擊
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

其他類型的設定詳細資料如下:

物件 說明
COMMAND 具有 TEXT 值的物件,包含要執行的指令。
HAS_PACKAGE_IN_FOREGROUND 具有 TEXT 值的物件,內含套件。
SWIPE 針對 SWIPE 動作省略 CONFIG key。這個 僅使用SWIPE_CONFIG
WAIT_MS 包含 TEXT 值的物件,內含有 等待毫秒的時間。

捲動和滑動相關動作需要額外設定,如下所示:

捲動設定

物件 說明
SCROLL_ACTION USE_GESTUREUSE_BUTTON
SCROLL_DIRECTION HORIZONTALVERTICAL
SCROLL_ELEMENT 一個物件,用來表示要捲動的容器 (採用與 UI 相同的格式) 元素設定 (請參閱上方說明)。
SCROLL_FORWARDSCROLL_BACKWARD 「向前」和「向前」捲動按鈕 (需要 SCROLL_ACTIONUSE_BUTTON)。
SCROLL_MARGIN 如果 SCROLL_ACTIONUSE_GESTURE,表示距離 開始和停止要使用的拖曳項目 執行捲動動作 (選用,預設值為 10)。
SCROLL_WAIT_TIME 如果 SCROLL_ACTIONUSE_GESTURE,則代表 搜尋要變更目標物件時,在捲動手勢之間等待的幾毫秒 點擊。 (選用,預設值 = 1)。

滑動

物件 說明
SWIPE_DIRECTION TOP_TO_BOTTOMBOTTOM_TO_TOPLEFT_TO_RIGHTRIGHT_TO_LEFT
SWIPE_FRACTION

下列任一

  • FULL:將手勢從螢幕邊緣滑動至螢幕邊緣

  • DEFAULT:螢幕邊緣,邊框為五 (5) 像素緩衝區。

  • THREE_QUARTERHALFQUARTER:滑動手勢,完成五 (5) 像素 從螢幕邊緣開始,藉此覆蓋整個螢幕 。
NUMBER_OF_STEPS 執行滑動手勢所需的步數。詳情請參閱 segmentSteps

建構及執行

系統會在測試 APK 中自動建立 Spectatio 架構。建構 測試 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-NAMEAndroidAutomotiveSettingsTests 即可測試 Wi-Fi 設定 如 Android.bp 中指明 檔案。您可以在以下應用程式的個別 Android.bp 檔案中找到 APK 名稱: Automotive 測試

  • DEVICE-SERIAL:DUT 的序號。這個參數並不是 。

  • config-file-path:非必要的選用參數 JSON 設定中指定的非預設裝置 UI 設定 檔案,如未提供, 架構會使用預設值來執行測試。

  • PATH-FOR-BUILT-TEST-APK:測試 APK 的建構路徑 執行 make 指令時。

  • TEST-PACKAGE:測試套件名稱。

  • TEST-CLASSNAME:測試類別的名稱。舉例來說,對於 Wifi 設定測試,測試套件為 android.platform.tests, 測試類別名稱為 WifiSettingTest

Automotive 程式碼片段程式庫

Automotive 程式碼片段程式庫是一組 Android 測試程式庫, 專為與汽車互動而設計的 Android 開放原始碼計畫 (AOSP) 應用程式與服務透過便利的機制使用 Spectatio 從主機 (測試) 執行遠端程序呼叫 (RPC) 至 Android 裝置。

開始使用

開始之前,請先詳閱下列各節內容。

必要條件

  • 在主機上安裝 Python 3.x。
  • 透過必要的建構工具設定 Android 開放原始碼計畫環境。
  • 具備 ADB 存取權的 Android 汽車裝置 (模擬器或實體裝置)。

編譯

如要編譯 Automotive 程式碼片段程式庫提供的各種程式碼片段, 可以使用提供的 android.bp 檔案。接著使用 部分來編譯 APK。

部署作業

成功編譯程式碼片段程式庫後,將產生的 APK 部署至 使用上一個步驟提及的 adb install 指令為目標裝置 專區。

執行測試

程式碼片段程式庫提供多個 RPC 方法,以便與汽車互動 有些人會將 Cloud Storage 視為檔案系統 但實際上不是這些方法可透過主機的 Mobly 架構叫用 這類機制更為快速假設您已經設定 Mobly 測試環境,就可以使用 snippet_shell.py 指令碼可開啟互動式 Python 殼層,您可以在 在裝置上手動叫用 RPC 方法。叫用範例:

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

<serial> 替換為裝置序號,您可在此取得該序號 ADB 裝置 (如果有多部裝置連線)。

包含的程式庫

Automotive 程式碼片段程式庫包含下列程式碼片段程式庫。 輔助程式:

  • AutomotiveSnippet:提供車輛營運相關 API,例如 撥號、音量控制、車輛鑰匙和媒體中心互動功能。

  • PhoneSnippet:提供電話處理相關 API,包括來電處理方式 聯絡人瀏覽以及 SMS 作業。

Automotive 程式碼片段和 PhoneSnippet 會共用一些常用邏輯。 具體來說,你可以入侵與藍牙相關的 RCP 呼叫,藉此配對汽車 以及手機裝置。這個 bt_discovery_test 示範操作方式。