A tarefa de teste do Visual Studio nos Devops do Azure tem um recurso muito interessante: a capacidade de repetir os testes de unidade com falha. Esse é um ótimo recurso quando você tem um longo tempo de teste e alguns testes que são escassos. Esta tarefa de teste no Azure Devops funciona para várias plataformas de teste como xUnit, NUnit e MSTest. (Então, testes escritos para .NET)
Seria possível obter o mesmo comportamento do script? Prefiro xUnit ou NUnit e executando o script no PowerShell.
Para xUnit, existe um -method "name"
:
execute um determinado método de teste (pode ser totalmente especificado ou use um curinga; por exemplo, 'MyNamespace.MyClass.MyTestMethod' ou '* .MyTestMethod') se especificado mais de uma vez, atua como uma operação OR
NUnit tem uma fonte de--where=EXPRESSION
sintaxe :
Uma expressão indicando quais testes executar. Pode especificar nomes de teste, classes, métodos, categorias ou propriedades comparando-os aos valores reais com os operadores ==,! =, = ~ E! ~. Consulte Teste de idioma de seleção para obter uma descrição completa da sintaxe.
Mas não sei como coletar o teste com falha para xUnit ou NUnit para fazer tudo funcionar.
Obviamente, corrigir o teste superficial seria melhor, mas às vezes não é tão fácil assim.
Atualização: a partir de. NET / C # (que pode ser acionado no PowerShell) também é aceitável
fonte
ITestLoggerWithParameters
para criar uma lista de nomes de teste com falha?dotnet test --logger:custom
coleciona nomes de teste com falha.Respostas:
Você pode fazer um pouco de "trabalho manual" para obter o resultado usando expressões regulares no PowerShell.
o exemplo é com XUnit. Então, o que você precisa fazer é armazenar o resultado do
dotnet test project.csproj
em uma variável. então um exemplo será como o próximoTest 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 você pode ver, existem alguns padrões comuns que são principalmente
Error Message
fornecem a dica para saber onde procurar; nesse caso, xUnit indica os erros porX testname [{time}ms] Error Message
se você comparar esse texto com uma expressão regular, poderá obter a resposta desejada: usei esta:
X\s*(\S*)\s\[\d*ms\]\s*Error Message
tenho certeza de que pode ser melhorada (não sou mestre em regex), mas faz o seu trabalho. você pode removerError Message
por exemplo. de qualquer maneira, eu continuo.depois de corresponder ao resultado, você só precisa obter o grupo para cada resultado, que neste caso eu o armazenei
TestName
. e chame odotnet test ...
esta linha
$failedTestName = $failedTest.Groups['TestName'].Value
é necessária, se você tentar passar.Groups..
oFullyQualifiedName
string, o PowerShell as entenderá como uma string literal.você precisa fazer o mesmo para calcular os tempos e a porcentagem.
Também para a primeira iteração é mais fácil, porque você pode executar todos os testes de uma só vez, mas a partir da segunda e até agora você não pode. lista necessária (para manter os testes que estão falhando) é necessária.
algo assim fará o trabalho.
fonte