diff --git a/Versions.props b/Versions.props index c57c84a..1b69998 100644 --- a/Versions.props +++ b/Versions.props @@ -11,7 +11,7 @@ 1.0.0-alpha.160 1.15.0-pre.10 2.8.2-pre.12 - 0.1.1-pre.475 + 0.1.1-pre.480 diff --git a/src/xunit.runner.visualstudio/Utility/AssemblyRunInfo.cs b/src/xunit.runner.visualstudio/Utility/AssemblyRunInfo.cs index 4d39177..4c2e167 100644 --- a/src/xunit.runner.visualstudio/Utility/AssemblyRunInfo.cs +++ b/src/xunit.runner.visualstudio/Utility/AssemblyRunInfo.cs @@ -6,17 +6,14 @@ namespace Xunit.Runner.VisualStudio; public class AssemblyRunInfo { - public AssemblyRunInfo( + AssemblyRunInfo( XunitProject project, RunSettings runSettings, string assemblyFileName, - IList? testCases = null) + AssemblyMetadata assemblyMetadata, + IList? testCases) { - Assembly = new XunitProjectAssembly(project) - { - AssemblyFileName = assemblyFileName, - AssemblyMetadata = AssemblyUtility.GetAssemblyMetadata(assemblyFileName), - }; + Assembly = new XunitProjectAssembly(project, assemblyFileName, assemblyMetadata); TestCases = testCases; runSettings.CopyTo(Assembly.Configuration); @@ -25,4 +22,17 @@ public AssemblyRunInfo( public XunitProjectAssembly Assembly { get; } public IList? TestCases { get; } + + public static AssemblyRunInfo? Create( + XunitProject project, + RunSettings runSettings, + string assemblyFileName, + IList? testCases = null) + { + var metadata = AssemblyUtility.GetAssemblyMetadata(assemblyFileName); + if (metadata is null || metadata.XunitVersion == 0) + return null; + + return new(project, runSettings, assemblyFileName, metadata, testCases); + } } diff --git a/src/xunit.runner.visualstudio/VsTestRunner.cs b/src/xunit.runner.visualstudio/VsTestRunner.cs index 69977d7..dc91481 100644 --- a/src/xunit.runner.visualstudio/VsTestRunner.cs +++ b/src/xunit.runner.visualstudio/VsTestRunner.cs @@ -182,11 +182,15 @@ async Task DiscoverTests( foreach (var assemblyFileNameCanBeWithoutAbsolutePath in sources) { var assemblyFileName = Path.GetFullPath(assemblyFileNameCanBeWithoutAbsolutePath); - var assembly = new XunitProjectAssembly(project) - { - AssemblyFileName = assemblyFileName, - AssemblyMetadata = AssemblyUtility.GetAssemblyMetadata(assemblyFileName), - }; + var metadata = AssemblyUtility.GetAssemblyMetadata(assemblyFileName); + // Silently ignore anything which doesn't look like a test project, because reporting it just throws + // lots of warnings into the test output window as Test Explorer asks you to enumerate tests for every + // assembly you build in your solution, not just the ones with references to this runner. + if (metadata is null || metadata.XunitVersion == 0) + return; + + var assembly = new XunitProjectAssembly(project, assemblyFileName, metadata); + var configWarnings = new List(); ConfigReader.Load(assembly.Configuration, assembly.AssemblyFileName, assembly.ConfigFileName, configWarnings); runSettings.CopyTo(assembly.Configuration); @@ -203,6 +207,9 @@ async Task DiscoverTests( await using var sourceInformationProvider = new VisualStudioSourceInformationProvider(assembly.AssemblyFileName, diagnosticMessageSink); await using var controller = XunitFrontController.ForDiscoveryAndExecution(assembly, sourceInformationProvider, diagnosticMessageSink); + if (controller is null) + return; + var discoveryOptions = _TestFrameworkOptions.ForDiscovery(assembly.Configuration); discoveryOptions.SetIncludeSourceInformation(true); if (!await DiscoverTestsInAssembly(controller, logger, testPlatformContext, runSettings, visitorFactory, visitComplete, assembly, discoveryOptions)) @@ -239,40 +246,35 @@ async Task DiscoverTestsInAssembly( var reporterMessageHandler = await GetRunnerReporter(logger, runSettings, [assembly.AssemblyFileName]).CreateMessageHandler(new VisualStudioRunnerLogger(logger), diagnosticMessageSink); fileName = Path.GetFileNameWithoutExtension(assembly.AssemblyFileName); - if (assembly.AssemblyMetadata.XunitVersion == 0) - diagnosticMessageSink.OnMessage(new _DiagnosticMessage("Skipping: {0} (no reference to xUnit.net)", fileName)); - else + using var visitor = visitorFactory(assembly.AssemblyFileName, controller, discoveryOptions); + var totalTests = 0; + var appDomain = assembly.Configuration.AppDomain ?? AppDomainDefaultBehavior; + var usingAppDomains = controller.CanUseAppDomains && appDomain != AppDomainSupport.Denied; + reporterMessageHandler.OnMessage(new TestAssemblyDiscoveryStarting { - using var visitor = visitorFactory(assembly.AssemblyFileName, controller, discoveryOptions); - var totalTests = 0; - var appDomain = assembly.Configuration.AppDomain ?? AppDomainDefaultBehavior; - var usingAppDomains = controller.CanUseAppDomains && appDomain != AppDomainSupport.Denied; - reporterMessageHandler.OnMessage(new TestAssemblyDiscoveryStarting - { - AppDomain = usingAppDomains ? AppDomainOption.Enabled : AppDomainOption.Disabled, - Assembly = assembly, - DiscoveryOptions = discoveryOptions, - ShadowCopy = assembly.Configuration.ShadowCopyOrDefault, - }); + AppDomain = usingAppDomains ? AppDomainOption.Enabled : AppDomainOption.Disabled, + Assembly = assembly, + DiscoveryOptions = discoveryOptions, + ShadowCopy = assembly.Configuration.ShadowCopyOrDefault, + }); - try - { - var findSettings = new FrontControllerFindSettings(discoveryOptions); - controller.Find(visitor, findSettings); + try + { + var findSettings = new FrontControllerFindSettings(discoveryOptions); + controller.Find(visitor, findSettings); - totalTests = visitor.Finish(); + totalTests = visitor.Finish(); - visitComplete?.Invoke(assembly.AssemblyFileName, controller, discoveryOptions, visitor); - } - finally + visitComplete?.Invoke(assembly.AssemblyFileName, controller, discoveryOptions, visitor); + } + finally + { + reporterMessageHandler.OnMessage(new TestAssemblyDiscoveryFinished { - reporterMessageHandler.OnMessage(new TestAssemblyDiscoveryFinished - { - Assembly = assembly, - DiscoveryOptions = discoveryOptions, - TestCasesToRun = totalTests, - }); - } + Assembly = assembly, + DiscoveryOptions = discoveryOptions, + TestCasesToRun = totalTests, + }); } } catch (Exception e) @@ -394,7 +396,8 @@ public void RunTests( () => tests .GroupBy(testCase => testCase.Source) - .Select(group => new AssemblyRunInfo(project, runSettings, group.Key, group.ToList())) + .Select(group => AssemblyRunInfo.Create(project, runSettings, group.Key, group.ToList())) + .WhereNotNull() .ToList() ).GetAwaiter().GetResult(); } @@ -425,7 +428,7 @@ public void RunTests( // before returning from this function. RunTests( runContext, frameworkHandle, logger, testPlatformContext, runSettings, - () => sources.Select(source => new AssemblyRunInfo(project, runSettings, Path.GetFullPath(source))).ToList() + () => sources.Select(source => AssemblyRunInfo.Create(project, runSettings, Path.GetFullPath(source))).WhereNotNull().ToList() ).GetAwaiter().GetResult(); } @@ -499,6 +502,9 @@ async Task RunTestsInAssembly( await using var sourceInformationProvider = new VisualStudioSourceInformationProvider(assemblyFileName, diagnosticSink); await using var controller = XunitFrontController.ForDiscoveryAndExecution(runInfo.Assembly, sourceInformationProvider, diagnosticSink); + if (controller is null) + return; + var testCasesMap = new Dictionary(); var testCaseSerializations = new List(); if (runInfo.TestCases is null || !runInfo.TestCases.Any())