מודולים מרובי מכשירים

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

המדגם

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

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

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

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

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

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

שלב 2: צור את המבחן

זה המקום שבו אתה מיישם את היגיון הבדיקה שלך. זה מאוד תלוי במה שנבדק.

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

שלב 3: צור את קובץ הבנייה: 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 או ב-Continuous execution.

Mobly Bundled Snippets זמינים באנדרואיד ב- extern/mobly-bundled-snippets/ .

אופציונלי: צור קטעי טקסט מותאמים אישית

מודולים מרובי מכשירים מסוימים עשויים לדרוש קטעי Mobly מותאמים אישית. הבדיקה לדוגמה כוללת קטע קוד מודע ל-WiFi ב- packages/modules/Wifi/tests/hostsidetests/multidevices/com.google.snippet.wifi/aware/WifiAwareSnippet.java , אשר בנוי עם Mobly Snippet Lib, זמין באנדרואיד בכתובת: חיצוני /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>

שימו לב ש:

  • למבחן לדוגמה זה יש תלות במובלי. ניתן לציין כל תלות עבור PythonVirtualenvPreparer והיא תותקן עם pip.
  • mobly-par-file-name עבור MoblyBinaryHostTest חייב להתאים לשם המודול כמו ב-Android.bp.
  • ציין mobly-test-timeout עבור הבדיקה. זה במילישניות והוא חל על הביצוע הבינארי המלא של פיתון (כל מקרי הבדיקה ביחד). זה נחוץ כדי למנוע מקרי בדיקה להיתלות לנצח במקרה של בעיות מסוימות.
  • כל תג device יכול להכיל הגדרה נפרדת בכל מכשיר, תצורת Mobly תקבל אותם באותו סדר כפי שצוין ב-XML.

קשור להתקנת Snippet apk:

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

שלב 5: הפעל בדיקה מקומית: atest

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

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

אתה יכול להריץ את הבדיקה באופן מקומי עם 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: אתה יכול להשתמש ב-sharding כדי להפעיל אותו (לדוגמה: --shard-count 2) או run cts-multidevces .