diff --git a/.runsettings b/.runsettings index f028fe7c..333f22f0 100644 --- a/.runsettings +++ b/.runsettings @@ -2,7 +2,7 @@ - 0 + 1 diff --git a/NUnit3TestAdapter.sln b/NUnit3TestAdapter.sln index 80b2e592..b6964428 100644 --- a/NUnit3TestAdapter.sln +++ b/NUnit3TestAdapter.sln @@ -61,6 +61,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{ .github\workflows\NUnit3TestAdapter.Cake.CI.yml = .github\workflows\NUnit3TestAdapter.Cake.CI.yml EndProjectSection EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "netcoreapp3.1", "netcoreapp3.1", "{2F940513-5B8F-45A5-A188-7C5D03D1B50D}" + ProjectSection(SolutionItems) = preProject + nuget\netcoreapp3.1\NUnit3TestAdapter.props = nuget\netcoreapp3.1\NUnit3TestAdapter.props + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -100,6 +105,7 @@ Global {A9584E41-6ECE-44B4-A504-41795A65DA5F} = {DE347D88-F6ED-4031-AFC2-318F63E39BC9} {062B1763-73C8-4B5A-92DF-C66A36C43CE1} = {7CE30108-5D81-4850-BE6B-C8BCA35D3592} {7D708804-B2F1-4A31-A9FB-85A0C7433200} = {062B1763-73C8-4B5A-92DF-C66A36C43CE1} + {2F940513-5B8F-45A5-A188-7C5D03D1B50D} = {DE347D88-F6ED-4031-AFC2-318F63E39BC9} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {8EF03474-188E-44A8-8C76-9FBCF9A382EC} diff --git a/build.cake b/build.cake index fcfde8a7..78dd09df 100644 --- a/build.cake +++ b/build.cake @@ -12,7 +12,7 @@ var configuration = Argument("configuration", "Release"); // SET PACKAGE VERSION ////////////////////////////////////////////////////////////////////// -var version = "4.3.0"; +var version = "4.3.1"; var modifier = ""; @@ -72,7 +72,7 @@ var BIN_DIR = PROJECT_DIR + "bin/" + configuration + "/"; var ADAPTER_PROJECT = SRC_DIR + "NUnitTestAdapter/NUnit.TestAdapter.csproj"; -var NETCOREAPP_TFM = "netcoreapp2.1"; +var NETCOREAPP_TFM = "netcoreapp3.1"; var ADAPTER_BIN_DIR_NET35 = SRC_DIR + $"NUnitTestAdapter/bin/{configuration}/net35/"; var ADAPTER_BIN_DIR_NETCOREAPP = SRC_DIR + $"NUnitTestAdapter/bin/{configuration}/{NETCOREAPP_TFM}/"; diff --git a/nuget/NUnit3TestAdapter.nuspec b/nuget/NUnit3TestAdapter.nuspec index 907c63a7..a04a6e3f 100644 --- a/nuget/NUnit3TestAdapter.nuspec +++ b/nuget/NUnit3TestAdapter.nuspec @@ -1,45 +1,44 @@  - - NUnit3TestAdapter - $version$ - NUnit3 Test Adapter for Visual Studio and DotNet - Charlie Poole, Terje Sandstrom - MIT - https://docs.nunit.org/articles/vs-test-adapter/Index.html - - https://cdn.rawgit.com/nunit/resources/master/images/icon/nunit_256.png - false - NUnit3 adapter for running tests in Visual Studio and DotNet. Works with NUnit 3.x, use the NUnit 2 adapter for 2.x tests. - - The NUnit3 TestAdapter for Visual Studio, all versions from 2012 and onwards, and DotNet (incl. .Net core). + + NUnit3TestAdapter + $version$ + NUnit3 Test Adapter for Visual Studio and DotNet + Charlie Poole, Terje Sandstrom + MIT + https://docs.nunit.org/articles/vs-test-adapter/Index.html + + https://cdn.rawgit.com/nunit/resources/master/images/icon/nunit_256.png + false + NUnit3 adapter for running tests in Visual Studio and DotNet. Works with NUnit 3.x, use the NUnit 2 adapter for 2.x tests. + + The NUnit3 TestAdapter for Visual Studio, all versions from 2012 and onwards, and DotNet (incl. .Net core). - Note that this package ONLY contains the adapter, not the NUnit framework. - For VS 2017 and forward, you should add this package to every test project in your solution. (Earlier versions only require a single adapter package per solution.) - - See https://docs.nunit.org/articles/vs-test-adapter/Adapter-Release-Notes.html - Copyright (c) 2011-2021 Charlie Poole, 2014-2022 Terje Sandstrom - en-US - test visualstudio testadapter nunit nunit3 dotnet + Note that this package ONLY contains the adapter, not the NUnit framework. + For VS 2017 and forward, you should add this package to every test project in your solution. (Earlier versions only require a single adapter package per solution.) + + See https://docs.nunit.org/articles/vs-test-adapter/Adapter-Release-Notes.html + Copyright (c) 2011-2021 Charlie Poole, 2014-2022 Terje Sandstrom + en-US + test visualstudio testadapter nunit nunit3 dotnet - false - - - - - - - - - + false + + + + + + + + + - - - - - - - - - + + + + + + + + diff --git a/nuget/netcoreapp3.1/NUnit3TestAdapter.props b/nuget/netcoreapp3.1/NUnit3TestAdapter.props new file mode 100644 index 00000000..5e45aede --- /dev/null +++ b/nuget/netcoreapp3.1/NUnit3TestAdapter.props @@ -0,0 +1,35 @@ + + + + + NUnit3.TestAdapter.dll + PreserveNewest + False + + + NUnit3.TestAdapter.pdb + PreserveNewest + False + + + nunit.engine.dll + PreserveNewest + False + + + nunit.engine.api.dll + PreserveNewest + False + + + nunit.engine.core.dll + PreserveNewest + False + + + testcentric.engine.metadata.dll + PreserveNewest + False + + + diff --git a/src/NUnit.TestAdapter.Tests.Acceptance/AcceptanceTests.cs b/src/NUnit.TestAdapter.Tests.Acceptance/AcceptanceTests.cs index 50f93d6a..acafe068 100644 --- a/src/NUnit.TestAdapter.Tests.Acceptance/AcceptanceTests.cs +++ b/src/NUnit.TestAdapter.Tests.Acceptance/AcceptanceTests.cs @@ -32,12 +32,12 @@ public abstract class AcceptanceTests public static IEnumerable TargetFrameworks => new[] { LowestNetfxTarget, - Frameworks.NetCoreApp21 + Frameworks.NetCoreApp31 }; public static IEnumerable DotNetCliTargetFrameworks => new[] { - Frameworks.NetCoreApp21, + // Frameworks.NetCoreApp21, // Doesnt seem to be supported by VS 2022 anymore Frameworks.NetCoreApp31, Frameworks.Net50, Frameworks.Net60, diff --git a/src/NUnit.TestAdapter.Tests.Acceptance/NUnit.TestAdapter.Tests.Acceptance.csproj b/src/NUnit.TestAdapter.Tests.Acceptance/NUnit.TestAdapter.Tests.Acceptance.csproj index 38703332..0be7ea1e 100644 --- a/src/NUnit.TestAdapter.Tests.Acceptance/NUnit.TestAdapter.Tests.Acceptance.csproj +++ b/src/NUnit.TestAdapter.Tests.Acceptance/NUnit.TestAdapter.Tests.Acceptance.csproj @@ -12,7 +12,7 @@ - + diff --git a/src/NUnit.TestAdapter.Tests.Acceptance/TestSourceWithCustomNames.cs b/src/NUnit.TestAdapter.Tests.Acceptance/TestSourceWithCustomNames.cs index 226b9451..0be1d792 100644 --- a/src/NUnit.TestAdapter.Tests.Acceptance/TestSourceWithCustomNames.cs +++ b/src/NUnit.TestAdapter.Tests.Acceptance/TestSourceWithCustomNames.cs @@ -83,8 +83,9 @@ public class Case [Test, Platform("Win")] [TestCase("net48")] // test code requires ValueTuple support, so can't got to net35 - [TestCase("netcoreapp2.1")] + [TestCase("netcoreapp3.1")] [TestCase("net5.0")] + [TestCase("net6.0")] public static void Single_target_csproj(string targetFramework) { var workspace = CreateWorkspace() diff --git a/src/NUnit3AdapterExternalTests/NUnit3AdapterExternalTests.csproj b/src/NUnit3AdapterExternalTests/NUnit3AdapterExternalTests.csproj index 961550cd..26df8db8 100644 --- a/src/NUnit3AdapterExternalTests/NUnit3AdapterExternalTests.csproj +++ b/src/NUnit3AdapterExternalTests/NUnit3AdapterExternalTests.csproj @@ -3,7 +3,7 @@ NUnit.VisualStudio.TestAdapter.ExternalTests NUnit.VisualStudio.TestAdapter.Tests - net45;netcoreapp2.1 + net45;netcoreapp3.1 diff --git a/src/NUnitTestAdapter/AdapterSettings.cs b/src/NUnitTestAdapter/AdapterSettings.cs index 9ff1e552..e0b866cf 100644 --- a/src/NUnitTestAdapter/AdapterSettings.cs +++ b/src/NUnitTestAdapter/AdapterSettings.cs @@ -29,6 +29,8 @@ using Microsoft.VisualStudio.TestPlatform.ObjectModel; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Adapter; +using NUnit.Engine; + namespace NUnit.VisualStudio.TestAdapter { public interface IAdapterSettings @@ -40,7 +42,7 @@ public interface IAdapterSettings string TestAdapterPaths { get; } bool CollectSourceInformation { get; } IDictionary TestProperties { get; } - string InternalTraceLevel { get; } + InternalTraceLevel InternalTraceLevelEnum { get; } string WorkDirectory { get; } string Where { get; } int DefaultTimeout { get; } @@ -115,7 +117,7 @@ public interface IAdapterSettings bool IncludeStackTraceForSuites { get; } - void Load(IDiscoveryContext context); + void Load(IDiscoveryContext context, TestLogger testLogger = null); void Load(string settingsXml); void SaveRandomSeed(string dirname); void RestoreRandomSeed(string dirname); @@ -132,6 +134,7 @@ public interface IAdapterSettings ExplicitModeEnum ExplicitMode { get; } bool SkipExecutionWhenNoTests { get; } string TestOutputFolder { get; } + string SetTestOutputFolder(string workDirectory); } public enum VsTestCategoryType @@ -210,7 +213,11 @@ public AdapterSettings(ITestLogger logger) #region Properties - NUnit Specific public string InternalTraceLevel { get; private set; } + public InternalTraceLevel InternalTraceLevelEnum { get; private set; } + /// + /// Is null if not set in runsettings. + /// public string WorkDirectory { get; private set; } public string Where { get; private set; } public string TestOutputXml { get; private set; } @@ -303,8 +310,14 @@ public AdapterSettings(ITestLogger logger) #region Public Methods - public void Load(IDiscoveryContext context) + /// + /// Initialized by the Load method. + /// + private TestLogger testLog; + + public void Load(IDiscoveryContext context, TestLogger testLogger) { + testLog = testLogger; if (context == null) throw new ArgumentNullException(nameof(context), "Load called with null context"); @@ -338,12 +351,9 @@ public void Load(string settingsXml) UseVsKeepEngineRunning = GetInnerTextAsBool(nunitNode, nameof(UseVsKeepEngineRunning), false); BasePath = GetInnerTextWithLog(nunitNode, nameof(BasePath)); PrivateBinPath = GetInnerTextWithLog(nunitNode, nameof(PrivateBinPath)); - TestOutputXml = GetInnerTextWithLog(nunitNode, nameof(TestOutputXml)); - OutputXmlFolderMode = MapEnum(GetInnerText(nunitNode, nameof(OutputXmlFolderMode), Verbosity > 0), OutputXmlFolderMode.RelativeToWorkFolder); + ParseOutputXml(nunitNode); NewOutputXmlFileForEachRun = GetInnerTextAsBool(nunitNode, nameof(NewOutputXmlFileForEachRun), false); - SetTestOutputFolder(); - RandomSeed = GetInnerTextAsNullableInt(nunitNode, nameof(RandomSeed)); RandomSeedSpecified = RandomSeed.HasValue; if (!RandomSeedSpecified) @@ -418,24 +428,44 @@ public void Load(string settingsXml) UpdateNumberOfTestWorkers(); } - private void SetTestOutputFolder() + private void ParseOutputXml(XmlNode nunitNode) { - if (!UseTestOutputXml) + TestOutputXml = GetInnerTextWithLog(nunitNode, nameof(TestOutputXml)); + if (Path.IsPathRooted(TestOutputXml)) + { + OutputXmlFolderMode = OutputXmlFolderMode.AsSpecified; return; + } + var outputMode = GetInnerText(nunitNode, nameof(OutputXmlFolderMode), Verbosity > 0); + + if (string.IsNullOrEmpty(WorkDirectory) && string.IsNullOrEmpty(outputMode)) + { + OutputXmlFolderMode = string.IsNullOrEmpty(TestOutputXml) ? OutputXmlFolderMode.UseResultDirectory : OutputXmlFolderMode.RelativeToResultDirectory; + } + + OutputXmlFolderMode = MapEnum(outputMode, OutputXmlFolderMode.RelativeToWorkFolder); + } + + public string SetTestOutputFolder(string workDirectory) + { + if (!UseTestOutputXml) + return ""; switch (OutputXmlFolderMode) { case OutputXmlFolderMode.UseResultDirectory: TestOutputFolder = ResultsDirectory; - return; + return TestOutputFolder; case OutputXmlFolderMode.RelativeToResultDirectory: TestOutputFolder = Path.Combine(ResultsDirectory, TestOutputXml); - return; + return TestOutputFolder; case OutputXmlFolderMode.RelativeToWorkFolder: - TestOutputFolder = Path.Combine(WorkDirectory, TestOutputXml); - return; + TestOutputFolder = Path.Combine(workDirectory, TestOutputXml); + return TestOutputFolder; case OutputXmlFolderMode.AsSpecified: + TestOutputFolder = TestOutputXml; + return TestOutputFolder; default: - return; + return ""; } } @@ -445,13 +475,32 @@ private void ExtractNUnitDiagnosticSettings(XmlNode nunitNode) DumpXmlTestResults = GetInnerTextAsBool(nunitNode, nameof(DumpXmlTestResults), false); DumpVsInput = GetInnerTextAsBool(nunitNode, nameof(DumpVsInput), false); FreakMode = GetInnerTextAsBool(nunitNode, nameof(FreakMode), false); - InternalTraceLevel = GetInnerTextWithLog(nunitNode, nameof(InternalTraceLevel), "Off", "Error", "Warning", - "Info", "Verbose", "Debug"); + InternalTraceLevel = GetInnerTextWithLog(nunitNode, nameof(InternalTraceLevel), "Off", "Error", "Warning", "Info", "Verbose", "Debug"); + InternalTraceLevelEnum = ParseInternalTraceLevel(InternalTraceLevel); Debug = GetInnerTextAsBool(nunitNode, nameof(Debug), false); DebugExecution = Debug || GetInnerTextAsBool(nunitNode, nameof(DebugExecution), false); DebugDiscovery = Debug || GetInnerTextAsBool(nunitNode, nameof(DebugDiscovery), false); } + private InternalTraceLevel ParseInternalTraceLevel(string s) + { + if (s == null) + { + return Engine.InternalTraceLevel.Off; + } + + try + { + var internalTrace = (InternalTraceLevel)Enum.Parse(typeof(InternalTraceLevel), s); + return internalTrace; + } + catch + { + testLog.Warning($"InternalTraceLevel is non-valid: {s}, see https://docs.nunit.org/articles/vs-test-adapter/Tips-And-Tricks.html"); + return Engine.InternalTraceLevel.Off; + } + } + private void UpdateTestProperties(XmlDocument doc) { TestProperties = new Dictionary(); diff --git a/src/NUnitTestAdapter/NUnit.TestAdapter.csproj b/src/NUnitTestAdapter/NUnit.TestAdapter.csproj index f6e05ab9..3bd554b4 100644 --- a/src/NUnitTestAdapter/NUnit.TestAdapter.csproj +++ b/src/NUnitTestAdapter/NUnit.TestAdapter.csproj @@ -4,9 +4,9 @@ NUnit3.TestAdapter NUnit.VisualStudio.TestAdapter - + - net35;netcoreapp2.1 + net35;netcoreapp3.1 false https://github.com/nunit/nunit3-vs-adapter true diff --git a/src/NUnitTestAdapter/NUnit3TestExecutor.cs b/src/NUnitTestAdapter/NUnit3TestExecutor.cs index 1f455146..4f8a5a7a 100644 --- a/src/NUnitTestAdapter/NUnit3TestExecutor.cs +++ b/src/NUnitTestAdapter/NUnit3TestExecutor.cs @@ -20,7 +20,7 @@ // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // *********************************************************************** - +#define REVERSEENGINEERING using System; using System.Collections.Generic; @@ -89,7 +89,7 @@ public sealed class NUnit3TestExecutor : NUnitTestAdapter, ITestExecutor, IDispo #region ITestExecutor Implementation /// - /// Called by the Visual Studio IDE to run all tests. Also called by TFS Build + /// Called by dotnet test, and TFS Build /// to run either all or selected tests. In the latter case, a filter is provided /// as part of the run context. /// @@ -100,8 +100,13 @@ public void RunTests(IEnumerable sources, IRunContext runContext, IFrame { Initialize(runContext, frameworkHandle); CheckIfDebug(); - TestLog.Debug("RunTests by IEnumerable"); +#if REVERSEENGINEERING + var st = new StackTrace(); + var frames = st.GetFrames(); + var filenames = frames?.Select(x => x.GetMethod()?.DeclaringType?.Assembly.CodeBase).Distinct().ToList(); +#endif InitializeForExecution(runContext, frameworkHandle); + TestLog.Debug($"RunTests by IEnumerable,({sources.Count()} entries), called from {WhoIsCallingUsEntry}"); if (Settings.InProcDataCollectorsAvailable && sources.Count() > 1) { @@ -156,7 +161,7 @@ private void SetRunTypeByStrings() } /// - /// Called by the VisualStudio IDE when selected tests are to be run. Never called from TFS Build, except (at least 2022, probably also 2019) when vstest.console uses /test: then this is being used. + /// Called by the VisualStudio IDE when all or selected tests are to be run. Never called from TFS Build, except (at least 2022, probably also 2019) when vstest.console uses /test: then this is being used. /// /// The tests to be run. /// The RunContext. @@ -167,11 +172,13 @@ public void RunTests(IEnumerable tests, IRunContext runContext, IFrame CheckIfDebug(); InitializeForExecution(runContext, frameworkHandle); RunType = RunType.Ide; - TestLog.Debug("RunTests by IEnumerable. RunType = Ide"); + TestLog.Debug($"RunTests by IEnumerable. RunType = Ide, called from {WhoIsCallingUsEntry}"); var timing = new TimingLogger(Settings, TestLog); Debug.Assert(NUnitEngineAdapter != null, "NUnitEngineAdapter is null"); Debug.Assert(NUnitEngineAdapter.EngineEnabled, "NUnitEngineAdapter TestEngine is null"); - var assemblyGroups = tests.GroupBy(tc => tc.Source); + var assemblyGroups = tests.GroupBy(tc => tc.Source).ToList(); + if (assemblyGroups.Count > 1) + TestLog.Debug($"Multiple ({assemblyGroups.Count}) assemblies in one test"); if (IsInProcDataCollectorsSpecifiedWithMultipleAssemblies(assemblyGroups)) { TestLog.Error( @@ -219,18 +226,18 @@ void ITestExecutor.Cancel() StopRun(); } - #endregion +#endregion - #region IDisposable Implementation +#region IDisposable Implementation public void Dispose() { // TODO: Nothing here at the moment. Check what needs disposing, if anything. Otherwise, remove. } - #endregion +#endregion - #region Helper Methods +#region Helper Methods public void InitializeForExecution(IRunContext runContext, IFrameworkHandle frameworkHandle) { @@ -274,7 +281,7 @@ private void RunAssembly(string assemblyPath, IGrouping testCa NUnitEngineAdapter.CreateRunner(package); CreateTestOutputFolder(); Dump?.StartDiscoveryInExecution(testCases, filter, package); - + TestLog.DebugRunfrom(); // var discoveryResults = RunType == RunType.CommandLineCurrentNUnit ? null : NUnitEngineAdapter.Explore(filter); var discoveryResults = NUnitEngineAdapter.Explore(filter); Dump?.AddString(discoveryResults?.AsString() ?? " No discovery"); @@ -349,17 +356,18 @@ private void RestoreRandomSeed(string assemblyPath) } - private NUnitTestFilterBuilder CreateTestFilterBuilder() => new (NUnitEngineAdapter.GetService(), Settings); - + private NUnitTestFilterBuilder CreateTestFilterBuilder() => new(NUnitEngineAdapter.GetService(), Settings); + /// + /// Must be called after WorkDir have been set. + /// private void CreateTestOutputFolder() { if (!Settings.UseTestOutputXml) { return; } - - string path = Settings.TestOutputFolder; + string path = Settings.SetTestOutputFolder(WorkDir); try { Directory.CreateDirectory(path); @@ -373,7 +381,7 @@ private void CreateTestOutputFolder() } } - #endregion +#endregion public void StopRun() { diff --git a/src/NUnitTestAdapter/NUnitEngine/NUnitEngineAdapter.cs b/src/NUnitTestAdapter/NUnitEngine/NUnitEngineAdapter.cs index a366ec43..cc4aaeda 100644 --- a/src/NUnitTestAdapter/NUnitEngine/NUnitEngineAdapter.cs +++ b/src/NUnitTestAdapter/NUnitEngine/NUnitEngineAdapter.cs @@ -23,6 +23,7 @@ using System; using System.IO; + using NUnit.Engine; using NUnit.VisualStudio.TestAdapter.Internal; @@ -64,12 +65,20 @@ public void Initialize() #endif InternalEngineCreated?.Invoke(engineX); TestEngine = engineX; + var tmpPath = Path.Combine(Path.GetTempPath(), "NUnit.Engine"); + if (!Directory.Exists(tmpPath)) + Directory.CreateDirectory(tmpPath); + TestEngine.WorkDirectory = tmpPath; + TestEngine.InternalTraceLevel = InternalTraceLevel.Off; } public void InitializeSettingsAndLogging(IAdapterSettings setting, ITestLogger testLog) { logger = testLog; settings = setting; +#if EnableTraceLevelAtInitialization + +#endif } public void CreateRunner(TestPackage testPackage) @@ -87,17 +96,18 @@ public NUnitResults Explore(TestFilter filter) { var timing = new TimingLogger(settings, logger); var results = new NUnitResults(Runner.Explore(filter)); - timing.LogTime($"Execution engine discovery time with filter length {filter.Text.Length}"); - if (filter.Text.Length < 300) - logger.Debug($"Filter: {filter.Text}"); - - return results; + return LogTiming(filter, timing, results); } public NUnitResults Run(ITestEventListener listener, TestFilter filter) { var timing = new TimingLogger(settings, logger); var results = new NUnitResults(Runner.Run(listener, filter)); + return LogTiming(filter, timing, results); + } + + private NUnitResults LogTiming(TestFilter filter, TimingLogger timing, NUnitResults results) + { timing.LogTime($"Execution engine run time with filter length {filter.Text.Length}"); if (filter.Text.Length < 300) logger.Debug($"Filter: {filter.Text}"); diff --git a/src/NUnitTestAdapter/NUnitTestAdapter.cs b/src/NUnitTestAdapter/NUnitTestAdapter.cs index ef879998..3989116a 100644 --- a/src/NUnitTestAdapter/NUnitTestAdapter.cs +++ b/src/NUnitTestAdapter/NUnitTestAdapter.cs @@ -92,24 +92,36 @@ public NUnitEngineAdapter NUnitEngineAdapter protected string WorkDir { get; private set; } - private static string exeName; + private static string entryExeName; + private static string whoIsCallingUsEntry; - public static bool IsRunningUnderIde + public static string WhoIsCallingUsEntry { get { - if (exeName == null) + if (whoIsCallingUsEntry != null) + return whoIsCallingUsEntry; + if (entryExeName == null) { var entryAssembly = Assembly.GetEntryAssembly(); if (entryAssembly != null) - exeName = entryAssembly.Location; + entryExeName = entryAssembly.Location; } + whoIsCallingUsEntry = entryExeName; + return whoIsCallingUsEntry; + } + } - return exeName != null && ( - exeName.Contains("vstest.executionengine") || - exeName.Contains("vstest.discoveryengine") || - exeName.Contains("TE.ProcessHost")); + public static bool IsRunningUnderIde + { + get + { + var exe = WhoIsCallingUsEntry; + return exe != null && ( + exe.Contains("vstest.executionengine") || + exe.Contains("vstest.discoveryengine") || + exe.Contains("TE.ProcessHost")); } } @@ -132,7 +144,7 @@ protected void Initialize(IDiscoveryContext context, IMessageLogger messageLogge TestLog.InitSettings(Settings); try { - Settings.Load(context); + Settings.Load(context, TestLog); TestLog.Verbosity = Settings.Verbosity; InitializeForbiddenFolders(); SetCurrentWorkingDirectory(); @@ -218,8 +230,7 @@ protected TestPackage CreateTestPackage(string assemblyName, IGrouping 0) package.Settings[PackageSettings.DefaultTimeout] = timeout; - if (Settings.InternalTraceLevel != null) - package.Settings[PackageSettings.InternalTraceLevel] = Settings.InternalTraceLevel; + package.Settings[PackageSettings.InternalTraceLevel] = Settings.InternalTraceLevelEnum.ToString(); if (Settings.BasePath != null) package.Settings[PackageSettings.BasePath] = Settings.BasePath; @@ -254,6 +265,11 @@ protected TestPackage CreateTestPackage(string assemblyName, IGroupingDebug"); - Assert.That(_settings.InternalTraceLevel, Is.EqualTo("Debug")); + Assert.That(_settings.InternalTraceLevelEnum, Is.EqualTo(Engine.InternalTraceLevel.Debug)); } + [Test] + public void InternalTraceLevelEmpty() + { + _settings.Load(""); + Assert.That(_settings.InternalTraceLevelEnum, Is.EqualTo(Engine.InternalTraceLevel.Off)); + Assert.That(_settings.InternalTraceLevelEnum.ToString(), Is.EqualTo("Off")); + } + + [Test] public void WorkDirectorySetting() { @@ -196,6 +208,7 @@ public void TestOutputSetting() { _settings.Load(@"C:\Whatever/my/work/dir"); Assert.That(_settings.UseTestOutputXml); + _settings.SetTestOutputFolder(_settings.WorkDirectory); Assert.Multiple(() => { Assert.That(_settings.TestOutputFolder, Does.Contain(@"/my/work/dir")); @@ -217,6 +230,7 @@ public void TestOutputSettingWithWorkDir() { _settings.Load(@"C:\Whatevermy/testoutput/dirRelativeToWorkFolder"); Assert.That(_settings.UseTestOutputXml, "Settings not loaded properly"); + _settings.SetTestOutputFolder(_settings.WorkDirectory); Assert.Multiple(() => { Assert.That(_settings.TestOutputFolder, Does.Contain(@"\my/testoutput/dir"), "Content not correct"); @@ -233,9 +247,23 @@ public void TestOutputSettingWithUseResultDirectory() { _settings.Load(@"c:\whatever\resultsC:\AnotherWhatevermy/testoutput/dirUseResultDirectory"); Assert.That(_settings.UseTestOutputXml, "Settings not loaded properly"); + _settings.SetTestOutputFolder(_settings.WorkDirectory); Assert.That(_settings.TestOutputFolder, Is.EqualTo(@"c:\whatever\results"), "Content not correct"); } + /// + /// Test should set output folder to same as resultdirectory, and ignore workdirectory and testoutputxml. + /// + [Test] + public void TestOutputSettingAsSpecified() + { + _settings.Load(@"c:\whatever"); + Assert.That(_settings.UseTestOutputXml, "Settings not loaded properly"); + _settings.SetTestOutputFolder(_settings.WorkDirectory); + Assert.That(_settings.TestOutputFolder, Is.EqualTo(@"c:\whatever"), "Content not correct"); + Assert.That(_settings.OutputXmlFolderMode, Is.EqualTo(OutputXmlFolderMode.AsSpecified), "Should be set default AsSpecified with absolute path in"); + } + [Test] public void NumberOfTestWorkersSetting() diff --git a/src/NUnitTestAdapterTests/Fakes/FakeRunSettings.cs b/src/NUnitTestAdapterTests/Fakes/FakeRunSettings.cs index 50452c8d..8d991394 100644 --- a/src/NUnitTestAdapterTests/Fakes/FakeRunSettings.cs +++ b/src/NUnitTestAdapterTests/Fakes/FakeRunSettings.cs @@ -33,7 +33,7 @@ ISettingsProvider IRunSettings.GetSettings(string settingsName) throw new NotImplementedException(); } - public virtual string SettingsXml => "false"; + public virtual string SettingsXml => "false5"; } class FakeRunSettingsForTestOutput : FakeRunSettings diff --git a/src/NUnitTestAdapterTests/NUnit.TestAdapter.Tests.csproj b/src/NUnitTestAdapterTests/NUnit.TestAdapter.Tests.csproj index 0dbc68ac..28b457e2 100644 --- a/src/NUnitTestAdapterTests/NUnit.TestAdapter.Tests.csproj +++ b/src/NUnitTestAdapterTests/NUnit.TestAdapter.Tests.csproj @@ -4,7 +4,7 @@ true NUnit.VisualStudio.TestAdapter.Tests NUnit.VisualStudio.TestAdapter.Tests - net46;netcoreapp2.1 + net46;netcoreapp3.1 true @@ -24,8 +24,8 @@ - - + + diff --git a/src/NUnitTestAdapterTests/NUnitEngineTests/NUnitDiscoveryTests.cs b/src/NUnitTestAdapterTests/NUnitEngineTests/NUnitDiscoveryTests.cs index 99d3f81d..92eb8b5a 100644 --- a/src/NUnitTestAdapterTests/NUnitEngineTests/NUnitDiscoveryTests.cs +++ b/src/NUnitTestAdapterTests/NUnitEngineTests/NUnitDiscoveryTests.cs @@ -732,8 +732,8 @@ public void ThatTheoryWorks() "; private const string ExplicitQuickTestXml = - @" - + @" + diff --git a/src/NUnitTestAdapterTests/TestDiscoveryTests.cs b/src/NUnitTestAdapterTests/TestDiscoveryTests.cs index 6841b2b1..9db7312f 100644 --- a/src/NUnitTestAdapterTests/TestDiscoveryTests.cs +++ b/src/NUnitTestAdapterTests/TestDiscoveryTests.cs @@ -24,10 +24,13 @@ using System.Collections.Generic; using System.IO; using System.Linq; + using Microsoft.VisualStudio.TestPlatform.ObjectModel; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Adapter; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Logging; + using NSubstitute; + using NUnit.Framework; namespace NUnit.VisualStudio.TestAdapter.Tests @@ -38,18 +41,19 @@ internal static class TestDiscoveryDataProvider { public static IEnumerable TestDiscoveryData() { - // yield return new FakeDiscoveryContext(null); + // yield return new FakeDiscoveryContext(null); yield return new FakeDiscoveryContext(new FakeRunSettings()); } } + [Ignore("These tests needs to rewritten as isolated tests")] [Category("TestDiscovery")] public class TestDiscoveryTests : ITestCaseDiscoverySink { static readonly string MockAssemblyPath = Path.Combine(TestContext.CurrentContext.TestDirectory, "mock-assembly.dll"); - private readonly List testCases = new (); + private readonly List testCases = new(); private readonly IDiscoveryContext _context; @@ -134,13 +138,13 @@ public void VerifyLoading(IDiscoveryContext context) this); } -#region ITestCaseDiscoverySink Methods + #region ITestCaseDiscoverySink Methods void ITestCaseDiscoverySink.SendTestCase(TestCase discoveredTest) { } -#endregion + #endregion } [Category("TestDiscovery")] diff --git a/src/NUnitTestAdapterTests/TestExecutionTests.cs b/src/NUnitTestAdapterTests/TestExecutionTests.cs index 68fbc8d2..c3a6b7c3 100644 --- a/src/NUnitTestAdapterTests/TestExecutionTests.cs +++ b/src/NUnitTestAdapterTests/TestExecutionTests.cs @@ -62,7 +62,7 @@ private int GetCount(TestOutcome outcome) } } - + [Ignore("These tests needs to rewritten as isolated tests")] [Category("TestExecution")] public class TestFilteringTests { @@ -118,6 +118,7 @@ public void TestsWhereShouldFilter(string filter, int expectedCount, int noOfSki } } + [Ignore("These tests needs to rewritten as isolated tests")] [Category("TestExecution")] public class TestExecutionTests { diff --git a/src/empty-assembly/empty-assembly.csproj b/src/empty-assembly/empty-assembly.csproj index 3763a2c2..036c83e6 100644 --- a/src/empty-assembly/empty-assembly.csproj +++ b/src/empty-assembly/empty-assembly.csproj @@ -4,7 +4,7 @@ false empty-assembly NUnit.Tests - net35;netcoreapp2.1 + net35;netcoreapp3.1 diff --git a/src/mock-assembly/mock-assembly.csproj b/src/mock-assembly/mock-assembly.csproj index 19da652f..56dacffe 100644 --- a/src/mock-assembly/mock-assembly.csproj +++ b/src/mock-assembly/mock-assembly.csproj @@ -4,7 +4,7 @@ false mock-assembly NUnit.Tests - net35;netcoreapp2.1 + net35;netcoreapp3.1