Spectatio, Android Automotive OS'i (AAOS) gerçek ve sanal cihazlarda test etmek için geliştirilmiş açık kaynak bir test çerçevesidir. Spectatio, uygulamaları otomotiv cihazlarda test etmek için API'ler sağlar. AAOS ve uygulamalarının kapasitesini ve performansını doğrulamak için kullanılan genişletilebilir ve ölçeklenebilir bir çözümdür.
Üst düzey tasarım
Spectatio çerçevesi, çeşitli AAOS kullanıcı arayüzü uygulamaları için uyarlanabilir ve genişletilebilir. Cihaz donanımı, emülatör ve sanallaştırılmış ortamlarda AAOS'un kapasitesini ve performansını test etmek için kullanılır.
Aşağıdaki şekilde, Spectatio çerçevesinin üst düzey tasarımı açıklanmaktadır.
Şekil 1. Spectatio çerçevesinin üst düzey tasarımı.
UI Automator'un üzerine inşa edilen Spectatio çerçevesi, AAOS'teki kullanıcı ve sistem uygulamalarıyla etkileşime geçen kullanıcı arayüzü testleri oluşturmak için bir dizi API sağlar. Otomotiv testleri, test için Spectatio çerçevesi tarafından sağlanan API'leri kullanır. Bu sayede, testler test edilen cihazdan (DUT) bağımsız olur ve destekleniyorsa çeşitli cihazları test edecek şekilde ölçeklendirilebilir.
Şekil 1'de, Spectatio çerçevesinin uygulamaya özel arayüzler ve yardımcılar kullanarak Telefon, Medicenter ve Ayarlar gibi referans uygulamalara göre modülerleştirildiği ve bu sayede yeni uygulamalar için kolayca genişletilebildiği gösterilmektedir. Spectatio çerçevesi, ortak standart ve yardımcı program sınıflarını yeniden kullanır. Standart yardımcı sınıf, tüm uygulama yardımcı işlevlerinin üst sınıfıdır ve cihaza özel veya uygulamalar genelinde geçerli olan standart işlevler sağlar. Yardımcı program sınıfları, cihazdan dosya okuma veya yazma gibi yardımcı programlar sağlar.
Mimari
Spectatio çerçevesi, kullanıcı arayüzü testleri oluşturmak için bir API grubu sağlamak amacıyla uygulamaya özel arayüzler ve yardımcılar uygularken mevcut standart yardımcı sınıfını genişletir ve yardımcı program yardımcı sınıflarını içe aktarır.
Şekil 2'de, Spectatio çerçevesinin üst düzey mimarisi ve bir uygulamayı test etmek için API'leri uygulamayla ilgili tüm öğeler gösterilmektedir.
Şekil 2. Spectatio çerçevesinin üst düzey mimarisi.
Uygulama yardımcısı arayüzü, uygulama yardımcısının uygulanması için bir taslak sağlar. Uygulamaları test etmek için gereken çeşitli yardımcı işlevlerden oluşur. Her uygulamanın kendi arayüzü vardır (ör. IAutoSettingHelper
ve IAutoDialHelper
).
Daha fazla bilgi ve arayüz işlevlerinin listesi için AOSP'deki uygulama yardımcısı arayüz işlevlerine bakın.
Standart yardımcı sınıf, cihaz kurulumu için gerekli olan ancak pressHome
ve scroll
gibi herhangi bir uygulamaya özgü olmayan standart özelliklerden ve işlevlerden oluşur. Standart yardımcı sınıf, AbstractAutoStandardAppHelper.java
adresinde tanımlanır.
Yardımcı program sınıfları çerçeve tarafından kullanılır. Örneğin, AutoJsonUtility.java
, belirli bir cihazın JSON yapılandırma dosyasını yükleyen ve çalışma zamanında çerçeve yapılandırmalarını güncelleyen bir yardımcı program sınıfıdır.
Uygulama yardımcısı uygulama modülü, Spectatio çerçevesinin temelini oluşturur. Uygulama yardımcı arayüzünde tanımlanan ve uygulamaları otomotiv cihazlarda test etmek için gereken yardımcı işlevlerin uygulamasını içerir. Her uygulamanın, uygulamaları test etmek için Otomotiv testleri tarafından kullanılan SettingHelperImpl
ve DialHelperImpl
gibi kendi uygulaması vardır. Daha fazla bilgi ve uygulama listesini görmek için AOSP'deki uygulama yardımcısı uygulama işlevlerine bakın.
Otomotiv Testleri, uygulamayla ilgili çeşitli işlemleri test etmek için uygulama yardımcısı uygulama işlevlerini kullanır. Uygulama yardımcısı uygulama işlevlerine erişmek için HelperAccessor
sınıfını kullanın.
Aşağıdaki kodda, örnek bir otomotiv testinin kurulumu, temizliği ve yürütülmesi gösterilmektedir.
@RunWith(AndroidJUnit4.class)
public class AutoApplicationTest {
static HelperAccessor<IAutoApplicationHelper> autoApplicationHelper =
new HelperAccessor<>(IAutoApplicationHelper.class);
public AutoApplicationTest() {
// constructor
// Initialize any attributes that are required for the test execution
}
@Before
public void beforeTest() {
// Initial setup before each test
// For example - open the app
autoApplicationHelper.open();
}
@After
public void afterTest() {
// Cleanup after each test.
// For example - exit the app
autoApplicationHelper.exit();
}
@Test
public void testApplicationFeature() {
// Test
// For example - Test if app is open
assertTrue("Application is not open.", autoApplicationHelper.isOpen());
}
}
Özelleştirme
Spectatio çerçevesi, cihaz kullanıcı arayüzünden bağımsızdır. Bu nedenle, farklı kullanıcı arayüzlerine ve donanımlara sahip cihazları test etmek için ölçeklenebilir. Bu ölçeklenebilirliği sağlamak için Spectatio, referans cihaza dayalı varsayılan cihaz yapılandırmalarını kullanır. Varsayılan olmayan cihaz yapılandırmalarını desteklemek için çerçeve, cihazda istenen kullanıcı arayüzü değişikliklerini ayarlamak amacıyla çalışma zamanında bir JSON yapılandırma dosyası kullanır. JSON yapılandırma dosyası, path
ayarlarının yanı sıra TEXT
, DESCRIPTION
ve RESOURCE_ID
gibi kullanıcı arayüzü öğelerini destekler ve yalnızca DUT'daki kullanıcı arayüzü değişiklikleriyle ilgili bilgileri içermelidir. Kullanıcı arayüzü öğelerinin geri kalanı, çerçevede sağlanan varsayılan yapılandırma değerlerini kullanır.
Varsayılan cihaz yapılandırmaları
Aşağıdaki örnek JSON yapılandırma dosyasında, mevcut cihaz yapılandırmaları ve varsayılan değerleri gösterilmektedir.
Örnek bir JSON yapılandırma dosyasını görüntülemek için burayı tıklayın
{ "SETTINGS": { "APPLICATION_CONFIG": { "SETTINGS_TITLE_TEXT": "Settings", "SETTINGS_PACKAGE": "com.android.car.settings", "SETTINGS_RRO_PACKAGE": "com.android.car.settings.googlecarui.rro", "OPEN_SETTINGS_COMMAND": "am start -a android.settings.SETTINGS", "OPEN_QUICK_SETTINGS_COMMAND": "am start -n com.android.car.settings/com.android.car.settings.common.CarSettingActivity" }, "QUICK_SETTINGS": { "OPEN_MORE_SETTINGS": { "TYPE": "RESOURCE_ID", "VALUE": "toolbar_menu_item_1", "PACKAGE": "com.android.car.settings" }, "NIGHT_MODE": { "TYPE": "TEXT", "VALUE": "Night mode" } }, "DISPLAY": { "PATH": "Settings > Display", "OPTIONS": [ "Brightness level" ], "BRIGHTNESS_LEVEL": { "TYPE": "RESOURCE_ID", "VALUE": "seekbar", "PACKAGE": "com.android.car.settings" } }, "SOUND": { "PATH": "Settings > Sound", "OPTIONS": [ "Media volume", "Alarm volume" ] }, "NETWORK_AND_INTERNET": { "PATH": "Settings > Network & internet", "OPTIONS": [ ], "TOGGLE_WIFI": { "TYPE": "RESOURCE_ID", "VALUE": "master_switch", "PACKAGE": "com.android.car.settings" } }, "BLUETOOTH": { "PATH": "Settings > Bluetooth", "OPTIONS": [ ], "TOGGLE_BLUETOOTH": { "TYPE": "RESOURCE_ID", "VALUE": "car_ui_toolbar_menu_item_switch", "PACKAGE": "com.android.car.settings" } }, "APPS_AND_NOTIFICATIONS": { "PATH": "Settings > Apps & notifications", "OPTIONS": [ ], "SHOW_ALL_APPS": { "TYPE": "TEXT", "VALUE": "Show all apps" }, "ENABLE_DISABLE_BUTTON": { "TYPE": "RESOURCE_ID", "VALUE": "car_ui_toolbar_menu_item_text", "PACKAGE": "com.android.car.settings" }, "DISABLE_BUTTON_TEXT": { "TYPE": "TEXT", "VALUE": "Disable" }, "ENABLE_BUTTON_TEXT": { "TYPE": "TEXT", "VALUE": "Enable" }, "DISABLE_APP_BUTTON": { "TYPE": "TEXT", "VALUE": "DISABLE APP" }, "FORCE_STOP_BUTTON": { "TYPE": "TEXT", "VALUE": "Force stop" }, "OK_BUTTON": { "TYPE": "TEXT", "VALUE": "OK" }, "PERMISSIONS_MENU": { "TYPE": "TEXT", "VALUE": "Permissions" }, "ALLOW_BUTTON": { "TYPE": "TEXT", "VALUE": "Allow" }, "DENY_BUTTON": { "TYPE": "TEXT", "VALUE": "Deny" }, "DENY_ANYWAY_BUTTON": { "TYPE": "TEXT", "VALUE": "Deny anyway" } }, "DATE_AND_TIME": { "PATH": "Settings > Date & time", "OPTIONS": [ "Automatic date & time", "Automatic time zone" ], "AUTOMATIC_DATE_AND_TIME": { "TYPE": "TEXT", "VALUE": "Automatic date & time" }, "AUTOMATIC_TIME_ZONE": { "TYPE": "TEXT", "VALUE": "Automatic time zone" }, "SET_DATE": { "TYPE": "TEXT", "VALUE": "Set date" }, "SET_TIME": { "TYPE": "TEXT", "VALUE": "Set time" }, "SELECT_TIME_ZONE": { "TYPE": "TEXT", "VALUE": "Select time zone" }, "USE_24_HOUR_FORMAT": { "TYPE": "TEXT", "VALUE": "Use 24-hour format" }, "OK_BUTTON": { "TYPE": "RESOURCE_ID", "VALUE": "toolbar_menu_item_0", "PACKAGE": "com.android.car.settings" }, "NUMBER_PICKER_WIDGET": { "TYPE": "CLASS", "VALUE": "android.widget.NumberPicker" }, "EDIT_TEXT_WIDGET": { "TYPE": "CLASS", "VALUE": "android.widget.EditText" } }, "USERS": { "PATH": "Settings > Users", "OPTIONS": [ "Guest" ] }, "ACCOUNTS": { "PATH": "Settings > Accounts", "OPTIONS": [ "Automatically sync data" ], "ADD_ACCOUNT": { "TYPE": "TEXT", "VALUE": "ADD ACCOUNT" }, "ADD_GOOGLE_ACCOUNT": { "TYPE": "TEXT", "VALUE": "Google" }, "SIGN_IN_ON_CAR_SCREEN": { "TYPE": "TEXT", "VALUE": "Sign in on car screen" }, "GOOGLE_SIGN_IN_SCREEN": { "TYPE": "TEXT", "VALUE": "Sign in to your Google Account" }, "ENTER_EMAIL": { "TYPE": "CLASS", "VALUE": "android.widget.EditText" }, "ENTER_PASSWORD": { "TYPE": "CLASS", "VALUE": "android.widget.EditText" }, "NEXT_BUTTON": { "TYPE": "TEXT", "VALUE": "Next" }, "DONE_BUTTON": { "TYPE": "TEXT", "VALUE": "Done" }, "REMOVE_BUTTON": { "TYPE": "TEXT", "VALUE": "Remove" }, "REMOVE_ACCOUNT_BUTTON": { "TYPE": "TEXT", "VALUE": "Remove Account" } }, "SYSTEM": { "PATH": "Settings > System", "OPTIONS": [ "About", "Legal information" ], "ABOUT_MENU": { "TYPE": "TEXT", "VALUE": "About" }, "RESET_OPTIONS_MENU": { "TYPE": "TEXT", "VALUE": "Reset options" }, "LANGUAGES_AND_INPUT_MENU": { "TYPE": "TEXT", "VALUE": "Languages & input" }, "DEVICE_MODEL": { "TYPE": "TEXT", "VALUE": "Model" }, "ANDROID_VERSION": { "TYPE": "TEXT", "VALUE": "Android version" }, "ANDROID_SECURITY_PATCH_LEVEL": { "TYPE": "TEXT", "VALUE": "Android security patch level" }, "KERNEL_VERSION": { "TYPE": "TEXT", "VALUE": "Kernel version" }, "BUILD_NUMBER": { "TYPE": "TEXT", "VALUE": "Build number" }, "RECYCLER_VIEW_WIDGET": { "TYPE": "CLASS", "VALUE": "androidx.recyclerview.widget.RecyclerView" }, "RESET_NETWORK": { "TYPE": "TEXT", "VALUE": "Reset network" }, "RESET_SETTINGS": { "TYPE": "TEXT", "VALUE": "RESET SETTINGS" }, "RESET_APP_PREFERENCES": { "TYPE": "TEXT", "VALUE": "Reset app preferences" }, "RESET_APPS": { "TYPE": "TEXT", "VALUE": "RESET APPS" }, "LANGUAGES_MENU": { "TYPE": "TEXT", "VALUE": "Languages" }, "LANGUAGES_MENU_IN_SELECTED_LANGUAGE": { "TYPE": "TEXT", "VALUE": "Idiomas" } }, "SECURITY": { "PATH": "Settings > Security", "OPTIONS": [ ], "TITLE": { "TYPE": "RESOURCE_ID", "VALUE": "car_ui_toolbar_title", "PACKAGE": "com.android.car.settings.googlecarui.rro" }, "CHOOSE_LOCK_TYPE": { "TYPE": "TEXT", "VALUE": "Choose a lock type" }, "LOCK_TYPE_PASSWORD": { "TYPE": "TEXT", "VALUE": "Password" }, "LOCK_TYPE_PIN": { "TYPE": "TEXT", "VALUE": "PIN" }, "LOCK_TYPE_NONE": { "TYPE": "TEXT", "VALUE": "None" }, "CONTINUE_BUTTON": { "TYPE": "TEXT", "VALUE": "Continue" }, "CONFIRM_BUTTON": { "TYPE": "TEXT", "VALUE": "Confirm" }, "ENTER_PASSWORD": { "TYPE": "CLASS", "VALUE": "android.widget.EditText" }, "PIN_PAD": { "TYPE": "RESOURCE_ID", "VALUE": "pin_pad", "PACKAGE": "com.android.car.settings" }, "ENTER_PIN_BUTTON": { "TYPE": "RESOURCE_ID", "VALUE": "key_enter", "PACKAGE": "com.android.car.settings" }, "REMOVE_BUTTON": { "TYPE": "TEXT", "VALUE": "Remove" } } }, "PHONE": { "APPLICATION_CONFIG": { "DIAL_PACKAGE": "com.android.car.dialer", "PHONE_ACTIVITY": "com.android.car.dialer/.ui.TelecomActivity", "OPEN_DIAL_PAD_COMMAND": "am start -a android.intent.action.DIAL" }, "IN_CALL_VIEW": { "DIALED_CONTACT_TITLE": { "TYPE": "RESOURCE_ID", "VALUE": "user_profile_title", "PACKAGE": "com.android.car.dialer" }, "DIALED_CONTACT_NUMBER": { "TYPE": "RESOURCE_ID", "VALUE": "user_profile_phone_number", "PACKAGE": "com.android.car.dialer" }, "END_CALL": { "TYPE": "RESOURCE_ID", "VALUE": "end_call_button", "PACKAGE": "com.android.car.dialer" }, "MUTE_CALL": { "TYPE": "RESOURCE_ID", "VALUE": "mute_button", "PACKAGE": "com.android.car.dialer" }, "SWITCH_TO_DIAL_PAD": { "TYPE": "RESOURCE_ID", "VALUE": "toggle_dialpad_button", "PACKAGE": "com.android.car.dialer" }, "CHANGE_VOICE_CHANNEL": { "TYPE": "RESOURCE_ID", "VALUE": "voice_channel_view", "PACKAGE": "com.android.car.dialer" }, "VOICE_CHANNEL_CAR": { "TYPE": "TEXT", "VALUE": "Car speakers" }, "VOICE_CHANNEL_PHONE": { "TYPE": "TEXT", "VALUE": "Phone" } }, "DIAL_PAD_VIEW": { "DIAL_PAD_MENU": { "TYPE": "TEXT", "VALUE": "Dial Pad" }, "DIAL_PAD_FRAGMENT": { "TYPE": "RESOURCE_ID", "VALUE": "dialpad_fragment", "PACKAGE": "com.android.car.dialer" }, "DIALED_NUMBER": { "TYPE": "RESOURCE_ID", "VALUE": "title", "PACKAGE": "com.android.car.dialer" }, "MAKE_CALL": { "TYPE": "RESOURCE_ID", "VALUE": "call_button", "PACKAGE": "com.android.car.dialer" }, "DELETE_NUMBER": { "TYPE": "RESOURCE_ID", "VALUE": "delete_button", "PACKAGE": "com.android.car.dialer" } }, "CONTACTS_VIEW": { "CONTACTS_MENU": { "TYPE": "TEXT", "VALUE": "Contacts" }, "CONTACT_INFO": { "TYPE": "RESOURCE_ID", "VALUE": "call_action_id", "PACKAGE": "com.android.car.dialer" }, "CONTACT_NAME": { "TYPE": "RESOURCE_ID", "VALUE": "title", "PACKAGE": "com.android.car.dialer" }, "CONTACT_DETAIL": { "TYPE": "RESOURCE_ID", "VALUE": "show_contact_detail_id", "PACKAGE": "com.android.car.dialer" }, "ADD_CONTACT_TO_FAVORITE": { "TYPE": "RESOURCE_ID", "VALUE": "contact_details_favorite_button", "PACKAGE": "com.android.car.dialer" }, "SEARCH_CONTACT": { "TYPE": "RESOURCE_ID", "VALUE": "menu_item_search", "PACKAGE": "com.android.car.dialer" }, "CONTACT_SEARCH_BAR": { "TYPE": "RESOURCE_ID", "VALUE": "car_ui_toolbar_search_bar", "PACKAGE": "com.android.car.dialer" }, "SEARCH_RESULT": { "TYPE": "RESOURCE_ID", "VALUE": "contact_name", "PACKAGE": "com.android.car.dialer" }, "CONTACT_SETTINGS": { "TYPE": "RESOURCE_ID", "VALUE": "menu_item_setting", "PACKAGE": "com.android.car.dialer" }, "CONTACT_ORDER": { "TYPE": "TEXT", "VALUE": "Contact order" }, "SORT_BY_FIRST_NAME": { "TYPE": "TEXT", "VALUE": "First name" }, "SORT_BY_LAST_NAME": { "TYPE": "TEXT", "VALUE": "Last Name" }, "CONTACT_TYPE_WORK": { "TYPE": "TEXT", "VALUE": "Work" }, "CONTACT_TYPE_MOBILE": { "TYPE": "TEXT", "VALUE": "Mobile" }, "CONTACT_TYPE_HOME": { "TYPE": "TEXT", "VALUE": "Home" } }, "CALL_HISTORY_VIEW": { "CALL_HISTORY_MENU": { "TYPE": "TEXT", "VALUE": "Recents" }, "CALL_HISTORY_INFO": { "TYPE": "RESOURCE_ID", "VALUE": "call_action_id", "PACKAGE": "com.android.car.dialer" } }, "FAVORITES_VIEW": { "FAVORITES_MENU": { "TYPE": "TEXT", "VALUE": "Favorites" } } }, "NOTIFICATIONS": { "APPLICATION_CONFIG": { "OPEN_NOTIFICATIONS_COMMAND": "service call statusbar 1" }, "EXPANDED_NOTIFICATIONS_SCREEN": { "NOTIFICATION_VIEW": { "TYPE": "RESOURCE_ID", "VALUE": "notification_view", "PACKAGE": "com.android.systemui" }, "CLEAR_ALL_BUTTON": { "TYPE": "RESOURCE_ID", "VALUE": "clear_all_button", "PACKAGE": "com.android.systemui" }, "STATUS_BAR": { "TYPE": "RESOURCE_ID", "VALUE": "car_top_navigation_bar_container", "PACKAGE": "com.android.systemui" }, "APP_ICON": { "TYPE": "RESOURCE_ID", "VALUE": "app_icon", "PACKAGE": "com.android.systemui" }, "APP_NAME": { "TYPE": "RESOURCE_ID", "VALUE": "header_text", "PACKAGE": "com.android.systemui" }, "NOTIFICATION_TITLE": { "TYPE": "RESOURCE_ID", "VALUE": "notification_body_title", "PACKAGE": "com.android.systemui" }, "NOTIFICATION_BODY": { "TYPE": "RESOURCE_ID", "VALUE": "notification_body_content", "PACKAGE": "com.android.systemui" }, "CARD_VIEW": { "TYPE": "RESOURCE_ID", "VALUE": "card_view", "PACKAGE": "com.android.systemui" } } }, "MEDIA_CENTER": { "APPLICATION_CONFIG": { "MEDIA_CENTER_PACKAGE": "com.android.car.media", "MEDIA_ACTIVITY": "com.android.bluetooth/com.android.bluetooth.avrcpcontroller.BluetoothMediaBrowserService" }, "MEDIA_CENTER_SCREEN": { "PLAY_PAUSE_BUTTON": { "TYPE": "RESOURCE_ID", "VALUE": "play_pause_stop", "PACKAGE": "com.android.car.media" }, "NEXT_BUTTON": { "TYPE": "RESOURCE_ID", "VALUE": "skip_next", "PACKAGE": "com.android.car.media" }, "PREVIOUS_BUTTON": { "TYPE": "RESOURCE_ID", "VALUE": "skip_prev", "PACKAGE": "com.android.car.media" }, "SHUFFLE_BUTTON": { "TYPE": "RESOURCE_ID", "VALUE": "overflow_on", "PACKAGE": "com.android.car.media" }, "PLAY_QUEUE_BUTTON": { "TYPE": "RESOURCE_ID", "VALUE": "play_queue", "PACKAGE": "com.android.car.media" }, "MINIMIZED_MEDIA_CONTROLS": { "TYPE": "RESOURCE_ID", "VALUE": "minimized_playback_controls", "PACKAGE": "com.android.car.media" }, "TRACK_NAME": { "TYPE": "RESOURCE_ID", "VALUE": "title", "PACKAGE": "com.android.car.media" }, "TRACK_NAME_MINIMIZED_CONTROL": { "TYPE": "RESOURCE_ID", "VALUE": "minimized_control_bar_title", "PACKAGE": "com.android.car.media" }, "BACK_BUTTON": { "TYPE": "DESCRIPTION", "VALUE": "Back" } }, "MEDIA_CENTER_ON_HOME_SCREEN": { "PLAY_PAUSE_BUTTON": { "TYPE": "RESOURCE_ID", "VALUE": "play_pause_stop", "PACKAGE": "com.android.car.carlauncher" }, "NEXT_BUTTON": { "TYPE": "RESOURCE_ID", "VALUE": "skip_next", "PACKAGE": "com.android.car.carlauncher" }, "PREVIOUS_BUTTON": { "TYPE": "RESOURCE_ID", "VALUE": "skip_prev", "PACKAGE": "com.android.car.carlauncher" }, "TRACK_NAME": { "TYPE": "RESOURCE_ID", "VALUE": "title", "PACKAGE": "com.android.car.carlauncher" } } } }
Alternatif cihaz yapılandırmaları
Aşağıdaki kod örneğinde, varsayılan ayarların DUT'taki ayarlarla geçersiz kılındığı JSON yapılandırma dosyası örneği gösterilmektedir. Bu örnekte:
Referans cihazlarda internet ayarları Ağ ve internet, DUT'ta ise Bağlantı olarak adlandırılır.
Referans cihazlarda tarih ve saat ayarları Ayarlar > Tarih ve saat bölümünde, DUT'ta ise Ayarlar > Sistem > Tarih ve saat bölümünde bulunur.
// Default configuration file
{
....
"SECURITY_SETTINGS_SCROLL_ELEMENT": {
"TYPE": "RESOURCE_ID",
"VALUE": "fragment_container",
},
....
}
// JSON configuration file for non-reference device
{
....
"SECURITY_SETTINGS_SCROLL_ELEMENT": {
"TYPE": "RESOURCE_ID",
"VALUE": "car_ui_recycler_view"
},
....
}
JSON yapılandırma dosyası hazır olduğunda aşağıdaki kod bloğunda gösterildiği gibi çalışma zamanında sağlanır:
# Push The JSON configuration file to the device
adb -s DEVICE-SERIAL push PATH-OF-JSON-FILE /data/local/tmp/runtimeSpectatioConfig.json
Bu komutta:
DEVICE-SERIAL: DUT'un seri kimliği. Ana makineye yalnızca bir cihaz bağlıysa bu parametre gerekli değildir.
PATH-TO-JSON-FILE: Barındıran makinedeki JSON dosyasının yolu.
Yapılandırma biçimi
Yapılandırmada aşağıdaki anahtar ve değerlere sahip beş üst düzey nesne vardır:
Nesne | Açıklama |
---|---|
PACKAGES |
Çeşitli uygulamalar için ana paketi tanımlayan ve söz konusu uygulamanın ne zaman ön planda olduğunu belirlemek için kullanılan bir nesne. |
ACTIONS |
Çeşitli işlemler için işlem türlerini ve parametreleri belirten bir nesne. Örneğin, kaydırma için düğmelerin mi yoksa hareketlerin mi kullanılacağı. |
COMMANDS |
Çeşitli işlemleri gerçekleştiren komutları belirten bir nesne. |
UI_ELEMENTS |
Kullanıcı arayüzü öğelerini seçen UI Automator "BySelectors" öğesini oluşturmak için kullanılan bir nesne (ayrıntıları aşağıda açıklanmıştır). |
WORKFLOWS |
Üst düzey görevleri tamamlayan işlem sıraları (aşağıda ayrıntılı olarak açıklanmıştır). |
Kullanıcı arayüzü öğeleri
Her kullanıcı arayüzü öğesinin, öğeyi tanımlamak için kullanıcı arayüzü otomasyonunun neyi arayacağını (ör. kaynak kimliği, metin ve açıklama) ve bu türle ilişkili yapılandırma değerlerini belirten bir TYPE
öğesi vardır. Genel olarak, yardımcılar bu yapılandırmayı kullanarak ekrandaki bir öğeyi tanımladığında tam olarak bir öğe alır. Birden fazla öğe yapılandırmayla eşleşirse testte rastgele bir öğe kullanılır. Bu nedenle yapılandırma (genellikle) ilgili bağlamda tek bir öğeye indirgenecek kadar spesifik yazılmalıdır.
METİN
Bu, en basit kullanıcı arayüzü öğesi türüdür. Kullanıcı arayüzü öğesi metniyle tanımlanır ve tam eşleşme gerektirir.
"CALL_HISTORY_MENU": {
"TYPE": "TEXT",
"VALUE": "Recents"
}
TEXT_CONTAINS
Belirtilen VALUE
'nin, eşleştirilecek öğenin metninde yalnızca bir yerde görünmesi gerektiği dışında TEXT
ile aynıdır.
"PRIVACY_CALENDAR": {
"TYPE": "TEXT_CONTAINS",
"VALUE": "Calendar"
}
AÇIKLAMA
Öğeyi içerik açıklaması özelliğine göre tanımlayın. Bu işlem için tam eşleşme gerekir.
"APP_GRID_SCROLL_BACKWARD_BUTTON": {
"TYPE": "DESCRIPTION",
"VALUE": "Scroll up"
}
RESOURCE_ID
Öğeyi kaynak kimliğine göre tanımlayın ve isteğe bağlı olarak bu kimliğin paket bileşenini de kontrol edin. PACKAGE
anahtarı isteğe bağlıdır; atlanırsa tüm paketler eşleşir ve yalnızca kimliğin :id/
'ten sonraki kısmı dikkate alınır.
"APP_LIST_SCROLL_ELEMENT": {
"TYPE": "RESOURCE_ID",
"VALUE": "apps_grid",
"PACKAGE": "com.android.car.carlauncher"
}
TIKLANABİLİR, KAYAN
Öğeyi, tıklanabilir veya kaydırılabilir olup olmadığına göre tanımlayın.
Bunlar çok geniş öğe türleridir ve genellikle başka bir öğe türünü daraltmaya yardımcı olmak için yalnızca MULTIPLE
içinde kullanılmalıdır. FLAG
anahtarı isteğe bağlıdır ve varsayılan olarak true
değerine ayarlanır.
"SAMPLE_ELEMENT": {
"TYPE": "CLICKABLE",
"FLAG": false
}
SINIF
Öğeyi sınıfına göre tanımlayın.
"SECURITY_SETTINGS_ENTER_PASSWORD": {
"TYPE": "CLASS",
"VALUE": "android.widget.EditText"
}
HAS_ANCESTOR
Öğeyi, widget hiyerarşisini atalarına bakarak bulun. ANCESTOR
anahtarı, üst öğeyi tanımlayan bir nesne içerir. DEPTH
anahtarı, hiyerarşinin ne kadar üst kısmının aranacağını belirtir. DEPTH
isteğe bağlıdır ve varsayılan değeri 1
'tur.
"SAMPLE_ELEMENT": {
"TYPE": "HAS_ANCESTOR",
"DEPTH": 2,
"ANCESTOR": {
"TYPE": "CLASS",
"VALUE": "android.view.ViewGroup"
}
}
HAS_DESCENDANT
Hiyerarşide alt öğelerine bakarak öğeyi tanımlayın. DESCENDANT
anahtarı, aranacak alt öğeyi belirten bir nesne içerir. DEPTH
anahtarı, hiyerarşinin ne kadar üst kısmının aranacağını belirtir. DEPTH
isteğe bağlıdır ve varsayılan değeri 1
'tür.
"SAMPLE_ELEMENT": {
"TYPE": "HAS_DESCENDANT",
"DEPTH": 2,
"DESCENDANT": {
"TYPE": "CLASS",
"VALUE": "android.view.ViewGroup"
}
}
ÇOKLU
Öğeyi, aynı anda birden fazla koşula göre tanımlayın. Bu koşulların tümü karşılanmalıdır.
"APP_INFO_SETTINGS_PERMISSION_MANAGER": {
"TYPE": "MULTIPLE",
"SPECIFIERS": [
{
"TYPE": "CLASS",
"VALUE": "android.widget.RelativeLayout"
},
{
"TYPE": "HAS_DESCENDANT",
"MAX_DEPTH": 2,
"DESCENDANT": {
"TYPE": "TEXT",
"VALUE": "Permission manager"
}
}
]
}
Bu örnekte yapılandırma, 2
derinliğinde Permission manager
metnine sahip bir alt öğesi olan bir RelativeLayout
'ü tanımlar.
İş akışları
İş akışı, belirli bir görevi tamamlamak için kullanılan bir işlem sırasını temsil eder. Bu işlem sırası, cihaz türünden cihaz türüne göre yeterince farklı olabilir ve yapılandırmada koddan daha esnek bir şekilde temsil edilebilir.
"WORKFLOWS": {
"OPEN_SOUND_SETTINGS_WORKFLOW": [
{
"NAME": "Go to Home",
"TYPE": "PRESS",
"CONFIG": {
"TEXT": "HOME"
}
},
{
"NAME": "Open Settings",
"TYPE": "COMMAND",
"CONFIG": {
"TEXT": "am start -a android.settings.SETTINGS"
}
},
{
"NAME": "Open Sound Settings",
"TYPE": "SCROLL_TO_FIND_AND_CLICK",
"CONFIG": {
"UI_ELEMENT": {
"TYPE": "TEXT",
"VALUE": "Sound"
}
},
"SCROLL_CONFIG": {
"SCROLL_ACTION": "USE_GESTURE",
"SCROLL_DIRECTION": "VERTICAL",
"SCROLL_ELEMENT": {
"TYPE": "RESOURCE_ID",
"VALUE": "car_ui_recycler_view"
}
}
}
]
}
Her iş akışı, anahtarın iş akışının adı, değerin ise gerçekleştirilecek işlem dizisi olduğu bir anahtar/değer çiftidir. Her işlemde bir NAME
, bir TYPE
, (genellikle) bir CONFIG
ve (bazen) bir SWIPE_CONFIG
veya SCROLL_CONFIG
bulunur. Çoğu TYPE için CONFIG
, değeri kullanıcı arayüzü öğesi girişiyle aynı biçimi alan bir UI_ELEMENT
anahtarına sahip bir nesnedir (yukarıya bakın). Bu TYPE'ler şunlardır:
BASMA UZUN_BASMA TIKLA UZUN_TIKLA VARSA_TIKLA |
HAS_UI_ELEMENT_IN_FOREGROUND SCROLL_TO_FIND_AND_CLICK SCROLL_TO_FIND_AND_CLICK_IF_EXIST SWIPE_TO_FIND_AND_CLICK SWIPE_TO_FIND_AND_CLICK_IF_EXIST |
Diğer TYPE türleri için yapılandırma ayrıntıları şunlardır:
Nesne | Açıklama |
---|---|
COMMAND |
Yürütülecek komutu içeren bir TEXT değeri olan bir nesne. |
HAS_PACKAGE_IN_FOREGROUND |
Paketi içeren bir TEXT değeri olan nesne. |
SWIPE |
SWIPE işlemi için CONFIG key öğesini çıkarın. Bu örnekte yalnızca SWIPE_CONFIG |
WAIT_MS |
Beklemesi gereken milisaniye sayısını içeren bir TEXT değeri olan bir nesne. |
Kaydırma ve kaydırmayla ilgili işlemler için aşağıdaki gibi ek yapılandırma gerekir:
SCROLL_CONFIG
Nesne | Açıklama |
---|---|
SCROLL_ACTION |
USE_GESTURE veya USE_BUTTON |
SCROLL_DIRECTION |
HORIZONTAL veya VERTICAL |
SCROLL_ELEMENT |
Kullanıcı arayüzü öğesi yapılandırmasıyla aynı formu kullanarak kaydırılacak kapsayıcıyı belirten bir nesne (yukarıya bakın). |
SCROLL_FORWARD , SCROLL_BACKWARD |
İleri ve geri kaydırma düğmeleri (SCROLL_ACTION USE_BUTTON olduğunda gereklidir). |
SCROLL_MARGIN |
SCROLL_ACTION USE_GESTURE ise kaydırma işlemini gerçekleştirmek için kullanılacak sürüklemeyi başlatmak ve durdurmak üzere kapsayıcının kenarından olan mesafe (İsteğe bağlı, varsayılan = 10). |
SCROLL_WAIT_TIME |
SCROLL_ACTION USE_GESTURE ise tıklanacak bir nesne ararken kaydırma hareketleri arasında bekleme süresi (milisaniye cinsinden).
(İsteğe bağlı, varsayılan = 1). |
SWIPE_CONFIG
Nesne | Açıklama |
---|---|
SWIPE_DIRECTION |
TOP_TO_BOTTOM , BOTTOM_TO_TOP ,
LEFT_TO_RIGHT veya RIGHT_TO_LEFT |
SWIPE_FRACTION |
Aşağıdakilerden biri:
|
NUMBER_OF_STEPS |
Kaydırma işlemini gerçekleştirmek için kullanılacak adım sayısı.
segmentSteps bakın.
|
Derleme ve yürütme
Spectatio çerçevesi, test APK'sı kapsamında otomatik olarak derlenir. Test APK'sını derlemek için AOSP kod tabanının yerel iş istasyonunda bulunması gerekir. Test APK'sı oluşturulduktan sonra kullanıcının APK'yı cihaza yüklemesi ve testi çalıştırması gerekir.
Aşağıdaki kod örneğinde, test APK'sının derlenmesi, yüklenmesi ve yürütülmesi gösterilmektedir.
# Build Test APK make TEST-APK-NAME
# Install Test APK adb -s DEVICE-SERIAL install -r PATH-FOR-BUILT-TEST-APK
# Execute Test with the JSON file adb -s DEVICE-SERIAL shell am instrument -w -r -e debug false -e config-file-path /data/local/tmp/jsonFile.json -e class TEST-PACKAGE.TEST-CLASSNAME TEST-PACKAGE/androidx.test.runner.AndroidJUnitRunner
Bu komutlarda:
TEST-APK-NAME: Test edilecek uygulamanın adı. Örneğin,
Android.bp
dosyasında belirtildiği gibi kablosuz ayarlarını test etmek için TEST-APK-NAME değeriniAndroidAutomotiveSettingsTests
olarak ayarlayın. APK'nın adını Otomotiv testi için ilgiliAndroid.bp
dosyasında bulabilirsiniz.DEVICE-SERIAL: DUT'un seri kimliği. Ana makineye yalnızca bir cihaz bağlıysa bu parametre gerekli değildir.
config-file-path
: Yalnızca JSON yapılandırma dosyasında belirtildiği gibi varsayılan olmayan cihaz kullanıcı arayüzü yapılandırmaları sağlamak için gereken isteğe bağlı parametre. Bu parametre sağlanmazsa çerçeve, testleri yürütmek için varsayılan değerleri kullanır.PATH-FOR-BUILT-TEST-APK:
make
komutu çalıştırıldığında test APK'sının derlendiği yol.TEST-PACKAGE: Test paketinin adı.
TEST-CLASSNAME: Test sınıfının adı. Örneğin, Kablosuz Ayarları testi için test paketi
android.platform.tests
ve test sınıfı adıWifiSettingTest
'tır.
Otomotiv Snippet Kitaplığı
Otomotiv snippet kitaplığı, otomotiv uygulamaları ve hizmetleriyle etkileşime geçmek için tasarlanmış Android Açık Kaynak Projesi (AOSP) için bir Android Test kitaplığı grubudur. Spectatio'dan, ana makineden (test) Android cihaza uzak prosedür çağrıları (RPC'ler) yürütmek için uygun bir mekanizmayla yararlanır.
Başlayın
Başlamadan önce bu bölümleri inceleyin.
Ön koşullar
- Ana makinede Python 3.x yüklü olmalıdır.
- Gerekli derleme araçlarıyla AOSP ortamı kurulumu.
- adb erişimi olan bir Android Automotive cihazı (emülatör veya fiziksel cihaz).
Derleme
Otomotiv snippet kitaplığı tarafından sağlanan çeşitli snippet'leri derlemek için sağlanan android.bp
dosyasını kullanabilirsiniz. APK'yı derlemek için önceki bölümdeki komutları uygulayın.
Dağıtım
snippet kitaplıklarını başarıyla derledikten sonra, önceki bölümde belirtilen adb install
komutunu kullanarak elde edilen APK'ları hedef cihaza dağıtın.
Test çalıştırma
snippet kitaplıkları, otomotiv sistemiyle etkileşim kurmak için çeşitli RPC yöntemleri sağlar. Bu yöntemler, ana makineden Mobly çerçevesi aracılığıyla çağrılabilir. Mobly test ortamını oluşturduğunuzu varsayarak, cihazda RPC yöntemlerini manuel olarak çağırabileceğiniz etkileşimli bir Python kabuğu açmak için snippet_shell.py
komut dosyasını kullanabilirsiniz. Örnek çağrı:
python3 snippet_shell.py com.google.android.mobly.snippet.bundled -s <serial>
<serial>
değerini, birden fazla cihaz bağlıysa adb devices komutuyla bulabileceğiniz cihaz seri numarasıyla değiştirin.
Dahil edilen kitaplıklar
Otomotiv snippet kitaplığı aşağıdaki snippet kitaplıklarını ve yardımcılarını içerir:
AutomotiveSnippet: Arama, ses seviyesi kontrolü, araç sabit anahtarları ve medya merkezi etkileşimi gibi araç işlemleriyle ilgili API'ler sağlar.
PhoneSnippet: Aramaları yönetme, kişilere göz atma ve SMS işlemleri gibi telefonla ilgili API'ler sağlar.
Otomotiv snippet'i ve PhoneSnippet bazı ortak mantığa sahiptir.
Daha açık belirtmek gerekirse, bir otomotiv cihazını ve telefon cihazını eşlemek için Bluetooth ile ilgili RCP çağrılarını istila edebilirsiniz. Bu bt_discovery_test
, nasıl yapılacağını gösterir.
- TEST-CLASSNAME: Test sınıfının adı. Örneğin, Kablosuz Ayarları testi için test paketi
android.platform.tests
, test sınıfı adı iseWifiSettingTest
'tır.