پیمانه‌های چنددستگاهی

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

نمونه

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

منبع واحد در 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» در 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",
    ],
}

مرحله ۴: ایجاد پیکربندی واحد: 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 به‌جای کد آزمایش در باینری‌های Python تضمین‌های بهتری ازنظر زمان‌بندی ارائه می‌دهد.

مرحله ۵: اجرای آزمایش به‌صورت محلی: 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/latest/installation.html

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

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

Expected to get at least 2 controller objects, got 1

اجرای پیمانه در حالت چنددستگاهی مشکل را برطرف خواهد کرد.

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