Multi-Geräte-Module

Dieses Dokument enthält Schritt-für-Schritt-Anleitungen zum Erstellen von Modulen für mehrere Geräte und weist auf aktuelle Einschränkungen hin, sofern diese bekannt sind.

Die Probe

Es wird ein CTS-WLAN-fähiges Multi-Geräte-Modul bereitgestellt. Es sendet eine Nachricht von einem Gerät über WLAN und überprüft, ob das andere Gerät sie empfängt.

Die Quelle für das Modul befindet sich unter packets/modules/Wifi/tests/hostsidetests/multidevices/test/aware/ .

Wir haben das Beispiel mit so vielen Kommentaren versehen, wie wir für nützlich halten.

Schritt 1: Erstellen Sie den Modulordner

Es wird empfohlen, einen Ordner für Ihr Multi-Geräte-Modul in dem Suite-Projekt zu erstellen, zu dem es gehört. Zum Beispiel: cts/hostsidetests/multidevices/ . Wir empfehlen dies, damit alle Multi-Device-Module zumindest zunächst zusammengelegt bleiben, was das Auffinden von Beispielen erleichtert.

Alle Dateien für dieses Modul sollten in einem eigenen Modulordner abgelegt werden. Zum Beispiel: wifi_aware .

Schritt 2: Erstellen Sie den Test

Hier implementieren Sie Ihre Testlogik. Es hängt stark davon ab, was getestet wird.

Erstellen Sie die Mobly-Testquelle, etwa: wifi_aware_test.py .

Schritt 3: Erstellen Sie die Build-Datei: Android.bp

Fügen Sie eine Android.bp-Datei wie packets/modules/Wifi/tests/hostsidetests/multidevices/test/Android.bp hinzu. Definieren Sie ein python_test_host-Modul, ähnlich wie:

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",
    ],
}

Geben Sie die Snippets für den Test mit dem Datenfeld an, das mit der Binärdatei gepackt wird und von ATest oder in der kontinuierlichen Ausführung gefunden und im Test installiert werden kann.

Mobly Bundled Snippets sind in Android unter external/mobly-bundled-snippets/ verfügbar.

Optional: Erstellen Sie benutzerdefinierte Snippets

Für einige Multi-Geräte-Module sind möglicherweise benutzerdefinierte Mobly-Snippets erforderlich. Der Beispieltest enthält ein WLAN-fähiges Snippet unter packets/modules/Wifi/tests/hostsidetests/multidevices/com.google.snippet.wifi/aware/WifiAwareSnippet.java , das mit Mobly Snippet Lib erstellt wurde, verfügbar in Android unter: external /mobly-snippet-lib/ .

Das Snippet sollte mit der Regel android_test in Android.bp wie bei der Standardinstrumentierung definiert werden:

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",
    ],
}

Schritt 4: Erstellen Sie die Modulkonfiguration: AndroidTest.xml

Fügen Sie eine AndroidTest.xml-Datei wie packets/modules/Wifi/tests/hostsidetests/multidevices/test/aware/AndroidTest.xml hinzu. In dieser Testkonfiguration müssen Sie zwei Geräte für den Test angeben, ähnlich wie:

<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>

Beachten Sie Folgendes:

  • Dieser Beispieltest ist von Mobly abhängig. Für PythonVirtualenvPreparer kann eine beliebige Abhängigkeit angegeben werden, die mit pip installiert wird.
  • Der mobly-par-file-name für MoblyBinaryHostTest muss mit dem Modulnamen wie in Android.bp übereinstimmen.
  • Geben Sie für den Test ein mobly-test-timeout an. Sie wird in Millisekunden angegeben und gilt für die gesamte Python-Binärausführung (alle Testfälle zusammen). Dies ist erforderlich, um zu vermeiden, dass Testfälle bei bestimmten Problemen für immer hängen bleiben.
  • Jedes device Tag kann ein eigenes Setup auf jedem Gerät enthalten. Die Mobly-Konfiguration empfängt sie in derselben Reihenfolge, wie im XML angegeben.

Bezogen auf die Snippet-Apk-Installation:

  • Der anfängliche POC wurde aufgrund eines Gesprächs mit dem Coverage-Team aktualisiert, um Snippet-Apks über target_preparer zu installieren: Um sicherzustellen, dass Coverage-Messungen nicht zu früh gelöscht werden, bietet die Deinstallation durch Harness statt durch Testcode in Python-Binärdateien bessere Garantien hinsichtlich des Timings.

Schritt 5: Führen Sie den Test lokal aus: atest

Derzeit werden Multi-Device-Tests nur auf physischen Geräten ausgeführt. Vergewissern Sie sich vor der Durchführung des Tests, dass sich Ihre Testgeräte im ordnungsgemäßen Zustand befinden. Der Befehl adb devices sollte die Liste Ihrer angeschlossenen Geräte melden. Wenn die Liste Geräte enthält, die nicht zum Testen vorgesehen sind, geben Sie die Geräte für den Test mit dem Flag -s an.

Stellen Sie bei WLAN-Tests sicher, dass WLAN für die Geräte aktiviert ist (nach dem Zurücksetzen auf die Werkseinstellungen).

Sie können den Test lokal mit atest ausführen:

$ atest CtsWifiAwareTestCases

In der Zusammenfassungsüberschrift der Testausgabe sollte die Anzahl der verwendeten Geräte angezeigt werden, etwa Test executed with 2 device(s) .

Fehlerbehebung

Wenn der Test bei lokaler Ausführung aus folgenden Gründen fehlschlägt:

Virtualenv-Fehler

java.io.IOException: Cannot run program
"virtualenv": error=2, No such file or directory

Bitte stellen Sie sicher, dass sich virtualenv in Ihrem PATH befindet. Das Hinzufügen von „~/.local/bin“ zu PATH sollte das Problem beheben. Wenn Virtualenv nicht installiert ist, folgen Sie: https://virtualenv.pypa.io/en/latest/installation.html

Erwartet, mindestens 2 Controller-Objekte zu erhalten, habe 1

Testmodule sind entweder Multi-Device- oder Single-Device-Module, es gibt keine gemischten Module. Wenn Sie versuchen, ein Multi-Geräte-Modul ohne mehrere Geräte auszuführen, wird dieser Fehler angezeigt:

Expected to get at least 2 controller objects, got 1

Durch Ausführen des Moduls im Multi-Geräte-Modus wird das Problem behoben.

Für CTS: Sie können Sharding verwenden, um es auszulösen (Beispiel: --shard-count 2) oder run cts-multidevces .