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

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

العيّنة

وتتوفر وحدة 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 مخصَّصة. يتضمّن نموذج الاختبار مقتطفًا متوافقًا مع شبكة Wi-Fi في ملف: 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 config بالترتيب نفسه المحدّد في ملف XML.

في ما يتعلق بتثبيت مقتطف apk:

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

الخطوة 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.