この章ではマルチスレッド アプリケーションの単体テストを実行し、データを収集する方法を説明します。
このセクションの内容:
事前準備
マルチスレッド アプリケーションをテストするには、ビルド設定のコンパイラ オプションに次のオプションを追加します。ビルド設定の詳細については 「プロジェクトとファイルのオプション設定」 を参照してください。
"-DCPPTEST_THREADS=1"
このオプションは、C++test ランタイム ライブラリのマルチスレッド サポートを有効にし、スレッド関係のルーチンに対するセーフ スタブの使用を無効にします。
注意事項
マルチスレッド アプリケーションをテストするときの注意事項は以下のとおりです。
- C++test のテスト実行可能ファイルは適切なランタイム ライブラリ (Visual C++ コンパイラの場合はマルチスレッド版のC ランタイム ライブラリ、UNIX では pthread ライブラリ) とリンクされている必要があります。また、Solaris ではコンパイラ オプションに-D_POSIX_PTHREAD_SEMANTICS を追加する必要があります。
- C++test ランタイムはスレッドの生存期間をコントロールしません。テスト ケースが完了したときにすべてのスレッドが終了されるようにテスト ケースを実装することを推奨します。
既知の問題と制限事項
既知の問題と制限事項は以下のとおりです。
- -DCPPTEST_THREADS=1 を使用してマルチスレッド サポートを有効にしているが、適切なライブラリがリンクされていない場合 (またはマルチスレッドとシングルスレッドの C ランタイムが混在している場合)、テスト実行可能ファイルは不正なテスト結果を出力したり、予期しないときに終了する可能性があります。
- メイン スレッド以外のスレッドでの予期しない振る舞い (シグナル、処理されない例外、タイムアウトなど) により、テスト実行可能ファイルが終了する場合があります。
C++test ランタイム ライブラリのビルド
C++test のデフォルトのランタイム ライブラリは、あらかじめマルチ スレッドをサポートしています。たとえば組込みのテストを行うなどのために、マルチスレッドをサポートするカスタム ランタイム ライブラリをビルドする場合を除いて、追加の作業を行う必要はありません。
マルチスレッドをサポートするカスタム ランタイム ライブラリをビルドする必要がある場合、コンパイラ コマンドラインに次を追加します。
"-DCPPTEST_THREADS_ENABLED=1"
サポートされるスレッド API
ランタイム ライブラリ実装は、以下の種類のスレッド API を使用できます。
- Windows スレッド
- POSIX スレッド
- VxWorks 6.x
他のスレッド API の使用
他のスレッド API (またはカスタム API) を使用する必要がある場合、以下の型とルーチンを実装する必要があります。
C++test ランタイム ソースの CppTestThread.c ファイルには、スレッド サポート ルーチンの定義が含まれていることに注意してください。このファイルをサンプルとして使用したり、変更のベースとすることができます。
TlS - Thread Local Storage
typedef IMPLEMENTATION_DEPENDENT_TYPE CppTestThreadKey; /** * スレッド ローカル ストレージ データのキーを作成 * 成功時に 0 を返す */ extern int localThreadKeyCreate(CppTestThreadKey* key); /** * スレッド ローカル ストレージ データのキーを削除 * 成功時に 0 を返す */ extern int localThreadKeyDelete(CppTestThreadKey key); /** * キーに関連付けられたスレッド固有の値を返す */ extern void* localThreadGetSpecific(CppTestThreadKey key); /** * スレッド固有の値をキーと関連付ける * 成功時に 0 を返す */ extern int localThreadSetSpecific(CppTestThreadKey key, void* value
Mutex
注意 ! C++test ランタイムは、mutex を静的に初期化できると仮定します。
typedef IMPLEMENTATION_DEPENDENT_TYPE CppTestThreadMutex; #define CPPTEST_THREADS_MUTEX_STATIC_INIT <IMPLEMENTATION_DEPENDENT_STATIC_INITIALIZER> /** * mutex の初期化 * @return 0 on success */ extern int localThreadMutexInit(CppTestThreadMutex* mutex); /** * mutex によって使用されたリソースの破壊と解放 * @return 0 on success */ extern int localThreadMutexDestroy(CppTestThreadMutex* mutex); /** * 呼び出し側のスレッドが mutex の所有者の場合 mutex をロックして戻る * @return 0 on success */ extern int localThreadMutexLock(CppTestThreadMutex* mutex); /** * 呼び出し側のスレッドが所有する mutex を解放 * @return 0 on success */ extern int localThreadMutexUnlock(CppTestThreadMutex* mutex);
その他
/** * 呼び出しスレッドを終了する * (never returns) */ extern void localThreadExit(); /** * @return non-zero if threads already finished execution */ extern int localThreadFinished(CppTestThread* thread); /** * @return non-zero if threads are supported in current build * (proper macros, libraries, compiler options were used). */ extern int localThreadsSupported(void); /** * 与えられたスレッド構造を初期化する */ extern void localThreadInit(CppTestThread* thread);