Écrire un test sans appareil côté hôte dans TF

Cette page vous explique comment écrire un test côté hôte qui ne nécessite pas tel qu'un test exécuté sur une instance GCE Linux. (Pour en savoir plus sur pour écrire un test piloté par l'hôte nécessitant un appareil, reportez-vous à la section Écrivez un test piloté par l'hôte dans une fédération commerciale.)

Types de tests côté hôte

Vous pouvez exécuter plusieurs types de tests côté hôte via la fédération commerciale (TF).

Tests natifs (gtest)

Créer des tests natifs (gtests) pour tester une plate-forme. Si le test ne nécessite pas d'appareil, exécutez-le sur un host; le test s'exécutera beaucoup plus rapidement de cette façon. Pour configurer l'exécution de ces tests un hôte de test, utilisez l'exécuteur TF Runner HostGTest.

Voici un exemple de configuration de test TradeFed:

<configuration description="Runs hello_world_test.">
    <option name="null-device" value="true" />
    <test class="com.android.tradefed.testtype.HostGTest" >
        <option name="module-name" value="hello_world_test" />
    </test>
</configuration>

La configuration de test exécute un test gtest (hello_world_test) sur un hôte. Exemple de test peut être générée automatiquement. À moins que votre test ne nécessite une configuration ou un nettoyage spécial, vous pouvez compter sur la génération automatique du fichier de configuration test pour créer un test TF approprié de configuration.

Pour configurer un gtest côté hôte et activer la génération automatique de configuration de test et de configuration, définissez host_supported à true po Android.bp, comme dans hello_world_test.

Pour en savoir plus sur l'écriture d'un test natif, consultez Ajouter un test natif Exemple :

Tests de l'hôte JAR

Tests d'hôte JAR (Java), tels que JUnit, des tests qui n'ont pas besoin de s'exécuter sur un appareil et qui fournissent du code de votre projet Java. Vous pouvez configurer ce type de test pour qu'il s'exécute à l'aide de l'exécuteur HostTest.

Exemple de configuration de test TradeFed

<configuration description="Executes HelloWorldHostTest">
    <test class="com.android.tradefed.testtype.HostTest" >
        <option name="jar" value="HelloWorldHostTest.jar" />
    </test>
</configuration>

La configuration de test exécute un test JUnit côté hôte de HelloWorldHostTest. Notez que la configuration de test ci-dessus peuvent être générées automatiquement. À moins que votre test ne nécessite une configuration ou un nettoyage spécifique, comptez sur la génération automatique de la configuration de test pour créer un test TradeFed approprié configuration.

Pour en savoir plus sur l'écriture d'un test d'hôte JAR, reportez-vous au Page Tests de l'hôte JAR (Java).

Tests d'hôtes Java isolés

Les tests Java sans appareil peuvent être exécutés dans un environnement isolé qui entraîne une légère baisse des performances. Toutefois, vous devez tenir compte de certains points importants avant de choisir d'utiliser environnement.

  • Il s'agit de l'exécuteur par défaut utilisé pour les tests unitaires Robolectric et JUnit.
  • Tradefed n'accepte que les tests JUnit dans l'environnement d'isolation.
  • Seules les dépendances liées statiquement sont acceptées. Aucune dépendance déclarée avec lib sont inclus dans le chemin de classe.
  • L'exécuteur d'isolation place uniquement l'exécuteur shim et votre fichier JAR de test sur le chemin de classe.
  • Il existe une certaine surcharge fixe par exécution de test exécutée avec cet exécuteur.

Exemple de configuration de test Tradefed (isolé)

<configuration description="Executes HelloWorldHostTest">
    <test class="com.android.tradefed.testtype.IsolatedHostTest" >
        <option name="jar" value="HelloWorldHostTest.jar" />
    </test>
</configuration>

Exemple de configuration Soong pour l'autogénération

Au lieu de créer manuellement la configuration de test comme ci-dessus, Soong peut la générer automatiquement en utilisant une déclaration comme dans cet exemple.

java_test_host {
    name: "HelloWorldHostTest",

    test_options: {
        unit_test: true,
    },

    test_suites: ["general-tests"],

    srcs: ["test/**/*.java"],

    static_libs: [
        "junit",
    ],
}

Tests roboolectric

Les tests Robolectric utilisent le même exécuteur que les tests d'hôte isolé, avec quelques options.

  • L'option robolectric-resources active quelques options de ligne de commande spécifiques à Robolectric. à transmettre dans le sous-processus et ajoute la compilation d'arborescence de android-all au "classpath" du sous-processus. Même si les deux autres sont des bonnes pratiques, cette option est obligatoire pour des tests de Robolectric.
  • L'option java-folder permet de modifier l'environnement d'exécution Java utilisé par le sous-processus. C'est nécessaire, car Robolectric préfère des versions de Java spécifiques qui pourraient ne pas correspondre au la JVM préférée du système hôte.
  • L'option exclude-paths permet à l'exécuteur de sous-processus d'éviter de charger des modules spécifiques ce qui est utile lorsqu'un fichier JAR contient des classes superflues susceptibles de provoquer des erreurs de chargement. java. est une exclusion courante pour éviter de générer des exceptions SecurityException.

Exemple de configuration Robolectric

<configuration description="Executes a Sample Robolectric Test">
    <option name="java-folder" value="prebuilts/jdk/jdk9/linux-x86/" />
    <option name="exclude-paths" value="java" />
    <option name="use-robolectric-resources" value="true" />
    <test class="com.android.tradefed.testtype.IsolatedHostTest">
        <option name="jar" value="RobolectricExampleTest.jar" />
    </test>
</configuration>

Exemple de configuration Soong pour l'autogénération Robolectric

Au lieu de créer manuellement la configuration de test comme ci-dessus, Soong peut générer automatiquement la configuration à l'aide d'une déclaration comme dans cet exemple.

android_robolectric_test {
    name: "HelloWorldRoboTest",
    srcs: [
        "src/**/*.java",
    ],

    // Include the testing libraries
    static_libs: [
        "mockito-robolectric-prebuilt",
        "platform-test-annotations",
        "testng",
        "truth-prebuilt",
    ],

    instrumentation_for: "HelloWorldApp",
}

Test Python

Si la logique de test est écrite en Python, utilisez le type de compilation python_test_host pour créer un fichier par exécuté par TF PythonBinaryHostTest.

Exemple de configuration de test TradeFed

<configuration description="Config to run atest unittests">
    <test class="com.android.tradefed.testtype.python.PythonBinaryHostTest" >
        <option name="par-file-name" value="atest_unittests" />
        <option name="test-timeout" value="2m" />
    </test>
</configuration>

Paramètre de la suite de tests

Pour que le test côté hôte soit accessible par TF pour un build donné, définissez le paramètre du module de test `test_suites` sur `general-tests`:

test_suites: ["general-tests"],

Avec ce paramètre, le test est empaqueté dans general-tests.zip sur la cible test_suites.