Modules multi-appareils

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

L'exemple

Un module CTS multi-appareil compatible Wi-Fi est fourni. Il envoie un message à partir d'un appareil sur 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 la suite. projet auquel il appartient. Par exemple: cts/hostsidetests/multidevices/. Nous vous recommandons de le faire pour que tous les modules multi-appareils restent au moins au moins ce qui facilitera la découverte d'exemples.

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

Étape 2: Créez le test

C'est ici que vous mettez en œuvre votre logique de test. Cela dépend fortement de ce qui en cours de 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 à l'aide du champ de données, qui sera empaqueté avec le binaire et peuvent être localisés et installés dans le test par ATest ou dans Exécution continue.

Les extraits groupés pour mobile sont disponibles sur Android à l'adresse external/mobly-bundled-snippets/.

Facultatif: Créer des extraits personnalisés

Certains modules multi-appareils peuvent nécessiter des extraits de code Mobly personnalisés. Exemple de test inclut un extrait de détection du Wi-Fi packages/modules/Wifi/tests/hostsidetests/multidevices/com.google.snippet.wifi/aware/WifiAwareSnippet.java, Il est basé sur la bibliothèque d'extraits de code Mobly, disponible sur Android à l'adresse suivante: external/mobly-snippet-lib/.

L'extrait doit être défini avec une règle android_test dans Android.bp, comme suit : 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, semblable à:

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

Notez que:

  • Cet exemple de test dépend de Mobly. N'importe quelle dépendance peut être spécifiée pour PythonVirtualenvPreparer et sera installé avec pip.
  • Le mobly-par-file-name pour MoblyBinaryHostTest doit correspondre au module comme dans Android.bp.
  • Spécifiez un mobly-test-timeout pour le test. en quelques millisecondes. s'applique à l'exécution complète du binaire Python (tous les scénarios de test réunis). 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, The Mobly les reçoivent dans l'ordre spécifié dans le fichier XML.

Lié à l'extrait de fichier APK installation:

  • Le contact initial a été mis à jour pour installer des APK d'extrait via target_preparer en raison d'une conversation avec l'équipe de couverture: afin de vous assurer mesures de couverture ne sont pas supprimées trop tôt, désinstallation par Harness plutôt que par code test dans les binaires Python offrent de meilleures garanties en termes de temps.

Étape 5 : Exécutez le test localement (au moins)

Actuellement, les tests multi-appareils ne s'exécutent que sur les appareils physiques. Avant d'exécuter la vérifiez que vos appareils de test sont en bon état. La commande adb devices devrait afficher la liste de vos appareils connectés. Si la liste contient appareils non destinés au test, spécifiez les appareils concernés à l'aide du caractère -s .

Pour tester la connexion 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 au moins:

$ atest CtsWifiAwareTestCases

Le nombre d'appareils utilisés doit s'afficher dans l'en-tête récapitulatif en au moins de sortie, semblable à 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 se trouve dans votre PATH. Ajouter "~/.local/bin" dans PATH doit y remédier. si virtualenv n'est pas installé: https://virtualenv.pypa.io/en/latest/installation.html

Au moins 2 objets contrôleurs étaient attendus, 1 obtenu

Les modules de test peuvent être utilisés sur plusieurs appareils ou sur un seul appareil. modules mixtes. Si vous tentez d'exécuter un module multi-appareil sans plusieurs appareils appareils, vous obtenez le message d'erreur suivant:

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 la segmentation pour la déclencher (par exemple: --shard-count 2). ou run cts-multidevces.