La tarea de prueba de Visual Studio en Azure Devops tiene una característica realmente genial, la capacidad de volver a intentar las pruebas unitarias fallidas. Esta es una gran característica cuando tiene un largo tiempo de prueba y algunas pruebas que son escamosas. Esta tarea de prueba en Azure Devops funciona para varias plataformas de prueba como xUnit, NUnit y MSTest. (Entonces pruebas escritas para .NET)
¿Sería posible obtener el mismo comportamiento del script? Prefiero xUnit o NUnit y ejecutar el script en PowerShell.
Para xUnit hay un -method "name"
:
ejecutar un método de prueba dado (puede especificarse completamente o usar un comodín; es decir, 'MyNamespace.MyClass.MyTestMethod' o '* .MyTestMethod') si se especifica más de una vez, actúa como una operación OR
NUnit tiene una fuente de--where=EXPRESSION
sintaxis :
Una expresión que indica qué pruebas ejecutar. Puede especificar nombres de prueba, clases, métodos, categorías o propiedades comparándolos con valores reales con los operadores ==,! =, = ~ Y! ~. Consulte Test Selection Language para obtener una descripción completa de la sintaxis.
Pero no estoy seguro de cómo recopilar la prueba fallida para xUnit o NUnit para que todo funcione.
Por supuesto, arreglar la prueba escamosa sería mejor, pero eso a veces no es tan fácil.
Actualización: desde. NET / C # (que podría activarse en PowerShell) también es aceptable
fuente
ITestLoggerWithParameters
para crear una lista de nombres de prueba fallidos?dotnet test --logger:custom
a recoger nombres de prueba fallidos.Respuestas:
Puede hacer un poco de "trabajo manual" para obtener el resultado utilizando expresiones regulares en powershell.
El ejemplo es con XUnit. entonces lo que tienes que hacer es almacenar el resultado de
dotnet test project.csproj
en una variable. entonces un ejemplo será como el siguienteTest 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
Como puede ver, hay algunos patrones comunes que principalmente le
Error Message
dan la pista de saber dónde buscar, en este caso, xUnit indica los errores porX testname [{time}ms] Error Message
si hace coincidir ese texto con una expresión regular, puede obtener la respuesta deseada: utilicé esta:
X\s*(\S*)\s\[\d*ms\]\s*Error Message
estoy seguro de que se puede mejorar (no soy un maestro en expresiones regulares ) pero hace su trabajo. puedes eliminarError Message
por ejemplo. de todos modos, sigo adelante.una vez que coincida con el resultado, solo necesita obtener el grupo para cada resultado, que en este caso lo almacené
TestName
. y llama aldotnet test ...
esta línea
$failedTestName = $failedTest.Groups['TestName'].Value
es necesaria, si intenta pasar.Groups..
laFullyQualifiedName
cadena, PowerShell las entiende como una cadena literal.debes hacer lo mismo para calcular los tiempos y el porcentaje.
También para la primera iteración es más fácil porque puedes ejecutar todas las pruebas de una vez, pero desde la segunda y lejos no puedes. es necesaria la lista necesaria (para mantener las pruebas que están fallando).
algo como esto hará el trabajo.
fuente