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

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

הדוגמה

מודול 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 יקבלו אותן באותו סדר שבו הן מפורטות ב-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 אמורה לתקן את הבעיה. אםאם לא מותקנת וירטואלי, צריך לעקוב אחרי: https://virtualenv.pypa.io/en/previous/installation.html

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

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

Expected to get at least 2 controller objects, got 1

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

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