WexLogger
WexLogger 为日志记录提供一致的 API,该 API 涵盖本机代码、托管代码和脚本。 它还从在命令提示符中运行单元测试一直扩展到长途压力测试。
通过验证框架进行日志记录
测试用例中的大多数日志记录应通过 Verify 框架执行。 这将确保以更清晰、更有序、更易于阅读的方式编写测试。 但是,在某些情况下,测试作者会发现,他们需要更精细地控制写入日志的内容:因此需要 WexLogger API。
TAEF 中的日志记录
对于在 TAEF 中运行的测试用例,测试作者无需进行记录器初始化。 可以立即开始使用日志 API,该 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 的详细信息,请参阅下面的 Static LogController 方法表。
有关如何在 TAEF 外部生成 WTT 日志 的信息,请参阅生成 WTT 日志部分。
WexLogger API
下面是可用的本机 C++ 日志方法的列表。
有可用于托管代码和脚本的等效版本。
本机 C++ 日志方法 | 功能 |
---|---|
断言 (const wchar_t* pszAssert) | 记录测试断言。 |
断言 (const wchar_t* pszAssert, const wchar_t* pszContext) | 使用上下文记录测试断言。 |
断言 (const wchar_t* pszAssert、const wchar_t* pszFile、const wchar_t* pszFunction、int 行) | 使用文件、函数和行信息记录测试断言。 |
断言 (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 号。 |
bug (const wchar_t* pszBugDatabase、int bugId、const wchar_t* pszContext) | 使用上下文记录已知的 bug 号。 |
注释 (const wchar_t* pszComment) | 记录测试注释。 |
注释 (const wchar_t* pszComment、 const wchar_t* pszContext) | 使用上下文记录测试注释 |
EndGroup (const wchar_t* pszGroupName) | 记录一组测试或特定测试的结束。 |
EndGroup (const wchar_t* pszGroupName,const wchar_t* pszContext) | 使用上下文记录一组测试或特定测试的结束。 |
错误 (const wchar_t* pszError) | 记录测试错误。 |
const wchar_t* pszError、const wchar_t* pszContext) (错误 | 使用上下文记录测试错误。 |
错误 (const wchar_t* pszError、const wchar_t* pszFile、const wchar_t* pszFunction、int 行) | 使用文件、函数和行信息记录测试错误。 |
错误 (const wchar_t* pszError、const wchar_t* pszContext、const wchar_t* pszFile、const wchar_t* pszFunction、int line) | 记录测试错误,其中包含上下文以及文件、函数和行信息。 |
文件 (const wchar_t* pszFileName) | 记录要保存的测试文件。 如果 WTTRunWorkingDir 设置为) ,则文件将保存到 <WTTRunWorkingDir>\WexLogFileOutput (或 <CurrentDirectory\>WexLogFileOutput。 |
文件 (const wchar_t* pszFileName, const wchar_t* pszContext) | 使用上下文记录要保存的测试文件。 如果 WTTRunWorkingDir 设置为) ,则文件将保存到 <WTTRunWorkingDir>\WexLogFileOutput (或 <CurrentDirectory\>WexLogFileOutput。 |
属性 (const wchar_t* pszName, const wchar_t* pszValue) | 记录名称/值属性对。 该值可以采用 xml 格式。 |
属性 (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) | 记录一组测试或特定测试的开始时间;还设置默认测试结果。 |
警告 (const wchar_t* pszWarning) | 记录测试警告。 |
警告 (const wchar_t* pszWarning、 const wchar_t* pszContext) | 使用上下文记录测试警告。 |
警告 (const wchar_t* pszWarning、const wchar_t* pszFile、const wchar_t* pszFunction、int 行) | 记录包含文件、函数和行信息的测试警告。 |
警告 (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 枚举 | 功能 |
---|---|
Passed | 测试通过 |
NotRun | 测试未运行 |
已跳过 | 已跳过测试 |
已阻止 | 测试被阻止 |
已失败 | 测试失败 |
下面是可用的本机 C++ LogController 方法的列表:
本机 C++ LogController 方法 | 功能 |
---|---|
static HRESULT InitializeLogging () | 初始化日志记录功能。 |
静态 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 框架外部使用 WexLogger 时,才需要调用 InitializeLogging/FinalizeLogging,因为 TAEF 已处理日志记录初始化/完成。
注意: 使用 脚本中的 WexLogger 时,无需初始化/完成日志记录功能。
下面是可用的本机 C++ RemoteLogContoller 方法的列表:
本机 C++ RemoteLogController 方法 | 功能 |
---|---|
静态 HRESULT GenerateConnectionData (WEX::Common::NoThrowString& connectionData) | 生成必须在父进程和子进程内使用的连接数据,以允许子进程重新登录到父进程。 |
static HRESULT GenerateConnectionData (const wchar_t* pszMachineName, WEX::Common:::NoThrowString& connectionData) | 在远程计算机上启动子进程时使用。 生成必须在父进程和子进程内使用的连接数据,以允许子进程重新登录到父进程。 |
静态 HRESULT InitializeLogging (WEX::Common:::NoThrowString connectionData) | 初始化父进程中的日志记录功能,以便子进程可以记录回该进程。 |
注意: 有关远程日志记录的详细信息,请参阅下面的 从子进程 远程日志记录部分。
下面是可用的托管 Log 方法列表。
托管日志方法 | 功能 |
---|---|
断言 (IFormatProvider 提供程序、字符串格式、params object[] args) | 使用区域性特定的格式设置信息提供程序、格式字符串以及包含零个或多个要格式化的对象的对象数组记录测试断言。 |
断言 (IFormatProvider 提供程序、字符串格式、params object[] args) | 使用区域性特定的格式设置信息提供程序、格式字符串以及包含零个或多个要格式化的对象的对象数组记录测试断言。 |
断言 (字符串消息) | 记录测试断言。 |
断言 (字符串格式、对象 arg0) | 使用格式字符串和要格式化的对象记录测试断言。 |
断言 (字符串格式,params object[] args) | 使用格式字符串和包含零个或多个要格式化的对象数组记录测试断言。 |
断言 (字符串消息、字符串上下文) | 使用上下文记录测试断言。 |
断言 (字符串消息、字符串文件、字符串函数、int 行) | 记录测试断言,以及文件、函数和行信息。 |
断言 (字符串消息、字符串上下文、字符串文件、字符串函数、int 行) | 使用上下文以及文件、函数和行信息记录测试断言。 |
bug (字符串 bugDatabase,int bugId) | 记录已知的 bug 编号。 |
bug (字符串 bugDatabase、int bugId、字符串上下文) | 使用上下文记录已知的 bug 编号。 |
注释 (IFormatProvider 提供程序、字符串格式、params object[] args) | 使用区域性特定的格式设置信息提供程序、格式字符串和包含零个或多个要格式化的对象的对象数组记录测试注释。 |
注释 (字符串消息) | 记录测试注释 |
注释 (字符串格式、对象 arg0) | 使用格式字符串和要格式化的对象记录测试注释。 |
注释 (字符串格式,params object[] args) | 使用格式字符串和包含零个或多个要设置格式的对象的对象数组记录测试注释。 |
注释 (字符串消息、字符串上下文) | 使用上下文记录测试注释 |
EndGroup (string groupName) | 记录一组测试或特定测试的结束。 |
EndGroup (string groupName,字符串上下文) | 使用上下文记录一组测试或特定测试的结束。 |
错误 (IFormatProvider 提供程序、字符串格式、params 对象[] args) | 使用区域性特定的格式设置信息提供程序、格式字符串以及包含零个或多个要设置格式的对象的对象数组记录测试错误。 |
字符串消息) (错误 | 记录测试错误。 |
字符串格式 (错误、对象 arg0) | 使用格式字符串和要格式化的对象记录测试错误。 |
字符串消息、字符串上下文) (错误 | 使用上下文记录测试错误。 |
错误 (IFormatProvider 提供程序、字符串格式、params 对象[] args) | 使用格式字符串和包含零个或多个要格式化的对象的对象数组记录测试错误。 |
错误 (字符串消息、字符串文件、字符串函数、int 行) | 使用文件、函数和行信息记录测试错误。 |
错误 (字符串消息、字符串上下文、字符串文件、字符串函数、int 行) | 使用上下文以及文件、函数和行信息记录测试错误。 |
文件 (字符串 fileName) | 记录要保存的测试文件。 如果 WTTRunWorkingDir 设置为) ,则文件将保存到 WTTRunWorkingDir\WexLogFileOutput (或 CurrentDirectory\WexLogFileOutput。 |
文件 (字符串 fileName,字符串上下文) | 使用上下文记录要保存的测试文件。 如果 WTTRunWorkingDir 设置为) ,则文件将保存到 WTTRunWorkingDir\WexLogFileOutput (或 CurrentDirectory\WexLogFileOutput。 |
MiniDump () | 记录当前进程小型转储。 |
属性 (字符串名称、字符串值) | 记录名称/值属性对。 该值可以采用 xml 格式。 |
属性 (字符串名称、字符串值、字符串上下文) | 使用上下文记录名称/值属性对。 该值可以采用 xml 格式。 |
Result (TestResult testResult) | 记录测试结果。 |
结果 (TestResult testResult,字符串注释) | 使用关联的注释记录测试结果。 |
结果 (TestResult testResult、字符串注释、字符串上下文) | 使用关联的注释和上下文记录测试结果。 |
StartGroup (string groupName) | 记录一组测试或特定测试的开始时间。 |
StartGroup (string groupName,字符串上下文) | 使用上下文记录一组测试或特定测试的开始时间。 |
警告 (IFormatProvider 提供程序、字符串格式、params object[] args) | 使用区域性特定的格式设置信息提供程序、格式字符串和包含零个或多个要格式化的对象数组记录测试警告。 |
警告 (字符串消息) | 记录测试警告。 |
警告 (字符串格式、对象 arg0) | 使用格式字符串和要格式化的对象记录测试警告。 |
警告 (字符串格式、参数对象[] args) | 使用格式字符串和包含零个或多个要设置格式的对象的对象数组记录测试警告。 |
警告 (字符串消息、字符串上下文) | 使用上下文记录测试警告。 |
警告 (字符串消息、字符串文件、字符串函数、int 行) | 使用文件、函数和行信息记录测试警告。 |
警告 (字符串消息、字符串上下文、字符串文件、字符串函数、int 行) | 记录测试警告,其中包含上下文以及文件、函数和行信息。 |
Xml (字符串 xmlData) | 日志 xml 数据。 不进行任何检查来验证其格式是否良好。 |
Xml (字符串 xmlData,字符串上下文) | 使用上下文记录 xml 数据。 不进行任何检查来验证其格式是否良好。 |
下面是可用的托管 LogContoller 方法列表:
托管 LogController 方法 | 功能 |
---|---|
static void InitializeLogging () | 初始化日志记录功能。 |
static void InitializeLogging (String logName) | 初始化日志记录功能,并指定要使用的日志文件的名称。 注意: 仅当 启用了 WttLogging 时,才会考虑日志名称。 |
static bool IsInitialized () | 返回是否已为此进程初始化 LogController。 |
静态字符串 GetLogName () | 如果有任何) ,则返回在 InitializeLogging 调用 (中为日志指定的名称。 |
static void FinalizeLogging () | 完成日志记录功能。 |
注意: 有关在 TAEF 框架外部使用 WexLogger 托管层时如何处理错误和异常的详细信息,请参阅下面的托管代码错误和异常部分。
注意: 仅当在 TAEF 框架外部使用 WexLogger 时,才需要调用 InitializeLogging/FinalizeLogging,因为 TAEF 已处理日志记录初始化/完成。
注意: 使用 脚本中的 WexLogger 时,无需初始化/完成日志记录功能。
下面是可用的托管 RemoteLogContoller 方法列表:
托管 RemoteLogController 方法 | 功能 |
---|---|
静态字符串 GenerateConnectionData () | 生成必须在父进程和子进程内使用的连接数据,以允许子进程重新登录到父进程。 |
static String GenerateConnectionData (string MachineName) | 在远程计算机上启动子进程时使用。 生成必须在父进程和子进程内使用的连接数据,以允许子进程重新登录到父进程。 |
static void InitializeLogging (String connectionData) | 初始化父进程中的日志记录功能,以便子进程可以记录回该进程。 |
注意: 有关远程日志记录的详细信息,请参阅下面的 从子进程 远程日志记录部分。
从子进程远程日志记录
WexLogger 使一个或多个子进程能够记录回单个父进程,从而在单个日志文件中生成合并的测试结果。
子进程可以与父进程在同一台计算机上运行,也可以在不同的计算机上远程运行。 若要使远程计算机日志记录正常工作,由 WexLogger 客户端为远程计算机上的所有子进程添加 TCP 防火墙排除项。 但是,如果子进程与父进程在同一台计算机上运行,则无需修改防火墙。
若要设置每个远程日志记录连接,必须执行以下步骤:
父进程
调用 RemoteLogController::GenerateConnectionData () 以生成连接数据,这两个进程都必须使用这些数据来启动日志记录连接。
注意:请确保检查此调用的返回值。
NoThrowString connectionData; Throw::IfFailed(RemoteLogController::GenerateConnectionData(connectionData));
通过在子进程的环境块中设置连接数据,或在命令提示符下将其作为参数传递,来与子进程通信连接数据。 例如:
在命令提示符下,作为 WexLogger 理解的命名参数传递:
/wexlogger_connectiondata=[connection data]注意:如果使用此选项,则不需要下面的子进程部分中的步骤 1。
作为 WexLogger 理解的命名环境变量传递:
[YourAppName_cmd]=/wexlogger_connectiondata=[连接数据]注意:如果使用此选项,则不需要下面的子进程部分中的步骤 1。
以任意格式 (其他一些命令参数、环境变量等 )
注意: 如果使用此选项,则下面的 子进程 部分中的步骤 1 是必需的 。注意: 为方便起见,在本机和托管 RemoteLogControllers 中,值“/wexlogger_connectiondata=”定义为常量:
WEX::Logging::c_szWexLoggerRemoteConnectionData,在 LogController.h 中
Wex.Logger.Interop.dll 中的 RemoteLogController.WexLoggerRemoteConnectionData
使用连接数据启动子进程
调用 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 日志。 所有这些都要求运行目录或路径中存在 WttLog.dll 。
如果在实验室中运行,并且安装了 wtt 客户端,将自动为你生成 wtt 日志。 这是因为 WexLogger 查找两个环境变量的存在,它们只应存在于实验室环境中:“WttTaskGuid”和“WTTRunWorkingDir”。 如果这两者都存在,则会自动启用 wtt 日志记录。
如果在实验室环境外部的 TAEF 中运行,请在命令提示符处将 /enablewttlogging 传递给测试用例。 例如:
te my.test.dll /enablewttlogging
如果在 TAEF 框架外部使用 WexLogger,并且未在实验室环境中运行,则必须在调用 LogController::InitializeLogging () 之前将 YOUR_PROCESS_NAME>_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:<new device string>
完全重写 WexLogger 初始化 WttLogger 时使用的 WttDeviceString。
要追加到设备字符串的 /WttDeviceStringSuffix:<value>
将指定的值追加到初始化 WttLogger 时 WexLogger 使用的默认 WttDeviceString。 如果还指定了“/WttDeviceString”,则忽略。
下表列出了 WexLogger TestResults 如何映射到 WttLogger 结果:
WexLogger | WttLogger |
---|---|
Passed | WTT_TESTCASE_RESULT_PASS |
NotRun | WTT_TESTCASE_RESULT_BLOCKED |
已跳过 | WTT_TESTCASE_RESULT_SKIPPED |
已阻止 | WTT_TESTCASE_RESULT_BLOCKED |
已失败 | 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 以包括除错误本身之外的一个或多个以下项:
- MiniDump
- ScreenCapture
- StackTrace
te my.test.dll /minidumponerror
te my.test.dll /screencaptureonerror /stacktraceonerror
启用其中一个或多个选项后,每次调用 Log::Error () 时都会收到额外的输出。
注意:如果在 TAEF 框架外部使用 WexLogger,则必须在调用 LogController::InitializeLogging () 之前设置YOUR_PROCESS_NAME>_CMD环境变量以包含这些选项。< 例如:
Environment.SetEnvironmentVariable("<YOUR_PROCESS_NAME>_CMD", "/screencaptureonerror /minidumponerror /stacktraceonerror");
LogController.InitializeLogging();
Environment.SetEnvironmentVariable("consoleapplication4_cmd", "/screencaptureonerror /minidumponerror /stacktraceonerror");
LogController.InitializeLogging();
C++ 错误处理
为了保护测试用例作者免受检查每个日志 API 调用的返回值的负担,WexLogger 通过使用可选的回调机制报告意外的错误情况; WexLoggerErrorCallback 函数。 通过 LogController::InitializeLogging () ) 初始化 WexLogger (时,客户端可以选择指定 WexLoggerErrorCallback 函数,以在 WexLogger 中发生意外错误情况时调用。 WexLoggerErrorCallback 函数必须使用以下签名:
void __stdcall MyLoggerErrorCallback(const unsigned short* pszMessage, HRESULT hr);
如果测试工具是控制台应用程序) ,WexLoggerErrorCallback 函数的常见用途是将错误消息写出到控制台 (。 例如,TAEF 框架是 WexLogger 的客户端,并实现 WexLoggerErrorCallback ,该函数在发生 WexLogger 错误时将红色文本写入控制台。
.NET 4.0 兼容性
Wex.Logger.Interop 编译为 NetFx 2/3/3.5 二进制文件,以便可以将其加载到 NetFx 2/3/3.5 和 NetFx 4 进程中。 这允许 TAEF 运行 NetFx 2 以上的所有托管程序集。 如果在 TAEF 外部使用 Wex.Logger,则需要为 exe 添加 配置文件 ,以便将 NetFx 4 运行时配置为将 NetFx 2/3/3.5 二进制文件加载到其进程中。 配置文件应包含以下内容:
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
</startup>
</configuration>
托管代码错误和异常处理
为了保护测试用例作者免受检查每个 日志 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 initializaiton/completion 期间预期/处理这些异常。