Développement de CTS

Initialiser votre client Repo

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 garantit 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 le CTS

Exécutez les commandes suivantes pour créer le CTS et démarrer la console CTS interactive :

Compiler le CTS (AOSP 14 ou version antérieure)

cd /path/to/android/root
source build/envsetup.sh
make cts -j32 TARGET_PRODUCT=aosp_arm64
cts-tradefed

Compiler CTS (AOSP 15)

cd /path/to/android/root
source build/envsetup.sh
make 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 :

Branch 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 généralement les mêmes conventions que les autres tests Android.

Le 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 et orientations d'écran, ainsi que des différentes dispositions de clavier.
  • N'utilisez que des méthodes d'API publiques. En d'autres termes, évitez toutes les classes, méthodes et champs avec l'annotation hide.
  • Évitez d'utiliser des mises en page ou de vous appuyer sur les dimensions d'éléments qui peuvent ne pas être présents sur certains appareils.
  • Ne comptez pas sur les droits racine.

Ajouter une annotation Java

Si votre test vérifie le comportement d'une API, annotez votre code de test avec @ApiTest et listez toutes les API impliquées dans le champ apis. Utilisez le format approprié parmi les exemples suivants :

Type d'API Format des annotations Notes
Méthode android.example.ClassA#methodA Cas d'utilisation le plus courant.
Méthode avec clé-valeurs android.example.ClassB#methodB(KeyA) À utiliser uniquement lorsque votre test utilise une méthode d'API pour valider un champ, comme dans 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 du CDD, annotez l'ID de l'exigence (y compris l'ID de la section et l'ID de l'exigence du CDD) avec @CddTest dans le code de test CTS, comme indiqué dans l'exemple suivant. Dans votre message de commit, indiquez l'exigence CDD testée par votre test en faisant référence aux ID des exigences CDD. Les ID d'exigence du CDD sont une combinaison de l'ID de section et de l'ID d'exigence, séparé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é de votre AndroidManifest.xml avec l'ID CDD correspondant. Les formats des champs de valeur sont semblables à ceux des annotations Java dans le CTS. Dans le message de commit, indiquez quelle exigence du CDD est appliquée en faisant référence à l'ID de l'exigence du 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 du processus d'envoi CTS-D.

Créer un sous-forfait

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 de l'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 scénarios de test CTS ciblent une classe spécifique de 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 scénario de test se compose de plusieurs tests, chacun d'eux 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épertoires où ils sont regroupés dans différentes catégories telles que "widgets" ou "views".

Par exemple, le test CTS pour le package Java android.widget.TextView est android.widget.cts.TextViewTest, avec son nom de package Java android.widget.cts et son 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 que le test teste, suivi de .cts. Dans notre exemple, le nom du package serait android.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 cible TextView, le nom de la classe doit être TextViewTest.
  • 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 la version du CTS que vous utilisez (v1 ou v2).

CTS v1

Pour Android 6.0 ou version antérieure, utilisez CTS v1. Pour le CTS v1, l'exemple de code se trouve dans cts/tests/tests/example.

La structure de répertoire des 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 version ultérieure, utilisez CTS v2. Pour en savoir plus, consultez l'exemple de test dans le projet Android Open Source (AOSP).

La structure de répertoire du 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 packages d'échantillons

Lorsque vous ajoutez des tests, il est possible qu'il n'existe pas de répertoire dans lequel 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 fichier Android.mk dans CTS_COVERAGE_TEST_CASE_LIST dans cts/CtsTestCaseList.mk. build/core/tasks/cts.mk utilise ce fichier make 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 :

  1. Pour créer le répertoire de test et copier les exemples de fichiers, exécutez la commande suivante :
    mkdir cts/tests/module-name && cp -r cts/tests/sample/* cts/tests/module-name
  2. Accédez à cts/tests/module-name et remplacez toutes les instances de "[Ss]ample" par la convention de dénomination recommandée ci-dessus.
  3. Mettez à jour SampleDeviceActivity pour utiliser la fonctionnalité que vous testez.
  4. Mettez à jour SampleDeviceTest pour vous assurer que l'activité réussit ou enregistre ses erreurs.

Autres annuaires

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 des tests, vous pouvez corriger ou supprimer ceux annotés avec BrokenTest ou KnownFailure.

Envoyer 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 à apporter à la branche de test appropriée avec DO NOT MERGE ou RESTRICT AUTOMERGE 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 versions 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 Tous les trimestres
15 35 android15-tests-dev Tous les trimestres
14 34 android14-tests-dev Tous les trimestres
13 33 android13-tests-dev Tous les trimestres

Dates importantes pendant la sortie

  • 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 du CTS. Les contributions à la branche après le gel du code ou après le choix d'une version candidate sont prises en compte pour la version suivante.
  • Deuxième ou troisième semaine : la CTS est publiée sur la page Téléchargements de la suite de tests de compatibilité.

Flux de fusion automatique

Des branches de développement CTS ont été configurées de sorte que les modifications envoyées à chaque branche soient automatiquement fusionnées avec 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 16 et ultérieures du CTS, un examinateur sélectionnera la modification dans Gerrit en interne.

Si une changelist (CL) ne parvient pas à être fusionnée correctement, l'auteur du correctif reçoit un e-mail contenant des instructions sur la manière de résoudre le conflit. Dans la plupart des cas, l'auteur du correctif peut utiliser les instructions pour ignorer la fusion automatique du CL en conflit.

Si une branche plus ancienne 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 Gerrit interne.