AOSP には、drawElements Quality Program(deqp)GPU テストスイートが含まれています(https://android.googlesource.com/platform/external/deqp)。このページでは、deqp テストスイートを新しい環境にデプロイする方法について詳細に説明します。
サブミットされた最新のコードを利用するには、deqp-dev
ブランチを使用します。特定の Android CTS リリースに対応するコードの場合は、release-code-name-release
ブランチ(たとえば Android 6.0 では marshmallow-release
ブランチ)を使用します。
ソース レイアウト
以下の表に、deqp テスト モジュールとサポート ライブラリのソースコード レイアウトを示します(すべてを網羅したリストではありませんが、最も重要なディレクトリを紹介しています)。
ディレクトリ | 説明 |
---|---|
android |
Android のテスターソースとビルド スクリプト |
data |
テスト データファイル |
modules |
テスト モジュール ソース |
modules/egl |
EGL モジュール |
modules/gles2 |
GLES2 モジュール |
modules/gles3 |
GLES3 モジュール |
modules/gles31 |
GLES3.1 モジュール |
modules/gles32 |
GLES3.2 モジュール |
targets |
ターゲット固有のビルド構成ファイル |
framework |
deqp テスト モジュールのフレームワークとユーティリティ |
framework/delibs |
ベース ポータビリティ ライブラリとビルド ライブラリ |
framework/platform |
プラットフォーム ポート |
framework/qphelper |
テスト プログラム統合ライブラリ(C) |
framework/common |
deqp フレームワーク(C++) |
framework/opengl, framework/egl |
API 固有のユーティリティ |
execserver |
デバイス側の ExecServer ソース |
executor |
ホスト側のテスト実行シェルツールとユーティリティ |
external |
外部ライブラリ libpng と zlib 用のビルド スタブ ディレクトリ |
オープンソース コンポーネント
deqp では libpng
と zlib
(スクリプト platform/external/deqp/external/fetch_sources.py
を使用するか、git で platform/external/[libpng,zlib]
から取得できる)が使用されます。
テスト プログラムをビルドする
テスト フレームワークは、ポータビリティ(移植性)を考慮して設計されています。必須要件は、C++ のフルサポートと、I/O、スレッド、ソケット用の標準システム ライブラリのみです。
CMake ビルドシステム
deqp ソースには、テスト プログラムをコンパイルするための推奨ツールである CMake のビルド スクリプトが用意されています。
CMake は、複数のプラットフォームとツールチェーンをサポートするオープンソース ビルドシステムです。CMake は、ターゲットに依存しない構成ファイルからネイティブ makefile または IDE プロジェクト ファイルを生成します。CMake の詳細については、CMake のドキュメントをご覧ください。
CMake は、ソースツリー外のビルドをサポートおよび推奨しています。つまり、makefile またはプロジェクト ファイルは必ずソースツリー外のビルド ディレクトリに作成するようにします。CMake には「distclean」ターゲットがまったくないため、CMake で生成されたファイルの削除は手動で行う必要があります。
構成オプションは、-DOPTION_NAME=VALUE
構文を使用して CMake に渡されます。deqp の一般的なオプションの一部を以下に示します。
構成オプション | 説明 |
---|---|
DEQP_TARGET |
ターゲット名(「android」など) deqp の CMake スクリプトはファイル |
CMAKE_TOOLCHAIN_FILE |
CMake のツールチェーン ファイルへのパス。クロスコンパイルに使用されます。 |
CMAKE_BUILD_TYPE |
makefile ターゲットのビルドタイプ。有効な値は「Debug」と「Release」です。 解釈とデフォルトのタイプは、ターゲットとなるビルドシステムによって異なります。詳しくは、CMake のドキュメントをご覧ください。 |
ターゲット ビルドファイルを作成する
新しいターゲットの deqp ビルドシステムは、ターゲット ビルドファイルを使用して構成されます。ターゲット ビルドファイルは、プラットフォームがサポートする機能と、必要なライブラリまたは追加インクルード パスを定義します。ターゲット ファイル名は targets/NAME/NAME.cmake
形式で指定し、ターゲットは DEQP_TARGET
ビルド パラメータを使用して選択します。
ターゲット ファイル内のファイルパスは、targets/NAME
ディレクトリではなく deqp
ベース ディレクトリに対する相対パスです。ターゲット ビルドファイルによって以下の標準変数を設定できます。
変数 | 説明 |
---|---|
DEQP_TARGET_NAME |
ターゲット名(テストログに含まれる) |
DEQP_SUPPORT_GLES2 |
GLES2 がサポートされているかどうか(デフォルト: OFF) |
DEQP_GLES2_LIBRARIES |
GLES2 ライブラリ(サポートされていない場合、または動的読み込みが使用されている場合は空白にする) |
DEQP_SUPPORT_GLES3 |
GLES3.x がサポートされているかどうか(デフォルト: OFF) |
DEQP_GLES3_LIBRARIES |
GLES3.x ライブラリ(サポートされていない場合、または動的読み込みが使用されている場合は空白にする) |
DEQP_SUPPORT_VG |
OpenVG がサポートされているかどうか(デフォルト: OFF) |
DEQP_OPENVG_LIBRARIES |
OpenVG ライブラリ(サポートされていない場合、または動的読み込みが使用されている場合は空白にする) |
DEQP_SUPPORT_EGL |
EGL がサポートされているかどうか(デフォルト: OFF) |
DEQP_EGL_LIBRARIES |
EGL ライブラリ(サポートされていない場合、または動的読み込みが使用されている場合は空白にする) |
DEQP_PLATFORM_LIBRARIES |
リンクに必要なその他のプラットフォーム固有のライブラリ |
DEQP_PLATFORM_COPY_LIBRARIES |
各テストバイナリ ビルド ディレクトリにコピーされるライブラリのリスト。テストの実行に必要であるにもかかわらず、デフォルトの検索パスに含まれていないライブラリをコピーするために使用できます。 |
TCUTIL_PLATFORM_SRCS |
プラットフォーム ポートのソースのリスト。デフォルトのソースは、機能と OS に基づいて決定されます。 注: パスは |
ターゲット ビルドファイルで include_directories()
および link_directories()
CMake 関数を使用して、インクルード パスまたはリンクパスを追加できます。
Win32 ビルド
Windows 用の deqp モジュールをビルドする最も簡単な方法は、CMake ビルドシステムを使用することです。CMake 2.6.12 以降と Microsoft Visual C / C++ コンパイラが必要になります。deqp は Visual Studio 2013 でテスト済みです。
Visual Studio プロジェクト ファイルは、次のコマンドで生成できます。
cmake path\to\src\deqp -G "Visual Studio 12"
64 ビットビルドを作成するには、ビルド生成ツールとして「Visual Studio VERSION Win64」を選択します。
cmake path\to\src\deqp -G "Visual Studio 12 Win64"
-G "NMake Makefiles"
オプションとビルドタイプ(-DCMAKE_BUILD_TYPE="Debug"
または "Release"
)を指定して、NMake makefile を生成することもできます。
レンダリング コンテキストの作成
Windows の場合、レンダリング コンテキストは WGL または EGL を使用して作成できます。
WGL サポート
すべての Win32 バイナリは、標準ライブラリ以外を必要としないため、WGL を使用した GL コンテキストの作成がサポートされます。WGL コンテキストは、--deqp-gl-context-type=wgl
コマンドライン引数を使用して選択できます。WGL モードでは、deqp は WGL_EXT_create_context_es_profile
拡張を使用して OpenGL ES コンテキストを作成します。これは、NVIDIA と Intel の最新ドライバでの動作をテスト済みです。AMD ドライバは、必要な拡張をサポートしていません。
EGL サポート
DEQP_SUPPORT_EGL が ON の場合は、Windows で EGL を動的に読み込むよう deqp がビルドされます。これは、ほとんどのターゲットのデフォルトです。ホストに使用可能な EGL ライブラリがある場合は、コマンドライン パラメータ --deqp-gl-context-type=egl
を使用してテストを実行できます。
Android ビルド
Android ビルドでは、ネイティブ テストコードのビルドに CMake ビルド スクリプトを使用します。テスト実行サーバーやテストアプリ スタブなど、Java を使用する部分は、標準の Android ビルドツールを使用してコンパイルされます。
提供されたビルド スクリプトを使用して Android の deqp テスト プログラムをコンパイルするには、以下が必要です。
- 最新バージョンの Android NDK(
android/scripts/common.py
ファイルに必要なバージョンがリストされています) - API 13、SDK Tools、SDK Platform Tools、SDK Build Tools パッケージがインストールされた Android スタンドアロン SDK
- Apache Ant 1.9.4(Java コードビルドで必要)
- CMake 2.8.12 以降
- 2.x シリーズの Python 2.6 以降(Python 3.x はサポートされていません)
- Windows の場合: NMake または JOM(
PATH
が通ったディレクトリにあること)- JOM を使用するとより高速にビルドできます
- (省略可)Linux では Ninja make もサポートされています
Ant バイナリと SDK バイナリは、特定のオーバーライド デフォルト値を持つ PATH 環境変数に基づいて配置されます。ロジックは android/scripts/common.py
によって制御されます。
NDK ディレクトリは、~/android-ndk-VERSION
または C:/android/android-ndk-VERSION
を使用するか、ANDROID_NDK_PATH
環境変数によって定義する必要があります。
deqp のデバイス上のコンポーネント、テスト実行サービス、テスト プログラムは、android/scripts/build.py
スクリプトを実行することでビルドされます。最終的な .apk は android/package/bin
に作成され、install.py
スクリプトを使用してインストールできます。コマンドライン エグゼキュータを使用している場合は、adb を経由してデバイスで launch.py
スクリプトを使用して ExecService を起動します。スクリプトはどのディレクトリからでも実行できます。
Linux ビルド
Linux 用にテストバイナリとコマンドライン ユーティリティをビルドするには、CMake を使用して makefile を生成します。Linux 向けのビルドを行う際に有用な複数のビルド ターゲットが事前に定義されています。
ビルド ターゲット | 説明 |
---|---|
default |
CMake プラットフォームのイントロスペクションを使用して各種 API のサポートを決定するデフォルトのターゲット。 |
x11_glx |
GLX を使用して OpenGL(ES)コンテキストを作成します。 |
x11_egl |
EGL を使用して OpenGL(ES)コンテキストを作成します。 |
x11_egl_glx |
X11 で GLX と EGL の両方をサポートします。 |
必ず -DCMAKE_BUILD_TYPE=<Debug|Release>
を使用してビルドタイプの定義を行うようにしてください。適切なデフォルトは Release
です。これを使用しない場合は、デフォルトの最適化されていないリリースビルドが作成されます。
-DCMAKE_C_FLAGS
と -DCMAKE_CXX_FLAGS
のコマンドライン引数を使用して、追加の引数をコンパイラに渡すことができます。たとえば、32 ビットまたは 64 ビットのビルドを行うには、それぞれ -DCMAKE_C(XX)_FLAGS="-m32"
または "-m64"
を設定します。これを指定しないと、ツールチェーンのネイティブ アーキテクチャ(通常、64 ビットのツールチェーンでは 64 ビット)が使用されます。
CMake は -DCMAKE_LIBRARY_PATH
引数と -DCMAKE_INCLUDE_PATH
引数を使用して、CMake の追加ライブラリを渡す、または検索パスを追加することができます。
次の例は、特定の場所にあるドライバ ヘッダーおよびライブラリに対して 32 ビット デバッグビルドを実行する際に使用する完全なコマンドラインです。
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
クロスコンパイル
クロスコンパイルは、CMake ツールチェーン ファイルを使用して実施できます。ツールチェーン ファイルは、ライブラリとヘッダーのカスタム検索パスに加えて、使用するコンパイラを指定します。一般的なシナリオ用のツールチェーン ファイルが、framework/delibs/cmake
ディレクトリのリリース パッケージに複数含まれています。
標準の CMake 変数に加えて、次の deqp 固有の変数をツールチェーン ファイルで設定できます。CMake では通常、DE_OS
、DE_COMPILER
、DE_PTR_SIZE
を正しく検出できますが、DE_CPU
はツールチェーン ファイルで設定する必要があります。
変数 | 説明 |
---|---|
DE_OS |
オペレーティング システム。サポートされている値: |
DE_COMPILER |
コンパイラのタイプ。サポートされている値: |
DE_CPU |
CPU のタイプ。サポートされている値: |
DE_PTR_SIZE |
プラットフォームの sizeof(void*)。サポートされている値: 4、8 |
ツールチェーン ファイルは、CMAKE_TOOLCHAIN_FILE
ビルド パラメータを使用して選択できます。たとえば、次のように ARM / Linux 用の CodeSourcery クロスコンパイラを使用してビルドの makefile を作成できます。
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
GLES ライブラリと EGL ライブラリの実行時リンク
deqp では、リンク時にテスト対象 API のエントリ ポイントは必要ありません。テストコードは、常に関数ポインタを介して API にアクセスします。エントリ ポイントは、実行時に動的に読み込むことも、リンク時にプラットフォーム ポートで提供することもできます。
ビルド設定で API のサポートが有効になっており、リンク ライブラリが指定されていない場合、deqp は必要なエントリ ポイントを実行時に読み込みます。静的リンクが必要な場合は、必要なリンク ライブラリを DEQP_<API>_LIBRARIES
ビルド構成変数で指定してください。
テスト フレームワークを移植する
deqp の移植は、ベース ポータビリティ ライブラリの適合化、テストフレームワーク プラットフォーム統合インターフェースの実装、実行サービスの移植という 3 つのステップで構成されます。
次の表に、移植による変更の可能性がある場所を示します。これら以外の変更はまれです。
場所 | 説明 |
---|---|
framework/delibs/debase |
OS 固有のコードの必要な実装。 |
framework/qphelper/qpCrashHandler.c |
(任意)使用している OS 用の実装。 |
framework/qphelper/qpWatchDog.c |
使用している OS 用の実装。現在の実装は、 |
framework/platform |
新しいプラットフォーム ポートとアプリスタブは、テスト フレームワークのプラットフォーム ポートで説明しているとおりに実装できます。 |
ベース ポータビリティ ライブラリ
ベース ポータビリティ ライブラリでは、Windows、ほとんどの Linux、Mac OS、iOS、Android がすでにサポートされています。テスト ターゲットがこれらのオペレーティング システムのいずれかで実行されている場合、ベース ポータビリティ ライブラリで必要な手順はほぼないと考えられます。
テスト フレームワークのプラットフォーム ポート
deqp テスト フレームワークのプラットフォーム ポートには、アプリ エントリ ポイントとプラットフォーム インターフェース実装の 2 つのコンポーネントが必要です。
アプリのエントリ ポイントは、プラットフォーム オブジェクトとコマンドライン(tcu::CommandLine
)オブジェクトを作成し、テストログ(tcu::TestLog
)を開いて、テストアプリ(tcu::App
)を反復処理します。ターゲット OS が標準の main()
エントリ ポイントをサポートしている場合は、エントリ ポイントの実装として tcuMain.cpp
を使用できます。
deqp プラットフォーム API の詳細は、次のファイルに記述されています。
ファイル | 説明 |
---|---|
framework/common/tcuPlatform.hpp |
すべてのプラットフォーム ポートの基本クラス |
framework/opengl/gluPlatform.hpp |
OpenGL プラットフォーム インターフェース |
framework/egl/egluPlatform.hpp |
EGL プラットフォーム インターフェース |
framework/platform/tcuMain.cpp |
標準アプリのエントリ ポイント |
すべてのプラットフォーム ポートの基本クラスは tcu::Platform
です。プラットフォーム ポートは、GL 固有および EGL 固有のインターフェースにも対応しています。テストの実行に必要な実装の概要については、次の表をご覧ください。
モジュール | インターフェース |
---|---|
OpenGL(ES)テスト モジュール |
GL プラットフォーム インターフェース |
EGL テスト モジュール |
EGL プラットフォーム インターフェース |
プラットフォーム ポートを実装する際の詳しい手順については、移植レイヤのヘッダーに記載されています。
テスト実行サービス
deqp テスト実行インフラストラクチャまたはコマンドライン エグゼキュータを使用するには、テスト実行サービスをターゲットで使用できる必要があります。サービスのポータブルな C++ 実装は、execserver
ディレクトリにあります。スタンドアロン バイナリは、PC ターゲット向けの deqp テスト モジュール ビルドの一部としてビルドされます。execserver/CMakeLists.txt
を変更して、他のターゲットでビルドを有効にできます。
C++ バージョンのテスト実行サービスは、次の 2 つのコマンドライン パラメータを受け取ります。
-
--port=<port>
はサーバーがリッスンする TCP ポートを設定します。デフォルトは 50016 です。 -
--single
を指定すると、クライアントの接続が解除されたときにサーバー プロセスを終了します。デフォルトでは、以降のテスト実行リクエストを処理するためにサーバー プロセスが維持されます。
テストを実行する
このページでは、Linux および Windows 環境での deqp テストの実行、コマンドライン引数の使用、Android アプリ パッケージの利用について説明します。
Linux 環境と Windows 環境
まず、次のファイルとディレクトリをターゲットにコピーします。
モジュール | ディレクトリ | ターゲット |
---|---|---|
実行サーバー | build/execserver/execserver |
<dst>/execserver |
EGL モジュール | build/modules/egl/deqp-egl |
<dst>/deqp-egl |
GLES2 モジュール | build/modules/gles2/deqp-gles2 |
<dst>/deqp-gles2 |
data/gles2 |
<dst>/gles2 |
|
GLES3 モジュール | build/modules/gles3/deqp-gles3 |
<dst>/deqp-gles3 |
data/gles3 |
<dst>/gles3 |
|
GLES3.1 モジュール | build/modules/gles31/deqp-gles31 |
<dst>/deqp-gles31 |
data/gles31 |
<dst>/gles31 |
|
GLES3.2 モジュール | build/modules/gles32/deqp-gles32 |
<dst>/deqp-gles32 |
data/gles32 |
<dst>/gles32 |
実行サービスとテストバイナリは、ターゲット ファイル システムの任意の場所にデプロイできます。ただし、テストバイナリはデータ ディレクトリが現在の作業ディレクトリ下にあることを想定しています。準備ができたら、ターゲット デバイスでテスト実行サービスを起動します。サービスの起動の詳細については、テスト実行サービスをご覧ください。
コマンドライン引数
次の表に、すべてのテスト プログラムの実行に影響するコマンドライン引数を示します。
引数 | 説明 |
---|---|
--deqp-case=<casename> |
指定されたパターンに一致するケースを実行します。ワイルドカード(*)がサポートされています。 |
--deqp-log-filename=<filename> |
名前を指定したファイルにテスト結果を書き込みます。テスト実行サービスによってテストの開始時にファイル名が設定されます。 |
--deqp-stdin-caselist |
stdin または指定の引数からケースリストを読み取ります。テスト実行サービスは、受け取った実行リクエストに応じて引数を設定します。ケースリストの形式については、次のセクションをご覧ください。 |
--deqp-test-iteration-count=<count> |
繰り返し回数が可変なテストの反復回数をオーバーライドします。 |
--deqp-base-seed=<seed> |
ランダム化を使用するテストケースのベースシード。 |
GLES2 と GLES3 に固有の引数
次の表に、GLES2 と GLES3 に固有の引数を示します。引数 | 説明 |
---|---|
--deqp-gl-context-type=<type> |
OpenGL のコンテキスト タイプ。使用可能なコンテキスト タイプは、プラットフォームによって異なります。EGL をサポートするプラットフォームでは、値 egl を使用して EGL コンテキストを選択できます。 |
--deqp-gl-config-id=<id> |
指定された GL 構成 ID のテストを実行します。解釈はプラットフォームによって異なります。EGL プラットフォームでは EGL 構成 ID です。 |
--deqp-gl-config-name=<name> |
名前を指定された GL 構成のテストを実行します。解釈はプラットフォームによって異なります。EGL の場合、形式は rgb(a)<bits>d<bits>s<bits> です。たとえば、rgb888s8 の値を指定すると、カラーバッファが RGB888 でありステンシル バッファが 8 ビットある最初の構成が選択されます。 |
--deqp-gl-context-flags=<flags> |
コンテキストを作成します。robust または debug を指定します。 |
--deqp-surface-width=<width> |
指定されたサイズのサーフェスの作成を試行します。この処理に対するサポートは任意です。 |
--deqp-surface-type=<type> |
指定されたサーフェス タイプをメインのテスト レンダリング ターゲットとして使用します。指定できるタイプは window 、pixmap 、pbuffer 、fbo です。 |
--deqp-screen-rotation=<rotation> |
画面の向きを 90 度単位で指定します(プラットフォームでサポートされている場合)。 |
テストケースのリスト形式
テストケースのリストは、2 つの形式で指定できます。1 つ目は、標準 ASCII ファイルで各テストの完全な名前を 1 行に 1 つずつ記述する方法です。テストセットが増えると、プレフィックスの繰り返しが煩雑になる可能性があります。プレフィックスの繰り返しを避けるには、次の trie(プレフィックス ツリーとも呼ばれる)構文を使用します。
{nodeName{firstChild{…},…lastChild{…}}}
次に例を示します。
{dEQP-EGL{config-list,create_context{rgb565_depth_stencil}}}
次の 2 つのテストケースに変換されます。
dEQP-EGL.config_list dEQP-EGL.create_context.rgb565_depth_stencil
Android
Android アプリ パッケージには、テスト実行サービス、テストバイナリ、データファイルなど、必要なコンポーネントがすべて含まれています。テスト アクティビティは、EGL を使用する NativeActivity
です(Android 3.2 以降が必要です)。
アプリ パッケージは、次のコマンドを使用してインストールできます(以下の名前は Android CTS パッケージの APK の名前であり、ビルドによって異なります)。
adb –d install –r com.drawelements.deqp.apk
テスト実行サービスを起動し、ポート転送を設定するには、次のコマンドを使用します。
adb –d forward tcp:50016 tcp:50016
adb –d shell am start –n com.drawelements.deqp/.execserver.ServiceStarter
デバッグ プリントは、テストを開始する前に以下のコマンドを実行することで有効にできます。
adb –d shell setprop log.tag.dEQP DEBUG
Android CTS を使用せずに Android でテストを実行する
手動でテスト実行アクティビティを開始するには、android.app.NativeActivity
をターゲットとする Android インテントを作成します。アクティビティは com.drawelements.deqp
パッケージ内にあります。コマンドラインは、インテントでキー "cmdLine"
を持つ追加の文字列として指定する必要があります。
テストログは /sdcard/dEQP-log.qpa
に書き込まれます。テストの実行が正常に開始されない場合は、デバッグの詳細情報をデバイスログで取得できます。
am
ユーティリティを使用してコマンドラインからアクティビティを開始できます。たとえば、NativeActivity,
をサポートしているプラットフォームで dEQP-GLES2.info
のテストを実行するには、次のコマンドを使用します。
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"'
Android でデバッグする
Android で GDB デバッガによるテストを実行するには、まず次の 2 つのスクリプトを実行し、デバッグビルドをコンパイルしてインストールします。
python android/scripts/build.py --native-build-type=Debug
python android/scripts/install.py
デバッグビルドがデバイスにインストールされた後、ホストで実行中の GDB でテストを開始するには、次のコマンドを実行します。
python android/scripts/debug.py \ --deqp-commandline="--deqp-log-filename=/sdcard/TestLog.qpa --deqp-case=dEQP-GLES2.functional.*"
deqp コマンドラインは、実行するテストケースとその他の必須パラメータによって異なります。スクリプトは、deqp 実行開始時にデフォルトのブレークポイント(tcu::App::App
)を追加します。
debug.py
スクリプトでは、アクション(デバッグのブレークポイント、gdbserver 接続パラメータ、デバッグする追加バイナリへのパスの設定など)の複数のコマンドライン引数を使用できます(すべての引数と説明を確認するには、debug.py
--help
を使用してください)。また、スクリプトはターゲット デバイスから一部のデフォルト ライブラリをコピーしてシンボルリストを取得します。
完全なデバッグ情報を持つバイナリの場所を GDB が把握する必要がある場合などに、ドライバコードをステップ実行するには、debug.py
のコマンドライン パラメータを使用してライブラリを追加します。このスクリプトは、スクリプト ファイルの 132 行目から始まる GDB の構成ファイルを書き出します。バイナリなどへの追加のパスを指定できますが、適切なコマンドライン パラメータを入力すれば十分です。
注: Windows では、GDB バイナリに libpython2.7.dll
が必要です。debug.py
を開始する前に、PATH 変数に <path-to-ndk>/prebuilt/windows/bin
を追加してください。
注: ストック Android 4.3 ではネイティブ コードのデバッグが機能しません。回避策については、公開バグをご覧ください。Android 4.4 以降にはこのバグが含まれていません。
テストを自動化する
deqp テスト モジュールは、複数の方法で自動テストシステムに統合できます。既存のテスト インフラストラクチャとターゲット環境によって最適な方法は異なります。
テスト実行のメイン出力は、常にテストログ ファイル(つまり .qpa
接尾辞付きのファイル)です。完全なテスト結果は、テストログから解析できます。コンソール出力はデバッグ情報のみであり、一部のプラットフォームでは使用できない場合があります。
テストバイナリは、テスト自動化システムから直接呼び出すことができます。特定のケース、テストセット、または使用可能なすべてのテストに対してテストバイナリを起動できます。実行中に致命的なエラーが発生した場合(特定の API エラーやクラッシュなど)、テストの実行は中止されます。回帰テストでは、ハードエラーが発生した場合でも部分的な結果を得られるように、各ケースまたは小規模なテストセットに対してテストバイナリを個別に呼び出す方法をおすすめします。
deqp にはコマンドライン テスト実行ツールが用意されており、実行サービスと組み合わせて使用すれば、より堅牢な統合を実現できます。エグゼキュータはテストプロセスの終了を検出し、次の使用可能なケースでテスト実行を再開します。完全なテスト セッションから生成されるログファイルは 1 つです。この設定は、クラッシュ リカバリ機能を備えていない軽量テストシステムに適しています。
コマンドライン テスト実行ツール
現在のコマンドライン ツールセットには、リモートテスト実行ツール、回帰分析用のテストログ比較生成ツール、テストログ - CSV 変換ツール、テストログ - XML 変換ツール、テストログ - JUnit 変換ツールが含まれます。
これらのツールのソースコードは executor
ディレクトリにあり、バイナリは <builddir>/executor
ディレクトリにビルドされます。
コマンドライン テスト エグゼキュータ
コマンドライン テスト エグゼキュータは、デバイスでテスト実行を開始し、TCP/IP 経由で結果ログを収集するポータブルな C++ ツールです。エグゼキュータは、ターゲット デバイス上の実行サービス(execserver)と通信します。この 2 つの連携により、テストプロセスのクラッシュから復旧する機能などが提供されます。次の例は、コマンドライン テスト エグゼキュータの使用方法を示したものです(詳細については、--help
を使用してください)。
例 1: Android デバイスで GLES2 機能テストを実行する
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"
例 2: OpenGL ES 2 テスト実行の一部をローカルで続行する
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
テストログの CSV エクスポートと比較
deqp にはテストログ(.qpa
ファイル)を CSV ファイルに変換するツールがあります。CSV 出力には、テストケースとそれらの結果のリストが含まれます。このツールを使用して複数のバッチ結果を比較し、ステータス コードが異なるテストケースのみを入力バッチ結果に表示することもできます。比較では、一致するケースの数も出力されます。
CSV 形式の出力は、標準のコマンドライン ユーティリティまたはスプレッドシート エディタで追加処理する際に非常に有用です。コマンドライン引数 --format=text
を使用して、人間による判読が可能な書式なしテキスト形式を選択することもできます。
例 1: CSV 形式でテストログをエクスポートする
testlog-to-csv --value=code BatchResult.qpa > Result_statuscodes.csv
testlog-to-csv --value=details BatchResult.qpa > Result_statusdetails.csv
例 2: 2 つのテストログのテスト結果の違いを一覧表示する
testlog-to-csv --mode=diff --format=text Device_v1.qpa Device_v2.qpa
注: 引数 --value=code
を使用すると、「Pass」や「Fail」などのテスト結果コードが出力されます。引数 --value=details
を使用すると、パフォーマンス、機能、または精度テストによって生成された結果または数値の詳細な説明が出力されます。
テストログの XML エクスポート
testlog-to-xml
ユーティリティを使用して、テストログ ファイルを有効な XML ドキュメントに変換できます。次の 2 つの出力モードがサポートされています。
- 個別ドキュメント モードでは、各テストケースと
caselist.xml
サマリー ドキュメントが宛先ディレクトリに書き込まれます。 - 単一ファイルモードでは、
.qpa
ファイルのすべての結果が単一の XML ドキュメントに書き込まれます。
エクスポートされたテストログ ファイルは、XML スタイルシートを使用してブラウザで表示できます。doc/testlog-stylesheet
ディレクトリには、スタイルシート ドキュメントのサンプル(testlog.xsl
と testlog.css
)があります。ブラウザでログファイルをレンダリングするには、エクスポートした XML ドキュメントがあるディレクトリに 2 つのスタイルシート ファイルをコピーします。
Google Chrome を使用している場合は、セキュリティ上の理由でローカル ファイルへのアクセスが制限されるため、HTTP 経由でファイルにアクセスする必要があります。標準の Python インストールには、python –m SimpleHTTPServer 8000
コマンドで起動できる基本的な HTTP サーバーが用意されており、現在のディレクトリ内容を提供することができます。サーバーを起動したら、Chrome ブラウザで http://localhost:8000
を指定すればテストログが表示されます。
JUnit テストログへの変換
多くのテスト自動化システムでは、JUnit 出力からテスト実行結果レポートを生成できます。deqp テストログ ファイルを JUnit 出力形式に変換するには、テストログ - JUnit 変換ツールを使用します。
現在、このツールではテストケースの判定結果のみを変換できます。JUnit は「pass」と「fail」の結果のみをサポートしているため、deqp の成功結果は「JUnit pass」にマッピングされ、他の結果は失敗とみなされます。元の deqp 結果コードは、JUnit 出力で使用できます。ログメッセージや結果画像などのその他のデータは、変換では保持されません。
特別なテストグループを使用する
特別なコマンドライン オプションを必要とする、あるいはサポートするテストグループや、特定のシステムで使用するときに特別な注意が必要なテストグループがあります。
メモリ割り当てストレステスト
メモリ割り当てストレステストでは、ドライバがメモリ不足エラーを報告するまで特定のリソースを繰り返し割り当てて、メモリ不足の状態を発生させます。
Android や大部分の Linux といった特定のプラットフォームでは、オペレーティング システムがドライバによる処理またはメモリ不足エラーの報告を許可せずに、テストプロセスを終了する場合があります。このようなプラットフォームでは、メモリ不足エラーを発生させるためのテストはデフォルトで無効になっており、--deqp-test-oom=enable
コマンドライン引数を使用して有効にする必要があります。このようなテストを手動で実行して、リソース増大時にシステムが正しく動作するかどうかを確認することをおすすめします。ただしこの場合は、テストプロセスのクラッシュが合格と解釈されることになります。
テストグループ
dEQP-GLES2.stress.memory.* dEQP-GLES3.stress.memory.*
長時間レンダリング ストレステスト
レンダリング ストレステストは、持続的にレンダリング負荷がかかった状態で堅牢性の問題を明らかにするためのものです。デフォルトではテストは数回だけ実行されますが、--deqp-test-iteration-count=-1
コマンドライン引数を指定して、無期限に実行するように構成できます。これらのテストを長期間実行する場合は、テストのウォッチドッグを無効にする必要があります(--deqp-watchdog=disable
)。
テストグループ
dEQP-GLES2.stress.long.* dEQP-GLES3.stress.long.*