Inicjowanie klienta Repo
Aby pobrać
i skompilować kod źródłowy Androida, postępuj zgodnie z instrukcjami w sekcji Pobieranie kodu źródłowego. Gdy wydajesz polecenie repo init, użyj flagi -b, aby określić konkretną gałąź CTS. Dzięki temu zmiany w CTS zostaną uwzględnione
w kolejnych wersjach CTS.
Poniższy przykładowy kod pokazuje, jak używać polecenia 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
Kompilowanie i uruchamianie CTS
Aby skompilować CTS i uruchomić interaktywną konsolę CTS, wykonaj te polecenia:
Kompilowanie CTS (AOSP 14 lub starszy)
cd /path/to/android/rootsource build/envsetup.shmake cts -j32 TARGET_PRODUCT=aosp_arm64cts-tradefed
Kompilowanie CTS (AOSP 15)
cd /path/to/android/rootsource build/envsetup.shmake cts -j32 TARGET_PRODUCT=aosp_arm64 TARGET_RELEASE=target-release cts-tradefed
Aby wybrać wartość target-release, zapoznaj się z tą tabelą:
| Gałąź | Wersja docelowa |
|---|---|
| android15-tests-dev | ap3a |
Uruchamianie CTS
W konsoli CTS wpisz:
tf> run cts --plan CTS
Pisanie testów CTS
Testy CTS korzystają z JUnit i interfejsów API testowania Androida. Zapoznaj się z
samouczkiem
Testowanie aplikacji
i istniejącymi testami w katalogu cts/tests.
Testy CTS w większości przypadków są zgodne z tymi samymi konwencjami, które są używane w innych testach Androida.
CTS działa na wielu urządzeniach produkcyjnych, dlatego testy muszą być zgodne z tymi regułami:
- Uwzględniaj różne rozmiary ekranu, orientacje i układy klawiatury.
- Używaj tylko publicznych metod interfejsu API. Innymi słowy, unikaj wszystkich klas, metod i pól
z adnotacją
hide. - Unikaj używania układów widoków i polegania na wymiarach zasobów, które mogą nie być dostępne na niektórych urządzeniach.
- Nie polegaj na uprawnieniach roota.
Dodawanie adnotacji Java
Jeśli test weryfikuje działanie interfejsu API, dodaj do kodu testu adnotację @ApiTest i wymień
wszystkie interfejsy API w polu apis. Użyj odpowiedniego formatu z tych
przykładów:
| Typ interfejsu API | Format adnotacji | Uwagi |
|---|---|---|
| Metoda | android.example.ClassA#methodA |
Najczęstszy przypadek użycia. |
| Metoda z parami klucz-wartość | android.example.ClassB#methodB(KeyA) |
Używaj tylko wtedy, gdy test używa metody interfejsu API do weryfikacji pola, jak w tym przykładzie. |
| Pole | android.example.ClassC#FieldA |
Używaj tylko wtedy, gdy test bezpośrednio weryfikuje pole interfejsu API, jak w tym przykładzie. |
Jeśli test weryfikuje wymaganie CDD, dodaj do kodu testu CTS adnotację @CddTest z identyfikatorem wymagania (w tym identyfikatorem sekcji CDD
i identyfikatorem wymagania), jak pokazano w tym przykładzie. W komunikacie zatwierdzenia wspomnij, które wymaganie CDD jest testowane, odwołując się do identyfikatorów wymagań CDD. Identyfikatory wymagań CDD to połączenie identyfikatora sekcji
i identyfikatora wymagania, połączonych ukośnikiem (/), np. 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()));
}
W przypadku CTS Verifier dodaj do każdej aktywności w pliku AndroidManifest.xml odpowiedni identyfikator CDD. Formaty pól wartości są podobne do formatów adnotacji Java w
CTS. W komunikacie zatwierdzenia wspomnij, które wymaganie CDD jest egzekwowane, odwołując się do identyfikatora wymagania CDD
wymagania.
<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>
W komunikacie zatwierdzenia
Wyraźnie wyjaśnij, dlaczego należy dodać test, i dodaj odpowiednie linki do pomocy. W przypadku testów CTS-D dodaj link do propozycji testu utworzonej w narzędziu Google Issue Tracker w ramach procesu przesyłania CTS-D CTS-D.
Tworzenie podplanu
Możesz na przykład dodać plik SubPlan.xml w android-cts/subplans w ten sposób:
<?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>
Aby uruchomić podplan:
run cts --subplan aSubPlan
Format wpisu podplanu:
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" />
Nazewnictwo i lokalizacja testów
Większość przypadków testowych CTS jest kierowana na konkretną klasę w interfejsie API Androida. Testy te mają nazwy pakietów Java z sufiksem cts i nazwy klas z sufiksem Test. Każdy przypadek testowy składa się z wielu testów, z których każdy zwykle sprawdza konkretną metodę testowanej klasy.
Testy te są ułożone w strukturze katalogów, w której są pogrupowane w różne kategorie, np. „widżety” lub „widoki”.
Na przykład test CTS dla pakietu Java
android.widget.TextView to
android.widget.cts.TextViewTest, którego nazwa pakietu Java to
android.widget.cts, a nazwa klasy to
TextViewTest.
- Nazwa pakietu Java
Nazwa pakietu Java dla testów CTS to nazwa pakietu klasy, którą testuje test, a po niej następuje.cts. W naszym przykładzie nazwa pakietu toandroid.widget.cts. - Nazwa klasy
Nazwa klasy dla testów CTS to nazwa testowanej klasy z dodanym sufiksem „Test”. Jeśli na przykład test jest kierowany naTextView, nazwa klasy powinna brzmiećTextViewTest. - Nazwa modułu (tylko CTS v2)
CTS v2 porządkuje testy według modułów. Nazwa modułu jest zwykle drugim ciągiem nazwy pakietu Java (w naszym przykładziewidget).
Struktura katalogów i przykładowy kod zależą od tego, czy używasz CTS v1 czy CTS v2.
CTS v1
W przypadku Androida 6.0 lub starszego użyj CTS v1. W przypadku CTS v1 przykładowy kod znajduje się w cts/tests/tests/example.
Struktura katalogów w testach CTS v1 wygląda tak:
cts/
tests/
tests/
package-name/
Android.mk
AndroidManifest.xml
src/
android/
package-name/
SampleDeviceActivity.java
cts/
SampleDeviceTest.java
CTS v2
W przypadku Androida 7.0 lub nowszego użyj CTS v2. Więcej informacji znajdziesz w przykładowym teście w projekcie Android Open Source (AOSP).
Struktura katalogów CTS v2 wygląda tak:
cts/
tests/
module-name/
Android.mk
AndroidManifest.xml
src/
android/
package-name/
SampleDeviceActivity.java
cts/
SampleDeviceTest.java
Nowe przykładowe pakiety
Podczas dodawania nowych testów może nie być istniejącego katalogu, w którym można umieścić test. W takich przypadkach musisz utworzyć katalog i skopiować odpowiednie przykładowe pliki.
CTS v1
Jeśli używasz CTS v1, zapoznaj się z przykładem w cts/tests/tests/example i utwórz nowy katalog. Dodaj też nazwę modułu nowego pakietu z pliku Android.mk
do CTS_COVERAGE_TEST_CASE_LIST w
cts/CtsTestCaseList.mk. build/core/tasks/cts.mk używa tego pliku makefile
do łączenia wszystkich testów i tworzenia końcowego pakietu CTS.
CTS v2
Aby szybko rozpocząć nowy moduł testowy, wykonaj te czynności, korzystając z przykładowego testu
/cts/tests/sample/
:
- Aby utworzyć katalog testowy i skopiować przykładowe pliki, uruchom:
mkdir cts/tests/module-name && cp -r cts/tests/sample/* cts/tests/module-name
- Przejdź do
cts/tests/module-namei zastąp wszystkie wystąpienia "[Ss]ample" zalecaną konwencją nazewnictwa opisaną powyżej. - Zaktualizuj
SampleDeviceActivity, aby sprawdzić testowaną funkcję. - Zaktualizuj
SampleDeviceTest, aby mieć pewność, że aktywność zakończy się powodzeniem lub zarejestruje błędy.
Dodatkowe katalogi
Możesz też dodać inne katalogi Androida, takie jak assets, jni, libs i res.
Aby dodać kod JNI, utwórz katalog w katalogu głównym projektu obok src z kodem natywnym i plikiem makefile Android.mk.
Plik makefile zwykle zawiera te ustawienia:
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)
Plik Android.mk
Na koniec zmodyfikuj plik Android.mk w katalogu głównym projektu, aby skompilować kod natywny i od niego zależeć, jak pokazano poniżej:
# 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))
Naprawianie lub usuwanie testów
Oprócz dodawania nowych testów możesz też naprawiać lub usuwać testy z adnotacjami BrokenTest lub KnownFailure.
Przesyłanie zmian
Podczas przesyłania zmian do CTS postępuj zgodnie z procesem przesyłania zmian kodu.
- Wybierz gałąź programistyczną na podstawie poziomów interfejsu API, do których ma zastosowanie poprawka.
- Opracuj lub przenieś zmiany do odpowiedniej gałęzi testowej z DO NOT MERGE lub RESTRICT AUTOMERGE w komunikacie zatwierdzenia.
Odbiorca zostanie przypisany do sprawdzenia zmiany i przeniesienia jej do wewnętrznego Gerrit.
Harmonogram publikacji i informacje o gałęziach
Wersje CTS są udostępniane zgodnie z tym harmonogramem.
| Wersja | Poziom API | Gałąź programistyczna | Częstotliwość publikacji |
|---|---|---|---|
| 16+ | 36+ | Wewnętrzny Gerrit | Co kwartał |
| 15 | 35 | android15-tests-dev | Co kwartał |
| 14 | 34 | android14-tests-dev | Co kwartał |
Ważne daty podczas udostępniania
- Koniec pierwszego tygodnia: zamrożenie kodu. Zmiany scalone w gałęzi do momentu zamrożenia kodu są uwzględniane w nadchodzącej wersji CTS. Przesłane do gałęzi po zamrożeniu kodu lub po wybraniu wersji kandydującej do udostępnienia są uwzględniane w kolejnej wersji.
- Drugi lub trzeci tydzień: CTS jest publikowany na stronie pobierania pakietu Compatibility Test Suite.
Proces automatycznego scalania
Gałęzie programistyczne CTS zostały skonfigurowane tak, aby zmiany przesyłane do każdej gałęzi były automatycznie scalane z gałęziami wyższymi.
W przypadku zmian bezpośrednio w gałęzi programistycznej testów AOSP ścieżka automatycznego scalania to:
android13-tests-dev >
android14-tests-dev >
android15-tests-dev
- W przypadku wersji CTS 16+ odbiorca przeniesie zmianę do wewnętrznego Gerrit.
Jeśli scalenie listy zmian (CL) nie powiedzie się, autor poprawki otrzyma e-maila z instrukcjami, jak rozwiązać konflikt. W większości przypadków autor poprawki może skorzystać z instrukcji, aby pominąć automatyczne scalanie powodującej konflikt listy zmian.
Jeśli zmiana jest wymagana w starszej gałęzi, poprawkę należy przenieść z nowszej gałęzi.
W przypadku zmian testowych mających zastosowanie do następnej wersji Androida po przesłaniu proponowanej zmiany, Google ją sprawdzi i, jeśli zostanie zaakceptowana, przeniesie ją do wewnętrznego Gerrit.