ماژول های چند دستگاهی

این سند دستورالعمل‌های گام به گام در مورد نحوه ایجاد ماژول‌های چند دستگاهی ارائه می‌دهد و در صورت لزوم، محدودیت‌های فعلی را نیز بیان می‌کند.

نمونه

یک ماژول چند دستگاهی CTS مجهز به وای‌فای ارائه شده است. این ماژول پیامی را از یک دستگاه از طریق وای‌فای ارسال می‌کند و تأیید می‌کند که دستگاه دیگر آن را دریافت می‌کند.

منبع این ماژول در packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/ قرار دارد.

ما مثال را با هر تعداد نظری که مفید می‌دانستیم، حاشیه‌نویسی کرده‌ایم.

مرحله ۱: ایجاد پوشه ماژول

توصیه می‌شود برای ماژول چند-دستگاهی خود، پوشه‌ای در پروژه‌ی مربوط به آن ایجاد کنید. برای مثال: cts/hostsidetests/multidevices/ . ما این کار را توصیه می‌کنیم تا حداقل در ابتدا، تمام ماژول‌های چند-دستگاهی در یک مکان قرار بگیرند که کشف مثال‌ها را آسان‌تر می‌کند.

تمام فایل‌های این ماژول باید در پوشه ماژول خودشان قرار بگیرند. برای مثال: wifi_aware .

مرحله ۲: ایجاد آزمون

اینجا جایی است که شما منطق تست خود را پیاده‌سازی می‌کنید. این بسیار وابسته به چیزی است که تست می‌شود.

منبع تست Mobly را ایجاد کنید، مانند: wifi_aware_test.py .

مرحله ۳: فایل ساخت را ایجاد کنید: 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 Bundled در اندروید در مسیر external/mobly-bundled-snippets/ در دسترس هستند.

اختیاری: ایجاد قطعه کدهای سفارشی

برخی از ماژول‌های چند دستگاهی ممکن است به قطعه کدهای سفارشی Mobly نیاز داشته باشند. نمونه تست شامل یک قطعه کد wifi-aware در packages/modules/Wifi/tests/hostsidetests/multidevices/com.google.snippet.wifi/aware/WifiAwareSnippet.java است که با Mobly Snippet Lib ساخته شده است و در اندروید در 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",
    ],
}

مرحله ۴: ایجاد فایل پیکربندی ماژول: 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 قطعه کد:

  • به دلیل گفتگو با تیم Coverage، POC اولیه برای نصب فایل‌های apk قطعه کد از طریق target_preparer به‌روزرسانی شده است: برای اطمینان از اینکه اندازه‌گیری‌های پوشش خیلی زود حذف نمی‌شوند، حذف نصب از طریق Harness به جای کد آزمایشی در فایل‌های باینری پایتون، تضمین‌های بهتری از نظر زمان‌بندی ارائه می‌دهد.

مرحله ۵: اجرای تست به صورت محلی: atest

در حال حاضر، تست‌های چند دستگاهی فقط روی دستگاه‌های فیزیکی اجرا می‌شوند. قبل از اجرای تست، بررسی کنید که دستگاه‌های تست شما در وضعیت مناسبی قرار دارند. دستور adb devices باید لیست دستگاه‌های متصل شما را گزارش دهد. اگر لیست شامل دستگاه‌هایی است که برای تست در نظر گرفته نشده‌اند، دستگاه‌های مورد نظر برای تست را با استفاده از آپشن -s مشخص کنید.

برای آزمایش وای‌فای، مطمئن شوید که وای‌فای برای دستگاه‌ها فعال است (پس از تنظیم مجدد کارخانه).

شما می‌توانید تست را به صورت محلی با atest اجرا کنید:

$ atest CtsWifiAwareTestCases

شما باید تعداد دستگاه‌های استفاده شده در عنوان خلاصه را در خروجی atest ببینید، چیزی شبیه به Test executed with 2 device(s) .

عیب‌یابی

اگر تست هنگام اجرای محلی به دلایل زیر با شکست مواجه شود:

خطای محیط مجازی

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

لطفاً مطمئن شوید که virtualenv در مسیر (PATH) شما قرار دارد. اضافه کردن "~/.local/bin" به مسیر باید مشکل را حل کند. اگر virtualenv نصب نشده است، به این آدرس بروید: https://virtualenv.pypa.io/en/latest/installation.html

انتظار می‌رفت حداقل ۲ شیء کنترلر دریافت کند، ۱ شیء دریافت شد

ماژول‌های آزمایشی یا چند دستگاهی هستند یا تک دستگاهی، ماژول مختلط وجود ندارد. اگر سعی کنید یک ماژول چند دستگاهی را بدون چندین دستگاه اجرا کنید، این خطا را مشاهده خواهید کرد:

Expected to get at least 2 controller objects, got 1

اجرای ماژول در حالت چند دستگاهی مشکل را حل خواهد کرد.

برای CTS: می‌توانید از sharding برای فعال کردن آن استفاده کنید (برای مثال: --shard-count 2) یا run cts-multidevces .