/// <inheritdoc/> public bool OnMessage(_MessageSinkMessage message) { Guard.ArgumentNotNull(nameof(message), message); if (message is _TestSkipped testSkipped) { var testFailed = new _TestFailed { AssemblyUniqueID = testSkipped.AssemblyUniqueID, ExceptionParentIndices = new[] { -1 }, ExceptionTypes = new[] { "FAIL_SKIP" }, ExecutionTime = 0m, Messages = new[] { testSkipped.Reason }, Output = "", StackTraces = new[] { "" }, TestCaseUniqueID = testSkipped.TestCaseUniqueID, TestClassUniqueID = testSkipped.TestClassUniqueID, TestCollectionUniqueID = testSkipped.TestCollectionUniqueID, TestMethodUniqueID = testSkipped.TestMethodUniqueID, TestUniqueID = testSkipped.TestUniqueID }; return(innerSink.OnMessage(testFailed)); } // TODO: Shouldn't there be conversions of all the finished messages up the stack, to rectify the counts? if (message is _TestCollectionFinished testCollectionFinished) { testCollectionFinished = new _TestCollectionFinished { AssemblyUniqueID = testCollectionFinished.AssemblyUniqueID, ExecutionTime = testCollectionFinished.ExecutionTime, TestCollectionUniqueID = testCollectionFinished.TestCollectionUniqueID, TestsFailed = testCollectionFinished.TestsFailed + testCollectionFinished.TestsSkipped, TestsRun = testCollectionFinished.TestsRun, TestsSkipped = 0 }; return(innerSink.OnMessage(testCollectionFinished)); } if (message is _TestAssemblyFinished assemblyFinished) { assemblyFinished = new _TestAssemblyFinished { AssemblyUniqueID = assemblyFinished.AssemblyUniqueID, ExecutionTime = assemblyFinished.ExecutionTime, TestsFailed = assemblyFinished.TestsFailed + assemblyFinished.TestsSkipped, TestsRun = assemblyFinished.TestsRun, TestsSkipped = 0 }; return(innerSink.OnMessage(assemblyFinished)); } return(innerSink.OnMessage(message)); }
Xunit1RunSummary RunTestCollection( IList <Xunit1TestCase> testCases, _IMessageSink messageSink) { Guard.ArgumentValid(nameof(testCases), "testCases must contain at least one test case", testCases.Count > 0); var collectionStarting = new _TestCollectionStarting { AssemblyUniqueID = testCases[0].AssemblyUniqueID, TestCollectionClass = null, TestCollectionDisplayName = $"xUnit.net v1 Tests for {assemblyFileName}", TestCollectionUniqueID = testCases[0].TestCollectionUniqueID }; var results = new Xunit1RunSummary { Continue = messageSink.OnMessage(collectionStarting) }; try { if (results.Continue) { foreach (var testClassGroup in testCases.GroupBy(tc => tc.TestClass)) { var classResults = RunTestClass(testClassGroup.Key, testClassGroup.ToList(), messageSink); results.Aggregate(classResults); if (!classResults.Continue) { break; } } } } finally { var collectionFinished = new _TestCollectionFinished { AssemblyUniqueID = collectionStarting.AssemblyUniqueID, ExecutionTime = results.Time, TestCollectionUniqueID = collectionStarting.TestCollectionUniqueID, TestsFailed = results.Failed, TestsRun = results.Total, TestsSkipped = results.Skipped }; results.Continue = messageSink.OnMessage(collectionFinished) && results.Continue; } return(results); }
/// <summary> /// Runs the tests in the test collection. /// </summary> /// <param name="ctxt">The context that describes the current test collection</param> /// <returns>Returns summary information about the tests that were run.</returns> protected async ValueTask <RunSummary> RunAsync(TContext ctxt) { await ctxt.InitializeAsync(); try { SetTestContext(ctxt, TestEngineStatus.Initializing); var collectionSummary = new RunSummary(); var testAssemblyUniqueID = ctxt.TestCollection.TestAssembly.UniqueID; var testCollectionUniqueID = ctxt.TestCollection.UniqueID; var collectionStarting = new _TestCollectionStarting { AssemblyUniqueID = testAssemblyUniqueID, TestCollectionClass = ctxt.TestCollection.CollectionDefinition?.Name, TestCollectionDisplayName = ctxt.TestCollection.DisplayName, TestCollectionUniqueID = testCollectionUniqueID }; if (!ctxt.MessageBus.QueueMessage(collectionStarting)) { ctxt.CancellationTokenSource.Cancel(); } else { try { await AfterTestCollectionStartingAsync(ctxt); SetTestContext(ctxt, TestEngineStatus.Running); collectionSummary = await RunTestClassesAsync(ctxt); SetTestContext(ctxt, TestEngineStatus.CleaningUp); ctxt.Aggregator.Clear(); await BeforeTestCollectionFinishedAsync(ctxt); if (ctxt.Aggregator.HasExceptions) { var collectionCleanupFailure = _TestCollectionCleanupFailure.FromException(ctxt.Aggregator.ToException() !, testAssemblyUniqueID, testCollectionUniqueID); if (!ctxt.MessageBus.QueueMessage(collectionCleanupFailure)) { ctxt.CancellationTokenSource.Cancel(); } } } finally { var collectionFinished = new _TestCollectionFinished { AssemblyUniqueID = testAssemblyUniqueID, ExecutionTime = collectionSummary.Time, TestCollectionUniqueID = testCollectionUniqueID, TestsFailed = collectionSummary.Failed, TestsRun = collectionSummary.Total, TestsSkipped = collectionSummary.Skipped }; if (!ctxt.MessageBus.QueueMessage(collectionFinished)) { ctxt.CancellationTokenSource.Cancel(); } } } return(collectionSummary); } finally { await ctxt.DisposeAsync(); } }