Spectatio, Android'i test etmek için geliştirilmiş açık kaynaklı bir test çerçevesidir Gerçek ve sanal cihazlarda Automotive OS (AAOS) Spectatio, şunlar için API'ler sağlar: bir otomotiv cihazında uygulamaları test etme, genişletilebilir ve ölçeklenebilir bir çözümdür. AAOS ile uygulamalarının özelliklerini ve performansını doğrulamak için kullanılır.
Üst düzey tasarım
Spectatio çerçevesi, çeşitli AAOS kullanıcı arayüzüne uyarlanabilir ve genişletilebilirdir hakkında bilgi edindiniz. AAOS'nin özelliklerini ve performansını test etmek için kullanılır cihaz donanımı, emülatörler ve sanallaştırılmış ortamlar için geçerlidir.
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ı.
Kullanıcı Arayüzü Otomatikleştirici'nin üzerine geliştirilen Spectatio çerçevesi, bir dizi API sağlar. . Otomotiv testler, test için Spectatio çerçevesi tarafından sağlanan API'leri kullanır; bu testler, test edilen cihazdan (DUT) bağımsızdır ve test edilebilir çeşitli cihazlarda kullanabilirsiniz.
Şekil 1'de, Spectatio çerçevesinin referansa dayalı olarak modüler hale geldiği gösterilmektedir Uygulamaya özel kullanan Çevirici, Medicenter ve Ayarlar gibi uygulamalar yeni uygulamalar için kolayca genişletilebilir hale getiren yeni arayüzler ve yardımcılar. Spectatio çerçeve, yaygın 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 özel veya uygulamalar genelinde geçerli olan standart işlevler İlgili içeriği oluşturmak için kullanılan yardımcı sınıfları, şunlar gibi yardımcı programlar sunar: cihazdan dosya okuma veya yazma ile ilgili bir sorun yoktur.
Mimari
Spectatio çerçevesi, kullanıcı arayüzü testleri oluşturma amacıyla bir dizi API sağlamak için uygulamaya özel arayüzler ve yardımcılar bulunurken mevcut standart yardımcı yardımcı sınıfını içe aktarmanızı sağlar.
Şekil 2'de Spectatio çerçevesinin üst düzey mimarisi gösterilmiştir ve bir uygulamayı test etmek için API'lerin uygulanmasıyla ilişkili tüm varlıklar.
Şekil 2. Spectatio çerçevesinin üst düzey mimarisi.
Uygulama yardımcı arayüzü,
yardımcı olabilir. Gereken çeşitli yardımcı işlevlerden
izin modudur. Her uygulamanın kendi arayüzü vardır. Örneğin, IAutoSettingHelper
ve IAutoDialHelper
.
Daha fazla bilgi ve arayüz işlevlerinin listesi için AOSP'deki uygulama yardımcı arayüzü işlevleri konusuna bakın.
Standart yardımcı sınıf, şu standart özelliklerden ve işlevlerden oluşur:
Cihaz kurulumu için gereklidir ancak pressHome
gibi herhangi bir uygulamaya özel değil
ve scroll
. Standart yardımcı sınıf AbstractAutoStandardAppHelper.java
içinde tanımlanmıştır.
Yardımcı program yardımcı sınıfları çerçeve tarafından kullanılır. Örneğin,
Örneğin AutoJsonUtility.java
, bir
belirtilen cihaz JSON yapılandırma dosyasını ve güncellemeleri yükleyen yardımcı program sınıfı
birçok farklı yolu vardır.
Uygulama yardımcısı uygulama modülü, Spectatio'nun temelini oluşturur.
bahsedeceğim. Şurada tanımlanan yardımcı işlevlerin uygulamasını içerir:
Google Play'de uygulamaları test etmek için gerekli olan
araba cihazıdır. Her uygulamanın kendi uygulaması vardır. Örneğin, SettingHelperImpl
ve
DialHelperImpl
,
kullanan
Automotive testlerini gözden geçireceğiz. Daha fazla bilgi edinmek ve
daha fazla bilgi için uygulama yardımcısı uygulama işlevlerine
"AOSP'de.
Otomotiv Testleri
Çeşitli işlemleri test etmek için uygulama yardımcısı uygulama işlevlerini kullanma
olduğunu görebilirsiniz. HelperAccessor
sınıfını kullanma
uygulama yardımcı uygulama işlevlerine erişim elde etmek için.
Aşağıdaki kod bir örneğin kurulumunu, temizlemesini ve yürütülmesini gösterir otomotiv testi.
@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ızdır. Bu nedenle,
çeşitli kullanıcı arayüzlerine ve donanımlara sahip test cihazları. Bu ölçeklenebilirliği sağlamak için
Spectatio, referans cihaza bağlı olarak varsayılan cihaz yapılandırmalarını kullanır. Alıcı:
varsayılan olmayan cihaz yapılandırmalarını desteklediğinden çerçeve, JSON kullanır
yapılandırma dosyasını
kullanın. CEVAP
JSON yapılandırma dosyası TEXT
, DESCRIPTION
ve
RESOURCE_ID
, path
ayarlarıyla birlikte. Yalnızca şu bilgileri içermelidir:
hakkında daha fazla bilgi edinin. Diğer kullanıcı arayüzü öğeleri varsayılan olarak
yapılandırma değerleridir.
Varsayılan cihaz yapılandırmaları
Aşağıdaki örnek JSON yapılandırma dosyası, kullanılabilir cihazı gösterir yapılandırmaları ve varsayılan değerleridir.
Örnek JSON görüntülemek için burayı tıklayın yapılandırma dosyası
{ "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, aşağıdaki gibi olan bir JSON yapılandırma dosyası örneği gösterilmektedir: Varsayılan ayarlar, DUT üzerindeki ayarlar tarafından geçersiz kılınır. Bu örnekte:
İnternet ayarları Ağ ve referans cihazlarda internet DUT'de bağlantı.
Tarih ve saat ayarlarına şuradan ulaşabilirsiniz: Ayarlar > Şu tarih ve saat: referans cihazlar bölümünde ve Ayarlar > Sistem > DUT'nin tarih ve saati.
// 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, gösterildiği gibi çalışma zamanında sağlanır. şu kod bloğunu içerir:
# 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'nin seri kimliği. Bu parametre ana makineye yalnızca tek bir cihaz bağlıysa gereklidir.
PATH-TO-JSON-FILE: Ana makinedeki JSON dosyasının yolu.
Yapılandırma biçimi
Yapılandırmada aşağıdaki anahtarlara sahip beş üst düzey nesne bulunur: ve değerler:
Nesne | Açıklama |
---|---|
PACKAGES |
Çeşitli uygulamaların ana paketini açıklayan; o uygulamanın ön planda olduğunu belirleyebilirsiniz. |
ACTIONS |
Çeşitli işlemler için işlem 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 işlemleri gerçekleştiren komutları belirten bir nesne. |
UI_ELEMENTS |
Kullanıcı arayüzünü seçen Kullanıcı Arayüzü Otomasyonu "BySelectors"ı oluşturmak için kullanılan bir nesne Öğeler (aşağıda ayrıntılı olarak açıklanmıştır). |
WORKFLOWS |
Üst düzey görevleri tamamlayan işlem dizileri (bkz. ayrıntıları aşağıda bulabilirsiniz). |
kullanıcı arayüzü öğeleri
Her kullanıcı arayüzü öğesinin, yeni bir arayüz oluşturmak için hangi UI Automator'ı arayacağını belirten bir TYPE
öğeyi tanımlayın (kaynak kimliği, metin ve açıklama gibi) ve
yapılandırma değerleridir. Genellikle, bir yardımcının
ekranda bir öğeyi bu yapılandırmayı kullanarak tanımlarsa tam olarak
bir öğedir. Birden fazla öğe yapılandırmayla eşleşirse rastgele bir öğe
nasıl yapıldığını göstereceğim. Bu nedenle, yapılandırma (genellikle)
ilgili bağlamda tek bir öğeyle sınırlı olmasını sağlayacak kadar spesifiktir.
METİN
Bu, en basit kullanıcı arayüzü öğesi türüdür. Kullanıcı arayüzü öğesi, metniyle tanımlanır, Tam eşleme gerektirir.
"CALL_HISTORY_MENU": {
"TYPE": "TEXT",
"VALUE": "Recents"
}
TEXT_CONTAINS
TEXT
ile aynıdır, ancak belirtilen VALUE
yalnızca
eşleştirilecek öğenin metnidir.
"PRIVACY_CALENDAR": {
"TYPE": "TEXT_CONTAINS",
"VALUE": "Calendar"
}
AÇIKLAMA
Öğeyi, içerik açıklaması özelliğine göre tanımlayın (tam eşleşmesini sağlar.
"APP_GRID_SCROLL_BACKWARD_BUTTON": {
"TYPE": "DESCRIPTION",
"VALUE": "Scroll up"
}
KAYNAK_KİMLİĞİ
Öğeyi kaynak kimliğine göre tanımlayın ve isteğe bağlı olarak paketi kontrol edin.
bileşenini ayarlayabilirsiniz. PACKAGE
anahtarı isteğe bağlıdır; atlanırsa,
eşleşir ve :id/
kimliğinden sonra gelen kimliğin yalnızca bir kısmı dikkate alını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 olup olmadığına göre tanımlayın.
Bunlar çok geniş öğe türleridir ve genellikle yalnızca
MULTIPLE
ile diğer öğe türlerini daraltın. 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
Üst öğelerindeki widget hiyerarşisini arayarak öğeyi tanımlayın. İlgili içeriği oluşturmak için kullanılan
ANCESTOR
anahtarı, üst öğeyi tanımlayan bir nesneyi barındırır. DEPTH
anahtarı
hiyerarşide ne kadar yukarıya bakılacağını belirtir. DEPTH
isteğe bağlıdır ve
varsayılan değere (1
) sahip.
"SAMPLE_ELEMENT": {
"TYPE": "HAS_ANCESTOR",
"DEPTH": 2,
"ANCESTOR": {
"TYPE": "CLASS",
"VALUE": "android.view.ViewGroup"
}
}
HAS_DESCENDANT
Hiyerarşide alt öğelere bakarak öğeyi tanımlayın. İlgili içeriği oluşturmak için kullanılan
DESCENDANT
anahtarı, aranacak alt öğeyi belirten bir nesneyi barındırır. İlgili içeriği oluşturmak için kullanılan
DEPTH
anahtarı, hiyerarşide ne kadar ileri doğru görüneceğini belirtir. DEPTH
isteğe bağlıdır ve
1
şeklinde bir varsayılan değere sahip.
"SAMPLE_ELEMENT": {
"TYPE": "HAS_DESCENDANT",
"DEPTH": 2,
"DESCENDANT": {
"TYPE": "CLASS",
"VALUE": "android.view.ViewGroup"
}
}
BİRDEN FAZLA
Eşzamanlı birden çok koşulu temel alarak elementi tanımlayın. Tüm bu koşullar 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, RelativeLayout
Permission manager
metnini içeren 2
derinliğinde alt öğe.
İş akışları
İş akışı, belirli bir görevi yerine getirmek için kullanılan bir dizi işlemi temsil eder cihaz türüne göre yeterince farklılık gösterebilecek ve daha ilgili olan kod yerine yapılandırmada daha esnek davranır.
"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ışı bir anahtar/değer çiftidir. Anahtar/değer çifti, iş akışının adı ve
değer, gerçekleştirilecek işlemlerden oluşan bir dizidir. Her işlem bir NAME
, bir TYPE
,
(genellikle) CONFIG
ve (bazen) SWIPE_CONFIG
veya SCROLL_CONFIG
. Örneğin,
çoğu TYPE türündeki CONFIG
, değeri 20 dakikada bir UI_ELEMENT
anahtarı olan
kullanıcı arayüzü öğesi girişiyle aynı biçimdedir (yukarıya bakın). Bu TYPE'ler şunlardır:
BASIN LONG_PRESS TIKLAMA UZUN_TIKLAMA TIKLAMA_IF_EXIST |
HAS_UI_ELEMENT_IN_FOREGROUND SCROLL_TO_FIND_AND_TIKLAMA SCROLL_TO_FIND_AND_TIKLAYIN_EĞER_VAR SWIPE_TO_BUL_VE_TIKLAMA KAYDIR |
Diğer TYPE'lar için yapılandırma ayrıntıları şunlardır:
Nesne | Açıklama |
---|---|
COMMAND |
Yürütülecek komutu içeren TEXT değerine sahip nesne. |
HAS_PACKAGE_IN_FOREGROUND |
Paketi içeren TEXT değerine sahip bir nesne. |
SWIPE |
SWIPE işlemi için CONFIG key değerini atlayın. Bu
yalnızca SWIPE_CONFIG kullanır |
WAIT_MS |
Aşağıdaki sayıyı içeren TEXT değerine sahip nesne
milisaniye cinsinden eder. |
Kaydırma ve kaydırma ile ilgili işlemler, aşağıdaki gibi ek yapılandırma gerektirir:
SCROLL_YAPILANDIRMA
Nesne | Açıklama |
---|---|
SCROLL_ACTION |
USE_GESTURE veya USE_BUTTON |
SCROLL_DIRECTION |
HORIZONTAL veya VERTICAL |
SCROLL_ELEMENT |
Kullanıcı arayüzüyle aynı biçimi kullanarak kapsayıcının kaydırmasını gösteren bir nesne Öğe yapılandırması (yukarıya bakın). |
SCROLL_FORWARD , SCROLL_BACKWARD |
İleri ve geri kaydırma düğmeleri (
SCROLL_ACTION : USE_BUTTON ). |
SCROLL_MARGIN |
SCROLL_ACTION USE_GESTURE ise mesafe
kullanılacak sürüklemeyi başlatmak ve durdurmak için kapsayıcının kenarından
tıklayın (İsteğe bağlı, varsayılan = 10). |
SCROLL_WAIT_TIME |
SCROLL_ACTION USE_GESTURE ise saat
için bir nesne ararken kaydırma hareketleri arasında beklenecek milisaniye
tıklayın.
(İsteğe bağlı, varsayılan = 1). |
KAYDIRMA_YAPILANDIRMASI
Nesne | Açıklama |
---|---|
SWIPE_DIRECTION |
TOP_TO_BOTTOM , BOTTOM_TO_TOP ,
LEFT_TO_RIGHT veya RIGHT_TO_LEFT |
SWIPE_FRACTION |
Şunlardan biri:
|
NUMBER_OF_STEPS |
Kaydırma işlemini gerçekleştirmek için kullanılacak adım sayısı.
segmentSteps bakın.
|
Geliştirme ve yürütme
Spectatio çerçevesi, test APK'sının parçası olarak otomatik şekilde oluşturulur. Bina oluşturmak için AOSP kod tabanı yerel iş istasyonunda bulunmalıdır. test APK'sı oluşturulduğunda, kullanıcının APK'yı cihaza yüklemesi ve testi.
Aşağıdaki kod örneğinde bir test APK'sı.
# 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, Kablosuz ağ ayarlarını test etmek için TEST-APK-NAME -
AndroidAutomotiveSettingsTests
belirtildiği şekildeAndroid.bp
dosyası olarak kaydedebilirsiniz. APK'nın adı, uygulamanın ilgiliAndroid.bp
dosyasında bulunabilir. Otomotiv testi.DEVICE-SERIAL: DUT'nin seri kimliği. Bu parametre ana makineye yalnızca tek bir cihaz bağlıysa gereklidir.
config-file-path
: Yalnızca JSON yapılandırmasında belirtilen varsayılan olmayan cihaz kullanıcı arayüzü yapılandırmaları dosyası olduğundan emin olun. Sağlanmamışsa çerçevesi, testleri yürütmek için varsayılan değerleri kullanır.PATH-FOR-BUILT-TEST-APK: Test APK'sının oluşturulduğu yol
make
komutu yürütüldüğünde alınır.TEST-PACKAGE: Test paketinin adı.
TEST-CLASSNAME: Test sınıfının adı. Örneğin, Wifi Settings (Kablosuz Ayarları) testi, test paketi
android.platform.tests
ve test sınıfının adı:WifiSettingTest
.
Otomotiv Snippet Kitaplığı
Automotive Snippet Kitaplığı, Otomotiv ile etkileşime girmek üzere tasarlanmış Android Açık Kaynak Projesi (AOSP) uygulamalar ve hizmetler. Spectatio'dan yararlandığı pratik mekanizmalar bir ana makine (test) makinesinden farklı bir sunucuya Android destekli bir cihaz.
Başlayın
Başlamadan önce bu bölümleri inceleyin.
Ön koşullar
- Ana makinede Python 3.x yüklü.
- Gerekli derleme araçlarıyla AOSP ortamı kurulumu.
- Adb erişimi olan bir Android automotive cihazı (emülatör veya fiziksel cihaz).
Derleme
Automotive Snippet Kitaplığı tarafından sağlanan çeşitli snippet'leri derlemek için
sağlanan android.bp
dosyasını kullanabilir. Önceki komutlarda verilen
bölümünü kullanarak APK'yı derlemeyi deneyin.
Dağıtım
Snippet kitaplıklarını başarıyla derledikten sonra, elde edilen APK'ları şuraya dağıtın:
önceki bölümde bahsedilen adb install
komutunu kullanan hedef cihaz
bölümüne bakın.
Testler yapın
Snippet kitaplıkları, otomotivle etkileşimde bulunmak için çeşitli RPC yöntemleri sunar
bahsedeceğim. Bu yöntemler, ana makinedeki Mobly çerçevesiyle çağrılabilir
üretiliyor. Mobly test ortamının ayarlandığını varsayarsak
snippet_shell.py
komut dosyasını kullanarak etkileşimli bir Python kabuğu açın.
cihazda RPC yöntemlerini manuel olarak çağırın. Örnek çağrı:
python3 snippet_shell.py com.google.android.mobly.snippet.bundled -s <serial>
<serial>
numarasını, cihazın seri numarasıyla değiştirin. Bu numarayı şuradan edinebilirsiniz:
adb cihazları bağlanır.
Dahil edilen kitaplıklar
Automotive Snippet Kitaplığı aşağıdaki snippet kitaplıklarını ve yardımcılar:
AutomotiveSnippet: Araç işlemleriyle ilgili API'ler sağlar. Örneğin: çevirme, ses kontrolü, araç sabit tuşları ve medya merkezi etkileşimi.
Telefon Snippet'i: Arama işleme, kişilere göz atma ve SMS işlemleriyle ilgili veriler içerir.
Automotive snippet'i ve PhoneSnippet'te bazı ortak açıklamalar vardır.
Daha açık belirtmek gerekirse, bir otomobili eşlemek için Bluetooth ile ilgili RCP çağrılarını istila edebilirsiniz.
bir de telefon cihazı var. Bu bt_discovery_test
, bunu nasıl yapacağınızı gösterir.
- TEST-CLASSNAME: Test sınıfının adı. Örneğin,
Kablosuz Ayarları testi,
test paketi
android.platform.tests
ve test sınıfının adıWifiSettingTest
.