Spectatio: إطار عمل اختبار السيارات

Spectatio هو إطار عمل اختباري مفتوح المصدر تم تطويره لاختبار نظام Android. نظام التشغيل Automotive (AAOS) على الأجهزة الحقيقية والافتراضية. توفّر Spectatio واجهات برمجة تطبيقات اختبار التطبيقات على أحد أجهزة السيارات، وهو حل قابل للتطوير والتوسع يُستخدم للتحقّق من إمكانات وأداء نظام التشغيل Android Automotive (AAOS) وتطبيقاته.

تصميم عالي المستوى

إنّ إطار عمل Spectatio قابل للتكيّف والتوسّع مع العديد من واجهات مستخدم AAOS. وعمليات التنفيذ. يُستخدم لاختبار إمكانات وأداء نظام التشغيل Android Automotive (AAOS). على معدّات الجهاز والمحاكيات والبيئات الافتراضية.

يوضح الشكل التالي التصميم عالي المستوى لإطار عمل Spectatio.

تصميم عالي المستوى لإطار عمل Spectatio

الشكل 1. إطار عمل Spectatio تصميم عالي المستوى.

يوفّر إطار عمل Spectatio مجموعة من واجهات برمجة التطبيقات، الذي تم إنشاؤه فوق واجهة المستخدم Automator. لإنشاء اختبارات واجهة المستخدم التي تتفاعل مع تطبيقات المستخدم والنظام على نظام التشغيل AAOS. السيارات من اختبار استخدام واجهات برمجة التطبيقات التي يقدمها إطار عمل Spectatio للاختبار، مما يجعل إجراء هذه الاختبارات بشكل مستقل عن الجهاز قيد الاختبار (DUT) وقابل للتطوير للاختبار أجهزة متنوعة، إذا كان مدعومًا.

يوضح الشكل 1 أن إطار عمل Spectatio ينقسم إلى وحدات بناءً على المرجع تطبيقات مثل Dialer وMedicenter والإعدادات التي تستخدم التطبيقات والواجهات والمساعدات، ما يجعلها قابلة للتوسع بسهولة للتطبيقات الجديدة. ذا سبكتايو إطار عمل إعادة استخدام الفئات الشائعة للمعايير والمساعدات في مجال الخدمات. فئة المساعد العادي هي الفئة الرئيسية لجميع دوال مساعد التطبيق وتوفر الوظائف العادية الخاصة بالجهاز أو القابلة للتطبيق على جميع التطبيقات. تشير رسالة الأشكال البيانية توفّر فئات الخدمات المساعِدة خدمات مثل قراءة أو كتابة الملفات من الجهاز.

هندسة معمارية

لتوفير مجموعة من واجهات برمجة التطبيقات لإنشاء اختبارات واجهة المستخدم، ينفِّذ إطار عمل Spectatio واجهات وتطبيقات مساعِدة خاصة بالتطبيق مع توسيع نطاق المساعد العادي الحالي الفئة واستيراد فئات مساعدة الأداة.

يوضح الشكل 2 البنية عالية المستوى لإطار عمل Spectatio جميع الجهات المشتركة في تنفيذ واجهات برمجة التطبيقات لاختبار أحد التطبيقات.

إطار 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_products_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

يجب تحديد ما يلي:

  • FULL: التمرير سريعًا من حافة الشاشة إلى حافة الشاشة

    أو
  • DEFAULT: من حافة الشاشة إلى حافة الشاشة مع علامة خمسة (5) المخزن المؤقت البكسل على كل جانب.

    أو
  • THREE_QUARTER أو HALF أو QUARTER: تنتهي إيماءة التمرير السريع من خمسة (5) بكسل من حافة الشاشة، ويبدأ من النقطة التي تغطي المسافة المشار إليها من الشاشة.
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 كيفية إجراء ذلك.