Moduli multi-dispositivo

Questo documento fornisce istruzioni dettagliate su come creare contenuti multi-dispositivo. e richiamano le limitazioni attuali, se note.

L'esempio

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

Il codice sorgente del modulo è disponibile all'indirizzo packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/.

Abbiamo annotato l'esempio con il maggior numero di commenti che riteniamo utili.

Passaggio 1: crea la cartella del modulo

È consigliabile creare una cartella per il modulo multi-dispositivo nella suite progetto a cui appartiene. Ad esempio: cts/hostsidetests/multidevices/. Lo consigliamo in modo che tutti i moduli multi-dispositivo rimangano collocati almeno che renderà più facile trovare degli esempi.

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

Passaggio 2: crea il test

È qui che implementi la logica di test. Dipende molto da ciò che in fase di test.

Crea l'origine di test di Mobly, ad esempio: 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. Definisci un modulo python_test_host, simile a questo:

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 dei dati, che verranno pacchettizzati del file binario e può essere localizzato e installato nel test da ATest o Esecuzione continua.

Gli snippet in bundle mobile sono disponibili su 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 è stata creata 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, ad esempio 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, devi specificare due dispositivi per il test, simile 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>

Tieni presente che:

  • Questo test di esempio dipende da Mobly. È possibile specificare qualsiasi dipendenza per PythonVirtualenvPreparer e verrà installata con pip.
  • Il valore mobly-par-file-name di MoblyBinaryHostTest deve corrispondere al modulo come in Android.bp.
  • Specifica un valore mobly-test-timeout per il test. È in millisecondi e si applica all'esecuzione binaria completa di Python (tutti gli scenari di test insieme). Ciò è necessario per evitare che gli scenari di test rimangano definitivamente in sospeso in caso di alcuni problemi.
  • Ogni tag device può contenere una configurazione distinta su ciascun dispositivo, The Mobly config li riceverà nello stesso ordine specificato nel file XML.

Contenuti correlati all'APK snippet installazione:

  • Il PDC iniziale è stato aggiornato per installare gli APK degli snippet tramite target_preparer a seguito della conversazione con il team Copertura: per garantire le misurazioni della copertura non vengono eliminate troppo presto; disinstallazioni tramite Harness. piuttosto che testare il codice nei file binari Python, offrendo migliori garanzie in termini delle tempistiche.

Passaggio 5: esegui il test in locale: atest

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

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

Puoi eseguire il test in locale con un test:

$ atest CtsWifiAwareTestCases

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

Risoluzione dei problemi

Se il test non va a buon fine durante l'esecuzione locale per i seguenti motivi:

Errore Virtualenv

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

Assicurati che virtualenv si trovi nel tuo PATH. Aggiunta di "~/.local/bin" a PATH dovrebbe correggerlo. Se virtualenv non è installato, segui: https://virtualenv.pypa.io/en/latest/installation.html

Previsto almeno 2 oggetti controller, ne è presente 1

I moduli di test possono essere su più dispositivi o su un solo dispositivo, e moduli misti. Se tenti di eseguire un modulo multi-dispositivo senza dispositivi, verrà visualizzato questo errore:

Expected to get at least 2 controller objects, got 1

Il problema sarà risolto eseguendo il modulo in modalità multidispositivo.

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