WexLogger
WexLogger は、ネイティブ コード、マネージド コード、スクリプトにまたがるログ記録用の一貫した API を提供します。 WexLogger は、コマンド プロンプトでの単体テストの実行から長期間のストレス テストまでスケーリングします。
Verify フレームワークを使用したログ記録
テスト ケース内のほとんどのログ記録は、Verify フレームワークを使用して実行する必要があります。 これにより、テストがより明確で、よりシーケンシャルで人間が判読できる形式で作成されることが保証されます。 ただし、テスト作成者がログに書き込まれる内容をより細かく制御する必要がある場合があります。そのため、WexLogger API が必要になります。
TAEF 内でのログ記録
TAEF 内で実行されるテスト ケースの場合、テスト作成者がロガーの初期化を行う必要はありません。 テストの作成に使用する言語に公開されている Log API をすぐに使い始めることができます。
ネイティブ C++ コードでは、このようになります。
using namespace WEX::Logging;
using namespace WEX::Common;
Log::Comment(L"Rendering to the BufferView");
Log::Comment(L"Render succeeded");
Log::Comment(String().Format(L"Look, a number! %d", aNumber));
#define LOG_OUTPUT(fmt, ...) Log::Comment(String().Format(fmt, __VA_ARGS__))
LOG_OUTPUT(L"Look, a number! %d", aNumber);
マネージド コードでは、このようになります。
using WEX.Logging.Interop;
Log.Comment("Rendering to the BufferView");
Log.Comment("Render succeeded");
JScript では、このようになります。
var log = new ActiveXObject("WEX.Logger.Log");
log.Comment("Rendering to the BufferView");
log.Comment("Render succeeded");
TAEF 外でのログ記録
ほとんどの場合、ログ記録の初期化と完了は TAEF によって実行されるため、WexLogger は、上記のようにテスト ケースの期間にわたって使用する準備が整い、正常に終了します。 ただし、クライアントが TAEF の外部で WexLogger を使用する場合は、LogController::InitializeLogging() と LogController::FinalizeLogging() を手動で呼び出す必要があります。 この要件は、ネイティブ コードとマネージド コードに対してのみ存在します。スクリプトには、この追加の要件はありません。 LogController API の詳細については、以下の静的 LogController メソッドの表を参照してください。
TAEF の外部で WTT ログを生成する方法については、「WTT ログの生成」セクションを参照してください。
WexLogger API
使用可能なネイティブ C++ Log メソッドの一覧を次に示します。
マネージド コードとスクリプトで使用できる同等のバージョンがあります。
ネイティブ C++ Log メソッド | 機能 |
---|---|
Assert(const wchar_t* pszAssert) | テスト アサートをログに記録します。 |
Assert(const wchar_t* pszAssert, const wchar_t* pszContext) | テスト アサートをコンテキストと共にログに記録します。 |
Assert(const wchar_t* pszAssert, const wchar_t* pszFile, const wchar_t* pszFunction, int line) | テスト アサートをファイル、関数、および行の情報と共にログに記録します。 |
Assert(const wchar_t* pszAssert, const wchar_t* pszContext, const wchar_t* pszFile, const wchar_t* pszFunction, int line) | テスト アサートをコンテキスト、ファイル、関数、および行の情報と共にログに記録します。 |
Bug(const wchar_t* pszBugDatabase, int bugId) | 既知のバグ番号をログに記録します。 |
Bug(const wchar_t* pszBugDatabase, int bugId, const wchar_t* pszContext) | 既知のバグ番号をコンテキストと共にログに記録します。 |
Comment(const wchar_t* pszComment) | テスト コメントをログに記録します。 |
Comment(const wchar_t* pszComment, const wchar_t* pszContext) | テスト コメントをコンテキストと共にログに記録します |
EndGroup(const wchar_t* pszGroupName) | テストのグループまたは特定のテストの終了をログに記録します。 |
EndGroup(const wchar_t* pszGroupName, const wchar_t* pszContext) | テストのグループまたは特定のテストの終了をコンテキストと共にログに記録します。 |
Error(const wchar_t* pszError) | テスト エラーをログに記録します。 |
Error(const wchar_t* pszError, const wchar_t* pszContext) | テスト エラーをコンテキストと共にログに記録します。 |
Error(const wchar_t* pszError, const wchar_t* pszFile, const wchar_t* pszFunction, int line) | テスト エラーをファイル、関数、および行の情報と共にログに記録します。 |
Error(const wchar_t* pszError, const wchar_t* pszContext, const wchar_t* pszFile, const wchar_t* pszFunction, int line) | テスト エラーをコンテキスト、ファイル、関数、および行の情報と共にログに記録します。 |
File(const wchar_t* pszFileName) | 保存するテスト ファイルをログに記録します。 ファイルは、<WTTRunWorkingDir>\WexLogFileOutput (WTTRunWorkingDir が設定されている場合) または <CurrentDirectory\>WexLogFileOutput のいずれかに保存されます。 |
File(const wchar_t* pszFileName, const wchar_t* pszContext) | 保存するテスト ファイルをコンテキストと共にログに記録します。 ファイルは、<WTTRunWorkingDir>\WexLogFileOutput (WTTRunWorkingDir が設定されている場合) または <CurrentDirectory\>WexLogFileOutput のいずれかに保存されます。 |
Property(const wchar_t* pszName, const wchar_t* pszValue) | 名前と値のプロパティ ペアをログに記録します。 値は xml 形式で指定できます。 |
Property(const wchar_t* pszName, const wchar_t* pszValue, const wchar_t* pszContext) | 名前と値のプロパティ ペアをコンテキストと共にログに記録します。 値は xml 形式で指定できます。 |
Result(TestResults::Result testResult) | テスト結果をログに記録します。 |
Result(TestResults::Result testResult, const wchar_t* pszComment) | テスト結果を関連するコメントと共にログに記録します。 |
Result(TestResults::Result testResult, const wchar_t* pszComment, const wchar_t* pszContext) | テスト結果を関連するコメントとコンテキストと共にログに記録します。 |
StartGroup(const wchar_t* pszGroupName) | テストのグループまたは特定のテストの開始をログに記録します。 |
StartGroup(const wchar_t* pszGroupName, TestResults::Result defaultTestResult) | テストのグループまたは特定のテストの開始をログに記録し、さらに既定のテスト結果を設定します。 |
StartGroup(const wchar_t* pszGroupName, const wchar_t* pszContext) | テストのグループまたは特定のテストの開始をコンテキストと共にログに記録します。 |
StartGroup(const wchar_t* pszGroupName, const wchar_t* pszContext, TestResults::Result defaultTestResult) | テストのグループまたは特定のテストの開始をログに記録し、さらに既定のテスト結果を設定します。 |
Warning(const wchar_t* pszWarning) | テスト警告をログに記録します。 |
Warning(const wchar_t* pszWarning, const wchar_t* pszContext) | テスト警告をコンテキストと共にログに記録します。 |
Warning(const wchar_t* pszWarning, const wchar_t* pszFile, const wchar_t* pszFunction, int line) | テスト警告をファイル、関数、および行の情報と共にログに記録します。 |
Warning(const wchar_t* pszWarning, const wchar_t* pszContext, const wchar_t* pszFile, const wchar_t* pszFunction, int line) | テスト警告をコンテキスト、ファイル、関数、および行の情報と共にログに記録します。 |
Xml(const wchar_t* pszXml) | xml データをログに記録します。 整形式であることを確認するためのチェックは行われません。 |
Xml(const wchar_t* pszXml, const wchar_t* pszContext) | xml データをコンテキストと共にログに記録します。 整形式であることを確認するためのチェックは行われません。 |
MiniDump() | 現在のプロセス ミニ ダンプをログに記録します。 |
注: "Context" は、必要に応じて WexLogger API 呼び出しに指定してより多くのコンテキストまたは詳細を提供できる追加の文字列です。 たとえば、ImageComparator クラス メソッドから WexLogger API 呼び出しを行うときに、コンテキストとして常に "ImageComparator" を渡すように選択できます。
ネイティブ C++ TestResults::Result 列挙型の有効な値を次に示します。 マネージド コードとスクリプトで使用できる同等のバージョンがあります。
ネイティブ C++ TestResults::Result 列挙型 | 機能 |
---|---|
成功 | テストは合格しました |
NotRun | テストは実行されませんでした |
スキップ済み | テストはスキップされました |
ブロック | テストはブロックされました |
Failed | テストは失敗しました |
使用可能なネイティブ C++ LogController メソッドの一覧を次に示します。
ネイティブ C++ LogController メソッド | 機能 |
---|---|
static HRESULT InitializeLogging() | ログ機能を初期化します。 |
static HRESULT InitializeLogging(WexLoggerErrorCallback pfnErrorCallback) | ログ機能を初期化し、内部ロガー エラーの通知に使用する WexLoggerErrorCallback 関数を指定します。 |
static HRESULT InitializeLogging(const wchar_t* pszLogName) | ログ機能を初期化し、使用するログ ファイルの名前を指定します。 注: ログ名は、WttLogging が有効になっている場合にのみ考慮されます。 |
static HRESULT InitializeLogging(const wchar_t* pszLogName, WexLoggerErrorCallback pfnErrorCallback) | ログ機能を初期化し、使用するログ ファイルの名前を指定し、内部ロガー エラーの通知に使用する WexLoggerErrorCallback 関数を指定します。 注: ログ名は、WttLogging が有効になっている場合にのみ考慮されます。 |
static bool IsInitialized() | このプロセスに対して LogController が初期化されているかどうかを返します。 |
static const unsigned short* GetLogName() | InitializeLogging 呼び出しでログに指定された名前を返します (存在する場合)。 |
static HRESULT FinalizeLogging() | ログ機能を完了します。 |
注:WexLoggerErrorCallback メカニズムの詳細とこれを TAEF フレームワークの外部で使用する方法の詳細については、以下の「C++ のエラー処理」セクションを参照してください。
注: TAEF ではログ記録の初期化/完了が処理されるため、InitializeLogging/FinalizeLogging を呼び出す必要があるのは、WexLogger を TAEF フレームワークの外部で使用する場合に限られます。
注:WexLogger をスクリプトから使用する場合は、ログ機能を初期化または完了する必要はありません。
使用可能なネイティブ C++ RemoteLogContoller メソッドの一覧を次に示します。
ネイティブ C++ RemoteLogController メソッド | 機能 |
---|---|
static HRESULT GenerateConnectionData(WEX::Common::NoThrowString& connectionData) | 子プロセスが親プロセスにログを送り返すことができるようにするために親プロセスと子プロセス内で使用する必要がある接続データを生成します。 |
static HRESULT GenerateConnectionData(const wchar_t* pszMachineName, WEX::Common::NoThrowString& connectionData) | リモート コンピューターで子プロセスを起動するときに使用されます。 子プロセスが親プロセスにログを送り返すことができるようにするために親プロセスと子プロセス内で使用する必要がある接続データを生成します。 |
static HRESULT InitializeLogging(WEX::Common::NoThrowString connectionData) | 子プロセスがログを送り返すことができるように、親プロセス内でログ機能を初期化します。 |
注: リモート ログ記録の詳細については、以下の「子プロセスからのリモート ログ記録」セクションを参照してください。
使用可能なマネージド Log メソッドの一覧を次に示します。
マネージド Log メソッド | 機能 |
---|---|
Assert(IFormatProvider provider, string format, params object[] args) | カルチャ固有の書式設定情報プロバイダー、書式設定文字列、および書式設定する 0 個以上のオブジェクトを含むオブジェクト配列を使用して、テスト アサートをログに記録します。 |
Assert(IFormatProvider provider, string format, params object[] args) | カルチャ固有の書式設定情報プロバイダー、書式設定文字列、および書式設定する 0 個以上のオブジェクトを含むオブジェクト配列を使用して、テスト アサートをログに記録します。 |
Assert(string message) | テスト アサートをログに記録します。 |
Assert(string format, object arg0) | 書式設定文字列と書式設定するオブジェクトを使用して、テスト アサートをログに記録します。 |
Assert(string format, params object[] args) | 書式設定文字列と、書式設定する 0 個以上のオブジェクトを含むオブジェクト配列を使用して、テスト アサートをログに記録します。 |
Assert(string message, string context) | テスト アサートをコンテキストと共にログに記録します。 |
Assert(string message, string file, string function, int line) | テスト アサートと、ファイル、関数、および行の情報をログに記録します。 |
Assert(string message, string context, string file, string function, int line) | テスト アサートをコンテキスト、ファイル、関数、および行の情報と共にログに記録します。 |
Bug(string bugDatabase, int bugId) | 既知のバグ番号をログに記録します。 |
Bug(string bugDatabase, int bugId, string context) | 既知のバグ番号をコンテキストと共にログに記録します。 |
Comment(IFormatProvider provider, string format, params object[] args) | カルチャ固有の書式設定情報プロバイダー、書式設定文字列、および書式設定する 0 個以上のオブジェクトを含むオブジェクト配列を使用して、テスト コメントをログに記録します。 |
Comment(string message) | テスト コメントをログに記録します |
Comment(string format, object arg0) | 書式設定文字列と書式設定するオブジェクトを使用して、テスト コメントをログに記録します。 |
Comment(string format, params object[] args) | 書式設定文字列と、書式設定する 0 個以上のオブジェクトを含むオブジェクト配列を使用して、テスト コメントをログに記録します。 |
Comment(string message, string context) | テスト コメントをコンテキストと共にログに記録します |
EndGroup(string groupName) | テストのグループまたは特定のテストの終了をログに記録します。 |
EndGroup(string groupName, string context) | テストのグループまたは特定のテストの終了をコンテキストと共にログに記録します。 |
Error(IFormatProvider provider, string format, params object[] args) | カルチャ固有の書式設定情報プロバイダー、書式設定文字列、および書式設定する 0 個以上のオブジェクトを含むオブジェクト配列を使用して、テスト エラーをログに記録します。 |
Error(string message) | テスト エラーをログに記録します。 |
Error(string format, object arg0) | 書式設定文字列と書式設定するオブジェクトを使用して、テスト エラーをログに記録します。 |
Error(string message, string context) | テスト エラーをコンテキストと共にログに記録します。 |
Error(IFormatProvider provider, string format, params object[] args) | 書式設定文字列と、書式設定する 0 個以上のオブジェクトを含むオブジェクト配列を使用して、テスト エラーをログに記録します。 |
Error(string message, string file, string function, int line) | テスト エラーをファイル、関数、および行の情報と共にログに記録します。 |
Error(string message, string context, string file, string function, int line) | テスト エラーをコンテキスト、ファイル、関数、および行の情報と共にログに記録します。 |
File(string fileName) | 保存するテスト ファイルをログに記録します。 ファイルは、WTTRunWorkingDir\WexLogFileOutput (WTTRunWorkingDir が設定されている場合) または CurrentDirectory\WexLogFileOutput のいずれかに保存されます。 |
File(string fileName, string context) | 保存するテスト ファイルをコンテキストと共にログに記録します。 ファイルは、WTTRunWorkingDir\WexLogFileOutput (WTTRunWorkingDir が設定されている場合) または CurrentDirectory\WexLogFileOutput のいずれかに保存されます。 |
MiniDump() | 現在のプロセス ミニ ダンプをログに記録します。 |
Property(string name, string value) | 名前と値のプロパティ ペアをログに記録します。 値は xml 形式で指定できます。 |
Property(string name, string value, string context) | 名前と値のプロパティ ペアをコンテキストと共にログに記録します。 値は xml 形式で指定できます。 |
Result(TestResult testResult) | テスト結果をログに記録します。 |
Result(TestResult testResult, string comment) | テスト結果を関連するコメントと共にログに記録します。 |
Result(TestResult testResult, string comment, string context) | テスト結果を関連するコメントとコンテキストと共にログに記録します。 |
StartGroup(string groupName) | テストのグループまたは特定のテストの開始をログに記録します。 |
StartGroup(string groupName, string context) | テストのグループまたは特定のテストの開始をコンテキストと共にログに記録します。 |
Warning(IFormatProvider provider, string format, params object[] args) | カルチャ固有の書式設定情報プロバイダー、書式設定文字列、および書式設定する 0 個以上のオブジェクトを含むオブジェクト配列を使用して、テスト警告をログに記録します。 |
Warning(string message) | テスト警告をログに記録します。 |
Warning(string format, object arg0) | 書式設定文字列と書式設定するオブジェクトを使用して、テスト警告をログに記録します。 |
Warning(string format, params object[] args) | 書式設定文字列と、書式設定する 0 個以上のオブジェクトを含むオブジェクト配列を使用して、テスト警告をログに記録します。 |
Warning(string message, string context) | テスト警告をコンテキストと共にログに記録します。 |
Warning(string message, string file, string function, int line) | テスト警告をファイル、関数、および行の情報と共にログに記録します。 |
Warning(string message, string context, string file, string function, int line) | テスト警告をコンテキスト、ファイル、関数、および行の情報と共にログに記録します。 |
Xml(string xmlData) | xml データをログに記録します。 整形式であることを確認するためのチェックは行われません。 |
Xml(string xmlData, string context) | xml データをコンテキストと共にログに記録します。 整形式であることを確認するためのチェックは行われません。 |
使用可能なマネージド LogContoller メソッドの一覧を次に示します。
マネージド LogController メソッド | 機能 |
---|---|
static void InitializeLogging() | ログ機能を初期化します。 |
static void InitializeLogging(String logName) | ログ機能を初期化し、使用するログ ファイルの名前を指定します。 注: ログ名は、WttLogging が有効になっている場合にのみ考慮されます。 |
static bool IsInitialized() | このプロセスに対して LogController が初期化されているかどうかを返します。 |
static String GetLogName() | InitializeLogging 呼び出しでログに指定された名前を返します (存在する場合)。 |
static void FinalizeLogging() | ログ機能を完了します。 |
注: TAEF フレームワークの外部で WWexLogger のマネージド レイヤーを使用する場合のエラーと例外を処理する方法の詳細については、以下の「マネージド コードのエラーと例外の処理」セクションを参照してください。
注: TAEF ではログ記録の初期化/完了が処理されるため、InitializeLogging/FinalizeLogging を呼び出す必要があるのは、WexLogger を TAEF フレームワークの外部で使用する場合に限られます。
注:WexLogger をスクリプトから使用する場合は、ログ機能を初期化または完了する必要はありません。
使用可能なマネージド RemoteLogContoller メソッドの一覧を次に示します。
マネージド RemoteLogController メソッド | 機能 |
---|---|
static String GenerateConnectionData() | 子プロセスが親プロセスにログを送り返すことができるようにするために親プロセスと子プロセス内で使用する必要がある接続データを生成します。 |
static String GenerateConnectionData(string machineName) | リモート コンピューターで子プロセスを起動するときに使用されます。 子プロセスが親プロセスにログを送り返すことができるようにするために親プロセスと子プロセス内で使用する必要がある接続データを生成します。 |
static void InitializeLogging(String connectionData) | 子プロセスがログを送り返すことができるように、親プロセス内でログ機能を初期化します。 |
注: リモート ログ記録の詳細については、以下の「子プロセスからのリモート ログ記録」セクションを参照してください。
子プロセスからのリモート ログ記録
WexLogger は、1 つ以上の子プロセスが単一の親プロセスにログを送り返す機能を提供します。これにより、1 つのログ ファイル内に統合されたテスト結果が生成されます。
子プロセスは、親プロセスと同じマシン上で実行することも、別のマシン上でリモートで実行することもできます。 リモート コンピューターでのログ記録を機能させるには、WexLogger クライアントがリモート コンピューター上のすべての子プロセスに対する TCP ファイアウォールの除外を追加する必要があります。 ただし、子プロセスが親と同じマシンで実行されている場合は、ファイアウォールを変更する必要はありません。
各リモート ログ接続を設定するには、次の手順を実行する必要があります。
親プロセス
RemoteLogController::GenerateConnectionData() を呼び出して、ログ接続を開始するために両方のプロセスで使用する必要がある接続データを生成します。
注: この呼び出しの戻り値を必ずチェックしてください。
NoThrowString connectionData; Throw::IfFailed(RemoteLogController::GenerateConnectionData(connectionData));
接続データを環境ブロックに設定するか、コマンド プロンプトで引数として渡すことによって、接続データを子プロセスに伝達します。 次に例を示します。
コマンド プロンプトで、WexLogger が認識する名前付き引数として渡す:
/wexlogger_connectiondata=[接続データ]注: このオプションを使用する場合、以下の「子プロセス」セクションの手順 1 を実行する必要はありません。
WexLogger が認識する名前付き環境変数として渡す:
[YourAppName_cmd]=/wexlogger_connectiondata=[接続データ]注: このオプションを使用する場合、以下の「子プロセス」セクションの手順 1 を実行する必要はありません。
任意の形式 (その他のコマンド パラメーター、環境変数など) でプロセスに渡す
注: このオプションを使用する場合、以下の「子プロセス」セクションの手順 1 を実行する必要があります。注: 値 "/wexlogger_connectiondata=" は、利便性のためにネイティブおよびマネージド RemoteLogController の両方で定数として定義されます。
WEX::Logging::c_szWexLoggerRemoteConnectionData (LogController.h 内)
RemoteLogController.WexLoggerRemoteConnectionData (Wex.Logger.Interop.dll 内)
接続データを使用して子プロセスを起動します
RemoteLogController::InitalizeLogging([手順 1 で作成した接続データ]) を呼び出します。 この呼び出しは、子プロセスの起動後に行う必要があります。それは、子が LogController::InitializeLogging() をタイムリーに呼び出さないとタイムアウトになるためです。
注: この呼び出しの戻り値を必ずチェックしてください。
// ...launch child process with connection data... Throw::IfFailed(RemoteLogController::InitializeLogging(connectionData));
子プロセスなどを待機します。
子プロセス
接続データがコマンド プロンプトで WexLogger が認識する名前付き引数として子プロセスに渡されなかった場合 (上記の手順 2 を参照)、次のように環境変数を設定する必要があります。
[YourAppName_cmd]=/wexlogger_connectiondata=[接続データ]
例:
// App name is mytestapp.exe ::SetEnvironmentVariable(L"mytestapp_cmd", String(c_szWexLoggerRemoteConnectionData).Append(connectionData));
LogController::InitializeLogging() を呼び出して、このプロセスのログ記録を初期化します。 内部的には、上記の手順 1 (または「親プロセス」セクションの手順 2) で設定した環境変数を利用して、親プロセスへのログ接続を開始します。
ログなどのすべてのトレースが親プロセスに送り返されます。
LogController::FinalizeLogging() を呼び出して、このプロセスのログ記録を完了します。
テスト結果の判定
テスト ケースの意図した結果 (Log::Result()) を明示的に示すメソッドが用意されていますが、ほとんどの場合、テスト ケースでこのメソッドを使用する必要はありません。
たとえば、テスト ケースで Log::Result() が明示的に呼び出されず、(Log::Error() を介して) エラーがログに記録されない場合、既定でテスト ケースは合格したと見なされます。エラーがログに記録される場合、テスト ケースは失敗したと見なされます。
ただし、テスト ケースで Log::Result(TestResults::TestPassed) を明示的に呼び出し、さらにテスト ケース内でエラーをログに記録した場合、テスト内でエラーが発生しているため、テストは失敗としてカウントされます。
TAEF フレームワーク内では、別の既定のテスト結果でテストにタグを付けることで、この動作をオーバーライドできます。 詳細については、「TAEF テストの作成」ドキュメントを参照してください。
この動作は、独自のテスト グループ/テスト ケースに対して選択した既定のテスト結果を使用して Log::StartGroup() を明示的に呼び出すことでオーバーライドすることもできます。
WTT ログの生成
WexLogger を使用して WTT ログを生成するには、3 つの方法があります。 これらのすべてで、実行ディレクトリまたはパスに WttLog.dll が存在する必要があります。
wtt クライアントがインストールされているラボで実行している場合、wtt ログは自動的に生成されます。 これは、WexLogger により、ラボ環境にのみ存在する必要がある 2 つの環境変数 "WttTaskGuid" と "WTTRunWorkingDir" があるかどうかが検索されるためです。 これら両方が存在する場合は、wtt ログ記録が自動的に有効になります。
ラボ環境の外部で TAEF 内で実行している場合は、コマンド プロンプトで /enablewttlogging をテスト ケースに渡します。 例:
te my.test.dll /enablewttlogging
TAEF フレームワークの外部で WexLogger を使用していて、ラボ環境で実行していない場合は、LogController::InitializeLogging() を呼び出す前に、<プロセス名>_CMD 環境変数を設定してこのオプションを含める必要があります。 例:
Environment.SetEnvironmentVariable("<YOUR_PROCESS_NAME>_CMD", "/enablewttlogging"); LogController.InitializeLogging();
Environment.SetEnvironmentVariable("consoleapplication4_cmd", "/enablewttlogging"); LogController.InitializeLogging();
上書きするのではなく、既存の wtt ログ ファイルに追加する場合は、/enablewttlogging に加えて /appendwttlogging オプションも指定します。
te my.test.dll /enablewttlogging /appendwttlogging
Environment.SetEnvironmentVariable("<YOUR_PROCESS_NAME>_CMD", "/enablewttlogging /appendwttlogging"); LogController.InitializeLogging();
Environment.SetEnvironmentVariable("consoleapplication4_cmd", "/enablewttlogging /appendwttlogging"); LogController.InitializeLogging();
次のいずれかのコマンド オプションを指定すると、既定の WttLogger デバイス文字列を完全にオーバーライドすることも、値を追加することもできます。
/WttDeviceString:<新しいデバイス文字列>
WttLogger を初期化するときに WexLogger によって使用される WttDeviceString を完全にオーバーライドします。
/WttDeviceStringSuffix:<デバイス文字列に追加する値>
指定した値を、WttLogger を初期化するときに WexLogger によって使用される既定の WttDeviceString に追加します。 同時に "/WttDeviceString" が指定されている場合は無視されます。
次の表に、WexLogger の TestResults がどのように WttLogger の結果にマップされるかを示します。
WexLogger | WttLogger |
---|---|
成功 | WTT_TESTCASE_RESULT_PASS |
NotRun | WTT_TESTCASE_RESULT_BLOCKED |
スキップ済み | WTT_TESTCASE_RESULT_SKIPPED |
ブロック | WTT_TESTCASE_RESULT_BLOCKED |
Failed | WTT_TESTCASE_RESULT_FAIL |
ロガーの依存関係
ネイティブ C++ ロガー (Wex.Logger.dll) は、Wex.Common.dll と Wex.Communication.dll に依存します。
マネージド ロガー (Wex.Logger.Interop.dll) は、Wex.Logger.dll、Wex.Common.dll、および Wex.Communication.dll に依存します。
さらに、Wtt ログ記録が有効になっている場合は、WttLog.dll が必要です。
追加のエラー データ
エラーがログに記録された場合は、WexLogger を有効にして、エラー自体に加えて、次の項目を 1 つ以上含めることができます。
- MiniDump
- ScreenCapture
- StackTrace
te my.test.dll /minidumponerror
te my.test.dll /screencaptureonerror /stacktraceonerror
これらのオプションの 1 つ以上を有効にすると、Log::Error() が呼び出されるたびに追加の出力が得られます。
注: TAEF フレームワークの外部で WexLogger を使用している場合は、LogController::InitializeLogging() を呼び出す前に、<プロセス名>_CMD 環境変数を設定してこれらのオプションを含める必要があります。 例:
Environment.SetEnvironmentVariable("<YOUR_PROCESS_NAME>_CMD", "/screencaptureonerror /minidumponerror /stacktraceonerror");
LogController.InitializeLogging();
Environment.SetEnvironmentVariable("consoleapplication4_cmd", "/screencaptureonerror /minidumponerror /stacktraceonerror");
LogController.InitializeLogging();
C++ のエラー処理
各 Log API 呼び出しの戻り値をチェックする負担からテスト ケースの作成者を守るために、WexLogger は、オプションのコールバック メカニズムである WexLoggerErrorCallback 関数を使用して、予期しないエラー状態を報告します。 (LogController::InitializeLogging() を介した) WexLogger の初期化時、クライアントは、WexLogger 内で予期しないエラー状態が発生した場合に呼び出す WexLoggerErrorCallback 関数を指定することを選択できます。 WexLoggerErrorCallback 関数では、次のシグネチャを使用する必要があります。
void __stdcall MyLoggerErrorCallback(const unsigned short* pszMessage, HRESULT hr);
WexLoggerErrorCallback 関数の一般的な用途として、(テスト ハーネスがコンソール アプリケーションの場合に) エラー メッセージをコンソールに書き出すことがあります。 たとえば、TAEF フレームワークは、WexLogger のクライアントであり、WexLogger エラーが発生したときにコンソールに赤いテキストを書き込む WexLoggerErrorCallback を実装します。
.NET 4.0 の互換性
Wex.Logger.Interop は NetFx 2/3/3.5 バイナリとしてコンパイルされるため、NetFx 2/3/3.5 プロセスと NetFx 4 プロセスの両方に読み込むことができます。 これにより、TAEF は NetFx 2 より上のすべてのマネージド アセンブリを実行できます。 TAEF の外部で Wex.Logger を使用している場合は、NetFx 2/3/3.5 バイナリをプロセスに読み込むように NetFx 4 ランタイムを構成するための exe の構成ファイルを追加する必要があります。 構成ファイルには、以下が含まれている必要があります。
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
</startup>
</configuration>
マネージド コードのエラーと例外の処理
各 Log API 呼び出しの戻り値をチェックする負担からテスト ケースの作成者を守るために、WexLogger は、オプションのコールバック メカニズムである LoggerController.WexLoggerError イベントを使用して、予期しないエラー状態を報告します。 このイベントは、独自の WexLoggerErrorEventHandler を実装し、C# イベント サブスクリプションの次の使い慣れた構文を使用して、いつでもサブスクライブできます。
LogController.WexLoggerError += new WexLoggerEventHandler(My_WexLoggerErrorHandler);
イベント ハンドラーの例を次に示します。
static void LogController_WexLoggerError(object sender, WexLoggerErrorEventArgs e)
{
ConsoleColor originalColor = Console.ForegroundColor;
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("LogController_WexLoggerError: " + e.Message);
Console.ForegroundColor = originalColor;
}
さらに、LogController::InitializeLogging() メソッドと LogController::FinalizeLogging() メソッド自体は、エラーが発生した場合に WexLoggerException をスローします。 これにより、エラーに関する詳細情報が提供され、開始前にテストの実行を中止することもできます。 テスト ケースの作成者は、これらの例外のキャッチについて心配する必要はありません。これらは、WexLogger の初期化/完了時に限り、予期/処理されます。