Compartir a través de


WexLogger

WexLogger proporciona una API coherente para el registro que abarca código nativo, código administrado y script. También es capaz de escalar desde la ejecución de pruebas unitarias en la línea de comandos hasta pruebas de estrés intensivas y prolongadas.

Registro a través del marco de verificación

Most logging within a test case should be performed via the Verify framework. Esto garantizará que las pruebas se creen de manera más clara, legible y secuencial para los humanos. Sin embargo, en ciertos casos, los autores de pruebas descubren que necesitan un control más detallado sobre lo que se escribe en los registros; de ahí la necesidad de la API WexLogger.

Registro dentro de TAEF

En el caso de los casos de prueba que se ejecutan en TAEF, el autor de la prueba no necesita ninguna inicialización del registrador. Puede empezar inmediatamente a usar la API de logs que se expone al lenguaje en el que está escribiendo sus pruebas.

En el código nativo de C++, tendrá este aspecto:

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);

En el código administrado, tendrá este aspecto:

using WEX.Logging.Interop;
Log.Comment("Rendering to the BufferView");
Log.Comment("Render succeeded");

En JScript, tendrá este aspecto:

var log = new ActiveXObject("WEX.Logger.Log");
log.Comment("Rendering to the BufferView");
log.Comment("Render succeeded");

Registro fuera de TAEF

La mayor parte del tiempo, la inicialización del registro y la finalización serán realizadas por TAEF, por lo que WexLogger estará listo para usarse durante la duración del caso de prueba como se indicó anteriormente y finalizará correctamente. However, if a client would like to use the WexLogger outside TAEF, they will be responsible for manually calling LogController::InitializeLogging() and LogController::FinalizeLogging(). Este requisito solo existe para código nativo y administrado; Los scripts no tienen este requisito adicional. Consulte la tabla Métodos logController estáticos a continuación para obtener más información sobre la API de LogController.

Consulte la sección Generación de registros WTT para obtener información sobre cómo generar registros WTT fuera de TAEF.

WexLogger API

Esta es la lista de métodos nativos de registro de C++ disponibles.

Hay versiones equivalentes disponibles para el código administrado y el script.

Métodos de registro nativos de C++ Functionality
Assert(const wchar_t* pszAssert) Registre una aserción de prueba.
Assert(const wchar_t* pszAssert, const wchar_t* pszContext) Registre una aserción de prueba, con contexto.
Assert(const wchar_t* pszAssert, const wchar_t* pszFile, const wchar_t* pszFunction, int line) Registre una afirmación de prueba con información sobre el archivo, la función y la línea.
Assert(const wchar_t* pszAssert, const wchar_t* pszContext, const wchar_t* pszFile, const wchar_t* pszFunction, int line) Registre una aseveración de prueba con contexto, así como archivo, función y línea.
Bug(const wchar_t* pszBugDatabase, int bugId) Registre un número de error conocido.
Bug(const wchar_t* pszBugDatabase, int bugId, const wchar_t* pszContext) Registre un número de error conocido, con contexto.
Comment(const wchar_t* pszComment) Registre un comentario de prueba.
Comment(const wchar_t* pszComment, const wchar_t* pszContext) Registrar un comentario de prueba, con contexto
EndGroup(const wchar_t* pszGroupName) Registre el final de un grupo de pruebas o de una prueba específica.
EndGroup(const wchar_t* pszGroupName, const wchar_t* pszContext) Registre el final de un grupo de pruebas, o de una prueba específica, con contexto.
Error(const wchar_t* pszError) Registre un error de prueba.
Error(const wchar_t* pszError, const wchar_t* pszContext) Registre un error de prueba, con contexto.
Error(const wchar_t* pszError, const wchar_t* pszFile, const wchar_t* pszFunction, int line) Registre un error de prueba con información de archivo, función y línea.
Error(const wchar_t* pszError, const wchar_t* pszContext, const wchar_t* pszFile, const wchar_t* pszFunction, int line) Registre un error de prueba, con contexto y también archivo, información de función y línea.
File(const wchar_t* pszFileName) Registre un archivo de prueba para ser guardado. Los archivos se guardan en <WTTRunWorkingDir>\WexLogFileOutput (si se ha establecido WTTRunWorkingDir), o en <CurrentDirectory\>WexLogFileOutput.
File(const wchar_t* pszFileName, const wchar_t* pszContext) Registre un archivo de prueba que se va a guardar, con contexto. Los archivos se guardan en <WTTRunWorkingDir>\WexLogFileOutput (si se ha establecido WTTRunWorkingDir), o en <CurrentDirectory\>WexLogFileOutput.
Property(const wchar_t* pszName, const wchar_t* pszValue) Registre un par de propiedades nombre-valor. El valor puede estar en formato xml.
Property(const wchar_t* pszName, const wchar_t* pszValue, const wchar_t* pszContext) Registre un conjunto de propiedades nombre-valor, con contexto. El valor puede estar en formato xml.
Result(TestResults::Result testResult) Registre un resultado de prueba.
Result(TestResults::Result testResult, const wchar_t* pszComment) Registre un resultado de prueba con un comentario asociado.
Result(TestResults::Result testResult, const wchar_t* pszComment, const wchar_t* pszContext) Registre un resultado de prueba con un comentario asociado, con contexto.
StartGroup(const wchar_t* pszGroupName) Registre el inicio de un grupo de pruebas o de una prueba específica.
StartGroup(const wchar_t* pszGroupName, TestResults::Result defaultTestResult) Registre el inicio de un grupo de pruebas o de una prueba específica; también establece el resultado de la prueba predeterminado.
StartGroup(const wchar_t* pszGroupName, const wchar_t* pszContext) Registre el inicio de un grupo de pruebas, o de una prueba específica, con contexto.
StartGroup(const wchar_t* pszGroupName, const wchar_t* pszContext, TestResults::Result defaultTestResult) Registre el inicio de un grupo de pruebas o de una prueba específica; también establece el resultado de la prueba predeterminado.
Warning(const wchar_t* pszWarning) Registre una advertencia de prueba.
Warning(const wchar_t* pszWarning, const wchar_t* pszContext) Registre una advertencia de prueba, con contexto.
Warning(const wchar_t* pszWarning, const wchar_t* pszFile, const wchar_t* pszFunction, int line) Registre una advertencia de prueba con información de archivo, función y línea.
Warning(const wchar_t* pszWarning, const wchar_t* pszContext, const wchar_t* pszFile, const wchar_t* pszFunction, int line) Registre una advertencia de prueba con contexto, así como información de archivo, función y línea.
Xml(const wchar_t* pszXml) Registrar datos XML. No se realiza ninguna comprobación para verificar que tiene un formato correcto.
Xml(const wchar_t* pszXml, const wchar_t* pszContext) Registrar datos XML con contexto. No se realiza ninguna comprobación para verificar que tiene un formato correcto.
MiniDump() Registre el mini volcado de memoria del proceso actual.

Note: "Context" is an extra string that you can optionally provide with a WexLogger API call to provide more context or detail. For example, you may choose to always pass in "ImageComparator" as your context when making any WexLogger API calls from your ImageComparator class methods.

Here are the possible valid values for the native C++ TestResults::Result enumeration. Hay versiones equivalentes disponibles para el código administrado y el script.

Enumeración TestResults::Result nativa de C++ Functionality
Passed Prueba superada
NotRun La prueba no se ejecutó
Skipped Se omitió la prueba
Blocked La prueba se bloqueó
Failed Error en la prueba

Esta es la lista de métodos logController nativos de C++ disponibles:

Métodos LogController nativos de C++ Functionality
static HRESULT InitializeLogging() Inicialice la funcionalidad de registro.
static HRESULT InitializeLogging(WexLoggerErrorCallback pfnErrorCallback) Inicialice la funcionalidad de registro y especifique la función WexLoggerErrorCallback que desea usar para recibir una notificación de errores internos del registrador.
static HRESULT InitializeLogging(const wchar_t* pszLogName) Inicialice la funcionalidad de registro y especifique el nombre del archivo de registro que desea usar. Note: The log name is only taken into account if WttLogging is enabled.
static HRESULT InitializeLogging(const wchar_t* pszLogName, WexLoggerErrorCallback pfnErrorCallback) Inicialice la funcionalidad de registro, especifique el nombre del archivo de registro que desea usar y especifique la función WexLoggerErrorCallback que desea usar para recibir una notificación de errores internos del registrador. Note: The log name is only taken into account if WttLogging is enabled.
static bool IsInitialized() Devuelve si logController se ha inicializado o no para este proceso.
static const unsigned short* ObtenerNombreDelRegistro() Devuelve el nombre especificado para el registro en la llamada InitializeLogging (si existe).
static HRESULT FinalizeLogging() Finalice la funcionalidad de registro.

Note: See the C++ Error Handling section below for more information on the WexLoggerErrorCallback mechanism and how to use it outside the TAEF framework.

Note: It is only necessary to call InitializeLogging/FinalizeLogging when using the WexLogger outside the TAEF framework, as TAEF already handles logging initialization/completion.

Note: It is not necessary to initialize/complete logging functionality when using the WexLogger from script.

Esta es la lista de métodos remoteLogContoller nativos de C++ disponibles:

Métodos RemoteLogController nativos de C++ Functionality
static HRESULT GenerateConnectionData(WEX::Common::NoThrowString& connectionData) Genera los datos de conexión que se deben usar en los procesos primarios y secundarios para permitir que el proceso secundario vuelva a iniciar sesión en el proceso primario.
static HRESULT GenerateConnectionData(const wchar_t* pszMachineName, WEX::Common::NoThrowString& connectionData) Se utiliza al iniciar procesos secundarios en una máquina remota. Genera los datos de conexión que se deben usar en los procesos primarios y secundarios para permitir que el proceso secundario vuelva a iniciar sesión en el proceso primario.
static HRESULT InitializeLogging(WEX::Common::NoThrowString connectionData) Inicializa la funcionalidad de registro dentro del proceso primario para que el proceso secundario pueda volver a iniciar sesión en él.

Note: See the Remote Logging From Child Processes section below for more information on remote logging.

Esta es la lista de métodos de registro administrados disponibles.

Métodos de registro administrados Functionality
Assert(Proveedor IFormatProvider, formato de cadena, objeto params[] args) Registre una aserción de prueba mediante un proveedor de información de formato cultural específico, una cadena de formato y una matriz de objetos que contenga cero o más elementos a formatear.
Assert(Proveedor IFormatProvider, formato de cadena, objeto params[] args) Registre una aserción de prueba mediante un proveedor de información de formato cultural específico, una cadena de formato y una matriz de objetos que contenga cero o más elementos a formatear.
Assert(string message) Registre una aserción de prueba.
Assert(string format, object arg0) Registre una aserción de prueba mediante una cadena de formato y un objeto al que se va a dar formato.
Assert(string format, params object[] args) Registre una aserción de prueba mediante una cadena de formato y una matriz de objetos que contenga cero o más objetos a los que dar formato.
Assert(cadena mensaje, cadena contexto) Registre una aserción de prueba, con contexto.
Assert(string message, string file, string function, int line) Registre una aserción de prueba y también archivo, información de función y línea.
Afirmar(cadena mensaje, cadena contexto, cadena archivo, cadena función, entero línea) Registre una aseveración de prueba con contexto, así como archivo, función y línea.
Bug(string bugDatabase, int bugId) Registre un número de error conocido.
Bug(string bugDatabase, int bugId, string context) Registre un número de error conocido, con contexto.
Comment(Proveedor IFormatProvider, formato de cadena, objeto params[] args) Registrar un comentario de prueba mediante un proveedor de información de formato específico de la cultura, una cadena de formato y una matriz de objetos que contengan cero o más objetos para dar formato.
Comment(string message) Registrar un comentario de prueba
Comment(string format, object arg0) Registre un comentario de prueba mediante una cadena de formato y un objeto al que se va a dar formato.
Comment(string format, params object[] args) Registre un comentario de prueba mediante una cadena de formato y una matriz de objetos que contenga cero o más objetos a los que dar formato.
Comment(string message, string context) Registrar un comentario de prueba, con contexto
EndGroup(string groupName) Registre el final de un grupo de pruebas o de una prueba específica.
EndGroup(string groupName, string context) Registre el final de un grupo de pruebas, o de una prueba específica, con contexto.
Error(Proveedor IFormatProvider, formato de cadena, objeto params[] args) Registre un error de prueba utilizando un proveedor de información de formato específico de la cultura, una cadena de formato específica y una matriz de objetos que contiene cero o más objetos para dar formato.
Error(string message) Registre un error de prueba.
Error(string format, object arg0) Registre un error de prueba mediante una cadena de formato y un objeto al que se va a dar formato.
Error(mensaje de cadena, contexto de cadena) Registre un error de prueba, con contexto.
Error(Proveedor IFormatProvider, formato de cadena, objeto params[] args) Registre un error de prueba mediante una cadena de formato y una matriz de objetos que contenga cero o más objetos a los que dar formato.
Error(string message, string file, string function, int line) Registre un error de prueba con información de archivo, función y línea.
Error(string message, string context, string file, string function, int line) Registre un error de prueba, con contexto y también archivo, información de función y línea.
File(string fileName) Registre un archivo de prueba para ser guardado. Los archivos se guardan en WTTRunWorkingDir\WexLogFileOutput (si se establece WTTRunWorkingDir) o CurrentDirectory\WexLogFileOutput.
File(string fileName, string context) Registre un archivo de prueba que se va a guardar, con contexto. Los archivos se guardan en WTTRunWorkingDir\WexLogFileOutput (si se establece WTTRunWorkingDir) o CurrentDirectory\WexLogFileOutput.
MiniDump() Registre el mini volcado de memoria del proceso actual.
Propiedad(string name, string value) Registre un par de propiedades nombre-valor. El valor puede estar en formato xml.
Property(string name, string value, string context) Registre un conjunto de propiedades nombre-valor, con contexto. El valor puede estar en formato xml.
Result(TestResult testResult) Registre un resultado de prueba.
Result(TestResult testResult, cadena comentario) Registre un resultado de prueba con un comentario asociado.
Result(TestResult testResult, cadena comment, cadena context) Registre un resultado de prueba con un comentario asociado, con contexto.
StartGroup(string groupName) Registre el inicio de un grupo de pruebas o de una prueba específica.
StartGroup(string groupName, string context) Registre el inicio de un grupo de pruebas, o de una prueba específica, con contexto.
Warning(Proveedor IFormatProvider, formato de cadena, objeto params[] args) Registre una advertencia de prueba usando un proveedor de formato cultural específico, una cadena de formato y una matriz de objetos que contenga cero o más objetos para formatear.
Warning(string message) Registre una advertencia de prueba.
Warning(string format, object arg0) Registre una advertencia de prueba mediante una cadena de formato y un objeto al que se va a dar formato.
Warning(string format, params object[] args) Registre una advertencia de prueba mediante una cadena de formato y una matriz de objetos que contenga cero o más objetos a los que dar formato.
Warning(string message, string context) // Advertencia(mensaje de cadena, contexto de cadena) Registre una advertencia de prueba, con contexto.
Warning(string message, string file, string function, int line) Registre una advertencia de prueba con información de archivo, función y línea.
Warning(string message, string context, string file, string function, int line) Registre una advertencia de prueba con contexto, así como información de archivo, función y línea.
Xml(string xmlData) Registrar datos XML. No se realiza ninguna comprobación para verificar que tiene un formato correcto.
Xml(string xmlData, string context) Registrar datos XML con contexto. No se realiza ninguna comprobación para verificar que tiene un formato correcto.

Esta es la lista de métodos logContoller administrados disponibles:

Métodos gestionados de LogController Functionality
static void InitializeLogging() Inicialice la funcionalidad de registro.
static void InitializeLogging(String logName) Inicialice la funcionalidad de registro y especifique el nombre del archivo de registro que desea usar. Note: The log name is only taken into account if WttLogging is enabled.
static bool IsInitialized() Devuelve si logController se ha inicializado o no para este proceso.
static String GetLogName() Devuelve el nombre especificado para el registro en la llamada InitializeLogging (si existe).
static void FinalizeLogging() Finalice la funcionalidad de registro.

Note: See the Managed Code Error and Exception section below for more information on how to handle errors and exceptions when using the managed layer of the WexLogger outside the TAEF framework.

Note: It is only necessary to call InitializeLogging/FinalizeLogging when using the WexLogger outside the TAEF framework, as TAEF already handles logging initialization/completion.

Note: It is not necessary to initialize/complete logging functionality when using the WexLogger from script.

Esta es la lista de métodos RemoteLogContoller administrados disponibles:

Métodos gestionados de RemoteLogController Functionality
static String GenerateConnectionData() Genera los datos de conexión que se deben usar en los procesos primarios y secundarios para permitir que el proceso secundario vuelva a iniciar sesión en el proceso primario.
static String GenerateConnectionData(string machineName) Se utiliza al iniciar procesos secundarios en una máquina remota. Genera los datos de conexión que se deben usar en los procesos primarios y secundarios para permitir que el proceso secundario vuelva a iniciar sesión en el proceso primario.
static void InitializeLogging(String connectionData) Inicializa la funcionalidad de registro dentro del proceso primario para que el proceso secundario pueda volver a iniciar sesión en él.

Note: See the Remote Logging From Child Processes section below for more information on remote logging.

Registro remoto desde procesos secundarios

WexLogger proporciona la capacidad de que uno o varios procesos secundarios vuelvan a iniciar sesión en un único proceso primario, lo que da lugar a la generación de resultados de pruebas consolidados dentro de un único archivo de registro.

Los procesos secundarios se pueden ejecutar en la misma máquina que el proceso primario o de forma remota en otra máquina. Para que el registro de máquinas remotas funcione, es responsabilidad del cliente WexLogger agregar exclusiones de firewall TCP para todos los procesos secundarios de la máquina remota. Sin embargo, si los procesos secundarios se ejecutan en la misma máquina que el proceso principal, no es necesario realizar ningún cambio en el firewall.

Los pasos siguientes son necesarios para configurar cada conexión de registro remoto:

Parent Process

  1. Call RemoteLogController::GenerateConnectionData() to generate the connection data that must be used by both processes to initiate a logging connection.

    Note: Be sure to check the return value of this call.

        NoThrowString connectionData;
        Throw::IfFailed(RemoteLogController::GenerateConnectionData(connectionData));
    
    
  2. Comunique los datos de conexión con el proceso secundario estableciéndolos en su bloque de entorno o pasándolos como argumento en la línea de comandos. For example:

    Páselo como argumento nombrado en la línea de comandos que WexLogger pueda entender:
    /wexlogger_connectiondata=[connection data]

    Note: If this option is used, then step 1 in the Child Process section below is not necessary.

    Pase como una variable de entorno con nombre que WexLogger comprende:
    [YourAppName_cmd]=/wexlogger_connectiondata=[connection data]

    Note: If this option is used, then step 1 in the Child Process section below is not necessary.

    Pasar al proceso en un formato arbitrario (algún otro parámetro de comando, variable de entorno, etc.)
    Note: If this option is used, then step 1 in the Child Process section below is necessary.

    Note: As a convenience, the value "/wexlogger_connectiondata=" is defined as a constant in both the native and managed RemoteLogControllers:

    • WEX::Logging::c_szWexLoggerRemoteConnectionData, in LogController.h

    • RemoteLogController.WexLoggerRemoteConnectionData, in Wex.Logger.Interop.dll

  3. Inicio del proceso secundario con los datos de conexión

  4. Llame a RemoteLogController::InitializeLogging([datos de conexión creados en el paso 1])). This call must be made after the child process is launched, since it will time out if the child does not call LogController::InitializeLogging() in a timely manner.

    Note: Be sure to check the return value of this call.

    // ...launch child process with connection data...
    Throw::IfFailed(RemoteLogController::InitializeLogging(connectionData));
    
  5. Espere al proceso hijo, etc.

Child Process

  1. If the connection data was not passed to the child process as a named argument at the command prompt that WexLogger understands (see step 2 above), then you must set an environment variable as such:

    [YourAppName_cmd]=/wexlogger_connectiondata=[connection data]

    For example:

    // App name is mytestapp.exe
    ::SetEnvironmentVariable(L"mytestapp_cmd", String(c_szWexLoggerRemoteConnectionData).Append(connectionData));
    
  2. Call LogController::InitializeLogging() to initialize logging for this process. Internally, this will leverage the environment variable set in step 1 above (or in step 2 of the Parent Process section) to initiate a logging connection back to the parent process.

  3. Registro, etc. todos los seguimientos se devolverán al proceso primario.

  4. Call LogController::FinalizeLogging() to finish logging for this process.

Determinar el resultado de la prueba

Although there is a method provided to explicitly state the intended outcome of a test case (Log::Result()), there is no need for a test case to use this method in most cases.

For example, if a test case does not explicitly call Log::Result(), and does not log an error (via Log::Error()), by default it is considered a passing test case; if it does log an error, it is a failing test case.

However, if a test case does explicitly call Log::Result(TestResults::TestPassed), but also does log an error within the test case, the test will still be counted as a failure since an error occurred within the test.

Dentro del marco de TAEF, este comportamiento se puede invalidar etiquetando la prueba con un resultado de prueba predeterminado diferente. Puede encontrar más información sobre esto en el documento "Creación de pruebas DE TAEF".

This behavior can also be overridden by explicitly calling Log::StartGroup() for your own test groups/test cases, with a default test result of your choice.

Generación de registros WTT

Three methods exist to generate WTT logs via the WexLogger. All of them require that WttLog.dll is present in the run directory, or in your path.

  • Si está ejecutando en el laboratorio, con el cliente wtt instalado, los registros de wtt se generarán automáticamente. Esto se debe al hecho de que WexLogger busca la existencia de dos variables de entorno que solo deben existir en un entorno de laboratorio: "WttTaskGuid" y "WTTRunWorkingDir". Si existen ambas, el registro de wtt se habilita automáticamente.

  • Si se ejecuta dentro de TAEF fuera de un entorno de laboratorio, pase el comando /enablewttlogging al símbolo del sistema para su caso de prueba. Example:

    te my.test.dll /enablewttlogging
    
  • Si usa WexLogger fuera del marco de TAEF y no se ejecuta en un entorno de laboratorio, debe establecer la <variable de entorno YOUR_PROCESS_NAME>_CMD para que contenga esta opción antes de llamar a LogController::InitializeLogging().. Example:

    Environment.SetEnvironmentVariable("<YOUR_PROCESS_NAME>_CMD", "/enablewttlogging");
    LogController.InitializeLogging();
    
    Environment.SetEnvironmentVariable("consoleapplication4_cmd", "/enablewttlogging");
    LogController.InitializeLogging();
    
  • Si desea anexar a un archivo de registro wtt existente en lugar de sobrescribirlo, especifique también la opción /appendwttlogging además de /enablewttlogging.

    te my.test.dll /enablewttlogging /appendwttlogging
    
    Environment.SetEnvironmentVariable("<YOUR_PROCESS_NAME>_CMD", "/enablewttlogging /appendwttlogging");
    LogController.InitializeLogging();
    
    Environment.SetEnvironmentVariable("consoleapplication4_cmd", "/enablewttlogging /appendwttlogging");
    LogController.InitializeLogging();
    

También es posible sobrescribir o agregar completamente a la cadena del dispositivo predeterminado WttLogger especificando una de las siguientes opciones de comando:

/WttDeviceString:<cadena de dispositivo nueva>
Invalida completamente el WttDeviceString usado por WexLogger cuando inicializa WttLogger.

/WttDeviceStringSuffix:<valor para añadir a la cadena del dispositivo>
Anexa el valor especificado al WttDeviceString predeterminado usado por WexLogger cuando inicializa WttLogger. Se omite si también se especifica '/WttDeviceString'.

En la tabla siguiente se muestra cómo los TestResults de WexLogger se asignan a los resultados de WttLogger.

WexLogger WttLogger
Passed WTT_TESTCASE_RESULT_PASS
NotRun WTT_TESTCASE_RESULT_BLOCKED
Skipped WTT_TESTCASE_RESULT_SKIPPED
Blocked WTT_TESTCASE_RESULT_BLOCKED
Failed WTT_TESTCASE_RESULT_FAIL

Logger Dependencies

The native C++ logger (Wex.Logger.dll) is dependent upon Wex.Common.dll and Wex.Communication.dll.

The managed logger (Wex.Logger.Interop.dll) is dependent upon Wex.Logger.dll, Wex.Common.dll and Wex.Communication.dll.

Additionally, WttLog.dll is required when Wtt Logging is enabled.

Datos de error adicionales

En caso de que se registre un error, puede habilitar WexLogger para incluir uno o varios de los siguientes elementos además del propio error:

  • MiniDump
  • ScreenCapture
  • StackTrace
te my.test.dll /minidumponerror
te my.test.dll /screencaptureonerror /stacktraceonerror

Con una o varias de estas opciones habilitadas, recibirá una salida adicional cada vez que se llame a Log::Error().

Nota: Si usa WexLogger fuera del marco de TAEF, debe establecer la <variable de entorno YOUR_PROCESS_NAME>_CMD para que contenga estas opciones antes de llamar a LogController::InitializeLogging().. Example:

Environment.SetEnvironmentVariable("<YOUR_PROCESS_NAME>_CMD", "/screencaptureonerror /minidumponerror /stacktraceonerror");
LogController.InitializeLogging();
Environment.SetEnvironmentVariable("consoleapplication4_cmd", "/screencaptureonerror /minidumponerror /stacktraceonerror");
LogController.InitializeLogging();

Control de errores de C++

In order to shield test case authors from the burden of checking return values for each Log API call, the WexLogger reports unexpected error conditions via the use of an optional callback mechanism; a WexLoggerErrorCallback function. Upon initializaiton of the WexLogger (via LogController::InitializeLogging()), clients may choose to specify a WexLoggerErrorCallback function to call if unexpected error conditions occur within the WexLogger. The WexLoggerErrorCallback function must use the following signature:

void __stdcall MyLoggerErrorCallback(const unsigned short* pszMessage, HRESULT hr);

Un uso común de la función WexLoggerErrorCallback sería escribir los mensajes de error en la consola (si el arnés de prueba es una aplicación de consola). For example, the TAEF framework is a client of the WexLogger, and implements a WexLoggerErrorCallback which writes red text to the console when WexLogger errors occur.

Compatibilidad con .NET 4.0

Wex.Logger.Interop se compila como un binario de NetFx 2/3/3.5, de modo que se pueda cargar en procesos de NetFx 2/3/3.5 y NetFx 4. Esto permite a TAEF ejecutar todos los ensamblados administrados por encima de NetFx 2. If you're using Wex.Logger outside TAEF, then you need to add a config file for your exe to configure the NetFx 4 runtime to load NetFx 2/3/3.5 binaries into it's process. El archivo de configuración debe contener lo siguiente:

<configuration> 
    <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0"/>
    </startup>
</configuration>

Manejo de errores y excepciones en código gestionado

In order to shield test case authors from the burden of checking return values for each Log API call, the managed layer of the WexLogger reports unexpected error conditions via the use of the LoggerController.WexLoggerError event. You may subscribe to this event at any time by implementing your own WexLoggerErrorEventHandler and using the following familiar syntax for C# event subscription:

LogController.WexLoggerError += new WexLoggerEventHandler(My_WexLoggerErrorHandler);

Este es un ejemplo del aspecto que podría tener el controlador de eventos:

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;
}

Additionally, the LogController::InitializeLogging() and LogController::FinalizeLogging() methods themselves throw WexLoggerException in the event of failure. Esto proporciona información detallada sobre el error y también permite anular la ejecución de pruebas antes de comenzar. Los autores de casos de prueba nunca tendrán que preocuparse de detectar estas excepciones: solo se deben esperar o controlar durante la inicialización o finalización de WexLogger.