/// <inheritdoc/> public void Find(bool includeSourceInformation, IMessageSink messageSink, ITestFrameworkOptions options) { Guard.ArgumentNotNull("messageSink", messageSink); Guard.ArgumentNotNull("options", options); ThreadPool.QueueUserWorkItem(_ => { using (var messageBus = new MessageBus(messageSink)) using (new PreserveWorkingFolder(AssemblyInfo)) { foreach (var type in AssemblyInfo.GetTypes(includePrivateTypes: false).Where(IsValidTestClass)) if (!FindTestsForTypeAndWrapExceptions(type, includeSourceInformation, messageBus)) break; var warnings = Aggregator.GetAndClear<EnvironmentalWarning>().Select(w => w.Message).ToList(); messageBus.QueueMessage(new DiscoveryCompleteMessage(warnings)); } }); }
/// <inheritdoc/> public void Find(string typeName, bool includeSourceInformation, IMessageSink messageSink, ITestFrameworkOptions options) { Guard.ArgumentNotNullOrEmpty("typeName", typeName); Guard.ArgumentNotNull("messageSink", messageSink); Guard.ArgumentNotNull("options", options); Task.Run(() => { using (var messageBus = new MessageBus(messageSink)) using (new PreserveWorkingFolder(AssemblyInfo)) { var typeInfo = AssemblyInfo.GetType(typeName); if (typeInfo != null && IsValidTestClass(typeInfo)) { var testClass = CreateTestClass(typeInfo); FindTestsForTypeAndWrapExceptions(testClass, includeSourceInformation, messageBus); } var warnings = Aggregator.GetAndClear<EnvironmentalWarning>().Select(w => w.Message).ToList(); messageBus.QueueMessage(new DiscoveryCompleteMessage(warnings)); } }); }
/// <inheritdoc/> public void Find(string typeName, bool includeSourceInformation, IMessageSink messageSink, ITestFrameworkOptions options) { Guard.ArgumentNotNullOrEmpty("typeName", typeName); Guard.ArgumentNotNull("messageSink", messageSink); Guard.ArgumentNotNull("options", options); ThreadPool.QueueUserWorkItem(_ => { using (var messageBus = new MessageBus(messageSink)) { ITypeInfo typeInfo = assemblyInfo.GetType(typeName); if (typeInfo != null && (!typeInfo.IsAbstract || typeInfo.IsSealed)) FindImpl(typeInfo, includeSourceInformation, messageBus); var warnings = messageAggregator.GetAndClear<EnvironmentalWarning>().Select(w => w.Message).ToList(); messageBus.QueueMessage(new DiscoveryCompleteMessage(warnings)); } }); }
/// <inheritdoc/> public void Find(bool includeSourceInformation, IMessageSink messageSink, ITestFrameworkOptions options) { Guard.ArgumentNotNull("messageSink", messageSink); Guard.ArgumentNotNull("options", options); ThreadPool.QueueUserWorkItem(_ => { using (var messageBus = new MessageBus(messageSink)) { foreach (var type in assemblyInfo.GetTypes(includePrivateTypes: false).Where(type => !type.IsAbstract || type.IsSealed)) if (!FindImpl(type, includeSourceInformation, messageBus)) break; var warnings = messageAggregator.GetAndClear<EnvironmentalWarning>().Select(w => w.Message).ToList(); messageBus.QueueMessage(new DiscoveryCompleteMessage(warnings)); } }); }
/// <inheritdoc/> public async void Run(IEnumerable<ITestCase> testCases, IMessageSink messageSink, ITestFrameworkOptions executionOptions) { Guard.ArgumentNotNull("testCases", testCases); Guard.ArgumentNotNull("messageSink", messageSink); Guard.ArgumentNotNull("executionOptions", executionOptions); var disableParallelization = false; var maxParallelThreads = 0; var collectionBehaviorAttribute = assemblyInfo.GetCustomAttributes(typeof(CollectionBehaviorAttribute)).SingleOrDefault(); if (collectionBehaviorAttribute != null) { disableParallelization = collectionBehaviorAttribute.GetNamedArgument<bool>("DisableTestParallelization"); maxParallelThreads = collectionBehaviorAttribute.GetNamedArgument<int>("MaxParallelThreads"); } disableParallelization = executionOptions.GetValue<bool>(TestOptionsNames.Execution.DisableParallelization, disableParallelization); var maxParallelThreadsOption = executionOptions.GetValue<int>(TestOptionsNames.Execution.MaxParallelThreads, 0); if (maxParallelThreadsOption > 0) maxParallelThreads = maxParallelThreadsOption; var displayName = GetDisplayName(collectionBehaviorAttribute, disableParallelization, maxParallelThreads); var cancellationTokenSource = new CancellationTokenSource(); var totalSummary = new RunSummary(); var scheduler = maxParallelThreads > 0 ? new MaxConcurrencyTaskScheduler(maxParallelThreads) : TaskScheduler.Current; string currentDirectory = Directory.GetCurrentDirectory(); var ordererAttribute = assemblyInfo.GetCustomAttributes(typeof(TestCaseOrdererAttribute)).SingleOrDefault(); var orderer = ordererAttribute != null ? GetTestCaseOrderer(ordererAttribute) : new DefaultTestCaseOrderer(); using (var messageBus = new MessageBus(messageSink)) { try { Directory.SetCurrentDirectory(Path.GetDirectoryName(assemblyInfo.AssemblyPath)); if (messageBus.QueueMessage(new TestAssemblyStarting(assemblyFileName, AppDomain.CurrentDomain.SetupInformation.ConfigurationFile, DateTime.Now, displayName, XunitTestFrameworkDiscoverer.DisplayName))) { IList<RunSummary> summaries; // TODO: Contract for Run() states that null "testCases" means "run everything". var masterStopwatch = Stopwatch.StartNew(); if (disableParallelization) { summaries = new List<RunSummary>(); foreach (var collectionGroup in testCases.Cast<XunitTestCase>().GroupBy(tc => tc.TestCollection)) summaries.Add(await RunTestCollectionAsync(messageBus, collectionGroup.Key, collectionGroup, orderer, cancellationTokenSource)); } else { var tasks = testCases.Cast<XunitTestCase>() .GroupBy(tc => tc.TestCollection) .Select(collectionGroup => Task.Factory.StartNew(() => RunTestCollectionAsync(messageBus, collectionGroup.Key, collectionGroup, orderer, cancellationTokenSource), cancellationTokenSource.Token, TaskCreationOptions.None, scheduler)) .ToArray(); summaries = await Task.WhenAll(tasks.Select(t => t.Unwrap())); } totalSummary.Time = (decimal)masterStopwatch.Elapsed.TotalSeconds; totalSummary.Total = summaries.Sum(s => s.Total); totalSummary.Failed = summaries.Sum(s => s.Failed); totalSummary.Skipped = summaries.Sum(s => s.Skipped); } } finally { messageBus.QueueMessage(new TestAssemblyFinished(assemblyInfo, totalSummary.Time, totalSummary.Total, totalSummary.Failed, totalSummary.Skipped)); Directory.SetCurrentDirectory(currentDirectory); } } }