Cette page explique comment écrire un test côté hôte qui ne nécessite pas d'appareil, comme un test qui s'exécute sur une instance Linux GCE. (Pour en savoir plus sur l'écriture d'un test piloté par l'hôte qui nécessite un appareil, consultez Écrire un test piloté par l'hôte dans Trade Federation.)
Types de tests côté hôte
Vous pouvez exécuter plusieurs types de tests côté hôte via Trade Federation (TF).
Tests natifs (gtest)
Créez des tests natifs (gtests) pour tester une plate-forme. Si le test ne nécessite pas d'appareil, exécutez-le sur un hôte. Il sera beaucoup plus rapide. Pour configurer ces tests afin qu'ils s'exécutent sur un hôte de test, utilisez le lanceur TF 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 du test exécute un test gtest (hello_world_test) sur un hôte. L'exemple de configuration de test peut être généré automatiquement. À moins que votre test ne nécessite une configuration ou un nettoyage spéciaux, vous pouvez vous appuyer sur la génération automatique de configurations de test pour créer des configurations de test TF appropriées.
Pour configurer un gtest côté hôte et activer la génération automatique de la configuration de test, définissez host_supported sur true dans Android.bp, comme dans hello_world_test.
Pour en savoir plus sur l'écriture d'un test natif, consultez Ajouter un exemple de test natif.
Tests d'hôte JAR
Les tests hôtes JAR (Java), tels que JUnit, sont des tests qui n'ont pas besoin d'être exécutés sur un appareil et qui fournissent une couverture du code de votre projet Java. Ces tests peuvent être configurés pour s'exécuter sur un hôte de test à 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 du test exécute un test JUnit côté hôte de HelloWorldHostTest. Notez que la configuration de test ci-dessus peut être générée automatiquement. À moins que votre test ne nécessite une configuration ou un nettoyage spéciaux, utilisez la génération automatique de la configuration de test pour créer une configuration de test TradeFed appropriée.
Pour en savoir plus sur la façon d'écrire un test hôte JAR, consultez la page Tests hôtes JAR (Java).
Tests hôtes Java isolés
Les tests Java sans appareil peuvent être exécutés dans un environnement isolé, ce qui a un léger impact sur les performances. Toutefois, vous devez prendre en compte certains points importants avant de choisir d'utiliser cet 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 de manière statique sont acceptées. Aucune dépendance déclarée avec
libn'est incluse dans le classpath. - L'exécuteur d'isolation ne place que l'exécuteur shim et votre fichier JAR de test sur le chemin de classe.
- Il existe une certaine quantité de frais généraux fixes par exécution de test avec cet exécuteur.
Exemple de configuration de test Tradefed (isolée)
<configuration description="Executes HelloWorldHostTest"> <test class="com.android.tradefed.testtype.IsolatedHostTest" > <option name="jar" value="HelloWorldHostTest.jar" /> </test> </configuration>
Exemple de configuration Soong pour la génération automatique
Au lieu de créer manuellement la configuration de test comme ci-dessus, Soong peut générer automatiquement la configuration 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 Robolectric
Les tests Robolectric utilisent le même exécuteur que les tests hôtes isolés, avec quelques options spéciales.
- L'option
robolectric-resourcespermet de transmettre quelques options de ligne de commande spécifiques à Robolectric au sous-processus et ajoute également la compilation de l'arborescence deandroid-allau classpath du sous-processus. Alors que les deux autres sont des bonnes pratiques, cette option est obligatoire pour exécuter des tests Robolectric avec succès. - L'option
java-folderpermet de modifier l'environnement d'exécution Java utilisé par le sous-processus. Cela est nécessaire, car Robolectric préfère certaines versions de Java qui ne correspondent pas forcément à la JVM préférée du système hôte. - L'option
exclude-pathspermet à l'exécuteur de sous-processus d'éviter de charger certains modules, ce qui est utile lorsqu'un fichier JAR est fourni avec des classes superflues susceptibles de provoquer des erreurs de chargement.java.est une exclusion courante pour éviter les exceptionsSecurityException.
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 la génération automatique de Robolectric
Au lieu de créer manuellement la configuration de test comme ci-dessus, Soong peut générer automatiquement la configuration en utilisant 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 qui peut être 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 une compilation donnée, définissez le paramètre `test_suites` du module de test sur `general-tests` :
test_suites: ["general-tests"],
Avec ce paramètre, le test est empaqueté dans general-tests.zip sur la cible test_suites.