Bạn có thể thực hiện một chút "công việc thủ công" để có được kết quả bằng cách sử dụng các biểu thức thông thường trong powershell.
ví dụ là với XUnit. Vì vậy, những gì bạn phải làm là lưu trữ kết quả của dotnet test project.csproj
một biến. vì vậy một ví dụ sẽ giống như tiếp theo
Test 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
như bạn có thể thấy có một số mẫu phổ biến mà chủ yếu là Error Message
cung cấp cho bạn gợi ý để biết nơi cần tìm, trong trường hợp này, xUnit chỉ ra các lỗi.X testname [{time}ms] Error Message
nếu bạn khớp văn bản đó với một biểu thức thông thường, bạn có thể nhận được phản hồi mong muốn: Tôi đã sử dụng văn bản này: X\s*(\S*)\s\[\d*ms\]\s*Error Message
Tôi chắc chắn nó có thể được cải thiện (tôi không phải là bậc thầy về regex) nhưng nó thực hiện công việc của nó. bạn có thể loại bỏ Error Message
ví dụ. Dù sao, tôi vẫn tiếp tục.
một khi bạn khớp kết quả, bạn chỉ cần lấy nhóm cho mỗi kết quả, trong trường hợp này tôi đã lưu nó vào TestName
. và gọidotnet test ...
$result = dotnet test XUnitTestProject1/XUnitTestProject1.csproj
$regex = 'X\s*(?<TestName>\S*)\s\[\d*ms\]\s*'
$matches = [regex]::Matches($result, $regex)
Foreach ($failedTest IN $matches)
{
$failedTestName = $failedTest.Groups['TestName'].Value
dotnet test --filter "FullyQualifiedName=$failedTestName"
}
dòng này $failedTestName = $failedTest.Groups['TestName'].Value
là cần thiết, nếu bạn cố gắng để vượt qua .Groups..
trong FullyQualifiedName
chuỗi, PowerShell hiểu chúng như là một chuỗi chữ.
bạn cần làm tương tự để tính thời gian và tỷ lệ phần trăm.
Ngoài ra đối với lần lặp đầu tiên thì dễ dàng hơn vì bạn có thể chạy tất cả các bài kiểm tra trong một lần, nhưng từ lần thứ hai trở đi bạn không thể. vì vậy danh sách cần thiết (để giữ các bài kiểm tra thất bại) là cần thiết.
một cái gì đó như thế này sẽ làm công việc
$times = 1
$result = dotnet test XUnitTestProject1/XUnitTestProject1.csproj
$regexFailedtests = 'X\s*(?<TestName>\S*)\s\[\d*ms\]\s*'
$FailedTestMatches = [regex]::Matches($result, $regexFailedtests)
$totalTestExecutedRegex = 'Total tests:\s*(?<TotalTest>\d*)'
$totalTests = [regex]::Matches($result, $totalTestExecutedRegex)[0].Groups['TotalTest'].Value -as [int]
$totalTesPassedRegex = 'Passed:\s*(?<Passed>\d*)'
$totalTestsPassed = [regex]::Matches($result, $totalTesPassedRegex)[0].Groups['Passed'].Value -as [int]
#convert the failed test into a list of string, so it can be looped.
$listFailedTest = New-Object Collections.Generic.List[string]
Foreach ($failedTest IN $FailedTestMatches)
{
$failedTestName = $failedTest.Groups['TestName'].Value
$listFailedTest.Add($failedTestName)
}
$percentage = ($totalTestsPassed*100)/$totalTests #Calculate the percentage
while($times -lt 5 -and $percentage -lt 70) {#5 loops or > 70% of test working
$listFailedTestInsideDo = New-Object Collections.Generic.List[string]
$listFailedTestInsideDo = $listFailedTest; #do a copy of the main list
$listFailedTest = New-Object Collections.Generic.List[string] ##empty the main list.
Foreach ($failedTestName IN $listFailedTestInsideDo)
{
$result2 = dotnet test --filter "FullyQualifiedName=$failedTestName"
if($result2 -match'Passed:\s*\d*') #if contains passed then it worked
{
totalTestsPassed++
}else{
$listFailedTest.Add($failedTestName) #add in new List for the new loop
}
}
$percentage = ($totalTestsPassed*100)/$totalTests
$times++
}