Modules multi-appareils

Ce document fournit des instructions détaillées sur la création de modules multi-appareils et indique les limites actuelles lorsqu'elles sont connues.

L'échantillon

Un module multi-appareil compatible avec le Wi-Fi CTS est fourni. Il envoie un message depuis un appareil via le Wi-Fi et vérifie que l'autre appareil le reçoit.

La source du module se trouve dans packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/.

Nous avons ajouté à l'exemple autant de commentaires que nous le jugeons utiles.

Étape 1: Créez le dossier du module

Nous vous recommandons de créer un dossier pour votre module multi-appareil dans le projet de la suite auquel il appartient. Par exemple: cts/hostsidetests/multidevices/. Nous vous recommandons de procéder ainsi afin que tous les modules multi-appareils restent colocalisés au moins au début, ce qui facilitera la découverte d'exemples.

Tous les fichiers de ce module doivent être placés dans leur propre dossier de module. Par exemple: wifi_aware.

Étape 2: Créez le test

C'est ici que vous mettez en œuvre votre logique de test. Il dépend fortement de ce qui est testé.

Créez la source de test Mobly, par exemple : wifi_aware_test.py.

Étape 3: Créez le fichier de compilation: Android.bp

Ajoutez un fichier Android.bp comme packages/modules/Wifi/tests/hostsidetests/multidevices/test/Android.bp. Définissez un module python_test_host, semblable à ceci:

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

Spécifiez les extraits pour le test avec le champ de données, qui sera empaqueté avec le binaire et qui peut être localisé et installé dans le test par ATest ou en exécution continue.

Les extraits groupés Mobly sont disponibles dans Android à l'emplacement external/mobly-bundled-snippets/.

Facultatif: Créer des extraits personnalisés

Certains modules multi-appareils peuvent nécessiter des extraits Mobly personnalisés. L'exemple de test inclut un extrait compatible avec le Wi-Fi à l'adresse packages/modules/Wifi/tests/hostsidetests/multidevices/com.google.snippet.wifi/aware/WifiAwareSnippet.java, qui est compilé avec la bibliothèque d'extraits Mobly, disponible dans Android à l'adresse external/mobly-snippet-lib/.

L'extrait de code doit être défini avec la règle android_test dans Android.bp comme pour l'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",
    ],
}

Étape 4: Créez la configuration du module: AndroidTest.xml

Ajoutez un fichier AndroidTest.xml comme packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/AndroidTest.xml. Dans cette configuration de test, vous devez spécifier deux appareils pour le test, comme suit:

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

Remarque:

  • Cet exemple de test dépend de Mobly. Vous pouvez spécifier n'importe quelle dépendance pour PythonVirtualenvPreparer. Elle sera installée avec pip.
  • Le mobly-par-file-name pour MoblyBinaryHostTest doit correspondre au nom du module comme dans Android.bp.
  • Spécifiez un mobly-test-timeout pour le test. Il est exprimé en millisecondes et s'applique à l'exécution complète du binaire Python (tous les scénarios de test ensemble). Cette étape est nécessaire pour éviter que les scénarios de test ne soient suspendus indéfiniment en cas de problèmes.
  • Chaque balise device peut contenir une configuration distincte sur chaque appareil. La configuration Mobly les recevra dans l'ordre spécifié dans le fichier XML.

En lien avec l'installation de l'APK d'extrait:

  • Le POC initial a été mis à jour pour installer les APK d'extrait via target_preparer suite à une discussion avec l'équipe de couverture: afin de s'assurer que les mesures de couverture ne sont pas supprimées trop tôt, la désinstallation par Harness plutôt que par code de test dans les binaires Python offre de meilleures garanties en termes de timing.

Étape 5: Exécuter le test localement: atest

Actuellement, les tests multi-appareils ne s'exécutent que sur des appareils physiques. Avant d'exécuter le test, vérifiez que vos appareils de test sont dans l'état approprié. La commande adb devices devrait afficher la liste de vos appareils connectés. Si la liste contient des appareils non destinés aux tests, spécifiez les appareils pour le test à l'aide de l'indicateur -s.

Pour les tests Wi-Fi, assurez-vous que le Wi-Fi est activé sur les appareils (après avoir rétabli la configuration d'usine).

Vous pouvez exécuter le test en local avec atest:

$ atest CtsWifiAwareTestCases

Le nombre d'appareils utilisés doit s'afficher dans l'en-tête récapitulatif de la sortie de test, par exemple Test executed with 2 device(s).

Dépannage

Si le test échoue lors de l'exécution en local pour les raisons suivantes:

Erreur d'environnement virtuel

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

Veuillez vous assurer que virtualenv figure dans votre PATH. Ajouter "~/.local/bin" à PATH devrait résoudre le problème. Si virtualenv n'est pas installé, suivez la page https://virtualenv.pypa.io/en/latest/installation.html.

Au moins deux objets de contrôleur attendus, mais un seul obtenu

Les modules de test sont multi-appareils ou mono-appareils. Il n'existe pas de modules mixtes. Si vous essayez d'exécuter un module multi-appareils sans plusieurs appareils, le message d'erreur suivant s'affiche:

Expected to get at least 2 controller objects, got 1

Exécuter le module en mode multi-appareils permet de résoudre le problème.

Pour CTS : vous pouvez utiliser le fractionnement pour le déclencher (par exemple, --shard-count 2) ou run cts-multidevces.