Die Visual Studio-Testaufgabe in Azure Devops bietet eine wirklich coole Funktion, nämlich die Möglichkeit, die fehlgeschlagenen Komponententests erneut zu versuchen . Dies ist eine großartige Funktion, wenn Sie eine lange Testzeit haben und einige Tests schuppig sind. Diese Testaufgabe in Azure Devops funktioniert für verschiedene Testplattformen wie xUnit, NUnit und MSTest. (Also Tests für .NET geschrieben)
Wäre es möglich, dasselbe Verhalten aus dem Skript zu erhalten? Ich bevorzuge xUnit oder NUnit und führe das Skript in PowerShell aus.
Für xUnit gibt es ein -method "name"
:
Führen Sie eine bestimmte Testmethode aus (kann vollständig angegeben werden oder verwenden Sie einen Platzhalter, dh 'MyNamespace.MyClass.MyTestMethod' oder '* .MyTestMethod'), wenn sie mehrmals angegeben wird, und fungieren Sie als ODER-Operation
NUnit hat eine Syntaxquelle--where=EXPRESSION
:
Ein Ausdruck, der angibt, welche Tests ausgeführt werden sollen. Es kann Testnamen, Klassen, Methoden, Kategorien oder Eigenschaften angeben, die sie mit tatsächlichen Werten mit den Operatoren == ,! =, = ~ Und! ~ Vergleichen. Eine vollständige Beschreibung der Syntax finden Sie unter Testauswahlsprache .
Sie sind sich jedoch nicht sicher, wie Sie den fehlgeschlagenen Test für xUnit oder NUnit erfassen sollen, damit alles funktioniert.
Natürlich wäre es besser, den Flockentest zu reparieren, aber das ist manchmal nicht so einfach.
Update: läuft ab. NET / C # (das in PowerShell ausgelöst werden könnte) ist ebenfalls akzeptabel
quelle
ITestLoggerWithParameters
, um eine Liste der fehlgeschlagenen Testnamen zu erstellen.dotnet test --logger:custom
sammeln also fehlgeschlagene Testnamen.Antworten:
Sie können ein wenig "manuelle Arbeit" leisten, um das Ergebnis mit regulären Ausdrücken in Powershell zu erhalten.
Das Beispiel ist mit XUnit. Sie müssen also das Ergebnis von
dotnet test project.csproj
in einer Variablen speichern . Ein Beispiel wird also wie das nächste seinTest run for C:\Users\Tigrex\source\repos\ConsoleApp1\XUnitTestProject1\bin\Debug\netcoreapp2.2\XUnitTestProject1.dll(.NETCoreApp,Version=v2.2) Microsoft (R) Test Execution Command Line Tool Version 16.3.0 Copyright (c) Microsoft Corporation. All rights reserved. Starting test execution, please wait... A total of 1 test files matched the specified pattern. X XUnitTestProject1.UnitTest1.ThisIsAnotherFailedTestYesAgain [11ms] Error Message: Assert.Equal() Failure Expected: 2 Actual: 1 Stack Trace: at XUnitTestProject1.UnitTest1.ThisIsAnotherFailedTestYesAgain() in C:\Users\Tigrex\source\repos\ConsoleApp1\XUnitTestProject1\UnitTest1.cs:line 33 X XUnitTestProject1.UnitTest1.ThisIsAnotherFAiledTest [1ms] Error Message: Assert.Equal() Failure Expected: 2 Actual: 1 Stack Trace: at XUnitTestProject1.UnitTest1.ThisIsAnotherFAiledTest() in C:\Users\Tigrex\source\repos\ConsoleApp1\XUnitTestProject1\UnitTest1.cs:line 22 X XUnitTestProject1.UnitTest1.TestToFail [1ms] Error Message: Assert.Equal() Failure Expected: 2 Actual: 1 Stack Trace: at XUnitTestProject1.UnitTest1.TestToFail() in C:\Users\Tigrex\source\repos\ConsoleApp1\XUnitTestProject1\UnitTest1.cs:line 16 Total tests: 5 Passed: 2 Failed: 3 Total time: 1.2764 Seconds
Wie Sie sehen können, gibt es einige gängige Muster
Error Message
, die Ihnen hauptsächlich den Hinweis geben, wo Sie suchen müssen. In diesem Fall gibt xUnit die Fehlermuster anX testname [{time}ms] Error Message
Wenn Sie diesen Text mit einem regulären Ausdruck abgleichen, erhalten Sie die gewünschte Antwort: Ich habe diesen verwendet:
X\s*(\S*)\s\[\d*ms\]\s*Error Message
Ich bin sicher, dass er verbessert werden kann (ich bin kein Meister in Regex), aber er macht seinen Job. Sie könnenError Message
zum Beispiel entfernen . Trotzdem mache ich weiter.Sobald Sie mit dem Ergebnis übereinstimmen, müssen Sie nur noch die Gruppe für jedes Ergebnis abrufen, in dem ich sie gespeichert habe
TestName
. und rufen Sie diedotnet test ...
Diese Zeile
$failedTestName = $failedTest.Groups['TestName'].Value
ist erforderlich, wenn Sie versuchen, die.Groups..
in derFullyQualifiedName
Zeichenfolge zu übergeben. PowerShell versteht sie als Literalzeichenfolge.Sie müssen dasselbe tun, um die Zeiten und den Prozentsatz zu berechnen.
Auch für die erste Iteration ist es einfacher, weil Sie alle Tests auf einmal ausführen können, aber von der zweiten und weit können Sie nicht. Daher ist eine Liste erforderlich (um die fehlgeschlagenen Tests beizubehalten).
so etwas wird den Job machen.
quelle