Partilhar via


WexLogger

O WexLogger fornece uma API consistente para registro em log que abrange código nativo, código gerenciado e script. Também é escalável, desde a execução de testes de unidade em um prompt de comando até testes de esforço de longa duração.

Log através do Verify Framework

Most logging within a test case should be performed via the Verify framework. Isso garantirá que os testes sejam criados de forma mais clara, sequencial e legível por humanos. No entanto, em alguns casos, os autores do teste descobrirão que precisam de um controle mais granular em torno do que é gravado nos logs: daí a necessidade da API WexLogger.

Registo em TAEF

Para casos de teste em execução no TAEF, não há inicialização do registrador necessária pelo autor do teste. Você pode começar imediatamente a usar a API de log que está exposta ao idioma no qual você está criando seus testes.

No código C++ nativo, ele terá esta aparência:

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

No código gerenciado, ele terá esta aparência:

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

No JScript, terá a seguinte aparência:

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

Exploração madeireira fora do TAEF

Na maioria das vezes, a inicialização e a conclusão do registro serão realizadas pelo TAEF, de modo que o WexLogger estará pronto para uso durante a duração do caso de teste, como mencionado acima, e terminará corretamente. 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 existe apenas para código nativo e gerenciado; Os scripts não têm esse requisito adicional. Consulte a tabela Static LogController Methods abaixo para obter mais informações sobre a API LogController.

Consulte a seção Gerando logs WTT para obter informações sobre como gerar logs WTT fora do TAEF.

WexLogger API

Aqui está a lista de métodos C++ Log nativos disponíveis.

Há versões equivalentes disponíveis para código gerenciado e script.

Métodos de log C++ nativos Functionality
Assert(const wchar_t* pszAssert) Faça um log de uma asserção de teste.
Assert(const wchar_t* pszAssert, const wchar_t* pszContext) Registre uma afirmação de teste, com contexto.
Assert(const wchar_t* pszAssert, const wchar_t* pszFile, const wchar_t* pszFunction, linha int) Registre uma declaração de teste com informações de arquivo, função e linha.
Assert(const wchar_t* pszAssert, const wchar_t* pszContext, const wchar_t* pszFile, const wchar_t* pszFunction, int line) Registre uma declaração de teste, com contexto, e também informações de arquivo, função e linha.
Bug(const wchar_t* pszBugDatabase, int bugId) Registre um número de bug conhecido.
Bug(const wchar_t* pszBugDatabase, int bugId, const wchar_t* pszContext) Registre um número de bug conhecido, com contexto.
Comentário(const wchar_t* pszComment) Registre um comentário de teste.
Comentário(const wchar_t* pszComment, const wchar_t* pszContext) Registrar um comentário de teste, com contexto
EndGroup(const wchar_t* pszGroupName) Registre o final de um grupo de testes ou de um teste específico.
EndGroup(const wchar_t* pszGroupName, const wchar_t* pszContext) // Finaliza o grupo com o nome e contexto especificados Registre o final de um grupo de testes, ou de um teste específico, com contexto.
Error(const wchar_t* pszError) Registre um erro de teste.
Error(const wchar_t* pszError, const wchar_t* pszContext) Registre um erro de teste, com contexto.
Error(const wchar_t* pszError, const wchar_t* pszFile, const wchar_t* pszFunction, linha int) Registre um erro de teste com informações de arquivo, função e linha.
Error(const wchar_t* pszError, const wchar_t* pszContext, const wchar_t* pszFile, const wchar_t* pszFunction, int linha) Registre um erro de teste, com contexto, e também informações de arquivo, função e linha.
Ficheiro(const wchar_t* pszFileName) Registe um ficheiro de teste para ser guardado. Os arquivos são salvos em <WTTRunWorkingDir>\WexLogFileOutput (se WTTRunWorkingDir estiver definido) ou <CurrentDirectory\>WexLogFileOutput.
Arquivo (const wchar_t* pszFileName, const wchar_t* pszContext) Registre um arquivo de teste a ser salvo, com contexto. Os arquivos são salvos em <WTTRunWorkingDir>\WexLogFileOutput (se WTTRunWorkingDir estiver definido) ou <CurrentDirectory\>WexLogFileOutput.
Propriedade(const wchar_t* pszName, const wchar_t* pszValue) Registre um par de propriedades nome/valor. O valor pode estar em formato xml.
Propriedade(const wchar_t* pszName, const wchar_t* pszValue, const wchar_t* pszContext) Registre um par de propriedades nome/valor, com contexto. O valor pode estar em formato xml.
Result(TestResults::Result testResult) Registre um resultado de teste.
Result(TestResults::Resultado testResult, const wchar_t* pszComment) Registre um resultado de teste com um comentário associado.
Result(TestResults::Resultado testResult, const wchar_t* pszComment, const wchar_t* pszContext) Registre um resultado de teste com um comentário associado, com contexto.
StartGroup(const wchar_t* pszGroupName) Registre o início de um grupo de testes ou de um teste específico.
StartGroup(const wchar_t* pszGroupName, TestResults::Resultado defaultTestResult) Registar o início de um grupo de testes, ou de um teste específico; também define o resultado do teste padrão.
StartGroup(const wchar_t* pszGroupName, const wchar_t* pszContext) Registre o início de um grupo de testes, ou de um teste específico, com contexto.
StartGroup(const wchar_t* pszGroupName, const wchar_t* pszContext, TestResults::Resultado defaultTestResult) Registar o início de um grupo de testes, ou de um teste específico; também define o resultado do teste padrão.
Warning(const wchar_t* pszWarning) Registre um aviso de teste.
Warning(const wchar_t* pszWarning, const wchar_t* pszContext) Registre um aviso de teste, com contexto.
Warning(const wchar_t* pszWarning, const wchar_t* pszFile, const wchar_t* pszFunction, int line) Registre um aviso de teste com informações de arquivo, função e linha.
Warning(const wchar_t* pszWarning, const wchar_t* pszContext, const wchar_t* pszFile, const wchar_t* pszFunction, int line) Registre um aviso de teste, com contexto e também informações de arquivo, função e linha.
Xml(const wchar_t* pszXml) Registrar dados XML. Nenhuma verificação é feita para verificar se está bem formado.
Xml(const wchar_t* pszXml, const wchar_t* pszContext) Registar dados XML, com contexto. Nenhuma verificação é feita para verificar se está bem formado.
MiniDump() Registe o minidump do processo atual.

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. Há versões equivalentes disponíveis para código gerenciado e script.

Native C++ TestResults::Result enumeração Functionality
Passed O teste passou
NotRun O teste não foi executado
Skipped O teste foi omitido
Blocked O teste foi bloqueado
Failed O teste falhou

Aqui está a lista de métodos C++ LogController nativos disponíveis:

Métodos C++ nativos LogController Functionality
HRESULT InitializeLogging() Inicialize a funcionalidade de registro.
estático HRESULT InitializeLogging(WexLoggerErrorCallback pfnErrorCallback) Inicialize a funcionalidade de registro em log e especifique a função WexLoggerErrorCallback que você gostaria de usar para ser notificado sobre erros internos do registrador.
estático HRESULT InitializeLogging(const wchar_t* pszLogName) Inicialize a funcionalidade de registro em log e especifique o nome do arquivo de log que você gostaria de usar. Note: The log name is only taken into account if WttLogging is enabled.
estático HRESULT InitializeLogging(const wchar_t* pszLogName, WexLoggerErrorCallback pfnErrorCallback) Inicialize a funcionalidade de registro, especifique o nome do arquivo de log que você gostaria de usar e especifique a função WexLoggerErrorCallback que você gostaria de usar para ser notificado sobre erros internos do registrador. Note: The log name is only taken into account if WttLogging is enabled.
bool estático IsInitialized() Retorna se o LogController foi ou não inicializado para esse processo.
static const não assinado short* GetLogName() Retorna o nome que foi especificado para o log na chamada InitializeLogging (se houver).
estático HRESULT FinalizeLogging() Concluir a funcionalidade de registo.

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.

Aqui está a lista de métodos C++ RemoteLogContoller nativos disponíveis:

Métodos nativos C++ RemoteLogController Functionality
estático HRESULT GenerateConnectionData(WEX::Common::NoThrowString& connectionData) Gera os dados de conexão que devem ser usados nos processos pai e filho para permitir que o processo filho se conecte novamente ao processo pai.
estático HRESULT GenerateConnectionData(const wchar_t* pszMachineName, WEX::Common::NoThrowString& connectionData) Usado ao iniciar processos filho em uma máquina remota. Gera os dados de conexão que devem ser usados nos processos pai e filho para permitir que o processo filho se conecte novamente ao processo pai.
estático HRESULT InitializeLogging(WEX::Common::NoThrowString connectionData) Inicializa a funcionalidade de registro em log dentro do processo pai para que o processo filho possa fazer logon novamente nele.

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

Aqui está a lista de métodos de log gerenciados disponíveis.

Métodos de registo geridos Functionality
Assert(provedor IFormatProvider, formato de cadeia de caracteres, params object[] args) Registre uma declaração de teste usando um provedor de informações de formatação específico da cultura, uma cadeia de caracteres de formato e uma matriz de objetos que contenha zero ou mais objetos para formatar.
Assert(provedor IFormatProvider, formato de cadeia de caracteres, params object[] args) Registre uma declaração de teste usando um provedor de informações de formatação específico da cultura, uma cadeia de caracteres de formato e uma matriz de objetos que contenha zero ou mais objetos para formatar.
Assert(string message) Faça um log de uma asserção de teste.
Assert(formato de cadeia de caracteres, objeto arg0) Registre uma declaração de teste usando uma cadeia de caracteres de formato e um objeto para formatar.
Assert(formato de cadeia de caracteres, params object[] args) Registre uma declaração de teste usando uma cadeia de caracteres de formato e uma matriz de objeto que contenha zero ou mais objetos para formatar.
Assert(mensagem de cadeia de caracteres, contexto de cadeia de caracteres) Registre uma afirmação de teste, com contexto.
Assert(mensagem de cadeia de caracteres, arquivo de cadeia de caracteres, função de cadeia de caracteres, linha int) Registre uma declaração de teste e também informações de arquivo, função e linha.
Assert(mensagem de cadeia de caracteres, contexto de cadeia de caracteres, arquivo de cadeia de caracteres, função de cadeia de caracteres, linha int) Registre uma declaração de teste, com contexto, e também informações de arquivo, função e linha.
Bug(string bugDatabase, int bugId) Registre um número de bug conhecido.
Bug(string bugDatabase, int bugId, string context) Registre um número de bug conhecido, com contexto.
Comentário(provedor IFormatProvider, formato de cadeia de caracteres, objeto params[] args) Registre um comentário de teste usando um provedor de informações de formatação específico da cultura, uma cadeia de caracteres de formato e uma matriz de objetos que contenha zero ou mais objetos para formatar.
Comment(string message) Registrar um comentário de teste
Comentário (formato de cadeia de caracteres, objeto arg0) Registre um comentário de teste usando uma cadeia de caracteres de formato e um objeto para formatar.
Comentário (formato de string, params object[] args) Registre um comentário de teste usando uma cadeia de caracteres de formato e uma matriz de objetos que contenha zero ou mais objetos para formatar.
Comentário (mensagem de cadeia de caracteres, contexto de cadeia de caracteres) Registrar um comentário de teste, com contexto
EndGroup(string groupName) Registre o final de um grupo de testes ou de um teste específico.
EndGroup(string groupName, string context) Registre o final de um grupo de testes, ou de um teste específico, com contexto.
Error(provedor IFormatProvider, formato de cadeia de caracteres, params object[] args) Registre um erro de teste usando um provedor de informações de formatação específico da cultura, uma cadeia de caracteres de formato e uma matriz de objetos que contenha zero ou mais objetos para formatar.
Error(string message) Registre um erro de teste.
Erro (formato de cadeia de caracteres, objeto arg0) Registre um erro de teste usando uma cadeia de caracteres de formato e um objeto para formatar.
Erro (mensagem de cadeia de caracteres, contexto de cadeia de caracteres) Registre um erro de teste, com contexto.
Error(provedor IFormatProvider, formato de cadeia de caracteres, params object[] args) Registre um erro de teste usando uma cadeia de caracteres de formato e uma matriz de objetos que contém zero ou mais objetos para formatar.
Erro (mensagem de cadeia de caracteres, arquivo de cadeia de caracteres, função de cadeia de caracteres, linha int) Registre um erro de teste com informações de arquivo, função e linha.
Erro (mensagem de cadeia de caracteres, contexto de cadeia de caracteres, arquivo de cadeia de caracteres, função de cadeia de caracteres, linha int) Registre um erro de teste, com contexto, e também informações de arquivo, função e linha.
File(string fileName) Registe um ficheiro de teste para ser guardado. Os arquivos são salvos em WTTRunWorkingDir\WexLogFileOutput (se WTTRunWorkingDir estiver definido) ou CurrentDirectory\WexLogFileOutput.
File(string fileName, string context) Registre um arquivo de teste a ser salvo, com contexto. Os arquivos são salvos em WTTRunWorkingDir\WexLogFileOutput (se WTTRunWorkingDir estiver definido) ou CurrentDirectory\WexLogFileOutput.
MiniDump() Registe o minidump do processo atual.
Propriedade(nome da cadeia de caracteres, valor da cadeia de caracteres) Registre um par de propriedades nome/valor. O valor pode estar em formato xml.
Propriedade (nome da cadeia de caracteres, valor da cadeia de caracteres, contexto da cadeia de caracteres) Registre um par de propriedades nome/valor, com contexto. O valor pode estar em formato xml.
Result(TestResult testResult) Registre um resultado de teste.
Result(TestResult testResult, string comment) Registre um resultado de teste com um comentário associado.
Result(TestResult testResult, comentário de cadeia de caracteres, contexto de cadeia de caracteres) Registre um resultado de teste com um comentário associado, com contexto.
StartGroup(string groupName) Registre o início de um grupo de testes ou de um teste específico.
StartGroup(string groupName, contexto da cadeia de caracteres) Registre o início de um grupo de testes, ou de um teste específico, com contexto.
Warning(provedor IFormatProvider, formato de cadeia de caracteres, params object[] args) Registre um aviso de teste usando um provedor de informações de formatação específico da cultura, uma cadeia de caracteres de formato e uma matriz de objetos que contenha zero ou mais objetos para formatar.
Warning(string message) Registre um aviso de teste.
Aviso(formato de cadeia de caracteres, objeto arg0) Registre um aviso de teste usando uma cadeia de caracteres de formato e um objeto para formatar.
Aviso(formato de cadeia de caracteres, params object[] args) Registre um aviso de teste usando uma cadeia de caracteres de formato e uma matriz de objetos que contenha zero ou mais objetos para formatar.
Aviso (mensagem de cadeia de caracteres, contexto de cadeia de caracteres) Registre um aviso de teste, com contexto.
Aviso (mensagem string, string file, string function, int line) Registre um aviso de teste com informações de arquivo, função e linha.
Aviso (mensagem de cadeia de caracteres, contexto de cadeia de caracteres, arquivo de cadeia de caracteres, função de cadeia de caracteres, linha int) Registre um aviso de teste, com contexto e também informações de arquivo, função e linha.
Xml(string xmlData) Registrar dados XML. Nenhuma verificação é feita para verificar se está bem formado.
Xml(string xmlData, contexto da cadeia de caracteres) Registar dados XML, com contexto. Nenhuma verificação é feita para verificar se está bem formado.

Aqui está a lista de métodos LogContoller gerenciados disponíveis:

Métodos Geridos do LogController Functionality
vazio estático InitializeLogging() Inicialize a funcionalidade de registro.
vazio estático InitializeLogging(String logName) Inicialize a funcionalidade de registro em log e especifique o nome do arquivo de log que você gostaria de usar. Note: The log name is only taken into account if WttLogging is enabled.
bool estático IsInitialized() Retorna se o LogController foi ou não inicializado para esse processo.
String estática GetLogName() Retorna o nome que foi especificado para o log na chamada InitializeLogging (se houver).
vazio estático FinalizeLogging() Concluir a funcionalidade de registo.

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.

Aqui está a lista de métodos gerenciados RemoteLogContoller disponíveis:

Métodos RemoteLogController gerenciados Functionality
String estática GenerateConnectionData() Gera os dados de conexão que devem ser usados nos processos pai e filho para permitir que o processo filho se conecte novamente ao processo pai.
static String GenerateConnectionData(string machineName) Usado ao iniciar processos filho em uma máquina remota. Gera os dados de conexão que devem ser usados nos processos pai e filho para permitir que o processo filho se conecte novamente ao processo pai.
vazio estático InitializeLogging(String connectionData) Inicializa a funcionalidade de registro em log dentro do processo pai para que o processo filho possa fazer logon novamente nele.

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

Registro remoto de processos filho

O WexLogger fornece a capacidade de um ou mais processos filho efetuarem login novamente em um processo pai único, resultando na geração de resultados de teste consolidados em um único arquivo de log.

Os processos filho podem ser executados na mesma máquina que o processo pai ou remotamente noutra máquina. Para que o registo de máquina remota funcione, cabe ao cliente WexLogger adicionar exclusões de firewall TCP para todos os subprocessos na máquina remota. No entanto, se os processos filho estiverem sendo executados na mesma máquina que o pai, nenhuma modificação de firewall será necessária.

As seguintes etapas são necessárias para configurar cada conexão de log 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 os dados de conexão com o processo filho definindo-os em seu bloco de ambiente ou passando-os como um argumento no prompt de comando. For example:

    Passe como um argumento nomeado no prompt de comando que o WexLogger entende:
    /wexlogger_connectiondata=[connection data]

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

    Passe como uma variável de ambiente nomeada que o WexLogger entende:
    [YourAppName_cmd]=/wexlogger_connectiondata=[connection data]

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

    Passar a processar em formato arbitrário (outro parâmetro de comando, variável de ambiente, 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. Inicie o processo filho com os dados de conexão

  4. Chame RemoteLogController::InitializeLogging([dados de conexão criados na etapa 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. Aguarde o processo da criança, 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. Registos, entre outros; todos os rastreamentos serão enviados de volta para o processo pai.

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

Determinando o resultado do teste

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 da estrutura TAEF, esse comportamento pode ser substituído marcando seu teste com um resultado de teste padrão diferente. Mais informações sobre isso podem ser encontradas no documento "Criação de testes 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.

Geração de logs 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.

  • Se estiver a operar no laboratório com o cliente wtt instalado, os logs wtt serão automaticamente gerados para si. Isso se deve ao fato de que o WexLogger procura a existência de duas variáveis de ambiente que só devem existir em um ambiente de laboratório: 'WttTaskGuid' e 'WTTRunWorkingDir'. Se ambos existirem, o registro wtt será ativado automaticamente.

  • Se estiver a executar aplicações dentro do TAEF fora de um ambiente de laboratório, introduza /enablewttlogging na linha de comandos no seu caso de teste. Example:

    te my.test.dll /enablewttlogging
    
  • Se você estiver consumindo WexLogger fora da estrutura TAEF e não estiver executando em um ambiente de laboratório, deverá definir a <variável de ambiente YOUR_PROCESS_NAME>_CMD para conter essa opção antes de chamar LogController::InitializeLogging(). Example:

    Environment.SetEnvironmentVariable("<YOUR_PROCESS_NAME>_CMD", "/enablewttlogging");
    LogController.InitializeLogging();
    
    Environment.SetEnvironmentVariable("consoleapplication4_cmd", "/enablewttlogging");
    LogController.InitializeLogging();
    
  • Se você quiser acrescentar a um arquivo de log wtt existente em vez de substituí-lo, especifique também a opção /appendwttlogging além 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();
    

É também possível substituir completamente ou acrescentar o texto padrão do dispositivo WttLogger especificando um dos seguintes comandos:

/WttDeviceString:<nova cadeia de caracteres de dispositivo>
Substitui completamente o WttDeviceString usado pelo WexLogger quando ele inicializa o WttLogger.

/WttDeviceStringSuffix:<valor a ser anexado à cadeia de caracteres do dispositivo>
Acrescenta o valor especificado ao padrão WttDeviceString usado por WexLogger quando ele inicializa WttLogger. Ignorado se '/WttDeviceString' também for especificado.

A tabela a seguir relaciona como o WexLogger TestResults mapeia os resultados do 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.

Dados de erro adicionais

No caso de um erro ser registrado, você pode habilitar o WexLogger para incluir um ou mais dos seguintes itens, além do erro em si:

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

Com uma ou mais dessas opções habilitadas, você receberá uma saída extra toda vez que Log::Error() for chamado.

Nota: Se você estiver consumindo WexLogger fora da estrutura TAEF, deverá definir a <variável de ambiente YOUR_PROCESS_NAME>_CMD para conter essas opções antes de chamar LogController::InitializeLogging(). Example:

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

Tratamento de erros 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);

Um uso comum para a função WexLoggerErrorCallback seria gravar as mensagens de erro no console (se o seu conjunto de teste for um aplicativo de console). 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.

Compatibilidade com .NET 4.0

Wex.Logger.Interop é compilado como um binário NetFx 2/3/3.5, para que possa ser carregado em ambos os processos NetFx 2/3/3.5 e NetFx 4. Isso permite que o TAEF execute todos os assemblies gerenciados acima do 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. O arquivo de configuração deve conter o seguinte:

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

Tratamento de erros e exceções de código gerenciado

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

Aqui está um exemplo de como seu manipulador de eventos pode parecer:

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. Isso fornece informações detalhadas sobre o erro e também permite que você aborte a execução do teste antes que ele comece. Os autores de casos de teste nunca precisarão se preocupar em capturar essas exceções - elas devem ser esperadas/tratadas apenas durante a inicialização/conclusão do WexLogger.