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

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

הדוגמה

מודול CTS עם תמיכה בכמה מכשירים שמתאים ל-Wi-Fi. הוא שולח הודעה ממכשיר אחד דרך 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 Bundled זמינים ב-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 לבדיקה. הזמן מופיע באלפיות שנייה ורלוונטי להפעלה הבינארית המלאה של Python (כל תרחישי הבדיקה ביחד). הדבר נדרש כדי למנוע מקרי סטטיות של תרחישי בדיקה במקרה של בעיות מסוימות.
  • כל תג device יכול להכיל הגדרה נפרדת לכל מכשיר. ההגדרות יתקבלו ב-Mobly Config באותו הסדר שצוין ב-XML.

קשורים להתקנת קובץ ה-apk של קטע הקוד:

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

שלב 5: מריצים את הבדיקה באופן מקומי: atest

בשלב זה, אפשר להריץ בדיקות במספר מכשירים רק במכשירים פיזיים. לפני שמריצים את הבדיקה, צריך לוודא שמכשירי הבדיקה נמצאים במצב תקין. הפקודה adb devices אמורה להציג את רשימת המכשירים המחוברים. אם הרשימה מכילה מכשירי בדיקה שלא מיועדים לבדיקה, צריך לציין את המכשירים לבדיקה באמצעות הדגל -s.

לבדיקות Wi-Fi, צריך לוודא ש-Wi-Fi מופעל במכשירים (אחרי איפוס להגדרות המקוריות).

אפשר להריץ את הבדיקה באופן מקומי באמצעות atest:

$ atest CtsWifiAwareTestCases

מספר המכשירים שבהם נעשה שימוש אמור להופיע בכותרת הסיכום בפלט של atest, למשל 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

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

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

Expected to get at least 2 controller objects, got 1

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

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