From b732aef322fd1f214e3ea02755c6a514265c1e22 Mon Sep 17 00:00:00 2001 From: nohwnd Date: Mon, 8 Feb 2021 12:50:03 +0100 Subject: [PATCH 1/2] Fix duration in console logger to show the correct output when tests run in parallel --- src/vstest.console/Internal/ConsoleLogger.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vstest.console/Internal/ConsoleLogger.cs b/src/vstest.console/Internal/ConsoleLogger.cs index a9d2371d0c..774bcd707a 100644 --- a/src/vstest.console/Internal/ConsoleLogger.cs +++ b/src/vstest.console/Internal/ConsoleLogger.cs @@ -707,9 +707,11 @@ private void TestRunCompleteHandler(object sender, TestRunCompleteEventArgs e) var source = sd.Key; var sourceSummary = new SourceSummary(); - foreach (var result in sd.ToArray()) + var results = sd.ToArray(); + // duration of the whole source is the difference between the test that ended last and the one that started first + sourceSummary.Duration = !results.Any() ? TimeSpan.Zero : results.Max(r => r.EndTime) - results.Min(r => r.StartTime); + foreach (var result in results) { - sourceSummary.Duration += result.Duration; switch (result.Outcome) { case TestOutcome.Passed: From 297513d4463cda1ee792222410323aa1f3737550 Mon Sep 17 00:00:00 2001 From: nohwnd Date: Mon, 8 Feb 2021 13:19:48 +0100 Subject: [PATCH 2/2] Fix tests --- .../Internal/ConsoleLoggerTests.cs | 45 +++++++++++-------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/test/vstest.console.UnitTests/Internal/ConsoleLoggerTests.cs b/test/vstest.console.UnitTests/Internal/ConsoleLoggerTests.cs index bbbc7719d8..38d77cb644 100644 --- a/test/vstest.console.UnitTests/Internal/ConsoleLoggerTests.cs +++ b/test/vstest.console.UnitTests/Internal/ConsoleLoggerTests.cs @@ -612,28 +612,28 @@ public void TestResultHandlerShouldShowFailedTestsAndPassedTestsForQuietVebosity loggerEvents.RaiseTestRunComplete(new TestRunCompleteEventArgs(new Mock().Object, false, false, null, new Collection(), TimeSpan.FromSeconds(1))); loggerEvents.WaitForEventCompletion(); - this.mockOutput.Verify(o => o.Write(string.Format(CultureInfo.CurrentCulture, CommandLineResources.TestRunSummary, + this.mockOutput.Verify(o => o.Write(string.Format(CultureInfo.CurrentCulture, CommandLineResources.TestRunSummary, (CommandLineResources.PassedTestIndicator + "!").PadRight(8), - 0.ToString().PadLeft(5), - 1.ToString().PadLeft(5), + 0.ToString().PadLeft(5), + 1.ToString().PadLeft(5), 1.ToString().PadLeft(5), 2 - .ToString().PadLeft(5), + .ToString().PadLeft(5), "1 m 2 s"), OutputLevel.Information), Times.Once); - this.mockOutput.Verify(o => o.WriteLine(string.Format(CultureInfo.CurrentCulture, CommandLineResources.TestRunSummaryAssemblyAndFramework, - "TestSourcePassed", - expectedFramework), OutputLevel.Information), Times.Once); - - this.mockOutput.Verify(o => o.Write(string.Format(CultureInfo.CurrentCulture, CommandLineResources.TestRunSummary, + this.mockOutput.Verify(o => o.WriteLine(string.Format(CultureInfo.CurrentCulture, CommandLineResources.TestRunSummaryAssemblyAndFramework, + "TestSourcePassed", + expectedFramework), OutputLevel.Information), Times.Once); + + this.mockOutput.Verify(o => o.Write(string.Format(CultureInfo.CurrentCulture, CommandLineResources.TestRunSummary, (CommandLineResources.FailedTestIndicator + "!").PadRight(8), 1.ToString().PadLeft(5), 1.ToString().PadLeft(5), 1.ToString().PadLeft(5), - 3.ToString().PadLeft(5), - "1 h 6 m"), OutputLevel.Information), Times.Once); + 3.ToString().PadLeft(5), + "1 h 2 m"), OutputLevel.Information), Times.Once); - this.mockOutput.Verify(o => o.WriteLine(string.Format(CultureInfo.CurrentCulture, CommandLineResources.TestRunSummaryAssemblyAndFramework, - "TestSource", + this.mockOutput.Verify(o => o.WriteLine(string.Format(CultureInfo.CurrentCulture, CommandLineResources.TestRunSummaryAssemblyAndFramework, + "TestSource", expectedFramework), OutputLevel.Information), Times.Once); } @@ -1171,12 +1171,12 @@ public void ResultsInHeirarchichalOrderShouldReportCorrectCount() Guid parentExecutionId = Guid.NewGuid(); TestProperty ParentExecIdProperty = TestProperty.Register("ParentExecId", "ParentExecId", typeof(Guid), TestPropertyAttributes.Hidden, typeof(ObjectModel.TestResult)); TestProperty ExecutionIdProperty = TestProperty.Register("ExecutionId", "ExecutionId", typeof(Guid), TestPropertyAttributes.Hidden, typeof(ObjectModel.TestResult)); - TestProperty TestTypeProperty = TestProperty.Register("TestType", "TestType" , typeof(Guid), TestPropertyAttributes.Hidden, typeof(ObjectModel.TestResult)); + TestProperty TestTypeProperty = TestProperty.Register("TestType", "TestType", typeof(Guid), TestPropertyAttributes.Hidden, typeof(ObjectModel.TestResult)); var result1 = new ObjectModel.TestResult(testCase1) { Outcome = TestOutcome.Failed }; result1.SetPropertyValue(ExecutionIdProperty, parentExecutionId); - var result2 = new ObjectModel.TestResult(testCase2) { Outcome = TestOutcome.Passed}; + var result2 = new ObjectModel.TestResult(testCase2) { Outcome = TestOutcome.Passed }; result2.SetPropertyValue(ExecutionIdProperty, Guid.NewGuid()); result2.SetPropertyValue(ParentExecIdProperty, parentExecutionId); @@ -1218,16 +1218,22 @@ private void Setup() DisplayName = "TestName" }; + var duration = new TimeSpan(1, 2, 3); var testresult = new ObjectModel.TestResult(testcase) { Outcome = TestOutcome.Passed, - Duration = new TimeSpan(1, 2, 3) + Duration = duration, + StartTime = DateTime.Now - duration, + EndTime = DateTime.Now }; + var duration1 = new TimeSpan(0, 0, 4, 5, 60); var testresult1 = new ObjectModel.TestResult(testcase) { Outcome = TestOutcome.Failed, - Duration = new TimeSpan(0, 0, 4, 5, 60) + Duration = duration1, + StartTime = DateTime.Now - duration1, + EndTime = DateTime.Now }; var testresult2 = new ObjectModel.TestResult(testcase) @@ -1257,10 +1263,13 @@ private void Setup() DisplayName = "TestName" }; + var duration = new TimeSpan(0, 0, 1, 2, 3); var testresult = new ObjectModel.TestResult(testcase) { Outcome = TestOutcome.Passed, - Duration = new TimeSpan(0, 0, 1, 2, 3) + Duration = duration, + StartTime = DateTime.Now - duration, + EndTime = DateTime.Now }; var testresult1 = new ObjectModel.TestResult(testcase)