PowerShell

Wie Sie einen PowerShellagenten einrichten können Sie in dem Kapitel Erstellen eines Automatisierungsagenten nachlesen. Der PowerShellagent wird für die Ausführung eines Testfalls mit PowerShell Skripten benötigt.
Um ein PowerShell-Skript zu einem Testfall hinzuzufügen, öffnen Sie den Bereich Testschritte im Testfall. Hier wechseln Sie auf den Reiter "Automatisierung".
 
 
Wenn Sie nun PowerShell auswählen, wird automatisch ein Beispiel PowerShell-Skript eingefügt. In dem Beisepielskript können Sie die Funktionalitäten, welche durch den PowerShell-Agenten zur Verfügung gestellt werden, nachvollziehen. Sie können das Skript dann weiter anpassen oder auch direkt durch andere Skripte ersetzen.
 
Im Folgenden werden alle Informationen zu den Objekten und Funktionen erläutert, welche durch den PowerShell-Agent für PowerShell-Skripte zur Verfügung gestellt werden:
 
  • variables - Array von Objekten, die Testfallvariablen (und ihre Werte) für die Ausführung beinhalten. Name und Value sind die wichtigsten Eigenschaften für VariableValue
  • tempDir - String Variable, die den Pfad des temporären Verzeichnisses enthält, in dem Skriptanhänge gespeichert wurden (wenn vorhanden)
  • aquaCallback - Verweis auf ein Hilfs-Objekt, dass genutzt werden kann, um mit aqua vom PowerShell-Skript zu kommunizieren. Die verfügbare Funktionalität beinhaltet:
  • Senden von Log-Nachrichten nach aqua (auch mit Screenshots)
  • Senden von Anhängen nach aqua (gespeichert als Anhänge im Ausführungsobjekt)
  • Senden von Testausführungs Status über AddExecutionData
  • Abfragen der Testausführungsinformationen (Ids von Projekt, Testfall, Testausführung, Testszenario, Testszenarioausführung)
  • StopRequest Eigenschaft - wird bei Abbruchanfragen, die von aqua erhalten werden, vom Agenten gesetzt. Lang laufende Skripte sollten dieses Flag periodisch überprüfen und das Skript stoppen, wenn es gesetzt ist. Wenn nicht nach 5 Sekunden gestoppt wird, nachdem dieses Flag gesetzt wurde, terminiert der Agent das laufende Skript selbstständig.
 
Zum Aufrufen von nunit aus PowerShell können Sie einen Befehl nutzen wie:  
 
$output = & $nunitLocation $testDll --test=$testCaseName 2>&1
 
Um exponierte Objekte zu nutzen, muss das PowerShell-Skript ihre Benutzung deklarieren, indem der folgende Befehl eingegeben wird:
 
param($variables, $tempDir, $aquaCallback)
 
Beachten Sie, dass alle genutzten Variablen in einem einzelnen "param"-Befehl deklariert werden müssen. Ein Beispielskript, dass diese Objekte benutzt: 
 
 
 
# Beispiel PowerShell Skript, dass .Net Objekte und Testfallvariablen von aqua benutzt
param($variables, $tempDir, $aquaCallback)  
$text = new-object System.Text.StringBuilder  
$date = [System.DateTime]::Now  
$text.AppendLine($date.ToLongDateString())  
$text.AppendLine($date.ToLongTimeString())  
echo "$text" > script-sample.log  
foreach ($var in $variables)  
{  
    $varName = $var.Name  
    $varValue = $var.Value  
    echo "Variable: $varName : $varValue" >> script-sample.log  
}
#Abfragen der Testausführungsinformationen über $aquaCallback.GetExecutionInfo()
#Es wird dabei ein Objekt zurückgegeben mit ProjectId, TestCaseId, TestExecutionId, [TestScenarioId and TestScenarioExecutionId]
$executionInfo = $aquaCallback.GetExecutionInfo()                                                             
Write-Output "Project ID: $($executionInfo.ProjectId)" >> script-sample.log
Write-Output "TestCase ID: $($executionInfo.TestCaseId)"  >> script-sample.log
Write-Output "Execution ID $($executionInfo.TestExecutionId)" >> script-sample.log
Write-Output "Scenario ID (when run in scenario): $($executionInfo.TestScenarioId)" >> script-sample.log
Write-Output "Scenario Execution ID (when run in scenario): $($executionInfo.TestScenarioExecutionId)" >> script-sample.log
# Mögliche Typen von [aqua.ProcessEngine.WebServiceProxy.ExecutionLogMessageType]
# SUTError, ScriptExecutionError, PreparationError, ExecutionError, InformationalInfo, InformationalDebug, InformationalWarn, InformationalSuccess  
$aquaCallback.SendMessage("hello, I was sent from script", [aqua.ProcessEngine.WebServiceProxy.ExecutionLogMessageType]::InformationalWarn, "my category");   
$aquaCallback.SendMessageWithScreenshot("and this is Screenshot", "c:\sample.jpg", [aqua.ProcessEngine.WebServiceProxy.ExecutionLogMessageType]::InformationalWarn, "my category");   
dir $tempDir >> script-sample.log  
$aquaCallback.AddExecutionAttachment("script-sample.log");  
while ($true)  
{  
    if ($aquaCallback.StopRequest)  
    {
        $aquaCallback.SendMessage("Aborting on StopRequest", [aqua.ProcessEngine.WebServiceProxy.ExecutionLogMessageType]::InformationalWarn, "my category");   
        return "Aborted"   
    }  
    Start-Sleep -s 10  
    aquaCallback.SendMessage("Looping in PowerShell…", [aqua.ProcessEngine.WebServiceProxy.ExecutionLogMessageType]::InformationalWarn, "my category");   
}  
# Gibt den Status der Testausführung zurück. Mögliche Werte sind: Ready, Blocked, Fail, Aborted  
return "Ready" 
 
 

Datei hochladen

Über den Button Datei hochladen können Sie Dateien zu dem automatisierten PowerShell Schritt hinzufügen, welche dann bei der Ausführung automatisch heruntergeladen und in dem Temp Ordner des Agenten, in dem auch das Skript ausgeführt wird, abgelegt werden. Damit können Sie ganz einfach diese Dateien innerhalb des Skriptes verwenden.
Außerdem können auch Dateien bei der Skriptausführung hochgeladen werden und an die Ausführung angehängt werden. Dies geht über den folgenden Call: $aquaCallback.AddExecutionAttachment("Dateipfad")
 

Execution Status

In PowerShell haben Sie zusätzlich die Möglichkeit, einen Ausführungsstatus in Form einer Liste von Parametern nach aqua zu senden. Dies hilft in Situationen, wenn die Testausführung sehr lange dauert und Sie einen Zwischenstand in aqua geben möchten, zum Beispiel einen Testfortschritt als Prozent-Wert oder die Anzahl der bereits abgearbeiteten Prüfschritte. Folgender Beispiel-Code zeigt, wie Sie diesen Ausführungsstatus senden können:
 
# mehrere Werte als Ausführungsstatus auf einmal senden
$attributes = @()
 
$attribute = New-Object aqua.ProcessEngine.WebServiceProxy.ExecutionDataAttribute
$attribute.AttrName = "dummy"
$attribute.AttrType = [aqua.ProcessEngine.WebServiceProxy.ExecutionDataAttributeType] "Integer"
$attribute.AttrValue = "14"
$attributes += $attribute
 
$attribute = New-Object aqua.ProcessEngine.WebServiceProxy.ExecutionDataAttribute
$attribute.AttrName = "dummy2"
$attribute.AttrType = [aqua.ProcessEngine.WebServiceProxy.ExecutionDataAttributeType] "String"
$attribute.AttrValue = "HelloWorld"
$attributes += $attribute
 
# ist der zweite Paramater true, dann wird der komplette Ausführungsstatus ersetzt, andernfalls werden existierende Werte überschrieben oder noch nicht vorhandene Werte ergänzt
$aquaCallback.AddExecutionData($attributes, $true)
 
# einzelnen Wert als Ausführungsstatus senden
# $aquaCallback.AddExecutionDataString(string name, string value)
$aquaCallback.AddExecutionDataString("Progress", "50%")
 
# $aquaCallback.AddExecutionDataInteger(string name, int value)
$aquaCallback.AddExecutionDataInteger("No. of Checks", 50)
 
 

Übertragung von Informationen zwischen Schritten

Zwei PowerShell-Skripte in unterschiedlichen Testschritten sind zunächst unabhängig voneinander und es können keine Daten aus dem einem Schritt ohne weiteres in einem nachfolgenden Schritt aufgegriffen und weiter verwendet werden. Um dieses Problem zu lösen kann der Ausführungsstatus auch dazu benutzt werden, um Daten aus einem automatisierten Schritt in den nächsten automatisierten Schritt zu überführen und wiederzuverwenden. Die benötigten Methoden sind im Folgenden beschrieben:
 
# $aquaCallback.GetAllExecutionAttributesInExecution()
$allAttributes = $aquaCallback.GetAllExecutionAttributesInExecution()
 
# $aquaCallback.GetExecutionAttributeInExecution(string attributeName)
$progress = $aquaCallback.GetExecutionAttributeInExecution("Progress")
 
# $aquaCallback.GetExecutionAttributeValueInExecution(string attributeName)
$noOfChecks = $aquaCallback.GetExecutionAttributeValueInExecution("No. of Checks")
 
 
Hier ein Minimalbeispiel für die Übertragung und Ausgabe von einem String zwischen zwei Schritten:
In Schritt 1:
$aquaCallback.AddExecutionDataString("GeteilteStringVariable","dies ist der Inhalt der String Variable aus Schritt 1") 
 
In Schritt 2:
$aquaCallback.SendMessage($aquaCallback.GetExecutionAttributeValueInExecution("GeteilteStringVariable"),[aqua.ProcessEngine.WebServiceProxy.ExecutionLogMessageType]::InformationalInfo, "my category");