From cec2ad6fb39c681991e46a08eb66a79ab571bc1b Mon Sep 17 00:00:00 2001 From: Niall Crowe Date: Wed, 21 Feb 2024 15:52:11 +0000 Subject: [PATCH] UX improvement: list of failed tests. (#86) The test runner now returns a list of any tests that failed. --- Turkey/TestOutputFormat.cs | 28 ++++++++++++++++++++++++++-- Turkey/TestRunner.cs | 6 +++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/Turkey/TestOutputFormat.cs b/Turkey/TestOutputFormat.cs index fea68cf..e342307 100644 --- a/Turkey/TestOutputFormat.cs +++ b/Turkey/TestOutputFormat.cs @@ -2,10 +2,12 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Runtime.CompilerServices; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Xml; +using System.Xml.Serialization; namespace Turkey { @@ -13,6 +15,17 @@ public class TestOutputFormats { public class NewOutput : TestOutput { + public class FailedTest + { + public string Name{ set; get;} + public string Duration{ set; get;} + } + + private List failedTests = new List(); + + public async override Task AtStartupAsync(){ + Console.WriteLine("Running tests:"); + } public async override Task AfterParsingTestAsync(string name, bool enabled) { var nameText = string.Format("{0,-60}", name); @@ -31,7 +44,7 @@ public async override Task AfterRunningTestAsync(string name, TestResult result, switch (result) { case TestResult.Passed: resultOutput = "PASS"; break; - case TestResult.Failed: resultOutput = "FAIL"; break; + case TestResult.Failed: resultOutput = "FAIL"; failedTests.Add(new FailedTest {Name = name, Duration = elapsedTime}); break; case TestResult.Skipped: resultOutput = "SKIP"; break; } Console.WriteLine($"[{resultOutput}]\t({elapsedTime})"); @@ -41,15 +54,26 @@ public async override Task AfterRunningTestAsync(string name, TestResult result, switch (result) { case TestResult.Passed: resultOutput = "\u001b[32mPASS\u001b[0m"; break; - case TestResult.Failed: resultOutput = "\u001b[31mFAIL\u001b[0m"; break; + case TestResult.Failed: resultOutput = "\u001b[31mFAIL\u001b[0m"; failedTests.Add(new FailedTest {Name = name, Duration = elapsedTime}); break; case TestResult.Skipped: resultOutput = "SKIP"; break; } Console.WriteLine($"[{resultOutput}]\t({elapsedTime})"); } } + public async override Task PrintFailedTests() + { + Console.WriteLine(); + Console.WriteLine("The following tests failed: "); + foreach(var test in failedTests) + { + Console.WriteLine($"{string.Format("{0,-30}", test.Name)}({test.Duration})"); + } + } + public async override Task AfterRunningAllTestsAsync(TestResults results) { + Console.WriteLine(); Console.WriteLine($"Total: {results.Total} Passed: {results.Passed} Failed: {results.Failed}"); } } diff --git a/Turkey/TestRunner.cs b/Turkey/TestRunner.cs index 59d8542..2c36624 100644 --- a/Turkey/TestRunner.cs +++ b/Turkey/TestRunner.cs @@ -48,6 +48,7 @@ public async virtual Task AtStartupAsync() {} public async virtual Task BeforeTestAsync() {} public async virtual Task AfterParsingTestAsync(string name, bool enabled) {} public async virtual Task AfterRunningTestAsync(string name, TestResult result, StringBuilder testLog, TimeSpan testTime) {} + public async virtual Task PrintFailedTests() {} public async virtual Task AfterRunningAllTestsAsync(TestResults results) {} } @@ -70,6 +71,7 @@ public TestRunner(SystemUnderTest system, DirectoryInfo root, bool verboseOutput public async Task ScanAndRunAsync(List outputs, string logDir, TimeSpan defaultTimeout) { + await outputs.ForEachAsync(output => output.AtStartupAsync()); TestResults results = new TestResults(); @@ -148,7 +150,9 @@ public async Task ScanAndRunAsync(List outputs, string } await outputs.ForEachAsync(output => output.AfterRunningTestAsync(testName, testResult, testLog, testTimeWatch.Elapsed)); - } + } + + await outputs.ForEachAsync(outputs => outputs.PrintFailedTests()); await outputs.ForEachAsync(output => output.AfterRunningAllTestsAsync(results));