WexLogger
Der WexLogger bietet eine konsistente API für die Protokollierung, die nativen Code, verwalteten Code und Skripts umfasst. Es wird auch vom Ausführen von Komponententests in einer Eingabeaufforderung bis hin zu Langstreckenbelastungstests skaliert.
Protokollierung über das Verify Framework
Die meisten Protokollierungen innerhalb eines Testfalls sollten über das Verify-Framework ausgeführt werden. Dadurch wird sichergestellt, dass Tests übersichtlicher, sequenzieller und lesbarer erstellt werden. In einigen Fällen werden Testautoren jedoch feststellen, dass sie eine präzisere Kontrolle darüber benötigen, was in die Protokolle geschrieben wird. Daher ist die WexLogger-API erforderlich.
Protokollierung innerhalb von TAEF
Für Testfälle, die innerhalb von TAEF ausgeführt werden, ist keine Protokollierungsinitialisierung durch den Testautor erforderlich. Sie können sofort mit der Verwendung der Protokoll-API beginnen, die für die Sprache verfügbar gemacht wird, in der Sie Ihre Tests erstellen.
Im nativen C++-Code sieht dies wie folgt aus:
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);
In verwaltetem Code sieht dies wie folgt aus:
using WEX.Logging.Interop;
Log.Comment("Rendering to the BufferView");
Log.Comment("Render succeeded");
In JScript sieht dies wie folgt aus:
var log = new ActiveXObject("WEX.Logger.Log");
log.Comment("Rendering to the BufferView");
log.Comment("Render succeeded");
Protokollierung außerhalb von TAEF
Die meiste Zeit wird die Protokollierungsinitialisierung und der Abschluss von TAEF durchgeführt, sodass der WexLogger für die Dauer des Testfalls wie oben angegeben verwendet werden kann und ordnungsgemäß abgeschlossen wird. Wenn ein Client den WexLogger jedoch außerhalb von TAEF verwenden möchte, ist er für den manuellen Aufruf von LogController::InitializeLogging() und LogController::FinalizeLogging() verantwortlich. Diese Anforderung gilt nur für nativen und verwalteten Code. -Skripts haben diese zusätzliche Anforderung nicht. Weitere Informationen zur LogController-API finden Sie weiter unten in der Tabelle Statische LogController-Methoden.
Informationen zum Generieren von WTT-Protokollen außerhalb von TAEF finden Sie im Abschnitt Generieren von WTT-Protokollen.
WexLogger-API
Hier ist die Liste der verfügbaren nativen C++-Protokollmethoden.
Für verwalteten Code und Skripts stehen entsprechende Versionen zur Verfügung.
Native C++-Protokollmethoden | Funktionalität |
---|---|
Assert(const wchar_t* pszAssert) | Protokollieren einer Testbehauptung. |
Assert(const wchar_t* pszAssert, const wchar_t* pszContext) | Protokollieren sie eine Testbehauptung mit Kontext. |
Assert(const wchar_t* pszAssert, const wchar_t* pszFile, const wchar_t* pszFunction, int line) | Protokollieren sie eine Testbehauptung mit Datei-, Funktions- und Zeileninformationen. |
Assert(const wchar_t* pszAssert, const wchar_t* pszContext, const wchar_t* pszFile, const wchar_t* pszFunction, int line) | Protokollieren Sie eine Testbehauptung mit Kontext sowie Datei-, Funktions- und Zeileninformationen. |
Bug(const wchar_t* pszBugDatabase, int bugId) | Protokollieren Sie eine bekannte Fehlernummer. |
Bug(const wchar_t* pszBugDatabase, int bugId, const wchar_t* pszContext) | Protokollieren Sie eine bekannte Fehlernummer mit Kontext. |
Comment(const wchar_t* pszComment) | Protokollieren sie einen Testkommentar. |
Comment(const wchar_t* pszComment, const wchar_t* pszContext) | Protokollieren eines Testkommentars mit Kontext |
EndGroup(const wchar_t* pszGroupName) | Protokollieren Sie das Ende einer Gruppe von Tests oder eines bestimmten Tests. |
EndGroup(const wchar_t* pszGroupName, const wchar_t* pszContext) | Protokollieren Sie das Ende einer Gruppe von Tests oder eines bestimmten Tests mit Kontext. |
Error(const wchar_t* pszError) | Protokollieren Sie einen Testfehler. |
Error(const wchar_t* pszError, const wchar_t* pszContext) | Protokollieren Sie einen Testfehler mit Kontext. |
Error(const wchar_t* pszError, const wchar_t* pszFile, const wchar_t* pszFunction, int line) | Protokollieren Sie einen Testfehler mit Datei-, Funktions- und Zeileninformationen. |
Error(const wchar_t* pszError, const wchar_t* pszContext, const wchar_t* pszFile, const wchar_t* pszFunction, int line) | Protokollieren Sie einen Testfehler mit Kontext sowie Datei-, Funktions- und Zeileninformationen. |
File(const wchar_t* pszFileName) | Protokollieren Sie eine zu speichernde Testdatei. Dateien werden entweder <in WTTRunWorkingDir>\WexLogFileOutput (wenn WTTRunWorkingDir festgelegt ist) oder <CurrentDirectory\>WexLogFileOutput gespeichert. |
File(const wchar_t* pszFileName, const wchar_t* pszContext) | Protokollieren Sie eine zu speichernde Testdatei mit Kontext. Dateien werden entweder <in WTTRunWorkingDir>\WexLogFileOutput (wenn WTTRunWorkingDir festgelegt ist) oder <CurrentDirectory\>WexLogFileOutput gespeichert. |
Property(const wchar_t* pszName, const wchar_t* pszValue) | Protokollieren sie ein Name-Wert-Eigenschaftspaar. Der Wert kann im XML-Format vorliegen. |
Property(const wchar_t* pszName, const wchar_t* pszValue, const wchar_t* pszContext) | Protokollieren Sie ein Name-Wert-Eigenschaftspaar mit Kontext. Der Wert kann im XML-Format vorliegen. |
Result(TestResults::Result testResult) | Protokollieren sie ein Testergebnis. |
Result(TestResults::Result testResult, const wchar_t* pszComment) | Protokollieren Sie ein Testergebnis mit einem zugeordneten Kommentar. |
Result(TestResults::Result testResult, const wchar_t* pszComment, const wchar_t* pszContext) | Protokollieren Sie ein Testergebnis mit einem zugeordneten Kommentar mit Kontext. |
StartGroup(const wchar_t* pszGroupName) | Protokollieren Sie den Start einer Gruppe von Tests oder eines bestimmten Tests. |
StartGroup(const wchar_t* pszGroupName, TestResults::Result defaultTestResult) | Protokollieren des Beginns einer Gruppe von Tests oder eines bestimmten Tests; legt außerdem das Standardtestergebnis fest. |
StartGroup(const wchar_t* pszGroupName, const wchar_t* pszContext) | Protokollieren Sie den Start einer Gruppe von Tests oder eines bestimmten Tests mit Kontext. |
StartGroup(const wchar_t* pszGroupName, const wchar_t* pszContext, TestResults::Result defaultTestResult) | Protokollieren des Beginns einer Gruppe von Tests oder eines bestimmten Tests; legt außerdem das Standardtestergebnis fest. |
Warning(const wchar_t* pszWarning) | Protokollieren sie eine Testwarnung. |
Warning(const wchar_t* pszWarning, const wchar_t* pszContext) | Protokollieren Sie eine Testwarnung mit Kontext. |
Warning(const wchar_t* pszWarning, const wchar_t* pszFile, const wchar_t* pszFunction, int line) | Protokollieren Sie eine Testwarnung mit Datei-, Funktions- und Zeileninformationen. |
Warning(const wchar_t* pszWarning, const wchar_t* pszContext, const wchar_t* pszFile, const wchar_t* pszFunction, int line) | Protokollieren Sie eine Testwarnung mit Kontext sowie Datei-, Funktions- und Zeileninformationen. |
Xml(const wchar_t* pszXml) | Protokollieren von XML-Daten. Es wird keine Überprüfung durchgeführt, um zu überprüfen, ob sie wohlgeformt ist. |
Xml(const wchar_t* pszXml, const wchar_t* pszContext) | Protokollieren von XML-Daten mit Kontext. Es wird keine Überprüfung durchgeführt, um zu überprüfen, ob sie wohlgeformt ist. |
MiniDump() | Protokollieren Des aktuellen Prozessminidumps. |
Hinweis: "Context" ist eine zusätzliche Zeichenfolge, die Sie optional mit einem WexLogger-API-Aufruf bereitstellen können, um mehr Kontext oder Details bereitzustellen. Beispielsweise können Sie "ImageComparator" immer als Ihren Kontext übergeben, wenn Sie WexLogger-API-Aufrufe von Ihren ImageComparator-Klassenmethoden ausführen.
Hier sind die möglichen gültigen Werte für die native C++- TestResults::Result-Enumeration aufgeführt. Für verwalteten Code und Skripts stehen entsprechende Versionen zur Verfügung.
Native C++-TestResults::Result-Enumeration | Funktionalität |
---|---|
Erfolgreich | Der bestandene Test |
NotRun | Der Test wurde nicht ausgeführt. |
Ausgelassen | Der Test wurde übersprungen |
Blockiert | Der Test wurde blockiert. |
Fehler | Fehler beim Test |
Hier ist die Liste der verfügbaren nativen C++-LogController-Methoden:
Native C++-LogController-Methoden | Funktionalität |
---|---|
static HRESULT InitializeLogging() | Initialisieren Sie die Protokollierungsfunktionalität. |
static HRESULT InitializeLogging(WexLoggerErrorCallback pfnErrorCallback) | Initialisieren Sie die Protokollierungsfunktionalität, und geben Sie die WexLoggerErrorCallback-Funktion an, die Sie verwenden möchten, um über interne Protokollierungsfehler benachrichtigt zu werden. |
static HRESULT InitializeLogging(const wchar_t* pszLogName) | Initialisieren Sie die Protokollierungsfunktionalität, und geben Sie den Namen der Protokolldatei an, die Sie verwenden möchten. Hinweis: Der Protokollname wird nur berücksichtigt, wenn WttLogging aktiviert ist. |
static HRESULT InitializeLogging(const wchar_t* pszLogName, WexLoggerErrorCallback pfnErrorCallback) | Initialisieren Sie die Protokollierungsfunktionalität, geben Sie den Namen der Protokolldatei an, die Sie verwenden möchten, und geben Sie die WexLoggerErrorCallback-Funktion an, die Sie verwenden möchten, um über interne Protokollierungsfehler benachrichtigt zu werden. Hinweis: Der Protokollname wird nur berücksichtigt, wenn WttLogging aktiviert ist. |
static bool IsInitialized() | Gibt zurück, ob der LogController für diesen Prozess initialisiert wurde oder nicht. |
static const unsigned short* GetLogName() | Gibt den Namen zurück, der für das Protokoll im InitializeLogging-Aufruf angegeben wurde (falls vorhanden). |
static HRESULT FinalizeLogging() | Beenden der Protokollierungsfunktionalität. |
Hinweis: Weitere Informationen zum WexLoggerErrorCallback-Mechanismus und zur Verwendung außerhalb des TAEF-Frameworks finden Sie im Abschnitt C++-Fehlerbehandlung unten.
Hinweis: Es ist nur erforderlich, InitializeLogging/FinalizeLogging aufzurufen, wenn der WexLogger außerhalb des TAEF-Frameworks verwendet wird, da TAEF bereits die Protokollierungsinitialisierung/-vervollständigung verarbeitet.
Hinweis: Es ist nicht erforderlich, die Protokollierungsfunktion zu initialisieren/abzuschließen, wenn Sie den WexLogger aus dem Skript verwenden.
Hier ist die Liste der verfügbaren nativen C++-RemoteLogContoller-Methoden:
Native C++-RemoteLogController-Methoden | Funktionalität |
---|---|
static HRESULT GenerateConnectionData(WEX::Common::NoThrowString& connectionData) | Generiert die Verbindungsdaten, die innerhalb des übergeordneten und untergeordneten Prozesses verwendet werden müssen, damit sich der untergeordnete Prozess wieder beim übergeordneten Prozess anmelden kann. |
static HRESULT GenerateConnectionData(const wchar_t* pszMachineName, WEX::Common::NoThrowString& connectionData) | Wird beim Starten untergeordneter Prozesse auf einem Remotecomputer verwendet. Generiert die Verbindungsdaten, die innerhalb des übergeordneten und untergeordneten Prozesses verwendet werden müssen, damit sich der untergeordnete Prozess wieder beim übergeordneten Prozess anmelden kann. |
static HRESULT InitializeLogging(WEX::Common::NoThrowString connectionData) | Initialisiert die Protokollierungsfunktionalität innerhalb des übergeordneten Prozesses, damit sich der untergeordnete Prozess wieder bei diesem anmelden kann. |
Hinweis: Weitere Informationen zur Remoteprotokollierung finden Sie weiter unten im Abschnitt Remoteprotokollierung aus untergeordneten Prozessen .
Hier ist die Liste der verfügbaren verwalteten Protokollmethoden.
Verwaltete Protokollmethoden | Funktionalität |
---|---|
Assert(IFormatProvider-Anbieter, Zeichenfolgenformat, params object[] args) | Protokollieren Sie eine Test assert mithilfe eines kulturspezifischen Formatierungsinformationsanbieters, einer Formatzeichenfolge und eines Objektarrays, das null oder mehr zu formatierende Objekte enthält. |
Assert(IFormatProvider-Anbieter, Zeichenfolgenformat, params object[] args) | Protokollieren Sie eine Test assert mithilfe eines kulturspezifischen Formatierungsinformationsanbieters, einer Formatzeichenfolge und eines Objektarrays, das null oder mehr zu formatierende Objekte enthält. |
Assert(Zeichenfolgenmeldung) | Protokollieren sie eine Test assert. |
Assert(string format, object arg0) | Protokollieren Sie eine Test assert mithilfe einer Formatzeichenfolge und eines zu formatierenden Objekts. |
Assert(string format, params object[] args) | Protokollieren Sie eine Test assert mithilfe einer Formatzeichenfolge und ein Objektarray, das null oder mehr zu formatierende Objekte enthält. |
Assert(Zeichenfolgenmeldung, Zeichenfolgenkontext) | Protokollieren Sie eine Test assert mit Kontext. |
Assert(string message, string file, string function, int line) | Protokollieren Sie eine Test assert sowie Datei-, Funktions- und Zeileninformationen. |
Assert(string message, string context, string file, string function, int line) | Protokollieren Sie eine Test assert mit Kontext sowie Datei-, Funktions- und Zeileninformationen. |
Bug(string bugDatabase, int bugId) | Protokollieren Sie eine bekannte Fehlernummer. |
Bug(string bugDatabase, int bugId, string context) | Protokollieren Sie eine bekannte Fehlernummer mit Kontext. |
Comment(IFormatProvider-Anbieter, Zeichenfolgenformat, params object[] args) | Protokollieren Sie einen Testkommentar mithilfe eines kulturspezifischen Formatierungsinformationsanbieters, einer Formatzeichenfolge und eines Objektarrays, das null oder mehr zu formatierende Objekte enthält. |
Kommentar(Zeichenfolgenmeldung) | Protokollieren eines Testkommentars |
Kommentar(Zeichenfolgenformat, Objekt arg0) | Protokollieren Sie einen Testkommentar mithilfe einer Formatzeichenfolge und eines zu formatierenden Objekts. |
Comment(string format, params object[] args) | Protokollieren Sie einen Testkommentar mithilfe einer Formatzeichenfolge und eines Objektarrays, das null oder mehr zu formatierende Objekte enthält. |
Kommentar(Zeichenfolgennachricht, Zeichenfolgenkontext) | Protokollieren eines Testkommentars mit Kontext |
EndGroup(string groupName) | Protokollieren Sie das Ende einer Gruppe von Tests oder eines bestimmten Tests. |
EndGroup(string groupName, string context) | Protokollieren Sie das Ende einer Gruppe von Tests oder eines bestimmten Tests mit Kontext. |
Error(IFormatProvider-Anbieter, Zeichenfolgenformat, params object[] args) | Protokollieren Sie einen Testfehler mithilfe eines kulturspezifischen Formatierungsinformationsanbieters, einer Formatzeichenfolge und eines Objektarrays, das null oder mehr zu formatierende Objekte enthält. |
Fehler(Zeichenfolgenmeldung) | Protokollieren Sie einen Testfehler. |
Error(string format, object arg0) | Protokollieren Sie einen Testfehler mithilfe einer Formatzeichenfolge und eines zu formatierenden Objekts. |
Fehler(Zeichenfolgenmeldung, Zeichenfolgenkontext) | Protokollieren Sie einen Testfehler mit Kontext. |
Error(IFormatProvider-Anbieter, Zeichenfolgenformat, params object[] args) | Protokollieren Sie einen Testfehler mithilfe einer Formatzeichenfolge und eines Objektarrays, das null oder mehr zu formatierende Objekte enthält. |
Fehler(Zeichenfolgenmeldung, Zeichenfolgendatei, Zeichenfolgenfunktion, Int-Zeile) | Protokollieren Sie einen Testfehler mit Datei-, Funktions- und Zeileninformationen. |
Fehler(Zeichenfolgenmeldung, Zeichenfolgenkontext, Zeichenfolgendatei, Zeichenfolgenfunktion, Int-Zeile) | Protokollieren Sie einen Testfehler mit Kontext sowie Datei-, Funktions- und Zeileninformationen. |
File(string fileName) | Protokollieren Sie eine zu speichernde Testdatei. Dateien werden entweder in WTTRunWorkingDir\WexLogFileOutput (wenn WTTRunWorkingDir festgelegt ist) oder CurrentDirectory\WexLogFileOutput gespeichert. |
File(string fileName, string context) | Protokollieren Sie eine zu speichernde Testdatei mit Kontext. Dateien werden entweder in WTTRunWorkingDir\WexLogFileOutput (wenn WTTRunWorkingDir festgelegt ist) oder CurrentDirectory\WexLogFileOutput gespeichert. |
MiniDump() | Protokollieren Des aktuellen Prozessminidumps. |
Property(Zeichenfolgenname, Zeichenfolgenwert) | Protokollieren sie ein Name-Wert-Eigenschaftspaar. Der Wert kann im XML-Format vorliegen. |
Property(Zeichenfolgenname, Zeichenfolgenwert, Zeichenfolgenkontext) | Protokollieren Sie ein Name-Wert-Eigenschaftspaar mit Kontext. Der Wert kann im XML-Format vorliegen. |
Result(TestResult testResult) | Protokollieren sie ein Testergebnis. |
Result(TestResult testResult, Zeichenfolgenkommentar) | Protokollieren Sie ein Testergebnis mit einem zugeordneten Kommentar. |
Result(TestResult testResult, Zeichenfolgenkommentar, Zeichenfolgenkontext) | Protokollieren Sie ein Testergebnis mit einem zugeordneten Kommentar mit Kontext. |
StartGroup(string groupName) | Protokollieren Sie den Start einer Gruppe von Tests oder eines bestimmten Tests. |
StartGroup(string groupName, string context) | Protokollieren Sie den Start einer Gruppe von Tests oder eines bestimmten Tests mit Kontext. |
Warning(IFormatProvider-Anbieter, Zeichenfolgenformat, params object[] args) | Protokollieren Sie eine Testwarnung mithilfe eines kulturspezifischen Formatierungsinformationsanbieters, einer Formatzeichenfolge und eines Objektarrays, das null oder mehr zu formatende Objekte enthält. |
Warnung(Zeichenfolgenmeldung) | Protokollieren sie eine Testwarnung. |
Warning(string format, object arg0) | Protokollieren Sie eine Testwarnung mithilfe einer Formatzeichenfolge und eines zu formatierenden Objekts. |
Warning(string format, params object[] args) | Protokollieren Sie eine Testwarnung mit einer Formatzeichenfolge und einem Objektarray, das null oder mehr zu formatende Objekte enthält. |
Warnung(Zeichenfolgenmeldung, Zeichenfolgenkontext) | Protokollieren Sie eine Testwarnung mit Kontext. |
Warning(string message, string file, string function, int line) | Protokollieren Sie eine Testwarnung mit Datei-, Funktions- und Zeileninformationen. |
Warning(string message, string context, string file, string function, int line) | Protokollieren Sie eine Testwarnung mit Kontext sowie Datei-, Funktions- und Zeileninformationen. |
Xml(string xmlData) | Protokollieren von XML-Daten. Es wird keine Überprüfung durchgeführt, um zu überprüfen, ob sie wohlgeformt ist. |
Xml(string xmlData, string context) | Protokollieren von XML-Daten mit Kontext. Es wird keine Überprüfung durchgeführt, um zu überprüfen, ob sie wohlgeformt ist. |
Hier ist die Liste der verfügbaren verwalteten LogContoller-Methoden:
Verwaltete LogController-Methoden | Funktionalität |
---|---|
static void InitializeLogging() | Initialisieren sie die Protokollierungsfunktionalität. |
static void InitializeLogging(String logName) | Initialisieren Sie die Protokollierungsfunktionalität, und geben Sie den Namen der Protokolldatei an, die Sie verwenden möchten. Hinweis: Der Protokollname wird nur berücksichtigt, wenn WttLogging aktiviert ist. |
static bool IsInitialized() | Gibt zurück, ob der LogController für diesen Prozess initialisiert wurde. |
static String GetLogName() | Gibt den Namen zurück, der für das Protokoll im InitializeLogging-Aufruf angegeben wurde (falls vorhanden). |
static void FinalizeLogging() | Beenden der Protokollierungsfunktionen. |
Hinweis: Weitere Informationen zum Behandeln von Fehlern und Ausnahmen bei Verwendung der verwalteten Ebene von WexLogger außerhalb des TAEF-Frameworks finden Sie weiter unten im Abschnitt Fehler und Ausnahmen für verwalteten Code.
Hinweis: Es ist nur erforderlich, InitializeLogging/FinalizeLogging aufzurufen, wenn WexLogger außerhalb des TAEF-Frameworks verwendet wird, da TAEF die Protokollierungsinitialisierung/-vervollständigung bereits verarbeitet.
Hinweis: Bei Verwendung des WexLogger-Skripts ist es nicht erforderlich, die Protokollierungsfunktionalität zu initialisieren/abzuschließen.
Hier ist die Liste der verfügbaren verwalteten RemoteLogContoller-Methoden:
Verwaltete RemoteLogController-Methoden | Funktionalität |
---|---|
static String GenerateConnectionData() | Generiert die Verbindungsdaten, die innerhalb des übergeordneten und untergeordneten Prozesses verwendet werden müssen, damit sich der untergeordnete Prozess wieder beim übergeordneten Prozess anmelden kann. |
static String GenerateConnectionData(string machineName) | Wird beim Starten untergeordneter Prozesse auf einem Remotecomputer verwendet. Generiert die Verbindungsdaten, die innerhalb des übergeordneten und untergeordneten Prozesses verwendet werden müssen, damit sich der untergeordnete Prozess wieder beim übergeordneten Prozess anmelden kann. |
static void InitializeLogging(String connectionData) | Initialisiert die Protokollierungsfunktionen innerhalb des übergeordneten Prozesses, damit sich der untergeordnete Prozess wieder bei diesem anmelden kann. |
Hinweis: Weitere Informationen zur Remoteprotokollierung finden Sie weiter unten im Abschnitt Remoteprotokollierung von untergeordneten Prozessen .
Remoteprotokollierung von untergeordneten Prozessen
WexLogger bietet die Möglichkeit, dass sich ein oder mehrere untergeordnete Prozesse bei einem einzelnen übergeordneten Prozess anmelden können, was zur Generierung konsolidierter Testergebnisse innerhalb einer einzelnen Protokolldatei führt.
Die untergeordneten Prozesse können entweder auf demselben Computer wie der übergeordnete Prozess oder remote auf einem anderen Computer ausgeführt werden. Damit die Protokollierung des Remotecomputers funktioniert, liegt es am WexLogger-Client, TCP-Firewallausschlüsse für alle untergeordneten Prozesse auf dem Remotecomputer hinzuzufügen. Wenn die untergeordneten Prozesse jedoch auf demselben Computer wie der übergeordnete Prozess ausgeführt werden, sind keine Firewalländerungen erforderlich.
Die folgenden Schritte sind erforderlich, um jede Remoteprotokollierungsverbindung einzurichten:
Übergeordneter Prozess
Rufen Sie RemoteLogController::GenerateConnectionData() auf, um die Verbindungsdaten zu generieren, die von beiden Prozessen zum Initiieren einer Protokollierungsverbindung verwendet werden müssen.
Hinweis: Überprüfen Sie unbedingt den Rückgabewert dieses Aufrufs.
NoThrowString connectionData; Throw::IfFailed(RemoteLogController::GenerateConnectionData(connectionData));
Kommunizieren Sie die Verbindungsdaten mit dem untergeordneten Prozess, indem Sie sie entweder in seinem Umgebungsblock festlegen oder sie an der Eingabeaufforderung als Argument übergeben. Beispiel:
Übergeben Sie als benanntes Argument an der Eingabeaufforderung, die WexLogger versteht:
/wexlogger_connectiondata=[Verbindungsdaten]Hinweis: Wenn diese Option verwendet wird, ist Schritt 1 im Abschnitt Untergeordneter Prozess unten nicht erforderlich.
Übergeben Sie als benannte Umgebungsvariable, die WexLogger versteht:
[YourAppName_cmd]=/wexlogger_connectiondata=[Verbindungsdaten]Hinweis: Wenn diese Option verwendet wird, ist Schritt 1 im Abschnitt Untergeordneter Prozess unten nicht erforderlich.
Übergeben an verarbeitung in einem beliebigen Format (anderer Befehlsparameter, Umgebungsvariable usw.)
Hinweis: Wenn diese Option verwendet wird, ist Schritt 1 im Abschnitt Untergeordneter Prozess unten erforderlich.Hinweis: Zur Vereinfachung wird der Wert "/wexlogger_connectiondata=" sowohl in den nativen als auch in den verwalteten RemoteLogControllers als Konstante definiert:
WEX::Logging::c_szWexLoggerRemoteConnectionData in LogController.h
RemoteLogController.WexLoggerRemoteConnectionData in Wex.Logger.Interop.dll
Starten des untergeordneten Prozesses mit den Verbindungsdaten
Rufen Sie RemoteLogController::InitalizeLogging([Verbindungsdaten, die in Schritt 1 erstellt wurden]) auf. Dieser Aufruf muss nach dem Starten des untergeordneten Prozesses erfolgen, da ein Timeout entsteht, wenn das untergeordnete Element LogController::InitializeLogging() nicht rechtzeitig aufruft.
Hinweis: Überprüfen Sie unbedingt den Rückgabewert dieses Aufrufs.
// ...launch child process with connection data... Throw::IfFailed(RemoteLogController::InitializeLogging(connectionData));
Warten Sie auf den untergeordneten Prozess usw.
Untergeordneter Prozess
Wenn die Verbindungsdaten nicht als benanntes Argument an die Eingabeaufforderung übergeben wurden, die WexLogger versteht (siehe Schritt 2 oben), müssen Sie eine Umgebungsvariable als solche festlegen:
[YourAppName_cmd]=/wexlogger_connectiondata=[Verbindungsdaten]
Beispiel:
// App name is mytestapp.exe ::SetEnvironmentVariable(L"mytestapp_cmd", String(c_szWexLoggerRemoteConnectionData).Append(connectionData));
Rufen Sie LogController::InitializeLogging() auf, um die Protokollierung für diesen Prozess zu initialisieren. Intern nutzt dies die Umgebungsvariable, die in Schritt 1 oben (oder in Schritt 2 des Abschnitts Übergeordneter Prozess ) festgelegt wurde, um eine Protokollierungsverbindung wieder mit dem übergeordneten Prozess zu initiieren.
Protokoll usw. Alle Ablaufverfolgungen werden an den übergeordneten Prozess zurückgesendet.
Rufen Sie LogController::FinalizeLogging() auf, um die Protokollierung für diesen Prozess abzuschließen.
Bestimmen des Testergebnisses
Obwohl eine Methode bereitgestellt wird, um das beabsichtigte Ergebnis eines Testfalls explizit anzugeben (Log::Result()), ist es in den meisten Fällen nicht erforderlich , dass ein Testfall diese Methode verwendet.
Wenn beispielsweise ein Testfall Log ::Result() nicht explizit aufruft und keinen Fehler protokolliert (über Log::Error()), wird er standardmäßig als bestandener Testfall betrachtet. wenn ein Fehler protokolliert wird, handelt es sich um einen fehlerhaften Testfall.
Wenn ein Testfall jedoch explizit Log::Result(TestResults::TestPassed) aufruft, aber auch einen Fehler innerhalb des Testfalls protokolliert, wird der Test weiterhin als Fehler gezählt, da innerhalb des Tests ein Fehler aufgetreten ist.
Innerhalb des TAEF-Frameworks kann dieses Verhalten überschrieben werden, indem Der Test mit einem anderen Standardtestergebnis gekennzeichnet wird. Weitere Informationen hierzu finden Sie im Dokument "Erstellen von TAEF-Tests".
Dieses Verhalten kann auch überschrieben werden, indem Log::StartGroup() explizit für Ihre eigenen Testgruppen/Testfälle mit einem Standardtestergebnis Ihrer Wahl aufgerufen wird.
Generieren von WTT-Protokollen
Es gibt drei Methoden zum Generieren von WTT-Protokollen über den WexLogger. Alle erfordern, dass WttLog.dll im Ausführungsverzeichnis oder in Ihrem Pfad vorhanden ist.
Wenn Sie im Lab ausführen und der wtt-Client installiert ist, werden automatisch wtt-Protokolle für Sie generiert. Dies liegt daran, dass der WexLogger nach zwei Umgebungsvariablen sucht, die nur in einer Labumgebung vorhanden sein sollten: "WttTaskGuid" und "WTTRunWorkingDir". Wenn beide vorhanden sind, wird die wtt-Protokollierung automatisch aktiviert.
Wenn Sie innerhalb von TAEF außerhalb einer Labumgebung ausgeführt werden, übergeben Sie /enablewttlogging an der Eingabeaufforderung an Ihren Testfall. Beispiel:
te my.test.dll /enablewttlogging
Wenn Sie WexLogger außerhalb des TAEF-Frameworks verwenden und nicht in einer Labumgebung ausgeführt werden, müssen Sie die <umgebungsvariable YOUR_PROCESS_NAME>_CMD so festlegen, dass diese Option enthalten ist, bevor Sie LogController::InitializeLogging()aufrufen. Beispiel:
Environment.SetEnvironmentVariable("<YOUR_PROCESS_NAME>_CMD", "/enablewttlogging"); LogController.InitializeLogging();
Environment.SetEnvironmentVariable("consoleapplication4_cmd", "/enablewttlogging"); LogController.InitializeLogging();
Wenn Sie an eine vorhandene wtt-Protokolldatei anfügen möchten, anstatt sie zu überschreiben, geben Sie zusätzlich zu /enablewttlogging auch die Option /appendwttlogging an.
te my.test.dll /enablewttlogging /appendwttlogging
Environment.SetEnvironmentVariable("<YOUR_PROCESS_NAME>_CMD", "/enablewttlogging /appendwttlogging"); LogController.InitializeLogging();
Environment.SetEnvironmentVariable("consoleapplication4_cmd", "/enablewttlogging /appendwttlogging"); LogController.InitializeLogging();
Es ist auch möglich, die standardmäßige WttLogger-Gerätezeichenfolge vollständig zu überschreiben oder anzufügen, indem Sie eine der folgenden Befehlsoptionen angeben:
/WttDeviceString:<new device string>
Überschreibt den wttDeviceString, der von WexLogger bei der Initialisierung von WttLogger verwendet wird, vollständig.
/WttDeviceStringSuffix:<value, das an die Gerätezeichenfolge angefügt werden soll>
Fügt den angegebenen Wert an den standardmäßigen WttDeviceString an, der von WexLogger bei der Initialisierung von WttLogger verwendet wird. Wird ignoriert, wenn auch "/WttDeviceString" angegeben ist.
In der folgenden Tabelle ist aufgeführt, wie WexLogger TestResults zu WttLogger-Ergebnissen zugeordnet wird:
WexLogger | WttLogger |
---|---|
Erfolgreich | WTT_TESTCASE_RESULT_PASS |
NotRun | WTT_TESTCASE_RESULT_BLOCKED |
Ausgelassen | WTT_TESTCASE_RESULT_SKIPPED |
Blockiert | WTT_TESTCASE_RESULT_BLOCKED |
Fehler | WTT_TESTCASE_RESULT_FAIL |
Protokollierungsabhängigkeiten
Die native C++-Protokollierung (Wex.Logger.dll) ist abhängig von Wex.Common.dll und Wex.Communication.dll.
Die verwaltete Protokollierung (Wex.Logger.Interop.dll) ist abhängig von Wex.Logger.dll, Wex.Common.dll und Wex.Communication.dll.
Darüber hinaus ist WttLog.dll erforderlich, wenn Wtt-Protokollierung aktiviert ist.
Zusätzliche Fehlerdaten
Für den Fall, dass ein Fehler protokolliert wird, können Sie WexLogger aktivieren, um eines oder mehrere der folgenden Elemente zusätzlich zum Fehler selbst einzuschließen:
- Minidump
- ScreenCapture
- StackTrace
te my.test.dll /minidumponerror
te my.test.dll /screencaptureonerror /stacktraceonerror
Wenn eine oder mehrere dieser Optionen aktiviert sind, erhalten Sie bei jedem Aufruf von Log::Error() eine zusätzliche Ausgabe.
Hinweis: Wenn Sie WexLogger außerhalb des TAEF-Frameworks verwenden, müssen Sie die Umgebungsvariable< YOUR_PROCESS_NAME>_CMD so festlegen, dass sie diese Optionen enthält, bevor Sie LogController::InitializeLogging() aufrufen. Beispiel:
Environment.SetEnvironmentVariable("<YOUR_PROCESS_NAME>_CMD", "/screencaptureonerror /minidumponerror /stacktraceonerror");
LogController.InitializeLogging();
Environment.SetEnvironmentVariable("consoleapplication4_cmd", "/screencaptureonerror /minidumponerror /stacktraceonerror");
LogController.InitializeLogging();
C++-Fehlerbehandlung
Um Testfallautoren von der Belastung der Überprüfung von Rückgabewerten für jeden Log-API-Aufruf zu schützen, meldet wexLogger unerwartete Fehlerbedingungen über die Verwendung eines optionalen Rückrufmechanismus. eine WexLoggerErrorCallback-Funktion . Nach der Initialisierung von WexLogger (über LogController::InitializeLogging()) können Clients eine WexLoggerErrorCallback-Funktion angeben, um aufzurufen, wenn unerwartete Fehlerbedingungen innerhalb des WexLogger auftreten. Die WexLoggerErrorCallback-Funktion muss die folgende Signatur verwenden:
void __stdcall MyLoggerErrorCallback(const unsigned short* pszMessage, HRESULT hr);
Eine häufige Verwendung der WexLoggerErrorCallback-Funktion besteht darin, die Fehlermeldungen in die Konsole zu schreiben (wenn Ihre Testumgebung eine Konsolenanwendung ist). Das TAEF-Framework ist beispielsweise ein Client von WexLogger und implementiert einen WexLoggerErrorCallback , der roter Text in die Konsole schreibt, wenn WexLogger-Fehler auftreten.
.NET 4.0-Kompatibilität
Wex.Logger.Interop wird als NetFx 2/3/3.5-Binärdatei kompiliert, sodass sie sowohl in NetFx 2/3/3.5 als auch in NetFx 4-Prozesse geladen werden kann. Dadurch kann TAEF alle verwalteten Assemblys über NetFx 2 ausführen. Wenn Sie Wex.Logger außerhalb von TAEF verwenden, müssen Sie eine Konfigurationsdatei für Ihre EXE hinzufügen, um die NetFx 4-Runtime so zu konfigurieren, dass NetFx 2/3/3/3.5-Binärdateien in den Prozess geladen werden. Die Konfigurationsdatei sollte Folgendes enthalten:
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
</startup>
</configuration>
Fehler- und Ausnahmebehandlung für verwalteten Code
Um Testfallautoren von der Belastung der Überprüfung von Rückgabewerten für jeden Protokoll-API-Aufruf zu schützen, meldet die verwaltete Ebene der WexLogger unerwartete Fehlerbedingungen über die Verwendung des LoggerController.WexLoggerError-Ereignisses. Sie können dieses Ereignis jederzeit abonnieren, indem Sie Ihren eigenen WexLoggerErrorEventHandler implementieren und die folgende bekannte Syntax für das C#-Ereignisabonnement verwenden:
LogController.WexLoggerError += new WexLoggerEventHandler(My_WexLoggerErrorHandler);
Hier sehen Sie ein Beispiel dafür, wie Ihr Ereignishandler aussehen könnte:
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;
}
Darüber hinaus lösen die Methoden LogController::InitializeLogging() und LogController::FinalizeLogging() selbst WexLoggerException im Fehlerfall aus. Dies enthält detaillierte Informationen zu dem Fehler und ermöglicht es Ihnen auch, den Testlauf abzubrechen, bevor er beginnt. Testfallautoren müssen sich keine Gedanken über das Abfangen dieser Ausnahmen machen . Sie sollten nur während der WexLogger-Initialisierung/Fertigstellung erwartet/behandelt werden.