WexLogger
WexLogger предоставляет согласованный API для ведения журнала, который охватывает машинный код, управляемый код и скрипт. Он также масштабируется от запуска модульных тестов в командной строке до длительного нагрузочного тестирования.
Ведение журнала с помощью платформы проверки
Большая часть журналов в тестовом случае должна выполняться через платформу Проверки . Это гарантирует, что тесты будут создаваться более четким, последовательным и понятным для человека образом. Однако в некоторых случаях авторы тестов обнаруживают, что им требуется более детализированный контроль над тем, что записывается в журналы. Следовательно, требуется API WexLogger.
Ведение журнала в TAEF
Для тестовых случаев, выполняемых в TAEF, автор тестов не требует инициализации средства ведения журнала. Вы можете сразу же приступить к использованию 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 будет готов к использованию в течение тестового случая, как указано выше, и завершится должным образом. Однако если клиент хочет использовать WexLogger за пределами TAEF, он будет отвечать за вызовы logController::InitializeLogging() и LogController::FinalizeLogging() вручную. Это требование существует только для машинного и управляемого кода; Скрипты не имеют этого дополнительного требования. Дополнительные сведения об API LogController см. в таблице Статические методы LogController ниже.
Сведения о создании журналов WTT за пределами TAEF см. в разделе Создание журналов WTT .
WexLogger API
Ниже приведен список доступных собственных методов журнала C++.
Для управляемого кода и скрипта доступны эквивалентные версии.
Собственные методы журнала C++ | Функциональность |
---|---|
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 — это дополнительная строка, которую при необходимости можно предоставить с помощью вызова API WexLogger , чтобы предоставить дополнительный контекст или сведения. Например, вы можете всегда передавать "ImageComparator" в качестве контекста при выполнении любых вызовов API WexLogger из методов класса ImageComparator.
Ниже приведены возможные допустимые значения для собственного перечисления C++ TestResults::Result . Для управляемого кода и скрипта доступны эквивалентные версии.
Собственное перечисление TestResults::Result C++ | Функциональность |
---|---|
Passed | Тест пройден |
NotRun | Тест не был запущен |
Пропущено | Тест был пропущен |
Блокировано | Тест заблокирован |
Сбой | Сбой теста |
Ниже приведен список доступных собственных методов C++ LogController:
Собственные методы LogController на C++ | Функциональность |
---|---|
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++ ниже.
Примечание: Вызывать InitializeLogging/FinalizeLogging необходимо только при использовании WexLogger за пределами платформы TAEF, так как TAEF уже обрабатывает инициализацию и завершение ведения журнала.
Примечание: При использовании скрипта WexLogger не требуется инициализировать или завершать функции ведения журнала.
Ниже приведен список доступных собственных методов C++ RemoteLogContoller:
Собственные методы RemoteLogController на C++ | Функциональность |
---|---|
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) | Инициализирует функцию ведения журнала в родительском процессе, чтобы дочерний процесс смог вернуться к нему. |
Примечание: Дополнительные сведения об удаленном ведении журнала см. в разделе Удаленное ведение журнала из дочерних процессов ниже.
Ниже приведен список доступных управляемых методов журнала.
Управляемые методы журнала | Функциональность |
---|---|
Assert(поставщик IFormatProvider, строковый формат, params object[] args) | Регистрируйте тестовые утверждения с помощью поставщика сведений о форматировании, зависящее от языка и региональных параметров, строки форматирования и массива объектов, содержащего ноль или более объектов для форматирования. |
Assert(поставщик IFormatProvider, строковый формат, params object[] args) | Регистрируйте тестовые утверждения с помощью поставщика сведений о форматировании, зависящее от языка и региональных параметров, строки форматирования и массива объектов, содержащего ноль или более объектов для форматирования. |
Assert(string message) | Регистрация тестового утверждения. |
Assert(string format, object arg0) | Регистрация тестового утверждения с использованием строки форматирования и объекта для форматирования. |
Assert(string format, params object[] args) | Регистрация тестового утверждения с помощью строки форматирования и массива объектов, содержащего ноль или несколько объектов для форматирования. |
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) | Записывание тестового комментария с помощью поставщика сведений о форматировании для конкретного языка и региональных параметров, строки форматирования и массива объектов, содержащего ноль или несколько объектов для форматирования. |
Comment(string message) | Запись в журнал тестового комментария |
Comment(string format, object arg0) | Зайдите в журнал тестового комментария, используя строку форматирования и объект для форматирования. |
Comment(string format, params object[] args) | Регистрируйте в журнале тестовый комментарий с помощью строки форматирования и массива объектов, который содержит ноль или больше объектов для форматирования. |
Comment(string message, string context) | Запись в журнал тестового комментария с контекстом |
EndGroup(string groupName) | Зайдите в журнал конец группы тестов или конкретного теста. |
EndGroup(string groupName, string context) | Зайдите в журнал конец группы тестов или конкретного теста с контекстом. |
Error(IFormatProvider provider, string format, params object[] args) | Регистрируйте тестовую ошибку с помощью поставщика сведений о форматировании для конкретного языка и региональных параметров, строки форматирования и массива объектов, содержащего ноль или более объектов для форматирования. |
Error(string message) | Регистрация тестовой ошибки. |
Error(string format, object arg0) | Регистрируйте тестовую ошибку с помощью строки форматирования и объекта для форматирования. |
Error(string message, string context) | Регистрируйте в журнале тестовую ошибку с контекстом. |
Error(IFormatProvider provider, string format, params object[] args) | Регистрируйте тестовую ошибку с помощью строки форматирования и массива объектов, содержащего ноль или несколько объектов для форматирования. |
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, строковый комментарий, контекст строки) | Результаты теста записываются в журнал с помощью связанного комментария с контекстом. |
StartGroup(string groupName) | Регистрация начала группы тестов или конкретного теста. |
StartGroup(string groupName, string context) | Регистрируйте начало группы тестов или конкретного теста с контекстом. |
Warning(IFormatProvider provider, string format, params object[] args) | Записывание тестового предупреждения с помощью поставщика сведений о форматировании, зависящее от языка и региональных параметров, строки форматирования и массива объектов, содержащего ноль или более объектов для форматирования. |
Warning(string message) | Зайдите в журнал тестовое предупреждение. |
Warning(string format, object arg0) | Регистрируйте в журнале тестовое предупреждение, используя строку форматирования и объект для форматирования. |
Warning(string format, params object[] args) | Регистрируйте в журнале тестовое предупреждение с помощью строки форматирования и массива объектов, содержащего ноль или больше объектов для форматирования. |
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() | Завершите ведение журнала. |
Примечание: Дополнительные сведения об обработке ошибок и исключений при использовании управляемого уровня WexLogger за пределами платформы TAEF см. в разделе Об ошибках и исключениях управляемого кода ниже.
Примечание: Вызывать InitializeLogging/FinalizeLogging необходимо только при использовании WexLogger за пределами платформы TAEF, так как TAEF уже обрабатывает инициализацию и завершение ведения журнала.
Примечание: При использовании скрипта WexLogger не требуется инициализировать или завершать функции ведения журнала.
Ниже приведен список доступных управляемых методов RemoteLogContoller:
Управляемые методы RemoteLogController | Функциональность |
---|---|
static String 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=[данные подключения]Примечание: Если используется этот параметр, шаг 1 в разделе Дочерний процесс ниже не требуется .
Передайте в качестве именованной переменной среды, которую WexLogger понимает:
[YourAppName_cmd]=/wexlogger_connectiondata=[данные подключения]Примечание: Если используется этот параметр, шаг 1 в разделе Дочерний процесс ниже не требуется .
Передача в процесс в произвольном формате (какой-то другой параметр команды, переменная среды и т. д.)
Примечание: Если используется этот параметр, необходимо выполнить шаг 1 в разделе Дочерний процессниже.Примечание: Для удобства значение "/wexlogger_connectiondata=" определяется как константа как в собственном, так и в управляемом RemoteLogControllers:
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
Для создания журналов WTT с помощью WexLogger существуют три метода. Для всех них требуется, чтобы WttLog.dll присутствовал в каталоге выполнения или в пути.
Если вы работаете в лаборатории, после установки клиента wtt журналы wtt будут созданы автоматически. Это связано с тем, что WexLogger ищет наличие двух переменных среды, которые должны существовать только в лабораторной среде: WttTaskGuid и WTTRunWorkingDir. Если они существуют, ведение журнала wtt включается автоматически.
При выполнении в TAEF за пределами лабораторной среды передайте /enablewttlogging в командной строке в тестовый случай. Пример
te my.test.dll /enablewttlogging
Если вы используете WexLogger за пределами платформы TAEF и не работаете в лабораторной среде, перед вызовом LogController::InitializeLogging() необходимо задать <для переменной среды YOUR_PROCESS_NAME>_CMD значение, содержащее этот параметр. Пример
Environment.SetEnvironmentVariable("<YOUR_PROCESS_NAME>_CMD", "/enablewttlogging"); LogController.InitializeLogging();
Environment.SetEnvironmentVariable("consoleapplication4_cmd", "/enablewttlogging"); LogController.InitializeLogging();
Если вы хотите добавить в существующий файл журнала WTT, а не перезаписать его, также укажите параметр /appendwttlogging в дополнение к параметру /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();
Можно также полностью переопределить или добавить строку устройства WttLogger по умолчанию, указав один из следующих параметров команды:
/WttDeviceString:<новая строка устройства>
Полностью переопределяет WttDeviceString, используемый WexLogger при инициализации WttLogger.
/WttDeviceStringSuffix:<value для добавления в строку устройства>
Добавляет указанное значение к WttDeviceString по умолчанию, используемому WexLogger при инициализации WttLogger. Игнорируется, если также указан параметр /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 один или несколько из следующих элементов в дополнение к самой ошибке:
- Минидампа
- ScreenCapture
- StackTrace
te my.test.dll /minidumponerror
te my.test.dll /screencaptureonerror /stacktraceonerror
Если один или несколько из этих параметров включены, вы будете получать дополнительные выходные данные при каждом вызове Log::Error().
Примечание. Если вы используете WexLogger за пределами платформы TAEF, необходимо задать <для переменной среды YOUR_PROCESS_NAME>_CMD эти параметры перед вызовом LogController::InitializeLogging(). Пример
Environment.SetEnvironmentVariable("<YOUR_PROCESS_NAME>_CMD", "/screencaptureonerror /minidumponerror /stacktraceonerror");
LogController.InitializeLogging();
Environment.SetEnvironmentVariable("consoleapplication4_cmd", "/screencaptureonerror /minidumponerror /stacktraceonerror");
LogController.InitializeLogging();
Обработка ошибок C++
Чтобы оградить авторов тестовых случаев от бремени проверки возвращаемых значений для каждого вызова API журнала, WexLogger сообщает о непредвиденных состояниях ошибок с помощью дополнительного механизма обратного вызова. Функция WexLoggerErrorCallback . После инициализации WexLogger (через LogController::InitializeLogging()) клиенты могут указать функцию 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.5, поэтому его можно загрузить в процессы NetFx 2/3/3.5 и NetFx 4. Это позволяет TAEF запускать все управляемые сборки выше NetFx 2. Если вы используете Wex.Logger за пределами TAEF, необходимо добавить файл конфигурации для файла EXE, чтобы настроить среду выполнения NetFx 4 для загрузки двоичных файлов NetFx 2/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.