Moduli multidispositivo

Questo documento fornisce istruzioni dettagliate su come creare moduli multi-dispositivo e richiama le limitazioni attuali quando note.

Il campione

Viene fornito un modulo multi-dispositivo CTS compatibile con Wi-Fi. Invia un messaggio da un dispositivo tramite Wi-Fi e verifica che l'altro dispositivo lo riceva.

La fonte del modulo è in packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/ .

Abbiamo commentato l'esempio con tutti i commenti che riteniamo utili.

Passaggio 1: crea la cartella del modulo

Si consiglia di creare una cartella per il proprio modulo multidispositivo nel progetto della suite a cui appartiene. Ad esempio: cts/hostsidetests/multidevices/ . Lo consigliamo in modo che tutti i moduli multi-dispositivo rimangano collocati almeno all'inizio, il che renderà più facile scoprire esempi.

Tutti i file per questo modulo devono essere inseriti nella propria cartella del modulo. Ad esempio: wifi_aware .

Passaggio 2: crea il test

Qui è dove implementi la logica del test. Dipende fortemente da ciò che viene testato.

Crea la sorgente del test Mobly, come: wifi_aware_test.py .

Passaggio 3: crea il file di build: Android.bp

Aggiungi un file Android.bp come packages/modules/Wifi/tests/hostsidetests/multidevices/test/Android.bp . Definire un modulo python_test_host, simile a:

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

Specificare i frammenti per il test con il campo dati, che verrà compresso con il file binario e potrà essere individuato e installato nel test da ATest o in esecuzione continua.

Gli snippet in bundle Mobly sono disponibili in Android all'indirizzo external/mobly-bundled-snippets/ .

Facoltativo: crea snippet personalizzati

Alcuni moduli multi-dispositivo potrebbero richiedere snippet Mobly personalizzati. Il test di esempio include uno snippet compatibile con Wi-Fi in packages/modules/Wifi/tests/hostsidetests/multidevices/com.google.snippet.wifi/aware/WifiAwareSnippet.java , creato con Mobly Snippet Lib, disponibile in Android all'indirizzo: external /mobly-snippet-lib/ .

Lo snippet deve essere definito con la regola android_test in Android.bp come la strumentazione standard:

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

Passaggio 4: crea la configurazione del modulo: AndroidTest.xml

Aggiungi un file AndroidTest.xml come packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/AndroidTest.xml . In questa configurazione di test, è necessario specificare due dispositivi per il test, simili a:

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

Notare che:

  • Questo test di esempio dipende da Mobly. Qualsiasi dipendenza può essere specificata per PythonVirtualenvPreparer e verrà installata con pip.
  • Il mobly-par-file-name per MoblyBinaryHostTest deve corrispondere al nome del modulo come in Android.bp.
  • Specificare un mobly-test-timeout per il test. È espresso in millisecondi e si applica all'esecuzione completa del binario Python (tutti i casi di test insieme). Ciò è necessario per evitare che i casi di test restino sospesi per sempre in caso di alcuni problemi.
  • Ciascun tag device può contenere una configurazione distinta su ciascun dispositivo. La configurazione Mobly li riceverà nello stesso ordine specificato nell'XML.

Relativo all'installazione dell'apk dello snippet:

  • Il POC iniziale è stato aggiornato per installare gli apk degli snippet tramite target_preparer a causa della conversazione con il team di Coverage: per garantire che le misurazioni della copertura non vengano eliminate troppo presto, la disinstallazione tramite Harness anziché tramite codice di test nei binari Python offre migliori garanzie in termini di tempistica.

Passaggio 5: eseguire il test localmente: atest

Attualmente, i test multi-dispositivo vengono eseguiti solo su dispositivi fisici. Prima di eseguire il test, verificare che i dispositivi di test siano nello stato corretto. Il comando adb devices dovrebbe riportare l'elenco dei tuoi dispositivi collegati. Se l'elenco contiene dispositivi non destinati al test, specificare i dispositivi per il test utilizzando il flag -s.

Per i test Wi-Fi, assicurati che il Wi-Fi sia abilitato per i dispositivi (dopo il ripristino delle impostazioni di fabbrica).

Puoi eseguire il test localmente con atest:

$ atest CtsWifiAwareTestCases

Dovresti vedere il numero di dispositivi utilizzati nell'intestazione di riepilogo nell'output di atest, qualcosa come Test executed with 2 device(s) .

Risoluzione dei problemi

Se il test fallisce durante l'esecuzione locale a causa di:

Errore ambiente virtuale

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

Assicurati che virtualenv sia nel tuo PERCORSO. L'aggiunta di "~/.local/bin" a PATH dovrebbe risolvere il problema. se virtualenv non è installato segui: https://virtualenv.pypa.io/en/latest/installation.html

Si prevedeva di ottenere almeno 2 oggetti controller, ne ho ottenuti 1

I moduli di test sono multi-dispositivo o dispositivo singolo, non sono presenti moduli misti. Se provi a eseguire un modulo multi-dispositivo senza più dispositivi vedrai questo errore:

Expected to get at least 2 controller objects, got 1

L'esecuzione del modulo in modalità multi-dispositivo risolverà il problema.

Per CTS: puoi utilizzare lo sharding per attivarlo (ad esempio: --shard-count 2) o run cts-multidevces .