diff --git a/.github/workflows/speed-comparison.yml b/.github/workflows/speed-comparison.yml index 7a551189bb..27c762a3e4 100644 --- a/.github/workflows/speed-comparison.yml +++ b/.github/workflows/speed-comparison.yml @@ -326,6 +326,7 @@ jobs: automated benchmarks documentation + ignore-for-release draft: false - name: Merge PR Immediately diff --git a/Directory.Packages.props b/Directory.Packages.props index acd52ae7d7..97b2ad0442 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -7,8 +7,8 @@ - - + + @@ -20,7 +20,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -81,12 +81,12 @@ - - - - - - + + + + + + diff --git a/TUnit.Analyzers/AnalyzerReleases.Shipped.md b/TUnit.Analyzers/AnalyzerReleases.Shipped.md index 3985959552..7438273863 100644 --- a/TUnit.Analyzers/AnalyzerReleases.Shipped.md +++ b/TUnit.Analyzers/AnalyzerReleases.Shipped.md @@ -28,7 +28,7 @@ TUnit0038 | Usage | Error | Property with data attribute must have a data source TUnit0043 | Usage | Error | Properties with data attributes must use 'required' keyword TUnit0044 | Usage | Error | Properties with data attributes must have a setter TUnit0045 | Usage | Error | Property has multiple data source attributes - use only one -TUnit0046 | Usage | Warning | Data source should return Func for lazy evaluation instead of T +TUnit0046 | Usage | Warning | Data source should return Func for reference types to ensure test isolation TUnit0049 | Usage | Error | [Matrix] parameters require [MatrixDataSource] attribute on the test method TUnit0050 | Usage | Error | Too many test arguments provided TUnit0056 | Usage | Error | Instance data source methods must use [InstanceMethodDataSource] attribute diff --git a/TUnit.Analyzers/Resources.resx b/TUnit.Analyzers/Resources.resx index b68d6eadff..4482dd6a1e 100644 --- a/TUnit.Analyzers/Resources.resx +++ b/TUnit.Analyzers/Resources.resx @@ -328,13 +328,13 @@ Too many data attributes - Return a `Func<T>` rather than a `<T>`. + When a data source method provides reference types (other than string) as test parameters, it should return Func<T> to defer object creation until the test runs. This prevents shared state between tests and ensures proper test isolation. - Return a `Func<T>` rather than a `<T>`. + Data source method should return Func<T> for reference type parameters (other than string) to ensure proper test isolation - Return a `Func<T>` rather than a `<T>` + Data source should return Func<T> for reference types For AsyncLocal values set in before hooks, you must call `context.AddAsyncLocalValues` to access them within tests. diff --git a/TUnit.Core.SourceGenerator.Tests/TimeoutCancellationTokenTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/TimeoutCancellationTokenTests.Test.verified.txt index 5c46854523..85223a7c65 100644 --- a/TUnit.Core.SourceGenerator.Tests/TimeoutCancellationTokenTests.Test.verified.txt +++ b/TUnit.Core.SourceGenerator.Tests/TimeoutCancellationTokenTests.Test.verified.txt @@ -877,3 +877,273 @@ internal static class TUnit_TestProject_TimeoutCancellationTokenTests_MatrixTest global::TUnit.Core.SourceRegistrar.Register(typeof(global::TUnit.TestProject.TimeoutCancellationTokenTests), new TUnit_TestProject_TimeoutCancellationTokenTests_MatrixTest__int_CancellationToken_TestSource()); } } + + +// ===== FILE SEPARATOR ===== + +// +#pragma warning disable + +#nullable enable +namespace TUnit.Generated; +internal sealed class TUnit_TestProject_TimeoutDoesNotFireTests_QuickTestDoesNotTimeout__CancellationToken_TestSource : global::TUnit.Core.Interfaces.SourceGenerator.ITestSource +{ + public async global::System.Collections.Generic.IAsyncEnumerable GetTestsAsync(string testSessionId, [global::System.Runtime.CompilerServices.EnumeratorCancellation] global::System.Threading.CancellationToken cancellationToken = default) + { + var metadata = new global::TUnit.Core.TestMetadata + { + TestName = "QuickTestDoesNotTimeout", + TestClassType = typeof(global::TUnit.TestProject.TimeoutDoesNotFireTests), + TestMethodName = "QuickTestDoesNotTimeout", + Dependencies = global::System.Array.Empty(), + AttributeFactory = static () => + [ + new global::TUnit.Core.TestAttribute(), + new global::TUnit.Core.MethodDataSourceAttribute("DataSource"), + new global::TUnit.Core.TimeoutAttribute(30_000), + new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass), + new global::TUnit.Core.CategoryAttribute("Timeout Cancellation Token Tests") + ], + DataSources = global::System.Array.Empty(), + ClassDataSources = new global::TUnit.Core.IDataSourceAttribute[] + { + new global::TUnit.Core.MethodDataSourceAttribute("DataSource") + { + Factory = (dataGeneratorMetadata) => + { + async global::System.Collections.Generic.IAsyncEnumerable>> Factory() + { + var result = global::TUnit.TestProject.TimeoutDoesNotFireTests.DataSource(); + if (result is global::System.Collections.IEnumerable enumerable && !(result is string)) + { + foreach (var item in enumerable) + { + yield return () => global::System.Threading.Tasks.Task.FromResult(global::TUnit.Core.Helpers.DataSourceHelpers.ToObjectArray(item)); + } + } + else + { + yield return () => global::System.Threading.Tasks.Task.FromResult(global::TUnit.Core.Helpers.DataSourceHelpers.ToObjectArray(result)); + } + } + return Factory(); + } + }, + }, + PropertyDataSources = global::System.Array.Empty(), + PropertyInjections = global::System.Array.Empty(), + InheritanceDepth = 0, + FilePath = @"", + LineNumber = 86, + MethodMetadata = new global::TUnit.Core.MethodMetadata + { + Type = typeof(global::TUnit.TestProject.TimeoutDoesNotFireTests), + TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.TimeoutDoesNotFireTests)), + Name = "QuickTestDoesNotTimeout", + GenericTypeCount = 0, + ReturnType = typeof(global::System.Threading.Tasks.Task), + ReturnTypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::System.Threading.Tasks.Task)), + Parameters = new global::TUnit.Core.ParameterMetadata[] + { + new global::TUnit.Core.ParameterMetadata(typeof(global::System.Threading.CancellationToken)) + { + Name = "cancellationToken", + TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::System.Threading.CancellationToken)), + IsNullable = false, + ReflectionInfo = typeof(global::TUnit.TestProject.TimeoutDoesNotFireTests).GetMethod("QuickTestDoesNotTimeout", global::System.Reflection.BindingFlags.Public | global::System.Reflection.BindingFlags.NonPublic | global::System.Reflection.BindingFlags.Instance, null, new global::System.Type[] { typeof(global::System.Threading.CancellationToken) }, null)!.GetParameters()[0] + } + }, + Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.TimeoutDoesNotFireTests", static () => + { + var classMetadata = new global::TUnit.Core.ClassMetadata + { + Type = typeof(global::TUnit.TestProject.TimeoutDoesNotFireTests), + TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.TimeoutDoesNotFireTests)), + Name = "TimeoutDoesNotFireTests", + Namespace = "TUnit.TestProject", + Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }), + Parameters = new global::TUnit.Core.ParameterMetadata[] + { + new global::TUnit.Core.ParameterMetadata(typeof(int)) + { + Name = "value", + TypeInfo = new global::TUnit.Core.ConcreteType(typeof(int)), + IsNullable = false, + ReflectionInfo = typeof(global::TUnit.TestProject.TimeoutDoesNotFireTests).GetConstructor(new global::System.Type[] { typeof(int) })!.GetParameters()[0] + } + }, + Properties = global::System.Array.Empty(), + Parent = null + }; + foreach (var prop in classMetadata.Properties) + { + prop.ClassMetadata = classMetadata; + prop.ContainingTypeMetadata = classMetadata; + } + return classMetadata; + }) + }, + InstanceFactory = (typeArgs, args) => + { + return new global::TUnit.TestProject.TimeoutDoesNotFireTests(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + }, + InvokeTypedTest = static (instance, args, cancellationToken) => + { + try + { + return new global::System.Threading.Tasks.ValueTask(instance.QuickTestDoesNotTimeout(cancellationToken)); + } + catch (global::System.Exception ex) + { + return new global::System.Threading.Tasks.ValueTask(global::System.Threading.Tasks.Task.FromException(ex)); + } + }, + }; + metadata.UseRuntimeDataGeneration(testSessionId); + yield return metadata; + yield break; + } +} +internal static class TUnit_TestProject_TimeoutDoesNotFireTests_QuickTestDoesNotTimeout__CancellationToken_ModuleInitializer +{ + [global::System.Runtime.CompilerServices.ModuleInitializer] + public static void Initialize() + { + global::TUnit.Core.SourceRegistrar.Register(typeof(global::TUnit.TestProject.TimeoutDoesNotFireTests), new TUnit_TestProject_TimeoutDoesNotFireTests_QuickTestDoesNotTimeout__CancellationToken_TestSource()); + } +} + + +// ===== FILE SEPARATOR ===== + +// +#pragma warning disable + +#nullable enable +namespace TUnit.Generated; +internal sealed class TUnit_TestProject_CancellationTokenTriggeredTests_CancellationTokenIsTriggered__CancellationToken_TestSource : global::TUnit.Core.Interfaces.SourceGenerator.ITestSource +{ + public async global::System.Collections.Generic.IAsyncEnumerable GetTestsAsync(string testSessionId, [global::System.Runtime.CompilerServices.EnumeratorCancellation] global::System.Threading.CancellationToken cancellationToken = default) + { + var metadata = new global::TUnit.Core.TestMetadata + { + TestName = "CancellationTokenIsTriggered", + TestClassType = typeof(global::TUnit.TestProject.CancellationTokenTriggeredTests), + TestMethodName = "CancellationTokenIsTriggered", + Dependencies = global::System.Array.Empty(), + AttributeFactory = static () => + [ + new global::TUnit.Core.TestAttribute(), + new global::TUnit.Core.MethodDataSourceAttribute("DataSource"), + new global::TUnit.Core.TimeoutAttribute(5_000), + new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Failure), + new global::TUnit.Core.CategoryAttribute("Timeout Cancellation Token Tests") + ], + DataSources = global::System.Array.Empty(), + ClassDataSources = new global::TUnit.Core.IDataSourceAttribute[] + { + new global::TUnit.Core.MethodDataSourceAttribute("DataSource") + { + Factory = (dataGeneratorMetadata) => + { + async global::System.Collections.Generic.IAsyncEnumerable>> Factory() + { + var result = global::TUnit.TestProject.CancellationTokenTriggeredTests.DataSource(); + if (result is global::System.Collections.IEnumerable enumerable && !(result is string)) + { + foreach (var item in enumerable) + { + yield return () => global::System.Threading.Tasks.Task.FromResult(global::TUnit.Core.Helpers.DataSourceHelpers.ToObjectArray(item)); + } + } + else + { + yield return () => global::System.Threading.Tasks.Task.FromResult(global::TUnit.Core.Helpers.DataSourceHelpers.ToObjectArray(result)); + } + } + return Factory(); + } + }, + }, + PropertyDataSources = global::System.Array.Empty(), + PropertyInjections = global::System.Array.Empty(), + InheritanceDepth = 0, + FilePath = @"", + LineNumber = 106, + MethodMetadata = new global::TUnit.Core.MethodMetadata + { + Type = typeof(global::TUnit.TestProject.CancellationTokenTriggeredTests), + TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.CancellationTokenTriggeredTests)), + Name = "CancellationTokenIsTriggered", + GenericTypeCount = 0, + ReturnType = typeof(global::System.Threading.Tasks.Task), + ReturnTypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::System.Threading.Tasks.Task)), + Parameters = new global::TUnit.Core.ParameterMetadata[] + { + new global::TUnit.Core.ParameterMetadata(typeof(global::System.Threading.CancellationToken)) + { + Name = "cancellationToken", + TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::System.Threading.CancellationToken)), + IsNullable = false, + ReflectionInfo = typeof(global::TUnit.TestProject.CancellationTokenTriggeredTests).GetMethod("CancellationTokenIsTriggered", global::System.Reflection.BindingFlags.Public | global::System.Reflection.BindingFlags.NonPublic | global::System.Reflection.BindingFlags.Instance, null, new global::System.Type[] { typeof(global::System.Threading.CancellationToken) }, null)!.GetParameters()[0] + } + }, + Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.CancellationTokenTriggeredTests", static () => + { + var classMetadata = new global::TUnit.Core.ClassMetadata + { + Type = typeof(global::TUnit.TestProject.CancellationTokenTriggeredTests), + TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.CancellationTokenTriggeredTests)), + Name = "CancellationTokenTriggeredTests", + Namespace = "TUnit.TestProject", + Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }), + Parameters = new global::TUnit.Core.ParameterMetadata[] + { + new global::TUnit.Core.ParameterMetadata(typeof(int)) + { + Name = "value", + TypeInfo = new global::TUnit.Core.ConcreteType(typeof(int)), + IsNullable = false, + ReflectionInfo = typeof(global::TUnit.TestProject.CancellationTokenTriggeredTests).GetConstructor(new global::System.Type[] { typeof(int) })!.GetParameters()[0] + } + }, + Properties = global::System.Array.Empty(), + Parent = null + }; + foreach (var prop in classMetadata.Properties) + { + prop.ClassMetadata = classMetadata; + prop.ContainingTypeMetadata = classMetadata; + } + return classMetadata; + }) + }, + InstanceFactory = (typeArgs, args) => + { + return new global::TUnit.TestProject.CancellationTokenTriggeredTests(TUnit.Core.Helpers.CastHelper.Cast(args[0])); + }, + InvokeTypedTest = static (instance, args, cancellationToken) => + { + try + { + return new global::System.Threading.Tasks.ValueTask(instance.CancellationTokenIsTriggered(cancellationToken)); + } + catch (global::System.Exception ex) + { + return new global::System.Threading.Tasks.ValueTask(global::System.Threading.Tasks.Task.FromException(ex)); + } + }, + }; + metadata.UseRuntimeDataGeneration(testSessionId); + yield return metadata; + yield break; + } +} +internal static class TUnit_TestProject_CancellationTokenTriggeredTests_CancellationTokenIsTriggered__CancellationToken_ModuleInitializer +{ + [global::System.Runtime.CompilerServices.ModuleInitializer] + public static void Initialize() + { + global::TUnit.Core.SourceRegistrar.Register(typeof(global::TUnit.TestProject.CancellationTokenTriggeredTests), new TUnit_TestProject_CancellationTokenTriggeredTests_CancellationTokenIsTriggered__CancellationToken_TestSource()); + } +} diff --git a/TUnit.Core/Data/ThreadSafeDictionary.cs b/TUnit.Core/Data/ThreadSafeDictionary.cs index 6744f5f638..c9e5665c48 100644 --- a/TUnit.Core/Data/ThreadSafeDictionary.cs +++ b/TUnit.Core/Data/ThreadSafeDictionary.cs @@ -69,12 +69,30 @@ public class ThreadSafeDictionary /// This method is thread-safe. If multiple threads call this method simultaneously with the same key, /// the factory function will be executed only once, and all threads will receive the same instance. + /// This implementation uses a two-phase approach: TryGetValue for the fast path (when key exists), + /// and GetOrAdd with a pre-created Lazy for the slow path (new key). This prevents the factory + /// from being invoked multiple times during concurrent access. /// public TValue GetOrAdd(TKey key, Func func) { - var lazy = _innerDictionary.GetOrAdd(key, - k => new Lazy(() => func(k), LazyThreadSafetyMode.ExecutionAndPublication)); - return lazy.Value; + // Fast path: Check if key already exists (lock-free read) + if (_innerDictionary.TryGetValue(key, out var existingLazy)) + { + return existingLazy.Value; + } + + // Slow path: Key not found, need to create + // Create Lazy instance OUTSIDE of GetOrAdd to prevent factory from running during race + var newLazy = new Lazy(() => func(key), LazyThreadSafetyMode.ExecutionAndPublication); + + // Use GetOrAdd with VALUE (not factory) - atomic operation that either: + // 1. Adds our newLazy if key still doesn't exist + // 2. Returns existing Lazy if another thread just added one + var winningLazy = _innerDictionary.GetOrAdd(key, newLazy); + + // CRITICAL: Always return value from the Lazy that's actually in the dictionary + // This ensures only ONE factory execution even if multiple Lazy instances were created + return winningLazy.Value; } /// diff --git a/TUnit.Core/TUnit.Core.targets b/TUnit.Core/TUnit.Core.targets index f27fabe053..ae21f778a1 100644 --- a/TUnit.Core/TUnit.Core.targets +++ b/TUnit.Core/TUnit.Core.targets @@ -8,7 +8,7 @@ - <_TUnitPolyfillVersion>9.0.1 + <_TUnitPolyfillVersion>9.0.3 <_TUnitNeedsPolyfill Condition="'$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'netstandard2.1' or '$(TargetFrameworkIdentifier)' == '.NETFramework'">true diff --git a/TUnit.Engine/Building/TestBuilder.cs b/TUnit.Engine/Building/TestBuilder.cs index c6c3cb787a..fe88863cc4 100644 --- a/TUnit.Engine/Building/TestBuilder.cs +++ b/TUnit.Engine/Building/TestBuilder.cs @@ -284,7 +284,8 @@ public async Task> BuildTestsFromMetadataAsy TestMetadata = metadata.MethodMetadata, Events = new TestContextEvents(), StateBag = new ConcurrentDictionary(), - DataSourceAttribute = methodDataSource + DataSourceAttribute = methodDataSource, + InitializedAttributes = testBuilderContext.InitializedAttributes // Preserve attributes from parent context }; classData = DataUnwrapper.Unwrap(await classDataFactory() ?? []); diff --git a/TUnit.Engine/TestExecutor.cs b/TUnit.Engine/TestExecutor.cs index bc1ab31272..dee49a9d75 100644 --- a/TUnit.Engine/TestExecutor.cs +++ b/TUnit.Engine/TestExecutor.cs @@ -160,6 +160,9 @@ private static async ValueTask ExecuteTestAsync(AbstractExecutableTest executabl // Set the test start time when we actually begin executing the test executableTest.Context.TestStart = DateTimeOffset.UtcNow; + // Set the cancellation token on the context so source-generated tests can access it + executableTest.Context.CancellationToken = cancellationToken; + if (executableTest.Context.InternalDiscoveredTest?.TestExecutor is { } testExecutor) { await testExecutor.ExecuteTest(executableTest.Context, diff --git a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj index 466f212a0f..698f64e438 100644 --- a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj index 3b4dea1e34..6ba222eecf 100644 --- a/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.AspNet/TestProject/TestProject.csproj @@ -9,7 +9,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj index 2d85bf717d..8acb6f52e2 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Starter/ExampleNamespace.TestProject/ExampleNamespace.TestProject.csproj @@ -11,7 +11,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj index 87faa21d22..87383344ce 100644 --- a/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj +++ b/TUnit.Templates/content/TUnit.Aspire.Test/ExampleNamespace.csproj @@ -10,7 +10,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj index adafbe6af9..68aace76d7 100644 --- a/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj +++ b/TUnit.Templates/content/TUnit.FSharp/TestProject.fsproj @@ -10,8 +10,8 @@ - - + + diff --git a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj index 662edbd9f1..8416c07b8c 100644 --- a/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj +++ b/TUnit.Templates/content/TUnit.Playwright/TestProject.csproj @@ -8,7 +8,7 @@ - + diff --git a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj index 6242ab0689..6fab6c832c 100644 --- a/TUnit.Templates/content/TUnit.VB/TestProject.vbproj +++ b/TUnit.Templates/content/TUnit.VB/TestProject.vbproj @@ -8,6 +8,6 @@ - + diff --git a/TUnit.Templates/content/TUnit/TestProject.csproj b/TUnit.Templates/content/TUnit/TestProject.csproj index f0173684fd..6390ab9ec7 100644 --- a/TUnit.Templates/content/TUnit/TestProject.csproj +++ b/TUnit.Templates/content/TUnit/TestProject.csproj @@ -8,7 +8,7 @@ - + \ No newline at end of file diff --git a/TUnit.TestProject/TimeoutCancellationTokenTests.cs b/TUnit.TestProject/TimeoutCancellationTokenTests.cs index 3ed528ca58..d98717f7b8 100644 --- a/TUnit.TestProject/TimeoutCancellationTokenTests.cs +++ b/TUnit.TestProject/TimeoutCancellationTokenTests.cs @@ -75,3 +75,55 @@ public static IEnumerable DataSource() public class FiveSecondTimeout() : TimeoutAttribute(5_000); } + +// Positive test: Timeout does NOT fire for quick tests with data sources +[MethodDataSource(nameof(DataSource))] +[Timeout(30_000)] // Long timeout (30 seconds) +[EngineTest(ExpectedResult.Pass)] +[Category("Timeout Cancellation Token Tests")] +public class TimeoutDoesNotFireTests(int value) +{ + [Test] + public async Task QuickTestDoesNotTimeout(CancellationToken cancellationToken) + { + await Assert.That(value).IsEqualTo(1); + await Task.Delay(TimeSpan.FromMilliseconds(100), cancellationToken); // Short delay + } + + public static IEnumerable DataSource() + { + yield return 1; + } +} + +// Test to verify cancellation token is actually triggered when timeout fires +[MethodDataSource(nameof(DataSource))] +[Timeout(5_000)] +[EngineTest(ExpectedResult.Failure)] +[Category("Timeout Cancellation Token Tests")] +public class CancellationTokenTriggeredTests(int value) +{ + [Test] + public async Task CancellationTokenIsTriggered(CancellationToken cancellationToken) + { + var fired = false; + cancellationToken.Register(() => fired = true); + + try + { + await Task.Delay(TimeSpan.FromMinutes(1), cancellationToken); + } + catch (OperationCanceledException) + { + // Expected - timeout should trigger cancellation + } + + // Verify token was cancelled + await Assert.That(fired).IsTrue(); + } + + public static IEnumerable DataSource() + { + yield return 1; + } +} diff --git a/docs/docs/advanced/extension-points.md b/docs/docs/advanced/extension-points.md index 8ad86faf7d..b4c9e0a1d3 100644 --- a/docs/docs/advanced/extension-points.md +++ b/docs/docs/advanced/extension-points.md @@ -262,9 +262,9 @@ public class TestReporterAttribute : Attribute, ITestStartEventReceiver, ITestEn { await ReportingService.ReportTestCompleted( context.GetDisplayName(), - context.Result?.State, - context.Result?.Duration, - context.Result?.Exception?.Message + context.Execution.Result?.State, + context.Execution.Result?.Duration, + context.Execution.Result?.Exception?.Message ); } } @@ -289,7 +289,7 @@ public class CustomEventReceiverAttribute : Attribute, ITestStartEventReceiver, public ValueTask OnTestEnd(TestContext context) { - Console.WriteLine($"Test ended: {context.GetDisplayName()} - {context.Result?.State}"); + Console.WriteLine($"Test ended: {context.GetDisplayName()} - {context.Execution.Result?.State}"); return default; } } diff --git a/docs/docs/advanced/performance-best-practices.md b/docs/docs/advanced/performance-best-practices.md index ff4645ae88..65587e29db 100644 --- a/docs/docs/advanced/performance-best-practices.md +++ b/docs/docs/advanced/performance-best-practices.md @@ -533,16 +533,16 @@ public class PerformanceAwareExecutor : ITestExecutor public static void RecordTestMetrics() { var context = TestContext.Current; - if (context?.Result != null) + if (context?.Execution.Result != null) { TelemetryClient.TrackMetric( "TestDuration", - context.Result.Duration.TotalMilliseconds, + context.Execution.Result.Duration.TotalMilliseconds, new Dictionary { ["TestName"] = context.Metadata.TestName, ["TestClass"] = context.Metadata.TestDetails.TestClass, - ["Result"] = context.Result.State.ToString() + ["Result"] = context.Execution.Result.State.ToString() }); } } diff --git a/docs/docs/advanced/test-variants.md b/docs/docs/advanced/test-variants.md index 6e5d662808..9bb698c504 100644 --- a/docs/docs/advanced/test-variants.md +++ b/docs/docs/advanced/test-variants.md @@ -87,7 +87,7 @@ public class ShrinkOnFailureAttribute : Attribute, ITestEndEventReceiver public async ValueTask OnTestEnd(TestContext testContext) { // Only shrink if test failed and it's not already a shrink attempt - if (testContext.Result?.Status != TestStatus.Failed) + if (testContext.Execution.Result?.State != TestState.Failed) return; if (testContext.Relationship == TestRelationship.Derived) diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index 311679bb5a..548e0174f2 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -7,7 +7,7 @@ sidebar_position: 2 # AsyncTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-12** from the latest CI run. +This benchmark was automatically generated on **2025-11-15** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.0 | 558.9 ms | 557.2 ms | 4.11 ms | -| NUnit | 4.4.0 | 650.2 ms | 649.0 ms | 9.00 ms | -| MSTest | 4.0.2 | 615.0 ms | 614.8 ms | 5.89 ms | -| xUnit3 | 3.2.0 | 702.4 ms | 702.4 ms | 7.09 ms | -| **TUnit (AOT)** | 1.1.0 | 123.8 ms | 123.9 ms | 0.46 ms | +| **TUnit** | 1.1.10 | 546.4 ms | 546.3 ms | 3.82 ms | +| NUnit | 4.4.0 | 647.1 ms | 642.5 ms | 9.04 ms | +| MSTest | 4.0.2 | 616.6 ms | 617.2 ms | 7.52 ms | +| xUnit3 | 3.2.0 | 693.2 ms | 692.8 ms | 5.17 ms | +| **TUnit (AOT)** | 1.1.10 | 123.7 ms | 123.7 ms | 0.39 ms | ## 📈 Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 843 - bar [558.9, 650.2, 615, 702.4, 123.8] + y-axis "Time (ms)" 0 --> 832 + bar [546.4, 647.1, 616.6, 693.2, 123.7] ``` ## 🎯 Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-12T21:13:20.516Z* +*Last generated: 2025-11-15T00:27:09.502Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index bb58397fad..8519936150 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -7,7 +7,7 @@ sidebar_position: 8 # Build Performance Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-12** from the latest CI run. +This benchmark was automatically generated on **2025-11-15** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.0 | 2.033 s | 2.032 s | 0.0296 s | -| Build_NUnit | 4.4.0 | 1.622 s | 1.615 s | 0.0216 s | -| Build_MSTest | 4.0.2 | 1.705 s | 1.701 s | 0.0231 s | -| Build_xUnit3 | 3.2.0 | 1.611 s | 1.613 s | 0.0248 s | +| **TUnit** | 1.1.10 | 2.104 s | 2.097 s | 0.0487 s | +| Build_NUnit | 4.4.0 | 1.658 s | 1.652 s | 0.0272 s | +| Build_MSTest | 4.0.2 | 1.751 s | 1.748 s | 0.0404 s | +| Build_xUnit3 | 3.2.0 | 1.643 s | 1.644 s | 0.0204 s | ## 📈 Visual Comparison @@ -60,7 +60,7 @@ xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] y-axis "Time (s)" 0 --> 3 - bar [2.033, 1.622, 1.705, 1.611] + bar [2.104, 1.658, 1.751, 1.643] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-12T21:13:20.518Z* +*Last generated: 2025-11-15T00:27:09.505Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index 539d7eaa2f..6532bf2b9a 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -7,7 +7,7 @@ sidebar_position: 3 # DataDrivenTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-12** from the latest CI run. +This benchmark was automatically generated on **2025-11-15** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.0 | 510.37 ms | 511.05 ms | 7.125 ms | -| NUnit | 4.4.0 | 583.06 ms | 583.47 ms | 17.581 ms | -| MSTest | 4.0.2 | 594.23 ms | 591.72 ms | 18.226 ms | -| xUnit3 | 3.2.0 | 604.34 ms | 605.85 ms | 7.447 ms | -| **TUnit (AOT)** | 1.1.0 | 25.55 ms | 25.62 ms | 0.241 ms | +| **TUnit** | 1.1.10 | 493.28 ms | 491.72 ms | 5.477 ms | +| NUnit | 4.4.0 | 527.71 ms | 528.80 ms | 6.631 ms | +| MSTest | 4.0.2 | 499.80 ms | 496.67 ms | 18.060 ms | +| xUnit3 | 3.2.0 | 571.43 ms | 570.30 ms | 9.897 ms | +| **TUnit (AOT)** | 1.1.10 | 24.09 ms | 24.07 ms | 0.146 ms | ## 📈 Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 726 - bar [510.37, 583.06, 594.23, 604.34, 25.55] + y-axis "Time (ms)" 0 --> 686 + bar [493.28, 527.71, 499.8, 571.43, 24.09] ``` ## 🎯 Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-12T21:13:20.516Z* +*Last generated: 2025-11-15T00:27:09.503Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index 6f2c8a816f..cc36aaf4c1 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -7,7 +7,7 @@ sidebar_position: 4 # MassiveParallelTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-12** from the latest CI run. +This benchmark was automatically generated on **2025-11-15** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.0 | 625.5 ms | 626.8 ms | 7.61 ms | -| NUnit | 4.4.0 | 1,213.0 ms | 1,211.9 ms | 12.39 ms | -| MSTest | 4.0.2 | 3,010.8 ms | 3,010.4 ms | 12.63 ms | -| xUnit3 | 3.2.0 | 3,099.6 ms | 3,101.6 ms | 15.59 ms | -| **TUnit (AOT)** | 1.1.0 | 132.3 ms | 132.3 ms | 0.36 ms | +| **TUnit** | 1.1.10 | 605.7 ms | 603.9 ms | 6.52 ms | +| NUnit | 4.4.0 | 1,177.6 ms | 1,177.8 ms | 6.41 ms | +| MSTest | 4.0.2 | 2,951.3 ms | 2,951.9 ms | 6.75 ms | +| xUnit3 | 3.2.0 | 3,050.0 ms | 3,050.0 ms | 7.02 ms | +| **TUnit (AOT)** | 1.1.10 | 130.9 ms | 130.7 ms | 0.38 ms | ## 📈 Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3720 - bar [625.5, 1213, 3010.8, 3099.6, 132.3] + y-axis "Time (ms)" 0 --> 3660 + bar [605.7, 1177.6, 2951.3, 3050, 130.9] ``` ## 🎯 Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-12T21:13:20.517Z* +*Last generated: 2025-11-15T00:27:09.503Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index d683a99d99..dd935dbdbb 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -7,7 +7,7 @@ sidebar_position: 5 # MatrixTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-12** from the latest CI run. +This benchmark was automatically generated on **2025-11-15** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.0 | 557.69 ms | 556.60 ms | 4.221 ms | -| NUnit | 4.4.0 | 1,539.35 ms | 1,541.87 ms | 11.514 ms | -| MSTest | 4.0.2 | 1,496.25 ms | 1,496.55 ms | 5.576 ms | -| xUnit3 | 3.2.0 | 1,586.79 ms | 1,586.67 ms | 7.339 ms | -| **TUnit (AOT)** | 1.1.0 | 79.15 ms | 79.11 ms | 0.381 ms | +| **TUnit** | 1.1.10 | 563.80 ms | 562.94 ms | 7.113 ms | +| NUnit | 4.4.0 | 1,538.27 ms | 1,538.35 ms | 11.633 ms | +| MSTest | 4.0.2 | 1,497.90 ms | 1,490.67 ms | 14.759 ms | +| xUnit3 | 3.2.0 | 1,579.28 ms | 1,578.51 ms | 6.673 ms | +| **TUnit (AOT)** | 1.1.10 | 78.71 ms | 78.69 ms | 0.421 ms | ## 📈 Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1905 - bar [557.69, 1539.35, 1496.25, 1586.79, 79.15] + y-axis "Time (ms)" 0 --> 1896 + bar [563.8, 1538.27, 1497.9, 1579.28, 78.71] ``` ## 🎯 Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-12T21:13:20.517Z* +*Last generated: 2025-11-15T00:27:09.503Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index 3de683a15b..5fb9e7d4bb 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -7,7 +7,7 @@ sidebar_position: 6 # ScaleTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-12** from the latest CI run. +This benchmark was automatically generated on **2025-11-15** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.0 | 514.19 ms | 512.52 ms | 6.486 ms | -| NUnit | 4.4.0 | 552.95 ms | 553.62 ms | 7.860 ms | -| MSTest | 4.0.2 | 474.67 ms | 475.13 ms | 8.594 ms | -| xUnit3 | 3.2.0 | 562.71 ms | 561.53 ms | 6.028 ms | -| **TUnit (AOT)** | 1.1.0 | 44.36 ms | 45.13 ms | 3.857 ms | +| **TUnit** | 1.1.10 | 484.97 ms | 485.22 ms | 3.999 ms | +| NUnit | 4.4.0 | 676.90 ms | 675.21 ms | 10.367 ms | +| MSTest | 4.0.2 | 659.56 ms | 659.58 ms | 4.624 ms | +| xUnit3 | 3.2.0 | 676.88 ms | 673.98 ms | 10.260 ms | +| **TUnit (AOT)** | 1.1.10 | 48.50 ms | 48.84 ms | 3.553 ms | ## 📈 Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 676 - bar [514.19, 552.95, 474.67, 562.71, 44.36] + y-axis "Time (ms)" 0 --> 813 + bar [484.97, 676.9, 659.56, 676.88, 48.5] ``` ## 🎯 Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-12T21:13:20.517Z* +*Last generated: 2025-11-15T00:27:09.504Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index 4452a73eb9..b91e232393 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -7,7 +7,7 @@ sidebar_position: 7 # SetupTeardownTests Benchmark :::info Last Updated -This benchmark was automatically generated on **2025-11-12** from the latest CI run. +This benchmark was automatically generated on **2025-11-15** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.1.0 | 583.4 ms | 583.7 ms | 5.16 ms | -| NUnit | 4.4.0 | 1,198.4 ms | 1,195.0 ms | 15.35 ms | -| MSTest | 4.0.2 | 1,162.5 ms | 1,161.5 ms | 9.11 ms | -| xUnit3 | 3.2.0 | 1,243.3 ms | 1,241.9 ms | 9.80 ms | -| **TUnit (AOT)** | 1.1.0 | NA | NA | NA | +| **TUnit** | 1.1.10 | 540.2 ms | 540.7 ms | 5.84 ms | +| NUnit | 4.4.0 | 1,160.3 ms | 1,156.8 ms | 10.70 ms | +| MSTest | 4.0.2 | 1,133.4 ms | 1,131.4 ms | 5.85 ms | +| xUnit3 | 3.2.0 | 1,219.9 ms | 1,218.4 ms | 19.12 ms | +| **TUnit (AOT)** | 1.1.10 | NA | NA | NA | ## 📈 Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2025-11-12** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1492 - bar [583.4, 1198.4, 1162.5, 1243.3, 0] + y-axis "Time (ms)" 0 --> 1464 + bar [540.2, 1160.3, 1133.4, 1219.9, 0] ``` ## 🎯 Key Insights @@ -72,4 +72,4 @@ This benchmark compares TUnit's performance against NUnit, MSTest, xUnit3 using View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2025-11-12T21:13:20.517Z* +*Last generated: 2025-11-15T00:27:09.504Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index c320ea6144..220c099ad9 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2025-11-12** from the latest CI run. +These benchmarks were automatically generated on **2025-11-15** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.100 ::: @@ -37,7 +37,7 @@ These benchmarks compare TUnit against the most popular .NET testing frameworks: | Framework | Version Tested | |-----------|----------------| -| **TUnit** | 1.1.0 | +| **TUnit** | 1.1.10 | | **xUnit v3** | 3.2.0 | | **NUnit** | 4.4.0 | | **MSTest** | 4.0.2 | @@ -56,10 +56,10 @@ The benchmarks measure real-world testing patterns: ### Environment - **OS**: Ubuntu Latest (GitHub Actions) -- **Runtime**: .NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3 +- **Runtime**: .NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4 - **SDK**: .NET SDK 10.0.100 - **Hardware**: GitHub Actions Standard Runner (Ubuntu) -- **Tool**: BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat) +- **Tool**: BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat) ### Why These Numbers Matter @@ -80,4 +80,4 @@ These benchmarks run automatically daily via [GitHub Actions](https://github.com Each benchmark runs multiple iterations with statistical analysis to ensure accuracy. Results may vary based on hardware and test characteristics. ::: -*Last generated: 2025-11-12T21:13:20.518Z* +*Last generated: 2025-11-15T00:27:09.505Z* diff --git a/docs/docs/test-lifecycle/cleanup.md b/docs/docs/test-lifecycle/cleanup.md index cb6366826f..6c66d55408 100644 --- a/docs/docs/test-lifecycle/cleanup.md +++ b/docs/docs/test-lifecycle/cleanup.md @@ -37,7 +37,7 @@ Hooks can optionally accept parameters for accessing context information and can public async Task Cleanup(TestContext context, CancellationToken cancellationToken) { // Access test results via context - if (context.Result?.Status == TestStatus.Failed) + if (context.Execution.Result?.State == TestState.Failed) { await CaptureScreenshot(cancellationToken); } diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index f0c2840116..e24f1a0e7e 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-11-12T21:13:20.516Z", + "timestamp": "2025-11-15T00:27:09.502Z", "category": "AsyncTests", "environment": { - "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "TUnit", - "Version": "1.1.0", - "Mean": "558.9 ms", - "Error": "4.39 ms", - "StdDev": "4.11 ms", - "Median": "557.2 ms" + "Version": "1.1.10", + "Mean": "546.4 ms", + "Error": "4.30 ms", + "StdDev": "3.82 ms", + "Median": "546.3 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "650.2 ms", - "Error": "10.15 ms", - "StdDev": "9.00 ms", - "Median": "649.0 ms" + "Mean": "647.1 ms", + "Error": "9.66 ms", + "StdDev": "9.04 ms", + "Median": "642.5 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "615.0 ms", - "Error": "6.64 ms", - "StdDev": "5.89 ms", - "Median": "614.8 ms" + "Mean": "616.6 ms", + "Error": "8.04 ms", + "StdDev": "7.52 ms", + "Median": "617.2 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "702.4 ms", - "Error": "8.00 ms", - "StdDev": "7.09 ms", - "Median": "702.4 ms" + "Mean": "693.2 ms", + "Error": "5.53 ms", + "StdDev": "5.17 ms", + "Median": "692.8 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.0", - "Mean": "123.8 ms", - "Error": "0.49 ms", - "StdDev": "0.46 ms", - "Median": "123.9 ms" + "Version": "1.1.10", + "Mean": "123.7 ms", + "Error": "0.41 ms", + "StdDev": "0.39 ms", + "Median": "123.7 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index f64bd7f717..078351a707 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,43 +1,43 @@ { - "timestamp": "2025-11-12T21:13:20.518Z", + "timestamp": "2025-11-15T00:27:09.505Z", "category": "BuildTime", "environment": { - "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "Build_TUnit", - "Version": "1.1.0", - "Mean": "2.033 s", - "Error": "0.0333 s", - "StdDev": "0.0296 s", - "Median": "2.032 s" + "Version": "1.1.10", + "Mean": "2.104 s", + "Error": "0.0409 s", + "StdDev": "0.0487 s", + "Median": "2.097 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.622 s", - "Error": "0.0231 s", - "StdDev": "0.0216 s", - "Median": "1.615 s" + "Mean": "1.658 s", + "Error": "0.0277 s", + "StdDev": "0.0272 s", + "Median": "1.652 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.705 s", - "Error": "0.0247 s", - "StdDev": "0.0231 s", - "Median": "1.701 s" + "Mean": "1.751 s", + "Error": "0.0339 s", + "StdDev": "0.0404 s", + "Median": "1.748 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.611 s", - "Error": "0.0265 s", - "StdDev": "0.0248 s", - "Median": "1.613 s" + "Mean": "1.643 s", + "Error": "0.0230 s", + "StdDev": "0.0204 s", + "Median": "1.644 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index 03fc62272a..0bcbeb8851 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-11-12T21:13:20.517Z", + "timestamp": "2025-11-15T00:27:09.503Z", "category": "DataDrivenTests", "environment": { - "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "TUnit", - "Version": "1.1.0", - "Mean": "510.37 ms", - "Error": "7.617 ms", - "StdDev": "7.125 ms", - "Median": "511.05 ms" + "Version": "1.1.10", + "Mean": "493.28 ms", + "Error": "5.855 ms", + "StdDev": "5.477 ms", + "Median": "491.72 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "583.06 ms", - "Error": "11.292 ms", - "StdDev": "17.581 ms", - "Median": "583.47 ms" + "Mean": "527.71 ms", + "Error": "7.480 ms", + "StdDev": "6.631 ms", + "Median": "528.80 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "594.23 ms", - "Error": "11.707 ms", - "StdDev": "18.226 ms", - "Median": "591.72 ms" + "Mean": "499.80 ms", + "Error": "9.877 ms", + "StdDev": "18.060 ms", + "Median": "496.67 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "604.34 ms", - "Error": "8.401 ms", - "StdDev": "7.447 ms", - "Median": "605.85 ms" + "Mean": "571.43 ms", + "Error": "11.164 ms", + "StdDev": "9.897 ms", + "Median": "570.30 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.0", - "Mean": "25.55 ms", - "Error": "0.258 ms", - "StdDev": "0.241 ms", - "Median": "25.62 ms" + "Version": "1.1.10", + "Mean": "24.09 ms", + "Error": "0.165 ms", + "StdDev": "0.146 ms", + "Median": "24.07 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index c60cb4d2d9..3bcf02d672 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-11-12T21:13:20.517Z", + "timestamp": "2025-11-15T00:27:09.503Z", "category": "MassiveParallelTests", "environment": { - "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "TUnit", - "Version": "1.1.0", - "Mean": "625.5 ms", - "Error": "8.58 ms", - "StdDev": "7.61 ms", - "Median": "626.8 ms" + "Version": "1.1.10", + "Mean": "605.7 ms", + "Error": "6.97 ms", + "StdDev": "6.52 ms", + "Median": "603.9 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,213.0 ms", - "Error": "13.24 ms", - "StdDev": "12.39 ms", - "Median": "1,211.9 ms" + "Mean": "1,177.6 ms", + "Error": "6.85 ms", + "StdDev": "6.41 ms", + "Median": "1,177.8 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "3,010.8 ms", - "Error": "13.51 ms", - "StdDev": "12.63 ms", - "Median": "3,010.4 ms" + "Mean": "2,951.3 ms", + "Error": "8.08 ms", + "StdDev": "6.75 ms", + "Median": "2,951.9 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,099.6 ms", - "Error": "17.58 ms", - "StdDev": "15.59 ms", - "Median": "3,101.6 ms" + "Mean": "3,050.0 ms", + "Error": "7.92 ms", + "StdDev": "7.02 ms", + "Median": "3,050.0 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.0", - "Mean": "132.3 ms", - "Error": "0.47 ms", - "StdDev": "0.36 ms", - "Median": "132.3 ms" + "Version": "1.1.10", + "Mean": "130.9 ms", + "Error": "0.43 ms", + "StdDev": "0.38 ms", + "Median": "130.7 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index fd462c3e66..6e19609d0e 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-11-12T21:13:20.517Z", + "timestamp": "2025-11-15T00:27:09.504Z", "category": "MatrixTests", "environment": { - "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "TUnit", - "Version": "1.1.0", - "Mean": "557.69 ms", - "Error": "4.512 ms", - "StdDev": "4.221 ms", - "Median": "556.60 ms" + "Version": "1.1.10", + "Mean": "563.80 ms", + "Error": "8.024 ms", + "StdDev": "7.113 ms", + "Median": "562.94 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,539.35 ms", - "Error": "12.309 ms", - "StdDev": "11.514 ms", - "Median": "1,541.87 ms" + "Mean": "1,538.27 ms", + "Error": "12.437 ms", + "StdDev": "11.633 ms", + "Median": "1,538.35 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,496.25 ms", - "Error": "7.142 ms", - "StdDev": "5.576 ms", - "Median": "1,496.55 ms" + "Mean": "1,497.90 ms", + "Error": "15.778 ms", + "StdDev": "14.759 ms", + "Median": "1,490.67 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,586.79 ms", - "Error": "7.846 ms", - "StdDev": "7.339 ms", - "Median": "1,586.67 ms" + "Mean": "1,579.28 ms", + "Error": "7.991 ms", + "StdDev": "6.673 ms", + "Median": "1,578.51 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.0", - "Mean": "79.15 ms", - "Error": "0.408 ms", - "StdDev": "0.381 ms", - "Median": "79.11 ms" + "Version": "1.1.10", + "Mean": "78.71 ms", + "Error": "0.450 ms", + "StdDev": "0.421 ms", + "Median": "78.69 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index 47799a37bb..a9d04333a3 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,51 +1,51 @@ { - "timestamp": "2025-11-12T21:13:20.517Z", + "timestamp": "2025-11-15T00:27:09.504Z", "category": "ScaleTests", "environment": { - "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "TUnit", - "Version": "1.1.0", - "Mean": "514.19 ms", - "Error": "6.934 ms", - "StdDev": "6.486 ms", - "Median": "512.52 ms" + "Version": "1.1.10", + "Mean": "484.97 ms", + "Error": "4.275 ms", + "StdDev": "3.999 ms", + "Median": "485.22 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "552.95 ms", - "Error": "8.867 ms", - "StdDev": "7.860 ms", - "Median": "553.62 ms" + "Mean": "676.90 ms", + "Error": "11.083 ms", + "StdDev": "10.367 ms", + "Median": "675.21 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "474.67 ms", - "Error": "9.187 ms", - "StdDev": "8.594 ms", - "Median": "475.13 ms" + "Mean": "659.56 ms", + "Error": "5.537 ms", + "StdDev": "4.624 ms", + "Median": "659.58 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "562.71 ms", - "Error": "6.445 ms", - "StdDev": "6.028 ms", - "Median": "561.53 ms" + "Mean": "676.88 ms", + "Error": "10.968 ms", + "StdDev": "10.260 ms", + "Median": "673.98 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.0", - "Mean": "44.36 ms", - "Error": "1.308 ms", - "StdDev": "3.857 ms", - "Median": "45.13 ms" + "Version": "1.1.10", + "Mean": "48.50 ms", + "Error": "1.211 ms", + "StdDev": "3.553 ms", + "Median": "48.84 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index b432996a90..51c9a4f9cb 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,47 +1,47 @@ { - "timestamp": "2025-11-12T21:13:20.518Z", + "timestamp": "2025-11-15T00:27:09.504Z", "category": "SetupTeardownTests", "environment": { - "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" }, "results": [ { "Method": "TUnit", - "Version": "1.1.0", - "Mean": "583.4 ms", - "Error": "6.18 ms", - "StdDev": "5.16 ms", - "Median": "583.7 ms" + "Version": "1.1.10", + "Mean": "540.2 ms", + "Error": "6.24 ms", + "StdDev": "5.84 ms", + "Median": "540.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,198.4 ms", - "Error": "16.41 ms", - "StdDev": "15.35 ms", - "Median": "1,195.0 ms" + "Mean": "1,160.3 ms", + "Error": "12.08 ms", + "StdDev": "10.70 ms", + "Median": "1,156.8 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,162.5 ms", - "Error": "10.28 ms", - "StdDev": "9.11 ms", - "Median": "1,161.5 ms" + "Mean": "1,133.4 ms", + "Error": "7.01 ms", + "StdDev": "5.85 ms", + "Median": "1,131.4 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,243.3 ms", - "Error": "10.48 ms", - "StdDev": "9.80 ms", - "Median": "1,241.9 ms" + "Mean": "1,219.9 ms", + "Error": "20.44 ms", + "StdDev": "19.12 ms", + "Median": "1,218.4 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.0", + "Version": "1.1.10", "Mean": "NA", "Error": "NA", "StdDev": "NA", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 10ef4375d6..736dfcee0b 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -30,5 +30,17 @@ { "date": "2025-11-12", "environment": "Ubuntu" + }, + { + "date": "2025-11-13", + "environment": "Ubuntu" + }, + { + "date": "2025-11-14", + "environment": "Ubuntu" + }, + { + "date": "2025-11-15", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index 8b4f513b5e..a7bd0c8dea 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,257 +1,257 @@ { - "timestamp": "2025-11-12T21:13:20.518Z", + "timestamp": "2025-11-15T00:27:09.505Z", "environment": { - "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.6, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", + "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.7, Linux Ubuntu 24.04.3 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.100", - "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3" + "host": ".NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v4" }, "categories": { "AsyncTests": [ { "Method": "TUnit", - "Version": "1.1.0", - "Mean": "558.9 ms", - "Error": "4.39 ms", - "StdDev": "4.11 ms", - "Median": "557.2 ms" + "Version": "1.1.10", + "Mean": "546.4 ms", + "Error": "4.30 ms", + "StdDev": "3.82 ms", + "Median": "546.3 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "650.2 ms", - "Error": "10.15 ms", - "StdDev": "9.00 ms", - "Median": "649.0 ms" + "Mean": "647.1 ms", + "Error": "9.66 ms", + "StdDev": "9.04 ms", + "Median": "642.5 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "615.0 ms", - "Error": "6.64 ms", - "StdDev": "5.89 ms", - "Median": "614.8 ms" + "Mean": "616.6 ms", + "Error": "8.04 ms", + "StdDev": "7.52 ms", + "Median": "617.2 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "702.4 ms", - "Error": "8.00 ms", - "StdDev": "7.09 ms", - "Median": "702.4 ms" + "Mean": "693.2 ms", + "Error": "5.53 ms", + "StdDev": "5.17 ms", + "Median": "692.8 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.0", - "Mean": "123.8 ms", - "Error": "0.49 ms", - "StdDev": "0.46 ms", - "Median": "123.9 ms" + "Version": "1.1.10", + "Mean": "123.7 ms", + "Error": "0.41 ms", + "StdDev": "0.39 ms", + "Median": "123.7 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", - "Version": "1.1.0", - "Mean": "510.37 ms", - "Error": "7.617 ms", - "StdDev": "7.125 ms", - "Median": "511.05 ms" + "Version": "1.1.10", + "Mean": "493.28 ms", + "Error": "5.855 ms", + "StdDev": "5.477 ms", + "Median": "491.72 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "583.06 ms", - "Error": "11.292 ms", - "StdDev": "17.581 ms", - "Median": "583.47 ms" + "Mean": "527.71 ms", + "Error": "7.480 ms", + "StdDev": "6.631 ms", + "Median": "528.80 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "594.23 ms", - "Error": "11.707 ms", - "StdDev": "18.226 ms", - "Median": "591.72 ms" + "Mean": "499.80 ms", + "Error": "9.877 ms", + "StdDev": "18.060 ms", + "Median": "496.67 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "604.34 ms", - "Error": "8.401 ms", - "StdDev": "7.447 ms", - "Median": "605.85 ms" + "Mean": "571.43 ms", + "Error": "11.164 ms", + "StdDev": "9.897 ms", + "Median": "570.30 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.0", - "Mean": "25.55 ms", - "Error": "0.258 ms", - "StdDev": "0.241 ms", - "Median": "25.62 ms" + "Version": "1.1.10", + "Mean": "24.09 ms", + "Error": "0.165 ms", + "StdDev": "0.146 ms", + "Median": "24.07 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", - "Version": "1.1.0", - "Mean": "625.5 ms", - "Error": "8.58 ms", - "StdDev": "7.61 ms", - "Median": "626.8 ms" + "Version": "1.1.10", + "Mean": "605.7 ms", + "Error": "6.97 ms", + "StdDev": "6.52 ms", + "Median": "603.9 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,213.0 ms", - "Error": "13.24 ms", - "StdDev": "12.39 ms", - "Median": "1,211.9 ms" + "Mean": "1,177.6 ms", + "Error": "6.85 ms", + "StdDev": "6.41 ms", + "Median": "1,177.8 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "3,010.8 ms", - "Error": "13.51 ms", - "StdDev": "12.63 ms", - "Median": "3,010.4 ms" + "Mean": "2,951.3 ms", + "Error": "8.08 ms", + "StdDev": "6.75 ms", + "Median": "2,951.9 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "3,099.6 ms", - "Error": "17.58 ms", - "StdDev": "15.59 ms", - "Median": "3,101.6 ms" + "Mean": "3,050.0 ms", + "Error": "7.92 ms", + "StdDev": "7.02 ms", + "Median": "3,050.0 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.0", - "Mean": "132.3 ms", - "Error": "0.47 ms", - "StdDev": "0.36 ms", - "Median": "132.3 ms" + "Version": "1.1.10", + "Mean": "130.9 ms", + "Error": "0.43 ms", + "StdDev": "0.38 ms", + "Median": "130.7 ms" } ], "MatrixTests": [ { "Method": "TUnit", - "Version": "1.1.0", - "Mean": "557.69 ms", - "Error": "4.512 ms", - "StdDev": "4.221 ms", - "Median": "556.60 ms" + "Version": "1.1.10", + "Mean": "563.80 ms", + "Error": "8.024 ms", + "StdDev": "7.113 ms", + "Median": "562.94 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,539.35 ms", - "Error": "12.309 ms", - "StdDev": "11.514 ms", - "Median": "1,541.87 ms" + "Mean": "1,538.27 ms", + "Error": "12.437 ms", + "StdDev": "11.633 ms", + "Median": "1,538.35 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,496.25 ms", - "Error": "7.142 ms", - "StdDev": "5.576 ms", - "Median": "1,496.55 ms" + "Mean": "1,497.90 ms", + "Error": "15.778 ms", + "StdDev": "14.759 ms", + "Median": "1,490.67 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,586.79 ms", - "Error": "7.846 ms", - "StdDev": "7.339 ms", - "Median": "1,586.67 ms" + "Mean": "1,579.28 ms", + "Error": "7.991 ms", + "StdDev": "6.673 ms", + "Median": "1,578.51 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.0", - "Mean": "79.15 ms", - "Error": "0.408 ms", - "StdDev": "0.381 ms", - "Median": "79.11 ms" + "Version": "1.1.10", + "Mean": "78.71 ms", + "Error": "0.450 ms", + "StdDev": "0.421 ms", + "Median": "78.69 ms" } ], "ScaleTests": [ { "Method": "TUnit", - "Version": "1.1.0", - "Mean": "514.19 ms", - "Error": "6.934 ms", - "StdDev": "6.486 ms", - "Median": "512.52 ms" + "Version": "1.1.10", + "Mean": "484.97 ms", + "Error": "4.275 ms", + "StdDev": "3.999 ms", + "Median": "485.22 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "552.95 ms", - "Error": "8.867 ms", - "StdDev": "7.860 ms", - "Median": "553.62 ms" + "Mean": "676.90 ms", + "Error": "11.083 ms", + "StdDev": "10.367 ms", + "Median": "675.21 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "474.67 ms", - "Error": "9.187 ms", - "StdDev": "8.594 ms", - "Median": "475.13 ms" + "Mean": "659.56 ms", + "Error": "5.537 ms", + "StdDev": "4.624 ms", + "Median": "659.58 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "562.71 ms", - "Error": "6.445 ms", - "StdDev": "6.028 ms", - "Median": "561.53 ms" + "Mean": "676.88 ms", + "Error": "10.968 ms", + "StdDev": "10.260 ms", + "Median": "673.98 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.0", - "Mean": "44.36 ms", - "Error": "1.308 ms", - "StdDev": "3.857 ms", - "Median": "45.13 ms" + "Version": "1.1.10", + "Mean": "48.50 ms", + "Error": "1.211 ms", + "StdDev": "3.553 ms", + "Median": "48.84 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", - "Version": "1.1.0", - "Mean": "583.4 ms", - "Error": "6.18 ms", - "StdDev": "5.16 ms", - "Median": "583.7 ms" + "Version": "1.1.10", + "Mean": "540.2 ms", + "Error": "6.24 ms", + "StdDev": "5.84 ms", + "Median": "540.7 ms" }, { "Method": "NUnit", "Version": "4.4.0", - "Mean": "1,198.4 ms", - "Error": "16.41 ms", - "StdDev": "15.35 ms", - "Median": "1,195.0 ms" + "Mean": "1,160.3 ms", + "Error": "12.08 ms", + "StdDev": "10.70 ms", + "Median": "1,156.8 ms" }, { "Method": "MSTest", "Version": "4.0.2", - "Mean": "1,162.5 ms", - "Error": "10.28 ms", - "StdDev": "9.11 ms", - "Median": "1,161.5 ms" + "Mean": "1,133.4 ms", + "Error": "7.01 ms", + "StdDev": "5.85 ms", + "Median": "1,131.4 ms" }, { "Method": "xUnit3", "Version": "3.2.0", - "Mean": "1,243.3 ms", - "Error": "10.48 ms", - "StdDev": "9.80 ms", - "Median": "1,241.9 ms" + "Mean": "1,219.9 ms", + "Error": "20.44 ms", + "StdDev": "19.12 ms", + "Median": "1,218.4 ms" }, { "Method": "TUnit_AOT", - "Version": "1.1.0", + "Version": "1.1.10", "Mean": "NA", "Error": "NA", "StdDev": "NA", @@ -263,35 +263,35 @@ "BuildTime": [ { "Method": "Build_TUnit", - "Version": "1.1.0", - "Mean": "2.033 s", - "Error": "0.0333 s", - "StdDev": "0.0296 s", - "Median": "2.032 s" + "Version": "1.1.10", + "Mean": "2.104 s", + "Error": "0.0409 s", + "StdDev": "0.0487 s", + "Median": "2.097 s" }, { "Method": "Build_NUnit", "Version": "4.4.0", - "Mean": "1.622 s", - "Error": "0.0231 s", - "StdDev": "0.0216 s", - "Median": "1.615 s" + "Mean": "1.658 s", + "Error": "0.0277 s", + "StdDev": "0.0272 s", + "Median": "1.652 s" }, { "Method": "Build_MSTest", "Version": "4.0.2", - "Mean": "1.705 s", - "Error": "0.0247 s", - "StdDev": "0.0231 s", - "Median": "1.701 s" + "Mean": "1.751 s", + "Error": "0.0339 s", + "StdDev": "0.0404 s", + "Median": "1.748 s" }, { "Method": "Build_xUnit3", "Version": "3.2.0", - "Mean": "1.611 s", - "Error": "0.0265 s", - "StdDev": "0.0248 s", - "Median": "1.613 s" + "Mean": "1.643 s", + "Error": "0.0230 s", + "StdDev": "0.0204 s", + "Median": "1.644 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2025-11-12T21:13:20.516Z" + "lastUpdated": "2025-11-15T00:27:09.502Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index dbf147f580..435c36799e 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2025-11-12", + "timestamp": "2025-11-15", "environment": "Ubuntu Latest • .NET SDK 10.0.100" } \ No newline at end of file