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

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

הדוגמה

מסופק מודול CTS wifi-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.