מודולים למספר מכשירים

במסמך הזה אנחנו מסבירים בפירוט איך ליצור מודולים לריבוי מכשירים, ומציינים את המגבלות הנוכחיות כשהן ידועות.

הדוגמה

מסופק מודול CTS לשימוש בכמה מכשירים עם Wi-Fi Aware. הוא שולח הודעה ממכשיר אחד דרך Wi-Fi ומוודא שהמכשיר השני מקבל אותה.

המקור של המודול נמצא בכתובת packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/.

הוספנו להערות בדוגמה כמה שיותר תגובות שלדעתנו מועילות.

שלב 1: יוצרים את תיקיית המודול

מומלץ ליצור תיקייה למודול של ריבוי מכשירים בפרויקט החבילה שאליו הוא שייך. לדוגמה: cts/hostsidetests/multidevices/. אנחנו ממליצים על כך כדי שכל המודולים של מכשירים מרובים יישארו באותו מיקום לפחות בהתחלה, וכך יהיה קל יותר למצוא דוגמאות.

כל הקבצים של המודול הזה צריכים להיות בתיקיית מודול משלהם. לדוגמה: wifi_aware.

שלב 2: יוצרים את הבדיקה

כאן מטמיעים את לוגיקת הבדיקה. היא תלויה מאוד במה שנבדק.

יוצרים את מקור הבדיקה של Mobly, למשל: wifi_aware_test.py.

שלב 3: יוצרים את קובץ ה-build‏: 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 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 לבדיקה. הערך הוא באלפיות שנייה והוא חל על ההפעלה הבינארית המלאה של Python (כל תרחישי הבדיקה יחד). ההגדרה הזו נדרשת כדי למנוע מצב שבו תרחישי בדיקה נתקעים לנצח במקרה של בעיות מסוימות.
  • כל תג device יכול להכיל הגדרה נפרדת בכל מכשיר, וההגדרות יתקבלו ב-Mobly config באותו סדר שצוין ב-XML.

בנושא התקנת קובץ ה-APK של קטע הקוד:

  • ה-POC הראשוני עודכן כדי להתקין קובצי APK של קטעי קוד באמצעות target_preparer בעקבות שיחה עם צוות Coverage: כדי לוודא שמדידות הכיסוי לא יימחקו מוקדם מדי, הסרת ההתקנה על ידי Harness ולא על ידי קוד בדיקה בקבצים בינאריים של Python מספקת ערבויות טובות יותר מבחינת התזמון.

שלב 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 מופיע בנתיב. הוספת '‎~/.local/bin' ל-PATH אמורה לפתור את הבעיה. אם virtualenv לא מותקן, אפשר לעקוב אחרי ההוראות שבכתובת: https://virtualenv.pypa.io/en/latest/installation.html

היה צפוי לקבל לפחות 2 אובייקטים של בקרים, אבל התקבל רק 1

מודולי בדיקה הם מודולים של כמה מכשירים או של מכשיר יחיד, ואין מודולים משולבים. אם תנסו להריץ מודול של כמה מכשירים בלי כמה מכשירים, תוצג השגיאה הבאה:

Expected to get at least 2 controller objects, got 1

הפעלת המודול במצב ריבוי מכשירים תפתור את הבעיה.

ב-CTS: אפשר להשתמש ב-sharding כדי להפעיל אותו (לדוגמה: ‎--shard-count 2) או ב-run cts-multidevces.