Spectatio, Android Automotive OS'yi (AAOS) gerçek ve sanal cihazlarda test etmek için geliştirilmiş açık kaynaklı bir test çerçevesidir. Spectatio, uygulamaları bir otomotiv cihazında test etmek için API'ler sağlar ve AAOS ile 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 UI uygulamaları için uyarlanabilir ve genişletilebilir. AAOS'un cihaz donanımı, emülatörler ve sanallaştırılmış ortamlardaki kapasitesini ve performansını test etmek için kullanılır.
Aşağıdaki şekil Spectatio çerçevesinin üst düzey tasarımını açıklamaktadır.
Şekil 1. Spectatio çerçevesinin üst düzey tasarımı.
UI Automator'ın üzerine inşa edilen Spectatio çerçevesi, AAOS'ta kullanıcı ve sistem uygulamalarıyla etkileşime giren UI 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, bu testleri test edilen cihazdan (DUT) bağımsız hale getirir ve destekleniyorsa çeşitli cihazları test etmek için ölçeklenebilir hale getirir.
Şekil 1, Spectatio çerçevesinin Dialer, Medicenter ve Settings gibi referans uygulamalara dayalı olarak uygulamaya özel arayüzler ve yardımcılar kullanılarak modüler hale getirildiğini ve böylece yeni uygulamalar için kolayca genişletilebildiğini göstermektedir. Spectatio çerçevesi, ortak standart ve yardımcı program yardımcı sınıflarını yeniden kullanır. Standart yardımcı sınıf, tüm uygulama yardımcı işlevleri için üst sınıftır ve cihaza özgü veya uygulamalar arasında geçerli olan standart işlevler sağlar. Yardımcı program yardımcı sınıfları, aygıttan dosya okuma veya yazma gibi yardımcı programlar sağlar.
Mimari
Spectatio çerçevesi, kullanıcı arayüzü testleri oluşturmaya yönelik bir dizi API sağlamak için 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, Spectatio çerçevesinin üst düzey mimarisini ve bir uygulamayı test etmek için API'lerin uygulanmasında yer alan tüm varlıkları göstermektedir.
Şekil 2. Spectatio çerçevesinin üst düzey mimarisi.
Uygulama yardımcı arayüzü, bir uygulama yardımcısının uygulanmasına yönelik bir plan sağlar. Uygulamaları test etmek için gerekli olan çeşitli yardımcı işlevlerden oluşur. Her uygulamanın IAutoSettingHelper
ve IAutoDialHelper
gibi kendi arayüzü vardır. Daha fazla bilgi ve arayüz işlevlerinin bir listesi için AOSP'deki uygulama yardımcı 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 özel olmayan standart özniteliklerden ve işlevlerden oluşur. Standart yardımcı sınıf AbstractAutoStandardAppHelper.java
tanımlanmıştır.
Yardımcı program yardımcı sınıfları çerçeve tarafından kullanılır. Örneğin, AutoJsonUtility.java
verilen aygıt 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ı uygulama modülü Spectatio çerçevesinin çekirdeğidir. Bir otomotiv cihazındaki uygulamaları test etmek için gerekli olan, uygulama yardımcı arayüzünde tanımlanan yardımcı işlevlerin uygulanmasını içerir. Her uygulamanın, Otomotiv testleri tarafından uygulamaları test etmek için kullanılan SettingHelperImpl
ve DialHelperImpl
gibi kendi uygulaması vardır. Daha fazla bilgi ve uygulamaların bir listesi için AOSP'deki uygulama yardımcı uygulama işlevlerine bakın.
Otomotiv Testleri, uygulamayla ilgili çeşitli işlemleri test etmek için uygulama yardımcı uygulama işlevlerini kullanır. Uygulama yardımcı uygulama işlevlerine erişim kazanmak için HelperAccessor
sınıfını kullanın.
Aşağıdaki kod örnek bir otomotiv testinin kurulumunu, temizliğini ve yürütülmesini gösterir.
@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ın kullanıcı arayüzünden bağımsız olduğundan, çeşitli kullanıcı arayüzleri ve donanıma sahip cihazları test etmek için ölçeklenebilir. Bu ölçeklenebilirliğe ulaşmak için Spectatio, referans cihaza dayalı varsayılan cihaz konfigürasyonlarını kullanır. Varsayılan olmayan cihaz yapılandırmalarını desteklemek için çerçeve, cihaz için istenen kullanıcı arayüzü değişikliklerini ayarlamak üzere çalışma zamanında bir JSON yapılandırma dosyası kullanır. JSON yapılandırma dosyası, path
ayarlarıyla birlikte TEXT
, DESCRIPTION
ve RESOURCE_ID
gibi kullanıcı arayüzü öğelerini destekler ve yalnızca DUT için 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ı, mevcut cihaz yapılandırmalarını ve bunların varsayılan değerlerini gösterir.
Örnek 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 konfigürasyonları
Aşağıdaki kod örneği, varsayılan ayarların DUT'taki ayarlar tarafından geçersiz kılındığı JSON yapılandırma dosyası örneğini gösterir. Bu örnekte:
İnternet ayarları, referans cihazlarda Ağ ve internet , DUT'ta ise Bağlantı olarak adlandırılır.
Tarih ve saat ayarlarına referans cihazları için Ayarlar > Tarih ve saat bölümünden ve DUT için Ayarlar > Sistem > Tarih ve saat bölümünden ulaşılabilir.
// 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 bilgisayara yalnızca bir cihaz bağlıysa bu parametre gerekli değildir.
PATH-TO-JSON-FILE : Ana makinedeki JSON dosyasının yolu.
Yapılandırma formatı
Yapılandırmada aşağıdaki anahtarlara ve değerlere sahip beş üst düzey nesne vardır:
Nesne | Tanım |
---|---|
PACKAGES | Çeşitli uygulamaların ana paketini tanımlayan ve o uygulamanın ne zaman ön planda olduğunu belirlemek için kullanılan bir nesne. |
ACTIONS | Çeşitli eylemler için eylem türlerini ve parametrelerini gösteren bir nesne. Örneğin, kaydırmak için düğmelerin mi yoksa bir hareketin mi kullanılacağı. |
COMMANDS | Çeşitli eylemleri gerçekleştiren komutları belirten bir nesne. |
UI_ELEMENTS | UI Öğelerini seçen UI Automator "BySelectors"ı oluşturmak için kullanılan bir nesne (aşağıda ayrıntılı olarak açıklanmıştır). |
WORKFLOWS | Üst düzey görevleri gerçekleştiren eylem dizileri (aşağıda ayrıntılı olarak açıklanmıştır). |
Kullanıcı arayüzü öğeleri
Her UI öğesinin, UI Automator'ın öğeyi (kaynak kimliği, metin ve açıklama gibi) ve o türle ilişkili yapılandırma değerlerini tanımlamak için neyi arayacağını belirten bir TYPE
vardır. Genel olarak, bir yardımcı bu yapılandırmayı kullanarak ekrandaki bir öğeyi tanımladığında tam olarak bir öğe alır. Birden fazla öğenin konfigürasyonla eşleşmesi durumunda testte rastgele bir öğe kullanılır. Bu nedenle, konfigürasyon (genellikle) ilgili bağlamda tek bir öğeye daraltacak kadar spesifik olarak 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 bir eşleşme gerektirir.
"CALL_HISTORY_MENU": {
"TYPE": "TEXT",
"VALUE": "Recents"
}
TEXT_CONTAINS
Belirtilen VALUE
yalnızca eşleştirilecek öğenin metninin herhangi bir yerinde görünmesi gerekmesi dışında TEXT
ile aynıdır.
"PRIVACY_CALENDAR": {
"TYPE": "TEXT_CONTAINS",
"VALUE": "Calendar"
}
TANIM
Öğeyi, tam eşleşme gerektiren içerik açıklaması özelliğine göre tanımlayın.
"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
tuşu isteğe bağlıdır; atlanırsa herhangi bir paket eşleşecek ve kimliğin yalnızca :id/
den sonraki kısmı dikkate alınacaktır.
"APP_LIST_SCROLL_ELEMENT": {
"TYPE": "RESOURCE_ID",
"VALUE": "apps_grid",
"PACKAGE": "com.android.car.carlauncher"
}
TIKLANABİLİR, KAYDIRILABİLİR
Öğeyi, tıklanabilir veya kaydırılabilir olmasına (veya olmaması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
kullanılmalıdır. FLAG
anahtarı isteğe bağlıdır ve varsayılan olarak true
şeklindedir.
"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 tanımlayın. ANCESTOR
anahtarı, atayı tanımlayan bir nesneyi içerir. DEPTH
tuşu hiyerarşinin ne kadar yukarısına bakılacağını belirtir. DEPTH
isteğe bağlıdır ve varsayılan değeri 1
.
"SAMPLE_ELEMENT": {
"TYPE": "HAS_ANCESTOR",
"DEPTH": 2,
"ANCESTOR": {
"TYPE": "CLASS",
"VALUE": "android.view.ViewGroup"
}
}
HAS_DESCENDANT
Öğeyi, hiyerarşideki alt öğelerine bakarak tanımlayın. DESCENDANT
anahtarı, aranacak çocuğu belirten bir nesneyi tutar. DEPTH
tuşu hiyerarşinin ne kadar yukarısına bakılacağını belirtir. DEPTH
isteğe bağlıdır ve varsayılan değeri 1
.
"SAMPLE_ELEMENT": {
"TYPE": "HAS_DESCENDANT",
"DEPTH": 2,
"DESCENDANT": {
"TYPE": "CLASS",
"VALUE": "android.view.ViewGroup"
}
}
ÇOKLU
Öğeyi, hepsinin karşılanması gereken birden fazla eşzamanlı koşula göre tanımlayın.
"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, derinlik 2
bir alt öğeye sahip olan ve Permission manager
metnini içeren bir RelativeLayout
tanımlar.
İş akışları
İş akışı, belirli bir görevi gerçekleştirmek için kullanılan, aygıt türünden aygıt türüne yeterince farklılık gösterebilen ve yapılandırmada temsil edilmesi koddan daha esnek olan bir dizi eylemi temsil eder.
"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ı ve değerin gerçekleştirilecek eylemler dizisi olduğu bir anahtar/değer çiftidir. Her eylemin bir NAME
, bir TYPE
, (genellikle) bir CONFIG
ve (bazen) bir SWIPE_CONFIG
veya SCROLL_CONFIG
vardır. Çoğu TYPE için CONFIG
, değeri bir UI öğesi girişiyle aynı biçimi alan UI_ELEMENT
anahtarına sahip bir nesnedir (yukarıya bakın). Bu TİPLER şunlardır:
BASMAK UZUN BASMA TIKLAMAK 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 |
Diğer TİPler için konfigürasyon ayrıntıları şunlardır:
Nesne | Tanım |
---|---|
COMMAND | Yürütülecek komutu içeren TEXT değerine sahip bir nesne. |
HAS_PACKAGE_IN_FOREGROUND | Paketi içeren TEXT değerine sahip bir nesne. |
SWIPE | SWIPE eylemi için CONFIG key atlayın. Bu yalnızca SWIPE_CONFIG kullanır |
WAIT_MS | Beklenecek milisaniye sayısını içeren TEXT değerine sahip bir nesne. |
Kaydırma ve kaydırmayla ilgili eylemler aşağıdaki gibi ek yapılandırma gerektirir:
SCROLL_CONFIG
Nesne | Tanım |
---|---|
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 kullanan, kaydırılacak kabı 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ırmayı gerçekleştirmek için kullanılacak sürüklemeyi başlatmak ve durdurmak için kabın kenarından olan mesafe ( İsteğe bağlı, varsayılan = 10). |
SCROLL_WAIT_TIME | SCROLL_ACTION USE_GESTURE ise tıklatılacak bir nesneyi ararken kaydırma hareketleri arasında beklenecek milisaniye cinsinden süre. ( İsteğe bağlı, varsayılan = 1). |
SWIPE_CONFIG
Nesne | Tanım |
---|---|
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ırmayı gerçekleştirmek için kullanılacak adım sayısı. segmentSteps bakın. |
Oluşturun ve yürütün
Spectatio çerçevesi, test APK'sının bir parçası olarak otomatik olarak oluşturulur. Test APK'sını oluşturmak 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 yürütmesi gerekir.
Aşağıdaki kod örneği bir test APK'sının oluşturulmasını, kurulmasını ve yürütülmesini gösterir.
# 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, Wi-Fi ayarlarını
Android.bp
dosyasında belirtildiği şekilde test etmek için TEST-APK-NAMEAndroidAutomotiveSettingsTests
olarak ayarlayın. APK'nın adı Otomotiv testi için ilgiliAndroid.bp
dosyasında bulunabilir.DEVICE-SERIAL : DUT'un seri kimliği. Ana bilgisayara yalnızca bir cihaz bağlıysa bu parametre gerekli değildir.
config-file-path
: JSON yapılandırma dosyasında belirtildiği gibi yalnızca varsayılan olmayan cihaz kullanıcı arayüzü yapılandırmalarını sağlamak için gerekli olan isteğe bağlı parametre. Sağlanmadığı takdirde çerçeve, testleri yürütmek için varsayılan değerleri kullanır.PATH-FOR-BUILT-TEST-APK :
make
komutu yürütüldüğünde test APK'sının oluşturulduğu yol.TEST-PACKAGE : Test paketinin adı.
TEST-CLASSNAME : Test sınıfının adı. Örneğin, Wifi Ayarları testi için test paketi
android.platform.tests
ve test sınıfı adıWifiSettingTest
şeklindedir.
Otomotiv Parçacık Kitaplığı
Otomotiv Parçacık Kitaplığı, otomotiv uygulamaları ve hizmetleriyle etkileşimde bulunmak üzere tasarlanmış Android Açık Kaynak Projesi (AOSP) için bir dizi Android Test kitaplığıdır. Bir ana bilgisayar (test) makinesinden Android destekli bir cihaza uzaktan prosedür çağrıları (RPC'ler) yürütmek için uygun bir mekanizma ile Spectatio'dan yararlanır.
Başlamak
Başlamadan önce bu bölümleri inceleyin.
Önkoşullar
- Ana makinede Python 3.x yüklü.
- Gerekli derleme araçlarıyla AOSP ortamı kurulumu.
- Adb erişimi olan bir Android otomotiv cihazı (emülatör veya fiziksel cihaz).
Derleme
Automotive Snippet Library tarafından sağlanan çeşitli parçacıkları derlemek için sağlanan android.bp
dosyasını kullanabilirsiniz. APK'yi derlemek için önceki bölümdeki komutları takip edin.
Dağıtım
Snippet kitaplıklarını başarıyla derledikten sonra, önceki bölümde bahsedilen adb install
komutunu kullanarak ortaya çıkan APK'ları hedef cihaza dağıtın.
Testleri çalıştır
Parçacık kitaplıkları, otomotiv sistemiyle etkileşime geçmek için çeşitli RPC yöntemlerini açığa çıkarır. Bu yöntemler ana makineden Mobly çerçevesi aracılığıyla çağrılabilir. Mobly test ortamını kurduğunuzu varsayarsak, snippet_shell.py
betiğini kullanarak etkileşimli bir Python kabuğu açabilirsiniz; burada cihazda RPC yöntemlerini manuel olarak çağırabilirsiniz. Örnek çağrı:
python3 snippet_shell.py com.google.android.mobly.snippet.bundled -s <serial>
<serial>
, birden fazla cihaz bağlıysa adb devices ile alabileceğiniz cihaz seri numarasıyla değiştirin.
Dahil edilen kütüphaneler
Otomotiv Parçacık Kitaplığı aşağıdaki parçacık kitaplıklarını ve yardımcıları içerir:
AutomotiveSnippet: Arama, ses kontrolü, araç sabit tuşları ve medya merkezi etkileşimi gibi araç işlemleriyle ilgili API'ler sağlar.
PhoneSnippet: Arama yönetimi, kişilere göz atma ve SMS işlemleri dahil olmak üzere telefonla ilgili API'ler sağlar.
Otomotiv pasajı ve PhoneSnippet'in bazı ortak mantığı vardır. Özellikle, bir araba ile bir telefon cihazını eşleştirmek için Bluetooth ile ilgili RCP çağrılarına izin verebilirsiniz. Bu bt_discovery_test
bunun nasıl olduğunu gösterir.
- TEST-CLASSNAME : Test sınıfının adı. Örneğin, Wifi Ayarları testi için test paketi
android.platform.tests
ve test sınıfı adıWifiSettingTest
şeklindedir.