Inizializza il client Repo
Segui le istruzioni riportate in Scaricare il codice sorgente per recuperare e compilare il codice sorgente di Android. Quando emetti il comando repo init
, specifica un ramo CTS specifico utilizzando -b
. In questo modo, le modifiche al CTS vengono incluse nelle release CTS successive.
Il seguente esempio di codice mostra come utilizzare 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
Crea ed esegui CTS
Esegui i seguenti comandi per compilare CTS e avviare la console CTS interattiva:
CTS di compilazione (AOSP 14 o versioni precedenti)
cd /path/to/android/root
source build/envsetup.sh
make cts -j32 TARGET_PRODUCT=aosp_arm64
cts-tradefed
Esegui la compilazione del CTS (AOSP 15 o versioni successive)
cd /path/to/android/root
source build/envsetup.sh
make cts -j32 TARGET_PRODUCT=aosp_arm64 TARGET_RELEASE=
target-release cts-tradefed
Per selezionare il valore target-release
, consulta la seguente tabella:
Branch | Release target |
---|---|
android15-tests-dev | ap3a |
Nella console CTS, inserisci:
tf> run cts --plan CTS
Scrivere i test CTS
.I test CTS utilizzano JUnit e le API di test Android. Consulta il tutorial su come testare la tua app e i test esistenti nella directory cts/tests
.
I test CTS seguono per lo più le stesse convenzioni utilizzate in altri test Android.
CTS viene eseguito su molti dispositivi di produzione, pertanto i test devono rispettare queste regole:
- Tieni conto di dimensioni, orientamenti e layout della tastiera dello schermo diversi.
- Utilizza solo i metodi API pubblici. In altre parole, evita tutte le classi, i metodi e i campi con l'annotazione
hide
. - Evita di utilizzare layout di visualizzazione o di fare affidamento sulle dimensioni degli asset che potrebbero non essere presenti su alcuni dispositivi.
- Non fare affidamento sui privilegi di root.
Aggiungere un'annotazione Java
Se il test verifica il comportamento di un'API, annota il codice di test con @ApiTest
e elenca tutte le API coinvolte nel campo apis
. Utilizza il formato appropriato tra i seguenti esempi:
Tipo di API | Formato dell'annotazione | Note |
---|---|---|
Metodo | android.example.ClassA#methodA |
Il caso d'uso più comune. |
Metodo con valori chiave | android.example.ClassB#methodB(KeyA) |
Da utilizzare solo se il test utilizza un metodo API per convalidare un campo, come in questo esempio. |
Campo | android.example.ClassC#FieldA | Utilizza solo quando il test convalida direttamente un campo dell'API, come in questo esempio. |
Se il test verifica un requisito del CDD, annota l'ID requisito (inclusi ID sezione CDD e ID requisito) con @CddTest
nel codice di test CTS come mostrato nell'esempio seguente. Nel messaggio di commit, indica quale requisito CDD viene testato dal tuo
test facendo riferimento agli ID dei requisiti CDD. Gli ID dei requisiti CDD sono una combinazione di ID sezione
e ID requisito, collegati da una barra (/), come in 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()));
}
Per il Verifier CTS, annota ogni attività nel tuo AndroidManifest.xml
con l'ID CDD pertinente. I formati dei campi valore sono simili ai formati delle annotazioni Java in
CTS. Nel messaggio del commit, indica quale requisito CDD viene applicato facendo riferimento all'ID requisito 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>
Nel messaggio di commit
Indica chiaramente il motivo per cui il test deve essere aggiunto e aggiungi link pertinenti per l'assistenza. Per i test CTS-D, includi un link alla proposta di test che hai creato in Google Issue Tracker nell'ambito della procedura di invio di CTS-D.
Creare un sottopiano
Ad esempio, puoi aggiungere un file SubPlan.xml in
android-cts/subplans
come segue:
<?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>
Per eseguire il sottopiano:
run cts --subplan aSubPlan
Il formato di inserimento del sottopiano è:
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" />
Testare la denominazione e la posizione
La maggior parte dei casi di test CTS ha come target una classe specifica nell'API Android. Questi test hanno nomi di pacchetti Java con un suffisso cts
e nomi di classi con un suffisso Test
. Ogni caso di test è costituito da più test, in cui ciascun
test esercita in genere un metodo specifico della classe in test.
Questi test sono organizzati in una struttura di directory in cui sono raggruppati in categorie diverse, come "widget" o "visualizzazioni".
Ad esempio, il test CTS per il pacchetto Java
android.widget.TextView
è
android.widget.cts.TextViewTest
con il nome del pacchetto Java come
android.widget.cts
e il nome della classe come
TextViewTest
.
- Nome del pacchetto Java
Il nome del pacchetto Java per i test CTS è il nome del pacchetto della classe in fase di test, seguito da.cts
. Nel nostro esempio, il nome del pacchetto saràandroid.widget.cts
. - Nome classe
Il nome della classe per i test CTS è il nome della classe sottoposta a test con "Test" aggiunto. Ad esempio, se un test ha come targetTextView
, il nome della classe deve essereTextViewTest
. - Nome del modulo (solo CTS v2)
CTS v2 organizza i test per modulo. Il nome del modulo è in genere la seconda stringa del nome del pacchetto Java (nel nostro esempio,widget
).
La struttura della directory e il codice di esempio dipendono dal fatto che tu stia utilizzando CTS v1 o CTS v2.
CTS v1
Per Android 6.0 o versioni precedenti, utilizza CTS v1. Per CTS v1, il codice di esempio è disponibile all'indirizzo
cts/tests/tests/example
.
La struttura di directory nei test CTS v1 è la seguente:
cts/ tests/ tests/ package-name/ Android.mk AndroidManifest.xml src/ android/ package-name/ SampleDeviceActivity.java cts/ SampleDeviceTest.java
CTS v2
Per Android 7.0 o versioni successive, utilizza CTS v2. Per maggiori dettagli, consulta il test di esempio in Android Open Source Project (AOSP).
La struttura di directory della CTS v2 è la seguente:
cts/ tests/ module-name/ Android.mk AndroidManifest.xml src/ android/ package-name/ SampleDeviceActivity.java cts/ SampleDeviceTest.java
Nuovi pacchetti di esempi
Quando aggiungi nuovi test, potrebbe non essere presente una directory in cui posizionarli. In questi casi, devi creare la directory e copiare i file di esempio appropriati.
CTS v1
Se utilizzi CTS 1.0, consulta l'esempio in cts/tests/tests/example
e crea una nuova directory. Inoltre, assicurati di aggiungere il nome del modulo del nuovo pacchetto da Android.mk
a CTS_COVERAGE_TEST_CASE_LIST
in
cts/CtsTestCaseList.mk
. build/core/tasks/cts.mk
utilizza questo file make per combinare tutti i test e creare il pacchetto CTS finale.
CTS v2
Utilizza il test di esempio
/cts/tests/sample/
per avviare rapidamente il nuovo modulo di test con i seguenti passaggi:
- Per creare la directory di test e copiare i file di esempio, esegui:
mkdir cts/tests/module-name && cp -r cts/tests/sample/* cts/tests/module-name
- Vai a
cts/tests/module-name
e sostituisci tutte le istanze di "[Ss]ample" con la convenzione di denominazione consigliata riportata sopra. - Aggiorna
SampleDeviceActivity
per utilizzare la funzionalità che stai testando. - Aggiorna
SampleDeviceTest
per assicurarti che l'attività vada a buon fine o registri i relativi errori.
Directory aggiuntive
È possibile aggiungere anche altre directory Android come assets
, jni
,
libs
e res
.
Per aggiungere il codice JNI,
crea una directory nella directory principale del progetto accanto a src
con il codice nativo e un file make Android.mk
.
Il file make contiene in genere le seguenti impostazioni:
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)
File Android.mk
Infine, modifica il file Android.mk
nella directory principale del progetto per compilare il codice nativo e dipenderne, come mostrato di seguito:
# 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))
Correggere o rimuovere i test
Oltre ad aggiungere nuovi test, puoi correggere o rimuovere i test annotati con BrokenTest
o KnownFailure
.
Invia le modifiche
Quando invii patch CTS o VTS in AOSP, scegli il ramo di sviluppo in base ai livelli API a cui si applica la patch.
-
Per le modifiche che si applicano a più livelli dell'API, innanzitutto
sviluppa una patch in
aosp/main
e poi scegli i componenti migliori per il branch di test più upstream. Consenti all'unione automatica di unire le modifiche a valle nei rami di test AOSP. Consulta Pianificazione delle release e informazioni sui branch per l'elenco dei branch e delle informazioni sui percorsi di unione automatica. - Per le modifiche specifiche a un livello API specifico, sviluppa o scegli manualmente le modifiche da applicare al ramo di test corretto con NON UNISCI o LIMITA UNIONE AUTOMATICA nel messaggio di commit.
Segui il flusso di lavoro per l'invio delle patch per apportare modifiche a CTS. Verrà assegnato un revisore che esaminerà la modifica di conseguenza.
Tempistiche di rilascio e informazioni sui branch
Le release CTS seguono questa pianificazione.
Versione | Livello API | Branch | Frequenza |
---|---|---|---|
15 | 35 | android15-tests-dev | Trimestrale |
14 | 34 | android14-tests-dev | Trimestrale |
13 | 33 | android13-tests-dev | Trimestrale |
12L | 32 | android12L-tests-dev | Trimestrale |
12 | 31 | android12-tests-dev | Trimestrale |
Date importanti durante il lancio
- Fine della prima settimana: blocco del codice. Le modifiche unite nel ramo fino al blocco del codice vengono prese in considerazione per la versione imminente di CTS. I commit inviati al ramo dopo il blocco del codice o dopo la scelta di un candidato per la release vengono presi in considerazione per la release successiva.
- Seconda o terza settimana: CTS viene pubblicato in AOSP.
Flusso di unione automatica
I branch di sviluppo CTS sono stati configurati in modo che le modifiche inviate a ciascun branch vengano unite automaticamente ai branch di livello superiore.
Per le modifiche direttamente a un ramo di sviluppo di test AOSP, il percorso di unione automatica è:
android11-tests-dev
>
android12-tests-dev
>
android12L-tests-dev
>
android13-tests-dev
>
android14-tests-dev
>
android15-tests-dev
>
aosp-main
Per le modifiche solo alla versione successiva di Android, il percorso dell'unione automatica è:
aosp-main
>
<Internal git_main>
.
Se l'unione di una lista di modifiche (CL) non va a buon fine, all'autore della patch viene inviata un'email con le istruzioni su come risolvere il conflitto. Nella maggior parte dei casi, l'autore della patch può utilizzare le istruzioni per saltare l'unione automatica del CL in conflitto.
Se una modifica è richiesta da un ramo precedente, la patch deve essere selezionata dal ramo più recente.