From bf2ee1a074ef72c06e640e3de54979a8929f93eb Mon Sep 17 00:00:00 2001 From: Terje Sandstrom Date: Tue, 9 Apr 2024 18:45:32 +0200 Subject: [PATCH 1/3] Fix consoleout=0, so also Error and Progress are blocked in this case, Fixes #1109 --- build.cake | 2 +- src/NUnitTestAdapter/NUnitEventListener.cs | 74 ++++++++++++---------- 2 files changed, 43 insertions(+), 33 deletions(-) diff --git a/build.cake b/build.cake index 8cba4f35..8871bab0 100644 --- a/build.cake +++ b/build.cake @@ -15,7 +15,7 @@ var configuration = Argument("configuration", "Release"); var version = "4.6.0"; -var modifier = "-beta.1"; +var modifier = "-beta.2"; var dbgSuffix = configuration.ToLower() == "debug" ? "-dbg" : ""; var packageVersion = version + modifier + dbgSuffix; diff --git a/src/NUnitTestAdapter/NUnitEventListener.cs b/src/NUnitTestAdapter/NUnitEventListener.cs index 430b2c87..aa884e2f 100644 --- a/src/NUnitTestAdapter/NUnitEventListener.cs +++ b/src/NUnitTestAdapter/NUnitEventListener.cs @@ -31,7 +31,6 @@ using Microsoft.VisualStudio.TestPlatform.ObjectModel.Logging; using NUnit.Engine; -using NUnit.VisualStudio.TestAdapter; using NUnit.VisualStudio.TestAdapter.Dump; using NUnit.VisualStudio.TestAdapter.Internal; using NUnit.VisualStudio.TestAdapter.NUnitEngine; @@ -49,10 +48,10 @@ public class NUnitEventListener : ITestEventListener, IDisposable // Public for testing { private static readonly ICollection EmptyNodes = new List(); - private readonly ITestExecutionRecorder recorder; - private readonly ITestConverterCommon testConverter; - private readonly IAdapterSettings settings; - private readonly Dictionary> outputNodes = new(); + private ITestExecutionRecorder Recorder { get; } + private ITestConverterCommon TestConverter { get; } + private IAdapterSettings Settings { get; } + private Dictionary> OutputNodes { get; } = new(); #if NET462 public override object InitializeLifetimeService() @@ -65,15 +64,15 @@ public override object InitializeLifetimeService() } #endif - private readonly INUnit3TestExecutor executor; + private INUnit3TestExecutor Executor { get; } public NUnitEventListener(ITestConverterCommon testConverter, INUnit3TestExecutor executor) { - this.executor = executor; + Executor = executor; dumpXml = executor.Dump; - settings = executor.Settings; - recorder = executor.FrameworkHandle; - this.testConverter = testConverter; + Settings = executor.Settings; + Recorder = executor.FrameworkHandle; + TestConverter = testConverter; } #region ITestEventListener @@ -105,8 +104,8 @@ public void OnTestEvent(string report) } catch (Exception ex) { - recorder.SendMessage(TestMessageLevel.Warning, $"Error processing {node.Name} event for {node.FullName}"); - recorder.SendMessage(TestMessageLevel.Warning, ex.ToString()); + Recorder.SendMessage(TestMessageLevel.Warning, $"Error processing {node.Name} event for {node.FullName}"); + Recorder.SendMessage(TestMessageLevel.Warning, ex.ToString()); } } @@ -143,51 +142,56 @@ protected virtual void Dispose(bool disposing) public void TestStarted(INUnitTestEventStartTest testNode) { - var ourCase = testConverter.GetCachedTestCase(testNode.Id); + var ourCase = TestConverter.GetCachedTestCase(testNode.Id); // Simply ignore any TestCase not found in the cache if (ourCase != null) - recorder.RecordStart(ourCase); + Recorder.RecordStart(ourCase); } + /// + /// Collects up all text output messages in the current test, and outputs them here. + /// Note: Error and Progress are handled in TestOutput. + /// + /// public void TestFinished(INUnitTestEventTestCase resultNode) { var testId = resultNode.Id; - if (this.outputNodes.TryGetValue(testId, out var outputNodes)) + if (OutputNodes.TryGetValue(testId, out var outputNodes)) { - this.outputNodes.Remove(testId); + OutputNodes.Remove(testId); } - var result = testConverter.GetVsTestResults(resultNode, outputNodes ?? EmptyNodes); - if (settings.ConsoleOut >= 1) + var result = TestConverter.GetVsTestResults(resultNode, outputNodes ?? EmptyNodes); + if (Settings.ConsoleOut >= 1) { if (!result.ConsoleOutput.IsNullOrWhiteSpace() && result.ConsoleOutput != NL) { string msg = result.ConsoleOutput; - if (settings.UseTestNameInConsoleOutput) + if (Settings.UseTestNameInConsoleOutput) msg = $"{resultNode.Name}: {msg}"; - var messageLevel = settings.ConsoleOut == 1 + var messageLevel = Settings.ConsoleOut == 1 ? TestMessageLevel.Informational : TestMessageLevel.Warning; - recorder.SendMessage(messageLevel, msg); + Recorder.SendMessage(messageLevel, msg); } if (!resultNode.ReasonMessage.IsNullOrWhiteSpace()) { - recorder.SendMessage(TestMessageLevel.Informational, $"{resultNode.Name}: {resultNode.ReasonMessage}"); + Recorder.SendMessage(TestMessageLevel.Informational, $"{resultNode.Name}: {resultNode.ReasonMessage}"); } } if (result.TestCaseResult != null) { - recorder.RecordEnd(result.TestCaseResult.TestCase, result.TestCaseResult.Outcome); + Recorder.RecordEnd(result.TestCaseResult.TestCase, result.TestCaseResult.Outcome); foreach (var vsResult in result.TestResults) { - recorder.RecordResult(vsResult); + Recorder.RecordResult(vsResult); } - if (result.TestCaseResult.Outcome == TestOutcome.Failed && settings.StopOnError) + if (result.TestCaseResult.Outcome == TestOutcome.Failed && Settings.StopOnError) { - executor.StopRun(); + Executor.StopRun(); } } } @@ -199,15 +203,15 @@ public void SuiteFinished(INUnitTestEventSuiteFinished resultNode) var site = resultNode.Site(); if (site != NUnitTestEvent.SiteType.Setup && site != NUnitTestEvent.SiteType.TearDown) return; - recorder.SendMessage(TestMessageLevel.Warning, $"{site} failed for test fixture {resultNode.FullName}"); + Recorder.SendMessage(TestMessageLevel.Warning, $"{site} failed for test fixture {resultNode.FullName}"); if (resultNode.HasFailure) { string msg = resultNode.FailureMessage; var stackNode = resultNode.StackTrace; - if (!string.IsNullOrEmpty(stackNode) && settings.IncludeStackTraceForSuites) + if (!string.IsNullOrEmpty(stackNode) && Settings.IncludeStackTraceForSuites) msg += $"\nStackTrace: {stackNode}"; - recorder.SendMessage(TestMessageLevel.Warning, msg); + Recorder.SendMessage(TestMessageLevel.Warning, msg); } } @@ -215,8 +219,14 @@ public void SuiteFinished(INUnitTestEventSuiteFinished resultNode) private static readonly int NL_LENGTH = NL.Length; private readonly IDumpXml dumpXml; + /// + /// Error stream and Progress stream are both sent here. + /// + /// public void TestOutput(INUnitTestEventTestOutput outputNodeEvent) { + if (Settings.ConsoleOut == 0) + return; string text = outputNodeEvent.Content; // Remove final newline since logger will add one @@ -231,10 +241,10 @@ public void TestOutput(INUnitTestEventTestOutput outputNodeEvent) string testId = outputNodeEvent.TestId; if (!string.IsNullOrEmpty(testId)) { - if (!this.outputNodes.TryGetValue(testId, out var outputNodes)) + if (!OutputNodes.TryGetValue(testId, out var outputNodes)) { outputNodes = new List(); - this.outputNodes.Add(testId, outputNodes); + OutputNodes.Add(testId, outputNodes); } outputNodes.Add(outputNodeEvent); @@ -244,7 +254,7 @@ public void TestOutput(INUnitTestEventTestOutput outputNodeEvent) ? TestMessageLevel.Warning : TestMessageLevel.Informational; - recorder.SendMessage(testMessageLevel, text); + Recorder.SendMessage(testMessageLevel, text); } } } From f98569ddb4ba12079006de363d1f6cb4ff387803 Mon Sep 17 00:00:00 2001 From: Terje Sandstrom Date: Tue, 9 Apr 2024 18:54:50 +0200 Subject: [PATCH 2/3] Fix test --- src/NUnitTestAdapterTests/NUnitEventListenerOutputTests.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/NUnitTestAdapterTests/NUnitEventListenerOutputTests.cs b/src/NUnitTestAdapterTests/NUnitEventListenerOutputTests.cs index fd49f631..61336403 100644 --- a/src/NUnitTestAdapterTests/NUnitEventListenerOutputTests.cs +++ b/src/NUnitTestAdapterTests/NUnitEventListenerOutputTests.cs @@ -49,6 +49,7 @@ public void Setup() recorder = Substitute.For(); converter = Substitute.For(); settings = Substitute.For(); + settings.ConsoleOut.Returns(1); executor = Substitute.For(); executor.Settings.Returns(settings); executor.FrameworkHandle.Returns(recorder); From 6f5dc718fcdc893f6d5bb1635a6ae222a3b00244 Mon Sep 17 00:00:00 2001 From: Terje Sandstrom Date: Tue, 9 Apr 2024 19:13:16 +0200 Subject: [PATCH 3/3] Fix tests --- .../NUnitEventListenerOutputTests.cs | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/NUnitTestAdapterTests/NUnitEventListenerOutputTests.cs b/src/NUnitTestAdapterTests/NUnitEventListenerOutputTests.cs index 61336403..ee8809e6 100644 --- a/src/NUnitTestAdapterTests/NUnitEventListenerOutputTests.cs +++ b/src/NUnitTestAdapterTests/NUnitEventListenerOutputTests.cs @@ -57,6 +57,17 @@ public void Setup() [Test] public void ThatNormalTestOutputIsOutput() + { + var sut = new NUnitEventListener(converter, executor); + sut.OnTestEvent(TestOutputOut); + sut.OnTestEvent(TestFinish); + + recorder.Received().SendMessage(Arg.Any(), Arg.Is(x => x.StartsWith("Whatever"))); + converter.Received().GetVsTestResults(Arg.Any(), Arg.Is>(x => x.Count == 1)); + } + + [Test] + public void ThatProgressTestOutputIsOutput() { var sut = new NUnitEventListener(converter, executor); sut.OnTestEvent(TestOutputProgress); @@ -77,6 +88,19 @@ public void ThatNormalTestOutputIsError() converter.Received().GetVsTestResults(Arg.Any(), Arg.Is>(x => x.Count == 1)); } + [Test] + public void ThatConsoleOutCanStopAllTestOutput() + { + settings.ConsoleOut.Returns(0); + var sut = new NUnitEventListener(converter, executor); + sut.OnTestEvent(TestOutputOut); + sut.OnTestEvent(TestOutputProgress); + sut.OnTestEvent(TestOutputError); + sut.OnTestEvent(TestFinish); + + recorder.DidNotReceive().SendMessage(Arg.Any(), Arg.Any()); + } + [Test] public void ThatTestOutputWithOnlyWhiteSpaceIsNotOutput() {