この章ではマルチスレッド アプリケーションの単体テストを実行し、データを収集する方法を説明します。

このセクションの内容:

事前準備

マルチスレッド アプリケーションをテストするには、ビルド設定のコンパイラ オプションに次のオプションを追加します。ビルド設定の詳細については 「プロジェクトとファイルのオプション設定」 を参照してください。

"-DCPPTEST_THREADS=1"

このオプションは、C++test ランタイム ライブラリのマルチスレッド サポートを有効にし、スレッド関係のルーチンに対するセーフ スタブの使用を無効にします。

注意事項

マルチスレッド アプリケーションをテストするときの注意事項は以下のとおりです。

  • C++test のテスト実行可能ファイルは適切なランタイム ライブラリ (Visual C++ コンパイラの場合はマルチスレッド版のC ランタイム ライブラリ、UNIX では pthread ライブラリ) とリンクされている必要があります。
  • 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);
  • No labels