Tests im Rahmen des drawElements-Qualitätsprogramms

AOSP enthält die GPU-Testsuite „drawElements Quality Program“ (deqp) unter https://android.googlesource.com/platform/external/deqp. Auf dieser Seite wird beschrieben, wie Sie die deqp-Testsuite in einer neuen Umgebung bereitstellen.

Wenn Sie mit dem neuesten eingereichten Code arbeiten möchten, verwenden Sie den Branch deqp-dev. Verwenden Sie für Code, der mit einer bestimmten Android CTS-Version übereinstimmt, den Branch release-code-name-release (z.B. marshmallow-release für Android 6.0).

Quelllayout

Das Quellcode-Layout für die deqp-Testmodule und die zugehörigen Bibliotheken ist in der folgenden Tabelle dargestellt. Die Liste ist nicht vollständig, enthält aber die wichtigsten Verzeichnisse.

Verzeichnis Beschreibung
android

Android-Testerquellen und Build-Scripts

data

Testdatendateien

modules

Testmodulquellen

modules/egl

EGL-Modul

modules/gles2

GLES2-Modul

modules/gles3

GLES3-Modul

modules/gles31

GLES3.1-Modul

modules/gles32

GLES3.2-Modul

targets

Zielspezifische Build-Konfigurationsdateien

framework

deqp-Testmodul-Framework und -Dienstprogramme

framework/delibs

Basis-Portabilität und Build-Bibliotheken

framework/platform

Plattformanschlüsse

framework/qphelper

Testprogramm-Integrationsbibliothek (C)

framework/common

Deqp-Framework (C++)

framework/opengl, framework/egl

API-spezifische Dienstprogramme

execserver

Geräteseitige ExecServer-Quelle

executor

Hostseitiges Shell-Tool und Dienstprogramme für die Testausführung

external

Stub-Verzeichnis für die externen Bibliotheken libpng und zlib erstellen

Open-Source-Komponenten

Für deqp werden libpng und zlib verwendet, die mit dem Script platform/external/deqp/external/fetch_sources.py oder über git von platform/external/[libpng,zlib] abgerufen werden können.

Testprogramme erstellen

Das Test-Framework wurde mit Blick auf Portabilität entwickelt. Die einzigen obligatorischen Anforderungen sind vollständige C++-Unterstützung und Standardsystembibliotheken für I/O, Threads und Sockets.

CMake-Buildsystem

Die deqp-Quellen enthalten Build-Scripts für CMake, das bevorzugte Tool zum Kompilieren der Testprogramme.

CMake ist ein Open-Source-Buildsystem, das mehrere Plattformen und Toolchains unterstützt. CMake generiert native Makefiles oder IDE-Projektdateien aus zielunabhängigen Konfigurationsdateien. Weitere Informationen zu CMake finden Sie in der CMake-Dokumentation.

CMake unterstützt und empfiehlt Builds außerhalb des Quellbaums. Sie sollten also immer Makefiles oder Projektdateien in einem separaten Build-Verzeichnis außerhalb des Quellbaums erstellen. CMake hat kein „distclean“-Ziel. Daher müssen alle von CMake generierten Dateien manuell entfernt werden.

Konfigurationsoptionen werden CMake mithilfe der -DOPTION_NAME=VALUE-Syntax übergeben. Im Folgenden sind einige häufig verwendete Optionen für deqp aufgeführt.

Konfigurationsoption Beschreibung
DEQP_TARGET

Zielname, z. B. „android“

Die deqp-CMake-Scripts enthalten die Datei targets/DEQP_TARGET/DEQP_TARGET.cmake und erwarten dort zielspezifische Buildoptionen.

CMAKE_TOOLCHAIN_FILE

Pfad zur Toolchain-Datei für CMake. Wird für die plattformübergreifende Kompilierung verwendet.

CMAKE_BUILD_TYPE

Build-Typ für Makefile-Ziele. Gültige Werte sind „Debug“ und „Release“.

Die Interpretation und der Standardtyp hängen vom Ziel-Buildsystem ab. Weitere Informationen finden Sie in der CMake-Dokumentation.

Ziel-Builddatei erstellen

Das deqp-Build-System wird mithilfe von Ziel-Build-Dateien für neue Ziele konfiguriert. In einer Ziel-Builddatei wird festgelegt, welche Funktionen die Plattform unterstützt und welche Bibliotheken oder zusätzlichen Include-Pfade erforderlich sind. Zieldateinamen folgen dem Format targets/NAME/NAME.cmake und das Ziel wird mit dem Build-Parameter DEQP_TARGET ausgewählt.

Dateipfade in Zieldateien beziehen sich auf das Basisverzeichnis deqp, nicht auf das Verzeichnis targets/NAME. Die folgenden Standardvariablen können in der Ziel-Builddatei festgelegt werden.

Variable Beschreibung
DEQP_TARGET_NAME

Zielname (wird in die Testprotokolle aufgenommen)

DEQP_SUPPORT_GLES2

Gibt an, ob GLES2 unterstützt wird (Standard: AUS)

DEQP_GLES2_LIBRARIES

GLES2-Bibliotheken (leer lassen, wenn nicht unterstützt oder dynamisches Laden verwendet wird)

DEQP_SUPPORT_GLES3

Gibt an, ob GLES3.x unterstützt wird (Standard: AUS)

DEQP_GLES3_LIBRARIES

GLES3.x-Bibliotheken (leer lassen, wenn nicht unterstützt oder dynamisches Laden verwendet wird)

DEQP_SUPPORT_VG

Gibt an, ob OpenVG unterstützt wird (Standard: AUS)

DEQP_OPENVG_LIBRARIES

OpenVG-Bibliotheken (leer lassen, wenn nicht unterstützt oder dynamisches Laden verwendet wird)

DEQP_SUPPORT_EGL

Gibt an, ob EGL unterstützt wird (Standard: AUS)

DEQP_EGL_LIBRARIES

EGL-Bibliotheken (leer lassen, wenn nicht unterstützt oder dynamisches Laden verwendet wird)

DEQP_PLATFORM_LIBRARIES

Zusätzliche plattformspezifische Bibliotheken für die Verknüpfung erforderlich

DEQP_PLATFORM_COPY_LIBRARIES

Liste der Bibliotheken, die in jedes Buildverzeichnis der Testbinärdatei kopiert werden. Kann zum Kopieren von Bibliotheken verwendet werden, die zum Ausführen von Tests erforderlich sind, aber nicht im Standardsuchpfad enthalten sind.

TCUTIL_PLATFORM_SRCS

Liste der Plattform-Portquellen. Die Standardquellen werden anhand der Funktionen und des Betriebssystems bestimmt.

Hinweis:Die Pfade sind relativ zu: framework/platform

Der Ziel-Builddatei können mit den CMake-Funktionen include_directories() und link_directories() zusätzliche Include- oder Linkpfade hinzugefügt werden.

Win32-Build

Am einfachsten lassen sich deqp-Module für Windows mit dem CMake-Buildsystem erstellen. Sie benötigen CMake 2.6.12 oder höher und den Microsoft Visual C/C++-Compiler. Der deqp wurde mit Visual Studio 2013 getestet.

Visual Studio-Projektdateien können mit dem folgenden Befehl generiert werden:

cmake path\to\src\deqp -G "Visual Studio 12"

Wenn Sie einen 64-Bit-Build erstellen möchten, wählen Sie „Visual Studio VERSION Win64“ als Build-Generator aus:

cmake path\to\src\deqp -G "Visual Studio 12 Win64"

Sie können auch NMake-Makefiles mit der Option -G "NMake Makefiles" und dem Buildtyp (-DCMAKE_BUILD_TYPE="Debug" oder "Release") generieren.

Renderkontext erstellen

Der Rendering-Kontext kann unter Windows entweder mit WGL oder mit EGL erstellt werden.

WGL-Unterstützung

Alle Win32-Binärdateien unterstützen die Erstellung von GL-Kontexten mit WGL, da nur Standardbibliotheken erforderlich sind. Der WGL-Kontext kann mit dem Befehlszeilenargument --deqp-gl-context-type=wgl ausgewählt werden. Im WGL-Modus verwendet deqp die WGL_EXT_create_context_es_profile-Erweiterung, um OpenGL ES-Kontexte zu erstellen. Die Funktion wurde mit den neuesten Treibern von NVIDIA und Intel getestet. AMD-Treiber unterstützen die erforderliche Erweiterung nicht.

EGL-Unterstützung

Die deqp wird mit dynamischer Auslagerung für EGL unter Windows erstellt, wenn DEQP_SUPPORT_EGL aktiviert ist. Dies ist die Standardeinstellung für die meisten Ziele. Wenn der Host EGL-Bibliotheken verfügbar hat, können Sie mit dem Befehlszeilenparameter --deqp-gl-context-type=egl Tests mit ihnen ausführen.

Android-Build

Für den Android-Build werden CMake-Buildscripts zum Erstellen des nativen Testcodes verwendet. Java-Teile, d.h. der Testausführungsserver und der Test-Anwendungs-Stub, werden mit den standardmäßigen Android-Build-Tools kompiliert.

Um deqp-Testprogramme für Android mit den bereitgestellten Build-Scripts zu kompilieren, benötigen Sie Folgendes:

  • Die neueste Version des Android NDK. In der Datei android/scripts/common.py ist die erforderliche Version aufgeführt.
  • Eigenständiges Android SDK mit API 13, installierte SDK-Tools, SDK-Plattformtools und SDK-Buildtools-Pakete
  • Apache Ant 1.9.4 (für den Java-Code-Build erforderlich)
  • CMake 2.8.12 oder höher
  • Python 2.6 oder höher in der 2.x-Reihe; Python 3.x wird nicht unterstützt
  • Für Windows: NMake oder JOM in PATH
    • JOM ermöglicht schnellere Builds
  • Optional: Ninja Make wird auch unter Linux unterstützt.

Ant- und SDK-Binärprogramme werden anhand der Umgebungsvariablen PATH mit bestimmten überschreibenden Standardwerten ermittelt. Die Logik wird von android/scripts/common.py gesteuert.

Das NDK-Verzeichnis muss entweder ~/android-ndk-VERSION oder C:/android/android-ndk-VERSION sein oder über die Umgebungsvariable ANDROID_NDK_PATH definiert werden.

Die On-Device-Komponenten von Deqp, der Testausführungsdienst und die Testprogramme werden durch Ausführen des android/scripts/build.py-Scripts erstellt. Die endgültige .apk wird in android/package/bin erstellt und kann mit dem install.py-Script installiert werden. Wenn der Befehlszeilen-Executor verwendet wird, wird der ExecService über ADB mit dem launch.py-Script auf dem Gerät gestartet. Die Scripts können von jedem beliebigen Verzeichnis aus ausgeführt werden.

Linux-Build

Test-Binärdateien und Befehlszeilen-Dienstprogramme können für Linux erstellt werden, indem Makefiles mit CMake generiert werden. Es gibt mehrere vordefinierte Build-Ziele, die beim Erstellen für Linux nützlich sind.

Ziel erstellen Beschreibung
default

Standardziel, bei dem die CMake-Plattforminspektion verwendet wird, um die Unterstützung verschiedener APIs zu ermitteln.

x11_glx

Erstellt OpenGL-(ES)-Kontexte mit GLX.

x11_egl

Erstellt OpenGL (ES)-Kontexte mit EGL.

x11_egl_glx

Unterstützt sowohl GLX als auch EGL mit X11.

Verwenden Sie immer -DCMAKE_BUILD_TYPE=<Debug|Release>, um den Buildtyp zu definieren. Release ist ein guter Standardwert. Andernfalls wird ein standardmäßiger, nicht optimierter Release-Build erstellt.

Mit den Befehlszeilenargumenten -DCMAKE_C_FLAGS und -DCMAKE_CXX_FLAGS können Sie dem Compiler zusätzliche Argumente übergeben. So können Sie beispielsweise einen 32-Bit- oder 64-Bit-Build ausführen, indem Sie -DCMAKE_C(XX)_FLAGS="-m32" bzw. "-m64" festlegen. Wenn nicht angegeben, wird die native Architektur der Toolchain verwendet, in der Regel 64-Bit bei der 64-Bit-Toolchain.

Die Argumente -DCMAKE_LIBRARY_PATH und -DCMAKE_INCLUDE_PATH können für CMake verwendet werden, um CMake zusätzliche Bibliotheks- oder Include-Suchpfade anzugeben.

Hier ein Beispiel für eine vollständige Befehlszeile, mit der ein 32-Bit-Debug-Build für Treiber-Header und ‑Bibliotheken an einem benutzerdefinierten Speicherort ausgeführt wird:

cmake <path to src>/deqp -DDEQP_TARGET=x11_egl -DCMAKE_C_FLAGS="-m32"
-DCMAKE_CXX_FLAGS="-m32" -DCMAKE_BUILD_TYPE=Debug
-DCMAKE_LIBRARY_PATH="PATH_TO_DRIVER/lib"
-DCMAKE_INCLUDE_PATH="PATH_TO_DRIVER/inc"
make -j4

Cross-Kompilierung

Die Cross-Kompilierung kann mit einer CMake-Toolchain-Datei erfolgen. In der Toolchain-Datei wird der zu verwendende Compiler sowie benutzerdefinierte Suchpfade für Bibliotheken und Header angegeben. Im Release-Paket im Verzeichnis framework/delibs/cmake sind mehrere toolchain-Dateien für gängige Szenarien enthalten.

Zusätzlich zu den standardmäßigen CMake-Variablen können die folgenden deqp-spezifischen Variablen in der Toolchain-Datei festgelegt werden. CMake kann DE_OS, DE_COMPILER und DE_PTR_SIZE in der Regel richtig erkennen, DE_CPU muss jedoch in der Toolchain-Datei festgelegt werden.

Variable Beschreibung
DE_OS

Betriebssystem Unterstützte Werte: DE_OS_WIN32, DE_OS_UNIX, DE_OS_WINCE, DE_OS_OSX, DE_OS_ANDROID, DE_OS_SYMBIAN, DE_OS_IOS

DE_COMPILER

Compilertyp. Unterstützte Werte: DE_COMPILER_GCC, DE_COMPILER_MSC, DE_COMPILER_CLANG

DE_CPU

CPU-Typ. Unterstützte Werte: DE_CPU_ARM, DE_CPU_X86.

DE_PTR_SIZE

sizeof(void*) auf der Plattform. Unterstützte Werte: 4 und 8

Die Toolchain-Datei kann mit dem Build-Parameter CMAKE_TOOLCHAIN_FILE ausgewählt werden. Mit dem folgenden Befehl werden beispielsweise Makefiles für einen Build mit dem CodeSourcery-Cross-Compiler für ARM/Linux erstellt:

cmake PATH_TO_SRC/deqp –DDEQP_BUILD_TYPE="Release"
–DCMAKE_TOOLCHAIN_FILE=PATH_TO_SRC/delibs/cmake/toolchain-arm-cs.cmake
–DARM_CC_BASE=PATH_TO_CC_DIRECTORY

Laufzeitverknüpfung von GLES- und EGL-Bibliotheken

Der deqp benötigt während der Verknüpfung keine Einstiegspunkte der zu testenden API. Der Testcode greift immer über Funktionszeiiger auf die APIs zu. Einstiegspunkte können dann zur Laufzeit dynamisch geladen oder vom Plattform-Port zur Linkzeit bereitgestellt werden.

Wenn die Unterstützung für eine API in den Build-Einstellungen aktiviert ist und keine Linkbibliotheken angegeben werden, lädt deqp die erforderlichen Einstiegspunkte zur Laufzeit. Wenn die statische Verknüpfung gewünscht ist, geben Sie die erforderlichen Verknüpfungsbibliotheken in der Build-Konfigurationsvariablen DEQP_<API>_LIBRARIES an.

Test-Framework portieren

Die Portierung von deqp umfasst drei Schritte: Anpassung der Basisbibliotheken für die Portabilität, Implementierung von Plattformintegrationsschnittstellen für das Test-Framework und Portierung des Ausführungsdiensts.

In der folgenden Tabelle sind Standorte aufgeführt, an denen es wahrscheinlich zu Änderungen bei der Portierung kommt. Alles darüber hinaus ist wahrscheinlich exotisch.

Standort Beschreibung
framework/delibs/debase
framework/delibs/dethread
framework/delibs/deutil

Alle erforderlichen Implementierungen von betriebssystemspezifischem Code.

framework/qphelper/qpCrashHandler.c

Optional: Implementierung für Ihr Betriebssystem.

framework/qphelper/qpWatchDog.c

Implementierung für Ihr Betriebssystem. Die aktuelle Version basiert auf dethread und der Standard-C-Bibliothek.

framework/platform

Neuer Plattform-Port und Anwendungs-Stub können wie unter Test-Framework-Plattform-Port beschrieben implementiert werden.

Basisbibliotheken für Portabilität

Die Basisbibliotheken für die Portabilität unterstützen bereits Windows, die meisten Linux-Varianten, Mac OS, iOS und Android. Wenn das Testziel auf einem dieser Betriebssysteme ausgeführt wird, müssen Sie die Basisbibliotheken für die Portabilität höchstwahrscheinlich gar nicht ändern.

Port der Test-Framework-Plattform

Der Plattform-Port des deqp-Test-Frameworks erfordert zwei Komponenten: einen Anwendungseingabepunkt und eine Plattform-Schnittstellenimplementierung.

Der Anwendungs-Einstiegspunkt ist für das Erstellen des Plattformobjekts, das Erstellen eines Befehlszeilenobjekts (tcu::CommandLine), das Öffnen eines Testlogs (tcu::TestLog) und die Iteration der Testanwendung (tcu::App) verantwortlich. Wenn das Zielbetriebssystem einen standardmäßigen main()-Einstiegspunkt unterstützt, kann tcuMain.cpp als Implementierung des Einstiegspunkts verwendet werden.

Die deqp-Plattform-API wird in den folgenden Dateien ausführlich beschrieben.

Datei Beschreibung
framework/common/tcuPlatform.hpp

Basisklasse für alle Plattformports

framework/opengl/gluPlatform.hpp

OpenGL-Plattformschnittstelle

framework/egl/egluPlatform.hpp

EGL-Plattformoberfläche

framework/platform/tcuMain.cpp

Standard-Einstiegspunkt der Anwendung

Die Basisklasse für alle Plattformports ist tcu::Platform. Der Plattformport kann optional GL- und EGL-spezifische Schnittstellen unterstützen. In der folgenden Tabelle finden Sie einen Überblick darüber, was für die Ausführung der Tests implementiert werden muss.

Modul Benutzeroberfläche

OpenGL (ES)-Testmodule

GL-Plattformschnittstelle

EGL-Testmodul

EGL-Plattformoberfläche

Detaillierte Anleitungen zur Implementierung von Plattformports finden Sie in den Überschriften der Portierungsebene.

Testausführungsdienst

Wenn Sie die deqp-Testausführungsinfrastruktur oder den Befehlszeilenausführer verwenden möchten, muss der Testausführungsdienst auf dem Ziel verfügbar sein. Im Verzeichnis execserver finden Sie eine portable C++-Implementierung des Dienstes. Das eigenständige Binärprogramm wird als Teil des deqp-Testmoduls für PC-Ziele erstellt. Sie können execserver/CMakeLists.txt ändern, um einen Build für andere Ziele zu aktivieren.

Die C++-Version des Testausführungsdienstes akzeptiert zwei Befehlszeilenparameter:

  • Mit --port=<port> wird der TCP-Port festgelegt, den der Server überwacht. Der Standardwert ist 50016.
  • --single beendet den Serverprozess, wenn der Client die Verbindung trennt. Standardmäßig bleibt der Serverprozess aktiv, um weitere Anfragen zur Testausführung zu bearbeiten.

Tests ausführen

Auf dieser Seite finden Sie eine Anleitung zum Ausführen von deqp-Tests in Linux- und Windows-Umgebungen, zum Verwenden von Befehlszeilenargumenten und zum Arbeiten mit dem Android-Anwendungspaket.

Linux- und Windows-Umgebungen

Kopieren Sie zuerst die folgenden Dateien und Verzeichnisse in das Ziel.

Modul Verzeichnis Target
Ausführungsserver build/execserver/execserver <dst>/execserver
EGL-Modul build/modules/egl/deqp-egl <dst>/deqp-egl
GLES2-Modul build/modules/gles2/deqp-gles2 <dst>/deqp-gles2
data/gles2 <dst>/gles2
GLES3-Modul build/modules/gles3/deqp-gles3 <dst>/deqp-gles3
data/gles3 <dst>/gles3
GLES3.1-Modul build/modules/gles31/deqp-gles31 <dst>/deqp-gles31
data/gles31 <dst>/gles31
GLES3.2-Modul build/modules/gles32/deqp-gles32 <dst>/deqp-gles32
data/gles32 <dst>/gles32

Sie können den Ausführungsdienst und Testbinärdateien überall im Zieldateisystem bereitstellen. Testbinärdateien erwarten jedoch Datenverzeichnisse im aktuellen Arbeitsverzeichnis. Starten Sie den Testausführungsdienst auf dem Zielgerät. Weitere Informationen zum Starten des Dienstes finden Sie unter Testausführungsdienst.

Befehlszeilenargumente

In der folgenden Tabelle sind Befehlszeilenargumente aufgeführt, die sich auf die Ausführung aller Testprogramme auswirken.

Argument Beschreibung
--deqp-case=<casename> Fälle ausführen, die mit einem bestimmten Muster übereinstimmen Der Platzhalter (*) wird unterstützt.
--deqp-log-filename=<filename> Testergebnisse in die von Ihnen angegebene Datei schreiben Der Dienst zur Testausführung legt den Dateinamen beim Starten eines Tests fest.
--deqp-stdin-caselist
--deqp-caselist=<caselist>
--deqp-caselist-file=<filename>
Fallliste aus stdin oder einem angegebenen Argument lesen Der Testausführungsdienst legt das Argument gemäß der empfangenen Ausführungsanfrage fest. Im nächsten Abschnitt finden Sie eine Beschreibung des Formats der Fallliste.
--deqp-test-iteration-count=<count> Überschreiben Sie die Wiederholungszahl für Tests, die eine variable Anzahl von Wiederholungen unterstützen.
--deqp-base-seed=<seed> Basis-Seed für die Testfälle, bei denen Zufallszahlen verwendet werden.

GLES2- und GLES3-spezifische Argumente

In der folgenden Tabelle sind die GLES2- und GLES3-spezifischen Argumente aufgeführt.
Argument Beschreibung
--deqp-gl-context-type=<type> OpenGL-Kontexttyp. Welche Kontexttypen verfügbar sind, hängt von der Plattform ab. Auf Plattformen, die EGL unterstützen, kann der Wert egl verwendet werden, um den EGL-Kontext auszuwählen.
--deqp-gl-config-id=<id> Tests für die angegebene GL-Konfigurations-ID ausführen Die Interpretation ist plattformabhängig. Auf der EGL-Plattform ist dies die EGL-Konfigurations-ID.
--deqp-gl-config-name=<name> Tests für eine benannte GL-Konfiguration ausführen Die Interpretation ist plattformabhängig. Für EGL ist das Format rgb(a)<bits>d<bits>s<bits>. Mit dem Wert rgb888s8 wird beispielsweise die erste Konfiguration ausgewählt, bei der der Farbbuffer RGB888 und der Stencil-Buffer 8 Bit hat.
--deqp-gl-context-flags=<flags> Erstellt einen Kontext. Geben Sie robust oder debug an.
--deqp-surface-width=<width>
--deqp-surface-height=<height>
Versuchen Sie, eine Oberfläche mit einer bestimmten Größe zu erstellen. Die Unterstützung dieser Funktion ist optional.
--deqp-surface-type=<type> Einen bestimmten Oberflächentyp als Hauptziel für das Testrendering verwenden. Mögliche Typen sind window, pixmap, pbuffer und fbo.
--deqp-screen-rotation=<rotation> Bildschirmausrichtung in 90-Grad-Schritten für Plattformen, die dies unterstützen.

Format der Testfallliste

Die Liste der Testfälle kann in zwei Formaten angegeben werden. Die erste Option besteht darin, den vollständigen Namen jedes Tests in einer Standard-ASCII-Datei in einer separaten Zeile aufzulisten. Wenn die Testsätze wachsen, können sich die sich wiederholenden Präfixe als umständlich erweisen. Um Wiederholungen von Präfixen zu vermeiden, verwenden Sie die unten gezeigte Syntax für einen Trie (auch als Präfixbaum bezeichnet).

{nodeName{firstChild{…},…lastChild{…}}}

Beispiel:

{dEQP-EGL{config-list,create_context{rgb565_depth_stencil}}}

Das entspricht den folgenden beiden Testfällen:

dEQP-EGL.config_list
dEQP-EGL.create_context.rgb565_depth_stencil

Android

Das Android-Anwendungspaket enthält alle erforderlichen Komponenten, einschließlich des Testausführungsdiensts, Test-Binärdateien und Datendateien. Die Testaktivität ist eine NativeActivity, die EGL verwendet (erfordert Android 3.2 oder höher).

Das Anwendungspaket kann mit dem folgenden Befehl installiert werden. Der angezeigte Name ist der Name des APK im Android CTS-Paket. Dieser Name hängt vom Build ab:

adb –d install –r com.drawelements.deqp.apk

So starten Sie den Dienst zur Testausführung und richten die Portweiterleitung ein:

adb –d forward tcp:50016 tcp:50016
adb –d shell am start –n com.drawelements.deqp/.execserver.ServiceStarter

Debug-Drucke können aktiviert werden, indem Sie vor Beginn der Tests Folgendes ausführen:

adb –d shell setprop log.tag.dEQP DEBUG

Tests auf Android ohne Android CTS ausführen

Wenn Sie die Aktivität „Testausführung“ manuell starten möchten, erstellen Sie ein Android-Intent, das auf android.app.NativeActivity ausgerichtet ist. Die Aktivitäten finden Sie im com.drawelements.deqp-Paket. Die Befehlszeile muss im Intent als zusätzlicher String mit dem Schlüssel "cmdLine" angegeben werden.

Ein Testprotokoll wird in /sdcard/dEQP-log.qpa geschrieben. Wenn der Test nicht normal gestartet wird, finden Sie im Geräteprotokoll weitere Informationen zur Fehlerbehebung.

Sie können eine Aktivität über die Befehlszeile mit dem am-Dienstprogramm starten. Wenn Sie beispielsweise dEQP-GLES2.info-Tests auf einer Plattform ausführen möchten, die NativeActivity, unterstützt, verwenden Sie die folgenden Befehle.

adb -d shell am start -n com.drawelements.deqp/android.app.NativeActivity -e \
'cmdLine "deqp --deqp-case=dEQP-GLES2.info.* --deqp-log-filename=/sdcard/dEQP-Log.qpa"'

Unter Android debuggen

Wenn Sie die Tests unter dem GDB-Debugger auf Android ausführen möchten, kompilieren und installieren Sie zuerst den Debug-Build, indem Sie die folgenden beiden Scripts ausführen:

python android/scripts/build.py --native-build-type=Debug
python android/scripts/install.py

Nachdem der Debug-Build auf dem Gerät installiert ist, führen Sie den folgenden Befehl aus, um die Tests unter GDB auszuführen, das auf dem Host ausgeführt wird:

python android/scripts/debug.py \
--deqp-commandline="--deqp-log-filename=/sdcard/TestLog.qpa --deqp-case=dEQP-GLES2.functional.*"

Die deqp-Befehlszeile hängt von den auszuführenden Testfällen und anderen erforderlichen Parametern ab. Das Script fügt am Anfang der deqp-Ausführung (tcu::App::App) einen Standard-Bruchpunkt hinzu.

Das debug.py-Script akzeptiert mehrere Befehlszeilenargumente für Aktionen wie das Setzen von Haltepunkten für die Fehlerbehebung, GDB-Server-Verbindungsparameter und Pfade zu zusätzlichen Binärdateien zur Fehlerbehebung. Verwenden Sie debug.py --help für alle Argumente und Erläuterungen. Das Script kopiert auch einige Standardbibliotheken vom Zielgerät, um Symbollisten zu erhalten.

Wenn Sie den Treibercode Schritt für Schritt durchgehen möchten (z. B. wenn GDB die Speicherorte der Binärdateien mit vollständigen Informationen zur Fehlerbehebung kennen muss), fügen Sie über debug.py-Befehlszeilenparameter weitere Bibliotheken hinzu. Dieses Script schreibt ab Zeile 132 der Scriptdatei eine Konfigurationsdatei für GDB aus. Sie können zusätzliche Pfade zu Binärdateien usw. angeben, aber die Angabe der richtigen Befehlszeilenparameter sollte ausreichen.

Hinweis:Unter Windows ist für die GDB-Binärdatei libpython2.7.dll erforderlich. Fügen Sie vor dem Starten von debug.py der PATH-Variablen <path-to-ndk>/prebuilt/windows/bin hinzu.

Hinweis:Das Debugging von Native Code funktioniert nicht mit der Standardversion von Android 4.3. Informationen zu Umgehungslösungen finden Sie in diesem öffentlichen Fehlerbericht. Android 4.4 und höher enthalten diesen Fehler nicht.

Tests automatisieren

Deqp-Testmodule können auf unterschiedliche Weise in automatisierte Testsysteme eingebunden werden. Der beste Ansatz hängt von der vorhandenen Testinfrastruktur und der Zielumgebung ab.

Die primäre Ausgabe eines Testlaufs ist immer die Testprotokolldatei, d.h. die Datei mit dem .qpa-Suffix. Die vollständigen Testergebnisse können aus dem Testprotokoll geparst werden. Die Konsolenausgabe enthält nur Informationen zur Fehlerbehebung und ist möglicherweise nicht auf allen Plattformen verfügbar.

Test-Binärdateien können direkt über ein Testautomatisierungssystem aufgerufen werden. Das Test-Binary kann für einen bestimmten Fall, für einen Testsatz oder für alle verfügbaren Tests gestartet werden. Wenn während der Ausführung ein schwerwiegender Fehler auftritt (z. B. bestimmte API-Fehler oder ein Absturz), wird die Testausführung abgebrochen. Für Regressionstests ist es am besten, die Testbinärdateien für einzelne Fälle oder kleine Testsätze separat aufzurufen, damit auch bei einem schweren Fehler Teilergebnisse verfügbar sind.

Der deqp enthält Befehlszeilentools zur Testausführung, die in Kombination mit dem Ausführungsdienst verwendet werden können, um eine robustere Integration zu erreichen. Der Executor erkennt das Ende des Testprozesses und setzt die Testausführung mit dem nächsten verfügbaren Fall fort. Aus der gesamten Testsession wird eine einzelne Protokolldatei erstellt. Diese Konfiguration eignet sich ideal für einfache Testsysteme, die keine Funktionen zur Wiederherstellung nach Abstürzen bieten.

Befehlszeilentools zur Testausführung

Das aktuelle Befehlszeilentool-Set umfasst ein Tool zur Remote-Testausführung, einen Testprotokoll-Vergleichsgenerator für die Regressionsanalyse, einen Testprotokoll-zu-CSV-Konverter, einen Testprotokoll-zu-XML-Konverter und einen Testprotokoll-zu-JUnit-Konverter.

Der Quellcode für diese Tools befindet sich im Verzeichnis executor und die Binärdateien sind im Verzeichnis <builddir>/executor eingebunden.

Befehlszeilen-Testausführer

Der Befehlszeilen-Testausführer ist ein portables C++-Tool zum Starten eines Testlaufs auf einem Gerät und zum Erfassen der resultierenden Protokolle über TCP/IP. Der Executor kommuniziert mit dem Ausführungsdienst (execserver) auf dem Zielgerät. Zusammen bieten sie Funktionen wie die Wiederherstellung nach Abstürzen des Testprozesses. In den folgenden Beispielen wird die Verwendung des Befehlszeilen-Testausführers veranschaulicht. Weitere Informationen finden Sie unter --help.

Beispiel 1: GLES2-Funktionstests auf einem Android-Gerät ausführen
executor --connect=127.0.0.1 --port=50016 --binaryname=
com.drawelements.deqp/android.app.NativeActivity
--caselistdir=caselists
--testset=dEQP-GLES2.* --out=BatchResult.qpa
--cmdline="--deqp-crashhandler=enable --deqp-watchdog=enable
--deqp-gl-config-name=rgba8888d24s8"
Beispiel 2: Teilweisen OpenGL ES 2-Test lokal fortsetzen
executor --start-server=execserver/execserver --port=50016
--binaryname=deqp-gles2 --workdir=modules/opengl
--caselistdir=caselists
--testset=dEQP-GLES2.* --exclude=dEQP-GLES2.performance.* --in=BatchResult.qpa
--out=BatchResult.qpa

Testprotokoll als CSV-Datei exportieren und vergleichen

Das deqp-Tool kann Testprotokolle (qpa-Dateien) in CSV-Dateien konvertieren. Die CSV-Ausgabe enthält eine Liste der Testfälle und ihrer Ergebnisse. Das Tool kann auch zwei oder mehr Batchergebnisse vergleichen und nur die Testfälle auflisten, die in den Eingabe-Batchergebnissen unterschiedliche Statuscodes haben. Außerdem wird die Anzahl der übereinstimmenden Fälle ausgegeben.

Die Ausgabe im CSV-Format eignet sich sehr gut für die weitere Verarbeitung mit standardmäßigen Befehlszeilen-Dienstprogrammen oder mit einem Tabelleneditor. Mit dem folgenden Befehlszeilenargument kann ein zusätzliches, visuell lesbares Format für den Klartext ausgewählt werden: --format=text

Beispiel 1: Testprotokoll im CSV-Format exportieren
testlog-to-csv --value=code BatchResult.qpa > Result_statuscodes.csv
testlog-to-csv --value=details BatchResult.qpa > Result_statusdetails.csv
Beispiel 2: Unterschiede zwischen den Testergebnissen aus zwei Testprotokollen auflisten
testlog-to-csv --mode=diff --format=text Device_v1.qpa Device_v2.qpa

Hinweis:Das Argument --value=code gibt den Testergebniscode aus, z. B. „Pass“ oder „Fail“. Mit dem Argument --value=details wird die weitere Erklärung des Ergebnisses oder des numerischen Werts ausgewählt, der von einem Leistungs-, Funktions- oder Genauigkeitstest generiert wurde.

XML-Export von Testprotokollen

Testprotokolldateien können mit dem Dienstprogramm testlog-to-xml in gültige XML-Dokumente umgewandelt werden. Es werden zwei Ausgabemodi unterstützt:

  • Modus für separate Dokumente, bei dem jeder Testfall und das caselist.xml-Zusammenfassungsdokument in ein Zielverzeichnis geschrieben werden
  • Im Modus „Einzelne Datei“ werden alle Ergebnisse in der .qpa-Datei in ein einzelnes XML-Dokument geschrieben.

Exportierte Testprotokolldateien können mit einem XML-Stylesheet in einem Browser geöffnet werden. Im Verzeichnis doc/testlog-stylesheet finden Sie Beispieldokumente für Stylesheets (testlog.xsl und testlog.css). Wenn Sie die Protokolldateien in einem Browser rendern möchten, kopieren Sie die beiden Stylesheet-Dateien in dasselbe Verzeichnis, in dem sich die exportierten XML-Dokumente befinden.

Wenn Sie Google Chrome verwenden, muss der Zugriff auf die Dateien über HTTP erfolgen, da Chrome den lokalen Dateizugriff aus Sicherheitsgründen einschränkt. Die Standardinstallation von Python enthält einen einfachen HTTP-Server, der mit dem Befehl python –m SimpleHTTPServer 8000 gestartet werden kann, um das aktuelle Verzeichnis bereitzustellen. Nachdem Sie den Server gestartet haben, rufen Sie einfach http://localhost:8000 im Chrome-Browser auf, um das Testprotokoll aufzurufen.

In ein JUnit-Testprotokoll konvertieren

Viele Testautomatisierungssysteme können Testlaufergebnisberichte aus JUnit-Ausgabe generieren. Die deqp-Testprotokolldateien können mit dem Tool „testlog-to-junit“ in das JUnit-Ausgabeformat konvertiert werden.

Das Tool unterstützt derzeit nur die Übersetzung des Testfallurteils. Da JUnit nur die Ergebnisse „Pass“ und „Fail“ unterstützt, wird ein erfolgreiches Ergebnis der deqp-Datei als „JUnit Pass“ zugeordnet und andere Ergebnisse gelten als Fehler. Der ursprüngliche deqp-Ergebniscode ist in der JUnit-Ausgabe verfügbar. Andere Daten wie Protokollmeldungen und Ergebnisbilder bleiben bei der Umwandlung nicht erhalten.

Spezielle Testgruppen verwenden

Einige Testgruppen erfordern möglicherweise spezielle Befehlszeilenoptionen oder unterstützen diese, oder sie erfordern bei der Verwendung auf bestimmten Systemen besondere Vorsicht.

Stresstests für die Arbeitsspeicherzuweisung

Bei Stresstests für die Arbeitsspeicherzuweisung werden Bedingungen für fehlenden Arbeitsspeicher simuliert, indem bestimmte Ressourcen wiederholt zugewiesen werden, bis der Treiber einen Fehler meldet.

Auf bestimmten Plattformen wie Android und den meisten Linux-Varianten kann Folgendes auftreten: Das Betriebssystem beendet möglicherweise den Testprozess, anstatt einem Treiber zu erlauben, einen Fehler wegen fehlenden Arbeitsspeichers zu verarbeiten oder anderweitig zu melden. Auf solchen Plattformen sind Tests, die dazu führen sollen, dass ein „Out-of-Memory“-Fehler auftritt, standardmäßig deaktiviert und müssen mit dem Befehlszeilenargument --deqp-test-oom=enable aktiviert werden. Es wird empfohlen, solche Tests manuell auszuführen, um zu prüfen, ob sich das System bei Ressourcenknappheit richtig verhält. In einer solchen Situation sollte ein Absturz des Testprozesses jedoch als Erfolg gewertet werden.

Testgruppen

dEQP-GLES2.stress.memory.*
dEQP-GLES3.stress.memory.*

Lang andauernde Rendering-Stresstests

Mit Rendering-Stresstests können Sie Robustheitsprobleme bei anhaltender Rendering-Last aufdecken. Standardmäßig werden nur wenige Iterationen ausgeführt. Sie können die Tests jedoch so konfigurieren, dass sie unbegrenzt laufen, indem Sie das Befehlszeilenargument --deqp-test-iteration-count=-1 angeben. Der Test-Watchdog sollte deaktiviert werden (--deqp-watchdog=disable), wenn diese Tests über einen längeren Zeitraum ausgeführt werden.

Testgruppen

dEQP-GLES2.stress.long.*
dEQP-GLES3.stress.long.*