Cette page explique comment écrire un test côté hôte qui ne nécessite pas d'appareil, par exemple un test exécuté 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 la 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 s'exécutera ainsi beaucoup plus rapidement. Pour configurer ces tests pour qu'ils s'exécutent sur un hôte de test, utilisez le lanceur de test 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 de 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. Sauf si votre test 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 la section 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 de 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 l'écriture d'un test d'hôte JAR, consultez la page Tests d'hôte JAR (Java).
Tests d'hôte Java isolés
Les tests Java sans appareil peuvent être exécutés dans un environnement d'isolation avec un léger coût en termes de performances. Toutefois, certains points importants doivent être pris en compte 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'est compatible qu'avec 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
lib
n'est incluse dans le chemin d'accès aux classes. - L'exécuteur d'isolation ne place que l'exécuteur de shim et votre fichier JAR de test dans le chemin d'accès aux classes.
- Une surcharge fixe est appliquée à chaque exécution de test effectuée avec ce lanceur.
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 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 à l'aide d'une déclaration comme celle-ci.
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 d'hôte isolés, avec quelques options spéciales.
- L'option
robolectric-resources
permet de transmettre quelques options de ligne de commande spécifiques à Robolectric au sous-programme, et ajoute la compilation d'arbre deandroid-all
au chemin d'accès de classe du sous-programme. Les deux autres sont des bonnes pratiques, mais cette option est obligatoire pour exécuter des tests Robolectric avec succès. - L'option
java-folder
permet de modifier l'environnement d'exécution Java utilisé par le sous-processus. Cela est nécessaire, car Robolectric préfère certaines versions Java qui peuvent ne pas correspondre à 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 complètement des modules spécifiques, ce qui est utile lorsqu'un fichier JAR est fourni avec des classes superflues qui pourraient entraîner des erreurs de chargement.java.
est une exclusion courante pour éviter de générer des 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 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 celle-ci.
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 pouvant ê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 un build donné, 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
.