الوحدات المخصّصة للأجهزة المتعددة

يقدّم هذا المستند تعليمات مفصّلة حول كيفية إنشاء وحدات متعددة الأجهزة، ويشير إلى القيود الحالية عند توفّرها.

العينة

يتم توفير وحدة CTS متعددة الأجهزة متوافقة مع Wi-Fi. يرسل الجهاز رسالة عبر شبكة Wi-Fi ويتحقّق من أنّ الجهاز الآخر قد استلمها.

يمكن العثور على مصدر الوحدة في packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/‎.

لقد أضفنا إلى المثال أكبر عدد ممكن من التعليقات التي نعتقد أنّها مفيدة.

الخطوة 1: إنشاء مجلد الوحدة

ننصحك بإنشاء مجلد لوحدة الأجهزة المتعددة في مشروع حزمة التطبيقات الذي تنتمي إليه. على سبيل المثال: cts/hostsidetests/multidevices/‎ ننصحك بذلك لكي تبقى جميع وحدات الأجهزة المتعددة متجاورة في البداية على الأقل، ما يسهّل اكتشاف الأمثلة.

يجب وضع جميع ملفات هذه الوحدة ضمن مجلد الوحدة الخاص بها. على سبيل المثال: wifi_aware.

الخطوة 2: إنشاء الاختبار

هذا هو المكان الذي تنفّذ فيه منطق الاختبار. ويعتمد ذلك بشكل كبير على ما يتم اختباره.

أنشئ مصدر اختبار Mobly، مثل: wifi_aware_test.py.

الخطوة 3: إنشاء ملف الإنشاء: Android.bp

أضِف ملف Android.bp مثل packages/modules/Wifi/tests/hostsidetests/multidevices/test/Android.bp. حدِّد وحدة python_test_host، على النحو التالي:

python_test_host {
    name: "CtsWifiAwareTestCases",
    main: "wifi_aware_test.py",
    srcs: ["wifi_aware_test.py"],
    test_suites: [
        "cts",
        "general-tests",
    ],
    test_options: {
        unit_test: false,
    },
    data: [
          // Package the snippet with the mobly test
        ":wifi_aware_snippet",
    ],
}

حدِّد المقتطفات الخاصة بالاختبار باستخدام حقل البيانات، والذي سيتم تضمينه في الملف الثنائي ويمكن تحديد موقعه وتثبيته في الاختبار من خلال ATest أو في التنفيذ المستمر.

تتوفّر مقتطفات Mobly المجمّعة في Android على الرابط external/mobly-bundled-snippets/‎.

اختياري: إنشاء مقتطفات مخصّصة

قد تتطلّب بعض وحدات الأجهزة المتعدّدة مقتطفات Mobly مخصّصة. يتضمّن الاختبار النموذجي مقتطفًا من wifi-aware في packages/modules/Wifi/tests/hostsidetests/multidevices/com.google.snippet.wifi/aware/WifiAwareSnippet.java، الذي تم إنشاؤه باستخدام Mobly Snippet Lib، وهو متاح في Android على الرابط: external/mobly-snippet-lib/‎.

يجب تحديد المقتطف باستخدام قاعدة android_test في ملف Android.bp على النحو التالي: أداة قياس الأداء العادية:

android_test {
    name: "wifi_aware_snippet",
    sdk_version: "current",
    srcs: [
        "CallbackUtils.java",
        "WifiAwareSnippet.java",
    ],
    manifest: "AndroidManifest.xml",
    static_libs: [
        "androidx.test.runner",
        "guava",
        "mobly-snippet-lib",
    ],
}

الخطوة 4: إنشاء إعدادات الوحدة: AndroidTest.xml

أضِف ملف AndroidTest.xml مثل packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/AndroidTest.xml. في إعداد الاختبار هذا، عليك تحديد جهازَين للاختبار، على النحو التالي:

<configuration description="Config for CTS Wifi Aware test cases">
    <option name="test-suite-tag" value="cts" />
    <option name="config-descriptor:metadata" key="component" value="wifi" />
    <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
    <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
    <option name="config-descriptor:metadata" key="parameter" value="not_secondary_user" />

    <device name="device1">
        <!-- For coverage to work, the APK should not be uninstalled until after coverage is pulled.
             So it's a lot easier to install APKs outside the python code.
        -->
        <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
            <option name="test-file-name" value="wifi_aware_snippet.apk" />
        </target_preparer>
        <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
            <option name="run-command" value="input keyevent KEYCODE_WAKEUP" />
            <option name="run-command" value="wm dismiss-keyguard" />
        </target_preparer>
        <target_preparer class="com.android.tradefed.targetprep.PythonVirtualenvPreparer">
          <!-- Any python dependencies can be specified and will be installed with pip -->
          <option name="dep-module" value="mobly" />
        </target_preparer>
    </device>
    <device name="device2">
        <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
            <option name="test-file-name" value="wifi_aware_snippet.apk" />
        </target_preparer>
        <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
            <option name="run-command" value="input keyevent KEYCODE_WAKEUP" />
            <option name="run-command" value="wm dismiss-keyguard" />
        </target_preparer>
    </device>

    <test class="com.android.tradefed.testtype.mobly.MoblyBinaryHostTest">
      <!-- The mobly-par-file-name should match the module name -->
      <option name="mobly-par-file-name" value="CtsWifiAwareTestCases" />
      <!-- Timeout limit in milliseconds for all test cases of the python binary -->
      <option name="mobly-test-timeout" value="60000" />
    </test>
</configuration>

يُرجى ملاحظة ما يلي:

  • يعتمد اختبار العيّنة هذا على Mobly. يمكن تحديد أي تبعية لـ PythonVirtualenvPreparer وسيتم تثبيتها باستخدام pip.
  • يجب أن يتطابق mobly-par-file-name الخاص بـ MoblyBinaryHostTest مع اسم الوحدة كما هو وارد في ملف Android.bp.
  • يجب تحديد mobly-test-timeout للاختبار. ويتم قياسه بالمللي ثانية وينطبق على عملية تنفيذ ملف بايثون الثنائي بالكامل (جميع حالات الاختبار معًا). هذا الإجراء مطلوب لتجنُّب تعليق حالات الاختبار إلى الأبد في حال حدوث بعض المشاكل.
  • يمكن أن تحتوي كل علامة device على إعداد مميز على كل جهاز، وستتلقّى إعدادات Mobly هذه العلامات بالترتيب نفسه المحدّد في ملف XML.

في ما يلي معلومات ذات صلة بتثبيت حِزم APK الخاصة بمقتطفات التطبيقات:

  • تم تعديل النسخة الأولية من إثبات المفهوم لتثبيت حِزم APK الخاصة بالمقتطفات من خلال target_preparer بسبب المحادثة مع فريق Coverage: لضمان عدم حذف قياسات التغطية مبكرًا جدًا، يوفّر إلغاء التثبيت من خلال Harness بدلاً من رمز الاختبار في ملفات Python الثنائية ضمانات أفضل من حيث التوقيت.

الخطوة 5: تشغيل الاختبار محليًا: atest

في الوقت الحالي، لا يتم إجراء اختبارات الأجهزة المتعددة إلا على الأجهزة الفعلية. قبل إجراء الاختبار، تأكَّد من أنّ الأجهزة الاختبارية في الحالة المناسبة. يجب أن يعرض الأمر adb devices قائمة الأجهزة المتصلة. إذا كانت القائمة تتضمّن أجهزة غير مخصّصة للاختبار، حدِّد الأجهزة التي تريد استخدامها في الاختبار باستخدام العلامة -s.

بالنسبة إلى اختبارات شبكة Wi-Fi، تأكَّد من تفعيل شبكة Wi-Fi على الأجهزة (بعد إعادة ضبطها على الإعدادات الأصلية).

يمكنك إجراء الاختبار محليًا باستخدام atest:

$ atest CtsWifiAwareTestCases

من المفترض أن يظهر لك عدد الأجهزة المستخدَمة في عنوان الملخّص في إخراج atest، على النحو التالي: Test executed with 2 device(s).

تحديد المشاكل وحلّها

إذا تعذّر الاختبار عند تنفيذه على الجهاز بسبب:

خطأ في Virtualenv

java.io.IOException: Cannot run program
"virtualenv": error=2, No such file or directory

يُرجى التأكّد من أنّ virtualenv مضمّن في PATH. يجب أن يؤدي إضافة "~/.local/bin" إلى PATH إلى حلّ المشكلة. إذا لم يتم تثبيت virtualenv، اتّبِع الخطوات الواردة في: https://virtualenv.pypa.io/en/latest/installation.html

كان من المتوقّع الحصول على عنصرَين على الأقل من عناصر التحكّم، ولكن تم الحصول على عنصر واحد.

تكون وحدات الاختبار إما متعددة الأجهزة أو أحادية الجهاز، ولا توجد وحدات مختلطة. إذا حاولت تشغيل وحدة تتضمّن أجهزة متعددة بدون أجهزة متعددة، سيظهر لك الخطأ التالي:

Expected to get at least 2 controller objects, got 1

سيؤدي تنفيذ الوحدة في وضع الأجهزة المتعددة إلى حل المشكلة.

بالنسبة إلى CTS، يمكنك استخدام التقسيم لتشغيله (على سبيل المثال: --shard-count 2) أو run cts-multidevces.