Initialiser votre client de dépôt
Suivez les instructions de la section Télécharger la source pour obtenir
et compiler le code source Android. Lorsque vous exécutez la commande repo init, spécifiez une
branche CTS spécifique à l'aide de -b. Cela permet de s'assurer que vos modifications CTS sont incluses
dans les versions CTS ultérieures.
L'exemple de code suivant montre comment utiliser repo init.
mkdir android11-tests-dev && cd android11-tests-dev && repo init -c -u https://android.googlesource.com/platform/manifest -b android11-tests-dev --use-superproject --partial-clone --partial-clone-exclude=platform/frameworks/base --clone-filter=blob:limit=10M && repo sync -c -j8
Compiler et exécuter CTS
Exécutez les commandes suivantes pour compiler CTS et démarrer la console CTS interactive :
Compiler CTS (AOSP 14 ou version antérieure)
cd /path/to/android/rootsource build/envsetup.shmake cts -j32 TARGET_PRODUCT=aosp_arm64cts-tradefed
Compiler CTS (AOSP 15)
cd /path/to/android/rootsource build/envsetup.shmake cts -j32 TARGET_PRODUCT=aosp_arm64 TARGET_RELEASE=target-release cts-tradefed
Veuillez vous reporter au tableau suivant pour sélectionner la valeur target-release :
| Branche | Version cible |
|---|---|
| android15-tests-dev | ap3a |
Exécuter CTS
Dans la console CTS, saisissez :
tf> run cts --plan CTS
Écrire des tests CTS
Les tests CTS utilisent JUnit et les API de test Android. Consultez le
tutoriel
Tester votre application
et les tests existants dans le répertoire cts/tests.
Les tests CTS suivent principalement les mêmes conventions que celles utilisées dans les autres tests Android.
CTS s'exécute sur de nombreux appareils de production. Les tests doivent donc respecter les règles suivantes :
- Tenez compte des différentes tailles d'écran, orientations et mises en page du clavier.
- N'utilisez que des méthodes d'API publiques. En d'autres termes, évitez toutes les classes, méthodes et tous les champs
avec l'annotation
hide. - Évitez d'utiliser des mises en page de vue ou de vous fier aux dimensions des éléments qui peuvent ne pas être présents sur certains appareils.
- Ne vous fiez pas aux droits racine.
Ajouter une annotation Java
Si votre test vérifie un comportement d'API, annotez votre code de test avec @ApiTest et listez
toutes les API impliquées dans le apis champ. Utilisez le format approprié parmi les
exemples suivants :
| Type d'API | Format d'annotation | Remarques |
|---|---|---|
| Méthode | android.example.ClassA#methodA |
Cas d'utilisation le plus courant. |
| Méthode avec des valeurs clés | android.example.ClassB#methodB(KeyA) |
À utiliser uniquement lorsque votre test utilise une méthode d'API pour valider un champ, comme en cet exemple. |
| Champ | android.example.ClassC#FieldA |
À utiliser uniquement lorsque votre test valide directement un champ d'API, comme dans cet exemple. |
Si votre test vérifie une exigence CDD, annotez l'ID d'exigence (y compris l'ID de section CDD et l'ID d'exigence) avec @CddTest dans le code de test CTS, comme illustré dans l'exemple suivant. Dans votre message de commit, indiquez quelle exigence CDD est testée par votre
test en vous référant aux ID d'exigence CDD. Les ID d'exigence CDD sont une combinaison d'ID de section
et d'ID d'exigence, reliés par une barre oblique (/), comme dans 7.3.1/C-1-1.
/**
* Verify Passpoint configuration management APIs for a Passpoint
* @throws Exception
*/
@CddTest(requirement="7.4.2.3/C-1-1,C-2-1")
public void testAddPasspointConfigWithUserCredential() throws Exception {
if (!WifiFeature.isWifiSupported(getContext())) {
// skip the test if WiFi is not supported
return;
} testAddPasspointConfig(generatePasspointConfig(generateUserCredential()));
}
Pour CTS Verifier, annotez chaque activité dans votre AndroidManifest.xml avec l'ID CDD approprié. Les formats des champs de valeur sont semblables à ceux des annotations Java dans
CTS. Dans le message de commit, indiquez quelle exigence CDD
est appliquée en vous référant à l'ID d'exigence CDD.
<activity>
......
<!-- OPTIONAL: Add a meta data attribute to indicate CDD requirements. -->
<meta-data android:name="cdd_test" android:value="7.4.1/C-4-1" />
<!-- OPTIONAL: Add a meta data attribute to indicate APIs being tested. -->
<meta-data android:name="api_test"
android:value="com.example.MyClass#myMethod" />
<!-- OPTIONAL: Add a metadata attribute to indicate the reason why the test doesn't enforce any CDD requirement but still useful in CTS-V. -->
<meta-data android:name="non_compliance_test"
android:value="detailed reasons" />
</activity>
Dans le message de commit
Indiquez clairement pourquoi votre test doit être ajouté et ajoutez des liens d'assistance pertinents. Pour les tests CTS-D, incluez un lien vers la proposition de test que vous avez créée dans Google Issue Tracker dans le cadre de la procédure d'envoi de CTS-D.
Créer un sous-plan
Par exemple, vous pouvez ajouter un fichier SubPlan.xml dans android-cts/subplans comme suit :
<?xml version="1.0" encoding="utf-8" standalone="no"?> <SubPlan version="2.0"> <Entry include="CtsSystemIntentTestCases" /> <Entry include="CtsSystemUiHostTestCases" /> <Entry include="CtsSecurityHostTestCases android.security.cts.SELinuxHostTest#testAospFileContexts" /> <Entry include="CtsSecurityHostTestCases android.security.cts.SELinuxHostTest#testAospServiceContexts" /> </SubPlan>
Pour exécuter le sous-plan :
run cts --subplan aSubPlan
Le format d'entrée du sous-plan est le suivant :
Include a module name as follows: <Entry include="MODULE_NAME" /> Include a package: <Entry include="MODULE_NAME PACKAGE_NAME" /> Include a class: <Entry include="MODULE_NAME PACKAGE_NAME.CLASS_NAME" /> Include an individual test: <Entry include="MODULE_NAME PACKAGE_NAME.CLASS_NAME#TEST_NAME" />
Nom et emplacement du test
La plupart des cas de test CTS ciblent une classe spécifique dans l'API Android. Ces tests ont des noms de package Java avec un suffixe cts et des noms de classe avec un suffixe Test. Chaque cas de test se compose de plusieurs tests, chacun exerçant généralement une méthode spécifique de la classe testée.
Ces tests sont organisés dans une structure de répertoire où ils sont regroupés en différentes catégories, telles que "widgets" ou "vues".
Par exemple, le test CTS pour le package Java
android.widget.TextView est
android.widget.cts.TextViewTest avec le nom de package Java
android.widget.cts et le nom de classe
TextViewTest.
- Nom du package Java
Le nom du package Java pour les tests CTS est le nom du package de la classe testée, suivi de.cts. Dans notre exemple, le nom du package seraitandroid.widget.cts. - Nom de la classe
Le nom de la classe pour les tests CTS est le nom de la classe testée auquel est ajouté "Test". Par exemple, si un test cibleTextView, le nom de la classe doit êtreTextViewTest. - Nom du module (CTS v2 uniquement)
CTS v2 organise les tests par module. Le nom du module est généralement la deuxième chaîne du nom du package Java (dans notre exemple,widget).
La structure du répertoire et l'exemple de code dépendent de l'utilisation de CTS v1 ou de CTS v2.
CTS v1
Pour Android 6.0 ou une version antérieure, utilisez CTS v1. Pour CTS v1, l'exemple de code se trouve dans cts/tests/tests/example.
La structure du répertoire dans les tests CTS v1 se présente comme suit :
cts/
tests/
tests/
package-name/
Android.mk
AndroidManifest.xml
src/
android/
package-name/
SampleDeviceActivity.java
cts/
SampleDeviceTest.java
CTS v2
Pour Android 7.0 ou une version ultérieure, utilisez CTS v2. Pour en savoir plus, consultez l'exemple de test dans le projet Android Open Source (AOSP).
La structure du répertoire CTS v2 se présente comme suit :
cts/
tests/
module-name/
Android.mk
AndroidManifest.xml
src/
android/
package-name/
SampleDeviceActivity.java
cts/
SampleDeviceTest.java
Nouveaux exemples de packages
Lorsque vous ajoutez de nouveaux tests, il est possible qu'aucun répertoire existant ne soit disponible pour les placer. Dans ce cas, vous devez créer le répertoire et copier les exemples de fichiers appropriés.
CTS v1
Si vous utilisez CTS v1, reportez-vous à l'exemple sous cts/tests/tests/example et créez un répertoire. Assurez-vous également
d'ajouter le nom du module de votre nouveau package à partir de son Android.mk
à CTS_COVERAGE_TEST_CASE_LIST dans
cts/CtsTestCaseList.mk. build/core/tasks/cts.mk utilise ce fichier makefile
pour combiner tous les tests et créer le package CTS final.
CTS v2
Utilisez l'exemple de test
/cts/tests/sample/
pour démarrer rapidement votre nouveau module de test en procédant comme suit :
- Pour créer le répertoire de test et copier des exemples de fichiers, exécutez la commande suivante :
mkdir cts/tests/module-name && cp -r cts/tests/sample/* cts/tests/module-name
- Accédez à
cts/tests/module-nameet remplacez toutes les instances de "[Ss]ample" par la convention d'attribution de noms recommandée ci-dessus. - Mettez à jour
SampleDeviceActivitypour exercer la fonctionnalité que vous testez. - Mettez à jour
SampleDeviceTestpour vous assurer que l'activité réussit ou enregistre ses erreurs.
Répertoires supplémentaires
Vous pouvez également ajouter d'autres répertoires Android tels que assets, jni, libs et res.
Pour ajouter du code JNI, créez un répertoire à la racine du projet à côté de src avec le code natif et un fichier makefile Android.mk.
Le fichier makefile contient généralement les paramètres suivants :
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libCtsSample_jni # don't include this package in any target LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := list of source code files LOCAL_C_INCLUDES := $(JNI_H_INCLUDE) # Tag this module as a cts test artifact LOCAL_COMPATIBILITY_SUITE := cts LOCAL_SHARED_LIBRARIES := libnativehelper LOCAL_SDK_VERSION := current include $(BUILD_SHARED_LIBRARY)
Fichier Android.mk
Enfin, modifiez le fichier Android.mk à la racine du
projet pour compiler le code natif et en dépendre, comme indiqué ci-dessous :
# All tests should include android.test.runner. LOCAL_JAVA_LIBRARIES := android.test.runner # Includes the jni code as a shared library LOCAL_JNI_SHARED_LIBRARIES := libCtsSample_jni # Include for InstrumentationCtsTestRunner LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner... LOCAL_SDK_VERSION := currentinclude $(BUILD_CTS_PACKAGE) #Tells make to look in subdirectories for more make files to include include $(call all-makefiles-under,$(LOCAL_PATH))
Corriger ou supprimer des tests
En plus d'ajouter de nouveaux tests, vous pouvez corriger ou supprimer des tests annotés avec BrokenTest ou KnownFailure.
Appliquer vos modifications
Suivez le workflow Envoyer des modifications de code lorsque vous contribuez à CTS.
- Choisissez la branche de développement en fonction des niveaux d'API auxquels le correctif s'applique.
- Développez ou sélectionnez les modifications dans la branche de test appropriée avec DO NOT MERGE (NE PAS FUSIONNER) ou RESTRICT AUTOMERGE (RESTREINDRE LA FUSION AUTOMATIQUE) dans le message de commit.
Un examinateur est chargé d'examiner votre modification et de la sélectionner dans le Gerrit interne en conséquence.
Calendrier des lancements et informations sur les branches
Les versions CTS suivent ce calendrier.
| Version | Niveau d'API | Branche de développement | Fréquence de publication |
|---|---|---|---|
| 16+ | 36+ | Gerrit interne | Trimestrielle |
| 15 | 35 | android15-tests-dev | Trimestrielle |
| 14 | 34 | android14-tests-dev | Trimestrielle |
Dates importantes lors de la publication
- Fin de la première semaine : gel du code. Les modifications fusionnées dans la branche jusqu'au gel du code sont prises en compte pour la prochaine version de CTS. Les envois à la branche après le gel du code ou après le choix d'un candidat à la publication sont pris en compte pour la version suivante.
- Deuxième ou troisième semaine : CTS est publié sur la page Téléchargements de la suite de tests de compatibilité.
Flux de fusion automatique
Les branches de développement CTS ont été configurées de sorte que les modifications envoyées à chaque branche soient automatiquement fusionnées dans les branches supérieures.
Pour les modifications apportées directement à une branche de développement de test AOSP, le chemin de fusion automatique est le suivant :
android13-tests-dev >
android14-tests-dev >
android15-tests-dev
- Pour les versions CTS 16+, un examinateur sélectionnera la modification dans le Gerrit interne Gerrit en conséquence.
Si une liste de modifications (CL) ne parvient pas à fusionner correctement, l'auteur du correctif reçoit un e-mail contenant des instructions sur la résolution du conflit. Dans la plupart des cas, l'auteur du correctif peut utiliser les instructions pour ignorer la fusion automatique de la CL en conflit.
Si une ancienne branche nécessite la modification, le correctif doit être sélectionné à partir de la branche la plus récente.
Pour les modifications de test applicables à la prochaine version d'Android, une fois que vous avez importé une modification proposée, Google l'examine et, si elle est acceptée, la sélectionne dans le Gerrit interne.