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

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

العيّنة

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

يوجد مصدر الوحدة في 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 على إعداد مختلف على كل جهاز، وهو The Mobly وستتلقّى هذه الإعدادات بالترتيب نفسه المحدّد في ملف XML.

ذات الصلة بمقتطف apk طريقة التثبيت:

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

الخطوة 5: إجراء الاختبار محليًا: atest

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

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

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

$ atest CtsWifiAwareTestCases

من المفترض أن ترى عدد الأجهزة المستخدمة في عنوان الملخّص مثل 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/update/installation.html

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

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

Expected to get at least 2 controller objects, got 1

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

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