Dies ist eine kurze Einführung in die Testzuordnung und eine Erklärung, wie Sie mit der Konfiguration von Tests im Android Open Source Project (AOSP) begonnen.
Testzuordnung
Die Testzuordnung ist ein Gerrit-basierter Ansatz, mit dem Entwickler
direkt in der Android-Quellstruktur
und Änderungen nach dem Senden
Entscheidungen von Branches und Geräten, die getestet werden sollen.
Testzuordnungsdefinitionen sind JSON-Dateien mit dem Namen TEST_MAPPING
, die Sie
in einem beliebigen Quellverzeichnis.
Atest kann mithilfe der TEST_MAPPING
-Dateien Tests vor dem Senden im
verknüpfte Verzeichnisse. Mit der Testzuordnung können Sie dieselben Tests
„presubmit“ prüft mit einer minimalen Änderung in der Android-Quellstruktur.
Hier einige Beispiele:
Vorabübermittlungstests zu
TEST_MAPPING
hinzufügen fürservices.core
TEST_MAPPING
mithilfe von Importen Presubmit-Tests fürtools/dexter
hinzufügen
Die Testzuordnung basiert auf dem Trade Federation (TF) Test-Harnisch für Testdurchführung und Ergebnisberichte.
Testgruppen definieren
Testen Sie die Zuordnungsgruppen mit einer Testgruppe. Der Name einer Testgruppe kann beliebig sein. So kann z. B. presubmit der Name für eine Gruppe von Tests sein, beim Validieren von Änderungen ausgeführt. Mit postsubmit können Sie Ihre nach dem Zusammenführen der Änderungen.
Regeln für das Paket-Build-Script
Damit die Trade Federation
zum Ausführen von Testmodulen für einen
bestimmten Build benötigen, müssen diese
test_suites
festgelegt für Soong oder LOCAL_COMPATIBILITY_SUITE
für Make in eine der folgenden beiden Suiten:
general-tests
ist für Tests gedacht, die nicht von gerätespezifischen (z. B. anbieterspezifische Hardware, die von den meisten Geräten haben). Die meisten Tests sollten in dergeneral-tests
-Suite enthalten sein, auch wenn sie für ein bestimmtes ABI, eine bestimmte Bitanzahl oder Hardwarefunktionen wie HWASan spezifisch sind (für jedes ABI gibt es ein separatestest_suites
-Ziel) und auch wenn sie auf einem Gerät ausgeführt werden müssen.device-tests
ist für Tests gedacht, die von gerätespezifischen Funktionen abhängen. In der Regel finden Sie diese Tests untervendor/
. Gerätespezifisch bezieht sich nur auf Funktionen, die es nur auf einem Gerät gibt. zu JUnit-Tests und GTest-Tests, die in der Regel alsgeneral-tests
, auch wenn sie ABI-spezifisch sind).
Beispiele:
Android.bp: test_suites: ["general-tests"],
Android.mk: LOCAL_COMPATIBILITY_SUITE := general-tests
Tests zur Ausführung in einer Testsuite konfigurieren
Damit ein Test in einer Testsuite ausgeführt werden kann, muss der Test:
- Darf keinen Build-Anbieter haben.
- Nach dem Test muss eine Bereinigung erfolgen, z. B. durch Löschen aller temporären Dateien, die während des Tests erstellt wurden.
- Die Systemeinstellungen müssen auf den Standard- oder ursprünglichen Wert zurückgesetzt werden.
Nicht davon ausgehen, dass sich ein Gerät in einem bestimmten Zustand befindet, z. B. „root-fähig“ Für die meisten Tests sind keine Root-Berechtigungen erforderlich. Wenn für einen Test Root-Berechtigungen erforderlich sind, muss dies mit
RootTargetPreparer
in derAndroidTest.xml
angegeben werden, wie im folgenden Beispiel:<target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer"/>
Testzuordnungsdateien erstellen
Fügen Sie für das Verzeichnis, für das eine Testabdeckung erforderlich ist, eine TEST_MAPPING
-JSON-Datei hinzu
ähnlich wie das Beispiel. Diese Regeln stellen sicher, dass die Tests
„presubmit“ prüft, wenn Dateien in diesem Verzeichnis oder in einer der
Unterverzeichnisse
Beispiel folgen
Hier ist eine Beispieldatei TEST_MAPPING
im JSON-Format, aber mit Kommentaren.
unterstützt):
{
"presubmit": [
// JUnit test with options and file patterns.
{
"name": "CtsWindowManagerDeviceTestCases",
"options": [
{
"include-annotation": "android.platform.test.annotations.RequiresDevice"
}
],
"file_patterns": ["(/|^)Window[^/]*\\.java", "(/|^)Activity[^/]*\\.java"]
},
// Device-side GTest with options.
{
"name" : "hello_world_test",
"options": [
{
"native-test-flag": "\"servicename1 servicename2\""
},
{
"native-test-timeout": "6000"
}
]
}
// Host-side GTest.
{
"name" : "net_test_avrcp",
"host" : true
}
],
"postsubmit": [
{
"name": "CtsDeqpTestCases",
"options": [
{
// Use regex in include-filter which is supported in AndroidJUnitTest
"include-filter": "dEQP-EGL.functional.color_clears.*"
}
]
}
],
"imports": [
{
"path": "frameworks/base/services/core/java/com/android/server/am"
}
]
}
Attribute festlegen
Im Beispiel sind presubmit
und postsubmit
die Namen der einzelnen Elemente.
Testgruppe. Weitere Informationen findest du unter Testgruppen definieren.
zu Testgruppen.
Du kannst den Namen des Testmoduls oder des Gewerkschafts-Integrationstests
name (Ressourcenpfad zur Test-XML-Datei, z. B.
uiautomator/uiautomator-demo
)
im Wert des Attributs name
. Beachten Sie, dass das Feld name
Verwenden Sie die Klasse name
oder die Testmethode name
. Um die auszuführenden Tests einzugrenzen,
Verwenden Sie Optionen wie include-filter
. Siehe Beispiel für die Verwendung von include-filter
.
Die Einstellung „host
“ eines Tests gibt an, ob es sich um einen Test ohne Geräte handelt
ob sie auf dem Host läuft oder nicht. Der Standardwert ist false
, was bedeutet, dass der Test
ein Gerät erforderlich ist. Folgende Testtypen werden unterstützt:
HostGTest
für
GTest-Binärprogramme und HostTest
für JUnit
Tests durchführen.
Mit dem Attribut file_patterns
können Sie eine Liste mit Strings für reguläre Ausdrücke erstellen.
zum Abgleich des relativen Pfads einer Quellcodedatei (relativ zum
Verzeichnis mit der Datei TEST_MAPPING
). Im Beispiel
Test CtsWindowManagerDeviceTestCases
wird nur dann in der Vorabübermittlung ausgeführt, wenn eine Java-Datei
beginnt mit Window
oder Activity
, die sich im selben Verzeichnis wie der
TEST_MAPPING
-Datei oder in einem ihrer Unterverzeichnisse geändert wird.
Umgekehrte Schrägstriche `` müssen maskiert werden, wie sie sich in einer JSON-Datei befinden.
Mit dem Attribut imports
können Sie Tests in andere TEST_MAPPING
-Dateien einfügen, ohne den Inhalt zu kopieren. Die TEST_MAPPING
-Dateien in der übergeordneten Datei
des importierten Pfads sind ebenfalls enthalten. Testzuordnung ermöglicht
verschachtelte Importe zu erstellen. Das bedeutet, dass zwei TEST_MAPPING
-Dateien sich gegenseitig importieren können und
Testzuordnung die enthaltenen Tests zusammenführen.
Das Attribut options
enthält zusätzliche Tradefed-Befehlszeilenoptionen.
Führen Sie folgenden Befehl aus, um eine vollständige Liste der verfügbaren Optionen für einen bestimmten Test zu erhalten:
tradefed.sh run commandAndExit [test_module] --help
Weitere Informationen zur Funktionsweise von Optionen finden Sie unter Optionen in Tradefed.
Tests mit Atest ausführen
So führen Sie die Testregeln für das Vorabsenden lokal aus:
- Wechseln Sie zu dem Verzeichnis, das die Datei
TEST_MAPPING
enthält. Führen Sie den folgenden Befehl aus:
atest
Alle Presubmit-Tests, die in den TEST_MAPPING
-Dateien des aktuellen Verzeichnisses und der übergeordneten Verzeichnisse konfiguriert sind, werden ausgeführt. Atest findet zwei Tests und führt sie aus
zur Vorabübermittlung (A und B).
Dies ist die einfachste Methode, um Tests vor dem Senden in TEST_MAPPING
auszuführen.
im aktuellen Arbeitsverzeichnis (CWD) und in übergeordneten Verzeichnissen. Atest
sucht und verwendet die Datei TEST_MAPPING
in CWD und alle zugehörigen übergeordneten Elemente
Verzeichnisse enthalten.
Quellcode der Struktur
Dieses Beispiel zeigt, wie Sie TEST_MAPPING
-Dateien im gesamten
Quellstruktur:
src
├── project_1
│ └── TEST_MAPPING
├── project_2
│ └── TEST_MAPPING
└── TEST_MAPPING
Inhalt von src/TEST_MAPPING
:
{
"presubmit": [
{
"name": "A"
}
]
}
Inhalt von src/project_1/TEST_MAPPING
:
{
"presubmit": [
{
"name": "B"
}
],
"postsubmit": [
{
"name": "C"
}
],
"other_group": [
{
"name": "X"
}
]}
Inhalt von src/project_2/TEST_MAPPING
:
{
"presubmit": [
{
"name": "D"
}
],
"import": [
{
"path": "src/project_1"
}
]}
Zielverzeichnisse angeben
Du kannst ein Zielverzeichnis angeben, um Tests in TEST_MAPPING
-Dateien auszuführen.
-Verzeichnis. Mit dem folgenden Befehl werden zwei Tests (A, B) ausgeführt:
atest --test-mapping src/project_1
Postsubmit-Testregeln ausführen
Sie können diesen Befehl auch verwenden, um die in den
TEST_MAPPING
in src_path
(Standardeinstellung ist CWD) und in dessen übergeordneten Verzeichnissen:
atest [--test-mapping] [src_path]:postsubmit
Nur Tests ausführen, die kein Gerät erfordern
Sie können die Option --host
für Atest verwenden, um nur die Tests auszuführen, die für
die kein Gerät benötigen. Ohne diese Option führt Atest beide Tests aus,
für solche, die ein Gerät benötigen,
und solche, die auf dem Host ausgeführt werden. Die
Tests werden in zwei separaten Suiten ausgeführt:
atest [--test-mapping] --host
Testgruppen identifizieren
Sie können Testgruppen im Atest-Befehl angeben. Der folgende Befehl wird ausgeführt:
alle postsubmit
-Tests, die sich auf Dateien im Verzeichnis src/project_1
beziehen, die
enthält nur einen Test (C).
Alternativ können Sie :all
verwenden, um alle Tests unabhängig von der Gruppe auszuführen. Die folgenden
werden vier Tests ausgeführt (A, B, C, X):
atest --test-mapping src/project_1:all
Unterverzeichnisse einschließen
Standardmäßig werden Tests in TEST_MAPPING
mit Atest nur vor dem Senden ausgeführt
Tests, die in der Datei TEST_MAPPING
in CWD (oder
eines angegebenen Verzeichnisses) und seiner übergeordneten Verzeichnisse. Wenn Sie Tests in allen TEST_MAPPING
-Dateien in den Unterverzeichnissen ausführen möchten, können Sie mit der Option --include-subdir
Atest dazu zwingen, diese Tests ebenfalls einzubeziehen.
atest --include-subdir
Ohne die Option --include-subdir
führt Atest nur Test A aus. Mit der
--include-subdir
-Option führt Atest zwei Tests aus (A und B).
Kommentare auf Zeilenebene werden unterstützt
Sie können einen //
-Formatkommentar auf Zeilenebene hinzufügen, um die TEST_MAPPING
-Datei um eine Beschreibung der nachfolgenden Einstellung zu ergänzen.
ATest und Handelsföderation
Vorverarbeiten von TEST_MAPPING
in ein gültiges JSON-Format ohne Kommentare. Beibehalten
Die JSON-Datei ist sauber, nur Kommentar im //
-Format auf Zeilenebene
wird unterstützt.
Beispiel:
{
// For presubmit test group.
"presubmit": [
{
// Run test on module A.
"name": "A"
}
]
}