Moduli multi-dispositivo

Questo documento fornisce istruzioni dettagliate su come creare moduli per più dispositivi e indica le limitazioni attuali, se note.

L'esempio

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

Il codice sorgente del modulo si trova in packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/.

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

Passaggio 1: crea la cartella del modulo

Ti consigliamo di creare una cartella per il tuo modulo multi-dispositivo nel progetto della suite a cui appartiene. Ad esempio: cts/hostsidetests/multidevices/. Ti consigliamo di farlo in modo che tutti i moduli multi-dispositivo rimangano collocati almeno inizialmente, il che faciliterà la ricerca di esempi.

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

Passaggio 2: crea il test

È qui che implementi la logica di test. Dipende molto da ciò che viene sottoposto a test.

Crea l'origine di test di Mobly, ad esempio: wifi_aware_test.py.

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

Aggiungi un file Android.bp come packages/modules/Wifi/tests/hostsidetests/multidevices/test/Android.bp. Definisci 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",
    ],
}

Specifica gli snippet per il test con il campo dati, che verrà pacchettizzato con il file binario e potrà essere individuato e installato nel test da ATest o nell'esecuzione continua.

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

(Facoltativo) Creare snippet personalizzati

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

Lo snippet deve essere definito con la regola android_test in Android.bp come la instrumentation 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, devi specificare due dispositivi per il test, in modo simile a quanto segue:

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

Tieni presente che:

  • Questo test di esempio ha una dipendenza da Mobly. Qualsiasi dipendenza può essere specificata per PythonVirtualenvPreparer e verrà installata con pip.
  • mobly-par-file-namefor MoblyBinaryHostTest deve corrispondere al nome del modulo come in Android.bp.
  • Specifica un mobly-test-timeout per il test. È espresso in millisecondi e si applica all'esecuzione completa del codice binario di Python (tutti gli scenari di test insieme). Questo è necessario per evitare che gli scenari di test rimangano inutilizzati per sempre in caso di problemi.
  • Ogni tag device può contenere una configurazione distinta su ogni dispositivo. Mobly config li riceverà nello stesso ordine specificato nel file XML.

Informazioni relative all'installazione dell'apk dello snippet:

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

Passaggio 5: esegui il test in locale: atest

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

Per i test Wi-Fi, assicurati che il Wi-Fi sia attivo sui dispositivi (dopo il ripristino dei dati di fabbrica).

Puoi eseguire il test localmente con atest:

$ atest CtsWifiAwareTestCases

Nell'output del test dovresti vedere il numero di dispositivi utilizzati nell'intestazione del riepilogo, ad esempio Test executed with 2 device(s).

Risoluzione dei problemi

Se il test non va a buon fine quando viene eseguito localmente a causa di:

Errore virtualenv

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

Assicurati che virtualenv sia presente nel tuo PATH. L'aggiunta di "~/.local/bin" a PATH dovrebbe risolvere il problema. Se virtualenv non è installato, segui le istruzioni riportate all'indirizzo https://virtualenv.pypa.io/en/latest/installation.html

Era previsto almeno 2 oggetti controller, ma ne è stato ricevuto 1

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

Expected to get at least 2 controller objects, got 1

Il problema verrà risolto eseguendo il modulo in modalità multi-dispositivo.

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