Spectatio هو إطار عمل اختباري مفتوح المصدر تم تطويره لاختبار نظام Android. نظام التشغيل Automotive (AAOS) على الأجهزة الحقيقية والافتراضية. توفّر Spectatio واجهات برمجة تطبيقات اختبار التطبيقات على أحد أجهزة السيارات، وهو حل قابل للتطوير والتوسع يُستخدم للتحقّق من إمكانات وأداء نظام التشغيل Android Automotive (AAOS) وتطبيقاته.
تصميم عالي المستوى
إنّ إطار عمل Spectatio قابل للتكيّف والتوسّع مع العديد من واجهات مستخدم AAOS. وعمليات التنفيذ. يُستخدم لاختبار إمكانات وأداء نظام التشغيل Android Automotive (AAOS). على معدّات الجهاز والمحاكيات والبيئات الافتراضية.
يوضح الشكل التالي التصميم عالي المستوى لإطار عمل Spectatio.
الشكل 1. إطار عمل Spectatio تصميم عالي المستوى.
يوفّر إطار عمل Spectatio مجموعة من واجهات برمجة التطبيقات، الذي تم إنشاؤه فوق واجهة المستخدم Automator. لإنشاء اختبارات واجهة المستخدم التي تتفاعل مع تطبيقات المستخدم والنظام على نظام التشغيل AAOS. السيارات من اختبار استخدام واجهات برمجة التطبيقات التي يقدمها إطار عمل Spectatio للاختبار، مما يجعل إجراء هذه الاختبارات بشكل مستقل عن الجهاز قيد الاختبار (DUT) وقابل للتطوير للاختبار أجهزة متنوعة، إذا كان مدعومًا.
يوضح الشكل 1 أن إطار عمل Spectatio ينقسم إلى وحدات بناءً على المرجع تطبيقات مثل Dialer وMedicenter والإعدادات التي تستخدم التطبيقات والواجهات والمساعدات، ما يجعلها قابلة للتوسع بسهولة للتطبيقات الجديدة. ذا سبكتايو إطار عمل إعادة استخدام الفئات الشائعة للمعايير والمساعدات في مجال الخدمات. فئة المساعد العادي هي الفئة الرئيسية لجميع دوال مساعد التطبيق وتوفر الوظائف العادية الخاصة بالجهاز أو القابلة للتطبيق على جميع التطبيقات. تشير رسالة الأشكال البيانية توفّر فئات الخدمات المساعِدة خدمات مثل قراءة أو كتابة الملفات من الجهاز.
هندسة معمارية
لتوفير مجموعة من واجهات برمجة التطبيقات لإنشاء اختبارات واجهة المستخدم، ينفِّذ إطار عمل Spectatio الواجهات الخاصة بالتطبيق والمساعدات بالإضافة إلى توسيع نطاق المساعد العادي الحالي الفئة واستيراد فئات مساعدة الأداة.
يوضح الشكل 2 البنية عالية المستوى لإطار عمل Spectatio جميع الجهات المشتركة في تنفيذ واجهات برمجة التطبيقات لاختبار أحد التطبيقات.
الشكل 2. إطار Spectatio بنية عالية المستوى
توفر واجهة مساعد التطبيق مخططًا لتنفيذ
مساعد التطبيق. وهو يتألف من العديد من الدوال المساعدة اللازمة
لاختبار التطبيقات. لكل تطبيق واجهة خاصة به، مثل IAutoSettingHelper
وIAutoDialHelper
للحصول على مزيد من المعلومات والاطّلاع على قائمة بوظائف الواجهة، يمكنك الاطّلاع على وظائف واجهة مساعد التطبيق على AOSP.
وتتألف فئة المساعدة العادية من السمات والدوال العادية
مطلوبة لإعداد الجهاز، ولكنها غير مخصّصة لأي تطبيق، مثل pressHome
وscroll
. يتم تحديد فئة المساعد العادية في AbstractAutoStandardAppHelper.java
.
يستخدِم إطار العمل فئات الخدمات المساعدة. بالنسبة
على سبيل المثال، AutoJsonUtility.java
هي
فئة خدمات تحمِّل ملف إعداد JSON المحدَّد للجهاز وتُجري التحديثات
إعدادات إطار العمل في وقت التشغيل.
وحدة تنفيذ مساعد التطبيق هي جوهر Spectatio
إطار العمل. يحتوي على تنفيذ الدوال المساعدة المحددة في
واجهة مساعد التطبيق، وهي مطلوبة لاختبار التطبيقات على
جهاز السيارة. لكل تطبيق طريقة تنفيذ خاصة به، مثل SettingHelperImpl
أو
DialHelperImpl
،
مستخدم من قِبل
اختبارات Automotive لاختبار التطبيقات. لمزيد من المعلومات وقائمة
عمليات التنفيذ، يُرجى الاطّلاع على وظائف تنفيذ مساعد التطبيقات
على AOSP.
اختبارات السيارات
استخدام وظائف تنفيذ مساعد التطبيق لاختبار العمليات المختلفة
المتعلق بالتطبيق. استخدام الصف 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 مستقلاً عن واجهة مستخدم الجهاز، لذا فهو قابل للتطوير من أجل
أجهزة اختبار مع واجهات مستخدم وأجهزة متنوعة. لتحقيق هذه القابلية للتوسع،
يستخدم Spectatio إعدادات الجهاز التلقائية استنادًا إلى الجهاز المرجعي. إلى
يتوافق مع الإعدادات غير التلقائية للأجهزة، يستخدم إطار العمل ملف JSON
ملف الإعداد في وقت التشغيل لضبط تغييرات واجهة المستخدم المطلوبة للجهاز. حاسمة
يدعم ملف إعداد JSON عناصر واجهة المستخدم مثل TEXT
وDESCRIPTION
RESOURCE_ID
، إلى جانب إعدادات path
، ويجب أن تحتوي على المعلومات فقط
حول تغييرات واجهة المستخدم في DUT. تستخدم باقي عناصر واجهة المستخدم الإعدادات الافتراضية
قيم التهيئة المقدمة في إطار العمل.
الإعدادات التلقائية للأجهزة
يعرض نموذج ملف إعداد 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 |
كائن يُستخدم لإنشاء "BySelectors" في UI Automator والذي يحدّد واجهة المستخدم العناصر (موصوفة بالتفصيل أدناه). |
WORKFLOWS |
تسلسلات من الإجراءات التي تنجز مهام عالية المستوى (الموضحة في التفاصيل أدناه). |
عناصر واجهة المستخدم
يتضمّن كل عنصر واجهة مستخدم علامة TYPE
تحدد ما سيبحث عنه UI Automator.
تحديد العنصر (مثل معرف المورد والنص والوصف)
قيم التهيئة المرتبطة بهذا النوع. بشكل عام، عندما تكون الجهة المساعدة
تحدد عنصرًا على الشاشة باستخدام هذه التكوين، يتم التعرف عليها
عنصرًا واحدًا. إذا تطابقت عناصر متعددة مع الإعدادات، يتم استخدام عنصر عشوائي
استخدامه في الاختبار. وبالتالي، يجب كتابة الإعداد (بشكل عام)
على وجه التحديد أنه يضيق إلى عنصر واحد في السياق ذي الصلة.
النص
هذا هو أبسط أنواع عناصر واجهة المستخدم. يتم تحديد عنصر واجهة المستخدم من خلال النص الخاص به، وتتطلب مطابقة تامة.
"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"
}
معرِّف الموارد
تحديد العنصر من خلال معرف المورد الخاص به، واختياريًا أيضًا التحقق من الحزمة
المكون لهذا المعرف. مفتاح PACKAGE
اختياري، إذا تم حذفها،
سيتطابق، وسيتم فقط النظر في الجزء من رقم التعريف الذي يلي :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"
}
لديه S_ANCESTOR
حدد العنصر من خلال البحث عن التسلسل الهرمي للأداة في الكيانات الأصلية. تشير رسالة الأشكال البيانية
يحتوي المفتاح ANCESTOR
على كائن يحدّد الأصل. المفتاح DEPTH
يحدد مدى بعد العرض الهرمي. إنّ DEPTH
اختيارية وتضم
والقيمة الافتراضية لـ 1
.
"SAMPLE_ELEMENT": {
"TYPE": "HAS_ANCESTOR",
"DEPTH": 2,
"ANCESTOR": {
"TYPE": "CLASS",
"VALUE": "android.view.ViewGroup"
}
}
يحتوي على وصف
حدد العنصر من خلال النظر لأسفل التسلسل الهرمي عند عناصره الثانوية. تشير رسالة الأشكال البيانية
يحتوي مفتاح DESCENDANT
على كائن يحدد العنصر الثانوي الذي يجب البحث عنه. تشير رسالة الأشكال البيانية
يحدّد مفتاح DEPTH
مدى الوصول إلى التسلسل الهرمي. DEPTH
اختياري
تحتوي على القيمة التلقائية 1
.
"SAMPLE_ELEMENT": {
"TYPE": "HAS_DESCENDANT",
"DEPTH": 2,
"DESCENDANT": {
"TYPE": "CLASS",
"VALUE": "android.view.ViewGroup"
}
}
متعددة
حدِّد العنصر استنادًا إلى شروط متزامنة متعددة، وجميعها يجب الوفاء به.
"APP_INFO_SETTINGS_PERMISSION_MANAGER": {
"TYPE": "MULTIPLE",
"SPECIFIERS": [
{
"TYPE": "CLASS",
"VALUE": "android.widget.RelativeLayout"
},
{
"TYPE": "HAS_DESCENDANT",
"MAX_DEPTH": 2,
"DESCENDANT": {
"TYPE": "TEXT",
"VALUE": "Permission manager"
}
}
]
}
في هذا المثال، تحدِّد الإعدادات RelativeLayout
الذي يتضمّن
تابع في العمق 2
، والذي يتضمن النص Permission manager
.
Workflows
يمثل سير العمل سلسلة من الإجراءات المستخدمة لإنجاز هدف معين قد تختلف بدرجة كافية من نوع جهاز إلى نوع جهاز وأكثر مرن لتمثيله في التكوين أكثر من التمثيل في التعليمة البرمجية.
"WORKFLOWS": {
"OPEN_SOUND_SETTINGS_WORKFLOW": [
{
"NAME": "Go to Home",
"TYPE": "PRESS",
"CONFIG": {
"TEXT": "HOME"
}
},
{
"NAME": "Open Settings",
"TYPE": "COMMAND",
"CONFIG": {
"TEXT": "am start -a android.settings.SETTINGS"
}
},
{
"NAME": "Open Sound Settings",
"TYPE": "SCROLL_TO_FIND_AND_CLICK",
"CONFIG": {
"UI_ELEMENT": {
"TYPE": "TEXT",
"VALUE": "Sound"
}
},
"SCROLL_CONFIG": {
"SCROLL_ACTION": "USE_GESTURE",
"SCROLL_DIRECTION": "VERTICAL",
"SCROLL_ELEMENT": {
"TYPE": "RESOURCE_ID",
"VALUE": "car_ui_recycler_view"
}
}
}
]
}
يتكون كل سير عمل من زوج المفتاح/القيمة حيث يكون المفتاح هو اسم سير العمل
تكون القيمة هي صفيف من الإجراءات التي يجب تنفيذها. لكل إجراء، NAME
، أو TYPE
،
(عادةً) CONFIG
و (في بعض الأحيان) SWIPE_CONFIG
أو SCROLL_CONFIG
. بالنسبة
معظم أنواع TYPE، فإن CONFIG
عبارة عن كائن به مفتاح UI_ELEMENT
تأخذ قيمته
نفس شكل إدخال عنصر واجهة المستخدم (انظر أعلاه). هذه TYPE هي:
اضغط على long_PRESS نقرة long_نقرة نقرة_IF_EXIST |
HAS_UI_ELEMENT_IN_FOREGROUND SCROLL_TO_FIND_AND_نقرة SCROLL_TO_FIND_AND_نقرة_IF_EXIST SWIPE_TO_FIND_AND_نقرة SWIPE_TO_FIND_AND_نقرة_IF_EXIST |
بالنسبة إلى أنواع TYPE الأخرى، تكون تفاصيل الضبط هي:
كائن | الوصف |
---|---|
COMMAND |
يشير هذا المصطلح إلى كائن يحتوي على القيمة TEXT يتضمّن الأمر المطلوب تنفيذه. |
HAS_PACKAGE_IN_FOREGROUND |
كائن ذو قيمة TEXT يحتوي على الحزمة. |
SWIPE |
احذف CONFIG key لإجراء SWIPE . هذا النمط
تستخدم فقط SWIPE_CONFIG |
WAIT_MS |
كائن ذو قيمة TEXT يتضمن رقم
مللي ثانية للانتظار. |
تتطلب الإجراءات ذات الصلة بالتمرير والتمرير ضبطًا إضافيًا، كما يلي:
ضبط_التمرير
كائن | الوصف |
---|---|
SCROLL_ACTION |
إما USE_GESTURE أو USE_BUTTON |
SCROLL_DIRECTION |
إما HORIZONTAL أو VERTICAL |
SCROLL_ELEMENT |
كائن يشير إلى الحاوية التي يجب تمريرها، باستخدام النموذج نفسه كواجهة مستخدم تهيئة العنصر (انظر أعلاه). |
SCROLL_FORWARD ، SCROLL_BACKWARD |
زرا التمرير للأمام وللخلف (مطلوب عند
تم USE_BUTTON ميزة SCROLL_ACTION . |
SCROLL_MARGIN |
إذا كانت قيمة SCROLL_ACTION هي USE_GESTURE ، تكون المسافة
من حافة الحاوية لبدء السحب الذي سيتم استخدامه وإيقافه
لتنفيذ الانتقال للأعلى أو للأسفل (اختياري، القيمة التلقائية = 10) |
SCROLL_WAIT_TIME |
إذا كانت قيمة SCROLL_ACTION هي USE_GESTURE ، يكون الوقت
مللي ثانية للانتظار بين إيماءات التمرير عند البحث عن كائن
نقرة.
(اختياري، القيمة التلقائية = 1). |
SWIPE_CONFIG
كائن | الوصف |
---|---|
SWIPE_DIRECTION |
إما TOP_TO_BOTTOM أو BOTTOM_TO_TOP
LEFT_TO_RIGHT أو RIGHT_TO_LEFT |
SWIPE_FRACTION |
يجب تحديد ما يلي:
|
NUMBER_OF_STEPS |
عدد الخطوات التي سيتم استخدامها لتنفيذ التمرير السريع. يمكنك الاطّلاع على
segmentSteps .
|
الإنشاء والتنفيذ
تم إنشاء إطار عمل Spectatio تلقائيًا كجزء من حِزمة APK التجريبية. لإنشاء APK للاختبار، يجب وضع قاعدة رموز AOSP في محطة العمل المحلية. بعد تمّ إنشاء حزمة APK تجريبية، على المستخدم تثبيت حزمة APK على الجهاز وتنفيذ الاختبار.
يوضح نموذج التعليمات البرمجية التالي طريقة إنشاء اختبار APK.
# Build Test APK make TEST-APK-NAME
# Install Test APK adb -s DEVICE-SERIAL install -r PATH-FOR-BUILT-TEST-APK
# Execute Test with the JSON file adb -s DEVICE-SERIAL shell am instrument -w -r -e debug false -e config-file-path /data/local/tmp/jsonFile.json -e class TEST-PACKAGE.TEST-CLASSNAME TEST-PACKAGE/androidx.test.runner.AndroidJUnitRunner
في هذه الأوامر:
TEST-APK-NAME: اسم التطبيق المطلوب اختباره على سبيل المثال، قم بتعيين TEST-APK-NAME إلى
AndroidAutomotiveSettingsTests
لاختبار إعدادات Wi-Fi كما هو محدّد فيAndroid.bp
الملف. يمكن العثور على اسم حزمة APK في ملفAndroid.bp
المعنيّ اختبار السيارات.DEVICE-SERIAL: المعرّف التسلسلي لـ DUT هذه المعلمة ليست مطلوبة في حال توصيل جهاز واحد فقط بالمضيف.
config-file-path
: مَعلمة اختيارية مطلوبة فقط لتقديمها عمليات الضبط غير التلقائية لواجهة مستخدم الجهاز كما هو محدَّد في ضبط JSON . إذا لم يتم توفيره، سيتم تضمين سمة القيم الافتراضية لتنفيذ الاختبارات.PATH-FOR-BUILT-TEST-APK: المسار الذي تم فيه إنشاء حزمة APK التجريبية عند تنفيذ الأمر
make
.TEST-PACKAGE: اسم حزمة الاختبار
TEST-CLASSNAME: اسم الصف الاختباري على سبيل المثال، بالنسبة إلى إعدادات Wifi، وحزمة الاختبار هي
android.platform.tests
اسم صف الاختبار هوWifiSettingTest
.
مكتبة مقتطفات السيارات
مكتبة مقتطفات السيارات هي مجموعة من مكتبات اختبار Android تم تصميم "المشروع المفتوح المصدر لنظام Android" (AOSP) للتفاعل مع التطبيقات التطبيقات والخدمات. تستفيد هذه المنصة من Spectatio بآلية ملائمة. لتنفيذ طلبات الإجراءات عن بُعد (RPC) من جهاز مضيف (اختبار) إلى جهاز يعمل بنظام التشغيل Android
البدء
قبل البدء، راجِع هذه الأقسام.
المتطلّبات الأساسية
- تثبيت Python 3.x على الجهاز المضيف.
- إعداد بيئة AOSP باستخدام أدوات التصميم اللازمة
- جهاز Android للسيارات (المحاكي أو الجهاز الفعلي) مع إمكانية الوصول إلى Adb
موسيقى مجمّعة
لتجميع المقتطفات المختلفة المتوفرة في مكتبة مقتطفات السيارات، عليك
يمكنك استخدام ملف android.bp
المقدَّم. قد يؤدي اتباع الأوامر في القسم السابق
لتجميع ملف APK.
التفعيل
بعد تجميع مكتبات المقتطفات بنجاح، انشر حِزم APK الناتجة
الجهاز المستهدَف باستخدام الأمر adb install
المذكور في الفقرة السابقة
.
إجراء الاختبارات
تكشف مكتبات المقتطفات عن العديد من طرق استدعاء الإجراءات عن بُعد للتفاعل مع النموذج
. ويمكن استدعاء هذه الطرق من خلال إطار عمل Mobly من المضيف
الجهاز. بافتراض أنك قمت بإعداد بيئة اختبار Mobly، يمكنك استخدام
snippet_shell.py
لفتح واجهة Python تفاعلية، حيث يمكنك
لاستدعاء طرق استدعاء إجراء عن بُعد (RPC) يدويًا على الجهاز. مثال على الاستدعاء:
python3 snippet_shell.py com.google.android.mobly.snippet.bundled -s <serial>
استبدِل <serial>
بالرقم التسلسلي للجهاز الذي يمكنك الحصول عليه باستخدام.
أجهزة adb إذا كانت هناك أجهزة متعددة متصلة.
المكتبات المضمّنة
تشتمل مكتبة مقتطفات Automotive على مكتبات المقتطفات التالية المساعدة:
Automotiveمقتطف: يوفر واجهات برمجة التطبيقات (API) ذات الصلة بعمليات المركبات، مثل الاتصال والتحكم في مستوى الصوت والمفاتيح الثابتة للمركبة والتفاعل مع مركز الوسائط.
Phonesnippet: توفر واجهات برمجة التطبيقات المتعلقة بالاتصالات الهاتفية، بما في ذلك التعامل مع المكالمات، وتصفح جهات الاتصال وعمليات الرسائل القصيرة SMS.
يتشارك مقتطف السيارات ومقتطف الهاتف بعض المنطق الشائع.
على وجه التحديد، يمكنك إيقاف طلبات RCP ذات الصلة بالبلوتوث لإقران سيارة.
وجهاز هاتف. توضّح bt_discovery_test
كيفية إجراء ذلك.
- TEST-CLASSNAME: اسم الصف الاختباري على سبيل المثال، بالنسبة إلى
إعدادات Wi-Fi
حزمة الاختبار هي
android.platform.tests
واسم فئة الاختبار هوWifiSettingTest
.