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 zuletzt eingereichten Code arbeiten möchten, verwenden Sie den deqp-dev-Branch. Verwenden Sie für Code, der einem bestimmten Android CTS-Release entspricht, den release-code-name-release-Branch (z.B. für Android 6.0 den marshmallow-release-Branch).

Quelllayout

Das Quellcodelayout für die DEQP-Testmodule und unterstützenden Bibliotheken ist in der folgenden Tabelle dargestellt. Die Auflistung ist nicht vollständig, sondern enthält nur die wichtigsten Verzeichnisse.

Verzeichnis Beschreibung
android

Android-Testerquellen und Build-Scripts

data

Testdatendateien

modules

Quellen für Testmodule

modules/egl

EGL-Modul

modules/gles2

GLES2-Modul

modules/gles3

GLES3-Modul

modules/gles31

GLES3.1-Modul

modules/gles32

GLES3.2-Modul

targets

Zielgerätspezifische Build-Konfigurationsdateien

framework

deqp-Testmodul-Framework und ‑Dienstprogramme

framework/delibs

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 Ausführung von Tests

external

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

Open-Source-Komponenten

Das deqp verwendet libpng und zlib, die mit dem Skript 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 die Portabilität entwickelt. Die einzigen obligatorischen Anforderungen sind die vollständige C++-Unterstützung und Standard-Systembibliotheken für E/A, Threads und Sockets.

CMake-Build-System

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

CMake ist ein Open-Source-Build-System, 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. Das bedeutet, dass Sie Makefiles oder Projektdateien immer in einem separaten Build-Verzeichnis außerhalb des Quellbaums erstellen sollten. CMake hat kein „distclean“-Ziel. Alle von CMake generierten Dateien müssen also manuell entfernt werden.

Konfigurationsoptionen werden an CMake übergeben, indem die -DOPTION_NAME=VALUE-Syntax verwendet wird. Im Folgenden sind einige häufig verwendete Optionen für deqp aufgeführt.

Konfigurationsoption Beschreibung
DEQP_TARGET

Zielname, z. B. „android“

Die DEQP-CMake-Skripts enthalten die Datei targets/DEQP_TARGET/DEQP_TARGET.cmake und erwarten dort zielgerätespezifische Build-Optionen.

CMAKE_TOOLCHAIN_FILE

Pfad zur Toolchain-Datei für CMake. Wird für die Cross-Compilation 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-Build-Datei erstellen

Das DEQP-Build-System wird für neue Ziele mit Ziel-Build-Dateien konfiguriert. In einer Ziel-Build-Datei wird definiert, 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 durch die Ziel-Build-Datei festgelegt werden.

Variable Beschreibung
DEQP_TARGET_NAME

Zielname (wird in 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 das Build-Verzeichnis jeder Testbinärdatei kopiert werden. Kann verwendet werden, um Bibliotheken zu kopieren, die zum Ausführen von Tests erforderlich sind, sich aber nicht im Standardsuchpfad befinden.

TCUTIL_PLATFORM_SRCS

Liste der Plattformportquellen. Die Standardquellen werden basierend auf den Funktionen und dem Betriebssystem bestimmt.

Hinweis:Pfade sind relativ zu: framework/platform

In der Ziel-Build-Datei können mit den CMake-Funktionen include_directories() und link_directories() zusätzliche Include- oder Link-Pfade 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. Die 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"

Eine 64-Bit-Version kann erstellt werden, indem Sie „Visual Studio VERSION Win64“ als Build-Generator auswählen:

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

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

Kontext für das Rendern 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 dafür 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. Dies 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 dynamischem Laden für EGL unter Windows erstellt, wenn DEQP_SUPPORT_EGL auf ON gesetzt ist. Dies ist die Standardeinstellung für die meisten Ziele. Wenn auf dem Host EGL-Bibliotheken verfügbar sind, können Sie Tests mit dem Befehlszeilenparameter --deqp-gl-context-type=egl ausführen.

Android-Build

Beim Android-Build werden CMake-Build-Skripts zum Erstellen des nativen Testcodes verwendet. Java-Teile, d.h. der Test Execution Server und der Test Application Stub, werden mit den Standard-Android-Build-Tools kompiliert.

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

  • Die aktuelle Version des Android NDK. Die erforderliche Version ist in der Datei android/scripts/common.py aufgeführt.
  • Eigenständiges Android-SDK mit API 13, SDK-Tools, SDK-Plattformtools und SDK-Build-Tools installiert
  • 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: Entweder NMake oder JOM in PATH
    • JOM ermöglicht schnellere Builds
  • Optional: Ninja Make wird auch unter Linux unterstützt.

Ant- und SDK-Binärdateien werden anhand der Umgebungsvariable PATH mit bestimmten überschreibenden Standardeinstellungen gesucht. 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-Skripts erstellt. Die endgültige APK-Datei wird in android/package/bin erstellt und kann mit dem Skript install.py installiert werden. Wenn der Befehlszeilen-Executor verwendet wird, wird der ExecService mit dem launch.py-Script auf dem Gerät über ADB gestartet. Die Skripts können aus einem beliebigen Verzeichnis ausgeführt werden.

Linux-Build

Testbinärdateien und Befehlszeilenprogramme 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, das die CMake-Plattform-Introspektion verwendet, um die Unterstützung für verschiedene APIs zu ermitteln.

x11_glx

Verwendet GLX zum Erstellen von OpenGL-Kontexten (ES).

x11_egl

Verwendet EGL zum Erstellen von OpenGL-(ES-)Kontexten.

x11_egl_glx

Unterstützt sowohl GLX als auch EGL mit X11.

Verwenden Sie immer -DCMAKE_BUILD_TYPE=<Debug|Release>, um den Build-Typ 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 zusätzliche Argumente an den Compiler übergeben. Der 32-Bit- oder 64-Bit-Build kann beispielsweise durch Festlegen von -DCMAKE_C(XX)_FLAGS="-m32" bzw. "-m64" erfolgen. Wenn nichts angegeben ist, wird die native Architektur der Toolchain verwendet, in der Regel 64-Bit bei der 64-Bit-Toolchain.

Mit den Argumenten -DCMAKE_LIBRARY_PATH und -DCMAKE_INCLUDE_PATH können Sie CMake zusätzliche Bibliotheks- oder Include-Suchpfade angeben.

Ein Beispiel für eine vollständige Befehlszeile, die zum Erstellen eines 32-Bit-Debug-Build anhand von Treiberheadern und ‑bibliotheken an einem benutzerdefinierten Speicherort verwendet wird, ist das Folgende:

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

Cross-Compiling kann mit einer CMake-Toolchain-Datei erreicht werden. In der Toolchain-Datei wird der zu verwendende Compiler zusammen mit benutzerdefinierten Suchpfaden für Bibliotheken und Headern angegeben. Das Release-Paket enthält mehrere Toolchain-Dateien für gängige Szenarien im Verzeichnis framework/delibs/cmake.

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 korrekt erkennen, DE_CPU muss jedoch von 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

Für das Linken benötigt deqp keine Einstiegspunkte der zu testenden API. Der Testcode greift immer über Funktionszeiger auf die APIs zu. Einstiegspunkte können dann zur Laufzeit dynamisch geladen werden oder der Plattformport kann sie zur Linkzeit bereitstellen.

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

Test-Framework portieren

Das Portieren von deqp umfasst drei Schritte: Anpassen der grundlegenden Portierungsbibliotheken, Implementieren von Schnittstellen für die Plattformintegration des Test-Frameworks und Portieren des Ausführungsdienstes.

In der folgenden Tabelle sind Orte aufgeführt, an denen wahrscheinlich Änderungen bei der Portierung vorgenommen werden müssen. 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

Der neue Plattformport und der Anwendungs-Stub können wie unter Testframework-Plattformport beschrieben implementiert werden.

Basispotabilitätsbibliotheken

Die grundlegenden Portabilitätsbibliotheken 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 grundlegenden Portabilitätsbibliotheken höchstwahrscheinlich überhaupt nicht ändern.

Plattformport des Testframeworks

Der Plattformport des DEQP-Testframeworks erfordert zwei Komponenten: einen Anwendungseinstiegspunkt und eine Implementierung der Plattformschnittstelle.

Der Anwendungseinstiegspunkt ist für das Erstellen des Plattformobjekts, das Erstellen eines Befehlszeilenobjekts (tcu::CommandLine), das Öffnen eines Testlogs (tcu::TestLog) und das Durchlaufen der Testanwendung (tcu::App) verantwortlich. Wenn das Zielbetriebssystem einen Standardeinstiegspunkt (main()) unterstützt, kann tcuMain.cpp als Einstiegspunktimplementierung 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-Plattformschnittstelle

framework/platform/tcuMain.cpp

Standardanwendungseinstiegspunkt

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 eine Übersicht darüber, was implementiert werden muss, um die Tests auszuführen.

Modul Schnittstelle

OpenGL (ES)-Testmodule

GL-Plattformschnittstelle

EGL-Testmodul

EGL-Plattformschnittstelle

Eine detaillierte Anleitung zur Implementierung von Plattform-Ports finden Sie in den Headern der Portierungsebene.

Dienst zur Testausführung

Wenn Sie die DEQP-Testausführungsinfrastruktur oder den Befehlszeilen-Executor verwenden möchten, muss der Testausführungsdienst auf dem Ziel verfügbar sein. Eine portable C++-Implementierung des Dienstes ist im Verzeichnis execserver verfügbar. Das eigenständige Binärprogramm wird im Rahmen des Builds des DEQP-Testmoduls für PC-Ziele erstellt. Sie können execserver/CMakeLists.txt ändern, um einen Build für andere Ziele zu ermöglichen.

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 die Verbindung zum Client getrennt wird. Standardmäßig bleibt der Serverprozess aktiv, um weitere Testausführungsanfragen zu bearbeiten.

Tests ausführen

Auf dieser Seite finden Sie Anleitungen zum Ausführen von DEQP-Tests in Linux- und Windows-Umgebungen mit Befehlszeilenargumenten und zum Arbeiten mit dem Android-Anwendungspaket.

Linux- und Windows-Umgebungen

Kopieren Sie zuerst die folgenden Dateien und Verzeichnisse auf das Zielgerät.

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 die Testbinärdateien an einem beliebigen Ort im Zieldateisystem bereitstellen. Die Testbinärdateien erwarten jedoch, dass sich die Datenverzeichnisse im aktuellen Arbeitsverzeichnis befinden. Starten Sie den Test Execution Service auf dem Zielgerät, wenn Sie bereit sind. 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ühren Sie Testläufe aus, die einem bestimmten Muster entsprechen. Platzhalter (*) werden unterstützt.
--deqp-log-filename=<filename> Schreibt die Testergebnisse in die Datei, deren Namen Sie angeben. Der Dienst für die Testausführung legt den Dateinamen beim Starten eines Tests fest.
--deqp-stdin-caselist
--deqp-caselist=<caselist>
--deqp-caselist-file=<filename>
Liest die Fallliste aus stdin oder aus einem angegebenen Argument. Der Testausführungsdienst legt das Argument entsprechend der empfangenen Ausführungsanfrage fest. Eine Beschreibung des Formats der Fallliste finden Sie im nächsten Abschnitt.
--deqp-test-iteration-count=<count> Überschreibt die Anzahl der Iterationen für Tests, die eine variable Anzahl von Iterationen unterstützen.
--deqp-base-seed=<seed> Basisausgangswert für die Testläufe, bei denen Randomisierung verwendet wird.

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> Führen Sie Tests für die angegebene GL-Konfigurations-ID aus. 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 lautet das Format rgb(a)<bits>d<bits>s<bits>. Bei einem Wert von rgb888s8 wird beispielsweise die erste Konfiguration ausgewählt, bei der der Farbpuffer RGB888 und der Schablonenpuffer 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 dafür ist optional.
--deqp-surface-type=<type> Verwenden Sie einen bestimmten Oberflächentyp als primäres Ziel für das Testrendering. 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 Testlaufliste

Die Testfallliste kann in zwei Formaten angegeben werden. Bei der ersten Option wird der vollständige Name jedes Tests in einer separaten Zeile in einer Standard-ASCII-Datei aufgeführt. Wenn die Testsets größer werden, können die sich wiederholenden Präfixe umständlich sein. Um die Präfixe nicht zu wiederholen, verwenden Sie die unten gezeigte Trie-Syntax (auch als Präfixbaum bezeichnet).

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

Beispiel:

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

Das führt zu den folgenden beiden Testläufen:

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

Android

Das Android-Anwendungspaket enthält alle erforderlichen Komponenten, einschließlich des Testausführungsdienstes, der Testbinärdateien und der Datendateien. Die Testaktivität ist ein NativeActivity, der 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

Verwenden Sie Folgendes, um den Dienst für die Testausführung zu starten und die Portweiterleitung einzurichten:

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

Debug-Ausgaben können aktiviert werden, indem Sie vor dem Starten 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 zur Testausführung manuell starten möchten, erstellen Sie eine Android-Intention, die auf android.app.NativeActivity ausgerichtet ist. Die Aktivitäten sind im com.drawelements.deqp-Paket enthalten. Die Befehlszeile muss als zusätzlicher String mit dem Schlüssel "cmdLine" im Intent angegeben werden.

Ein Test-Log wird in /sdcard/dEQP-log.qpa geschrieben. Wenn der Testlauf nicht normal startet, sind zusätzliche Debugging-Informationen im Geräteprotokoll verfügbar.

Sie können eine Aktivität über die Befehlszeile mit dem Tool am 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"'

Auf Android debuggen

Wenn Sie die Tests unter dem GDB-Debugger auf Android ausführen möchten, müssen Sie zuerst den Debug-Build kompilieren und installieren, indem Sie die folgenden beiden Skripts 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 wurde, führen Sie den folgenden Befehl aus, um die Tests unter GDB auf dem Host zu starten:

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 Testläufen und anderen erforderlichen Parametern ab. Mit dem Skript wird am Anfang der DEQP-Ausführung (tcu::App::App) ein Standard-Haltepunkt hinzugefügt.

Das debug.py-Skript akzeptiert mehrere Befehlszeilenargumente für Aktionen wie das Festlegen von Haltepunkten für das Debugging, gdbserver-Verbindungsparameter und Pfade zu zusätzlichen zu debuggenden Binärdateien (verwenden Sie debug.py --help für alle Argumente und Erklärungen). Das Skript kopiert auch einige Standardbibliotheken vom Zielgerät, um Symbollisten zu erhalten.

Wenn Sie den Treibercode durchgehen möchten (z. B. wenn GDB die Speicherorte der Binärdateien mit vollständigen Debugging-Informationen kennen muss), fügen Sie weitere Bibliotheken über die debug.py-Befehlszeilenparameter hinzu. Dieses Skript schreibt ab Zeile 132 der Skriptdatei eine Konfigurationsdatei für den GDB. 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 die Variable <path-to-ndk>/prebuilt/windows/bin zur PATH-Variablen hinzu.

Hinweis:Das Debugging von nativem Code funktioniert nicht unter Android 4.3. Informationen zu Workarounds finden Sie in diesem öffentlichen Fehler. In Android 4.4 und höher tritt dieser Fehler nicht auf.

Tests automatisieren

DEQP-Testmodule können auf verschiedene Arten 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 Suffix .qpa. Die vollständigen Testergebnisse können aus dem Testlog geparst werden. Die Konsolenausgabe enthält nur Debugging-Informationen und ist möglicherweise nicht auf allen Plattformen verfügbar.

Testbinärdateien können direkt über ein Testautomatisierungssystem aufgerufen werden. Das Test-Binärprogramm 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, um auch bei einem schwerwiegenden Fehler Teilergebnisse zu erhalten.

Das DEQP enthält Befehlszeilentools für die Testausführung, die in Kombination mit dem Ausführungsservice für eine robustere Integration verwendet werden können. Der Executor erkennt das Beenden des Testprozesses und setzt die Testausführung mit dem nächsten verfügbaren Testfall fort. Aus der gesamten Testsitzung wird eine einzige Protokolldatei erstellt. Diese Einrichtung ist ideal für einfache Testsysteme, die keine Funktionen zur Wiederherstellung nach Abstürzen bieten.

Befehlszeilentools für die Testausführung

Das aktuelle Befehlszeilentoolset umfasst ein Tool zur Remote-Testausführung, einen Generator für den Vergleich von Testlogs für die Regressionsanalyse, einen Testlog-zu-CSV-Konverter, einen Testlog-zu-XML-Konverter und einen Testlog-zu-JUnit-Konverter.

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

Befehlszeilen-Testausführung

Der Befehlszeilen-Test-Executor ist ein portables C++-Tool zum Starten eines Testlaufs auf einem Gerät und zum Erfassen der resultierenden Logs ü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. Die folgenden Beispiele veranschaulichen die Verwendung des Befehlszeilen-Test-Executors (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: Einen teilweisen OpenGL ES 2-Testlauf 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 enthält ein Tool zum Konvertieren von Testprotokollen (.qpa-Dateien) in CSV-Dateien. Die CSV-Ausgabe enthält eine Liste der Testläufe und ihrer Ergebnisse. Das Tool kann auch zwei oder mehr Batch-Ergebnisse vergleichen und nur die Testläufe auflisten, die in den eingegebenen Batch-Ergebnissen unterschiedliche Statuscodes haben. Beim Vergleich wird auch die Anzahl der übereinstimmenden Fälle ausgegeben.

Die Ausgabe im CSV-Format ist sehr praktisch für die Weiterverarbeitung mit Standard-Befehlszeilenprogrammen oder mit einem Tabellenkalkulationsprogramm. Mit dem folgenden Befehlszeilenargument können Sie ein zusätzliches, menschenlesbares Nur-Text-Format auswählen: --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 zweier Testlogs 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. „Bestanden“ oder „Nicht bestanden“. Mit dem Argument --value=details wird die weitere Erläuterung des Ergebnisses oder numerischen Werts ausgewählt, der durch einen Leistungs-, Funktions- oder Genauigkeitstest generiert wird.

XML-Export von Testprotokollen

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

  • Modus „Separate Dokumente“, in dem jeder Testlauf und das caselist.xml-Zusammenfassungsdokument in ein Zielverzeichnis geschrieben werden
  • Modus mit einer einzelnen Datei, in dem alle Ergebnisse in der Datei .qpa in ein einzelnes XML-Dokument geschrieben werden.

Exportierte Testprotokolldateien können in einem Browser mit einem XML-Stylesheet angezeigt werden. Beispieldokumente für Stylesheets (testlog.xsl und testlog.css) sind im Verzeichnis doc/testlog-stylesheet verfügbar. Wenn Sie die Logdateien 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 über HTTP auf die Dateien zugegriffen werden, da Chrome aus Sicherheitsgründen den Zugriff auf lokale Dateien einschränkt. Die Standard-Python-Installation enthält einen einfachen HTTP-Server, der mit dem Befehl python –m SimpleHTTPServer 8000 gestartet werden kann, um das aktuelle Verzeichnis bereitzustellen. Nach dem Starten des Servers müssen Sie nur noch mit dem Chrome-Browser auf http://localhost:8000 zugreifen, um das Testprotokoll aufzurufen.

Konvertierung in ein JUnit-Testprotokoll

Viele Testautomatisierungssysteme können Testlaufberichte aus der JUnit-Ausgabe generieren. Die DEQP-Testlogdateien können mit dem Tool „testlog-to-junit“ in das JUnit-Ausgabeformat konvertiert werden.

Derzeit unterstützt das Tool nur die Übersetzung des Testfallurteils. Da JUnit nur die Ergebnisse „Bestanden“ und „Fehler“ unterstützt, wird ein bestandenes Ergebnis des deqp auf „JUnit-Bestanden“ abgebildet und andere Ergebnisse werden als Fehler betrachtet. Der ursprüngliche deqp-Ergebniscode ist in der JUnit-Ausgabe verfügbar. Andere Daten wie Log-Meldungen und Ergebnisbilder bleiben bei der Konvertierung nicht erhalten.

Spezielle Testgruppen verwenden

Für einige Testgruppen sind möglicherweise spezielle Befehlszeilenoptionen erforderlich oder werden unterstützt. Bei der Verwendung auf bestimmten Systemen ist besondere Vorsicht geboten.

Stresstests für die Arbeitsspeicherzuweisung

Bei Speichertests werden Bedingungen für fehlenden Speicherplatz simuliert, indem bestimmte Ressourcen wiederholt zugewiesen werden, bis der Treiber einen Fehler aufgrund von fehlendem Speicherplatz meldet.

Auf bestimmten Plattformen wie Android und den meisten Linux-Varianten kann Folgendes passieren: Das Betriebssystem beendet den Testprozess möglicherweise, anstatt einem Treiber zu erlauben, einen Fehler aufgrund von zu wenig Arbeitsspeicher zu beheben oder anderweitig zu behandeln. Auf solchen Plattformen sind Tests, die darauf ausgelegt sind, Out-of-Memory-Fehler zu verursachen, 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 Ressourcenengpässen richtig verhält. In einer solchen Situation sollte ein Absturz des Testprozesses jedoch als bestanden interpretiert werden.

Testgruppen

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

Langzeit-Rendering-Stresstests

Rendering-Stresstests sollen Robustheitsprobleme bei anhaltender Rendering-Last aufdecken. Standardmäßig werden die Tests nur wenige Male ausgeführt. Sie können jedoch so konfiguriert werden, dass sie unbegrenzt ausgeführt werden, 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.*