diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000000..49356716e6 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,3 @@ +# Agents + +See [CLAUDE.md](CLAUDE.md). diff --git a/Directory.Packages.props b/Directory.Packages.props index 71b4e523f7..1687ba004a 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -100,14 +100,14 @@ - + - - - - - + + + + + diff --git a/SourceGenerationDebug.props b/SourceGenerationDebug.props index ee0bad18a5..46581de60d 100644 --- a/SourceGenerationDebug.props +++ b/SourceGenerationDebug.props @@ -1,11 +1,14 @@ - true - SourceGeneratedViewer + true + SourceGeneratedViewer - + + + + diff --git a/TUnit.Assertions.Tests/Bugs/Issue5720Tests.cs b/TUnit.Assertions.Tests/Bugs/Issue5720Tests.cs index 7081355ec3..eb28eb2cbd 100644 --- a/TUnit.Assertions.Tests/Bugs/Issue5720Tests.cs +++ b/TUnit.Assertions.Tests/Bugs/Issue5720Tests.cs @@ -1,3 +1,5 @@ +// Gated to match ImplicitConversionEqualityExtensions.cs — see issue #5765. +#if NET9_0_OR_GREATER namespace TUnit.Assertions.Tests.Bugs; /// @@ -191,3 +193,5 @@ await Assert.That(assertionException.InnerException!.Message).StartsWith( $"No implicit conversion operator from '{typeof(UnrelatedType)}' to '{typeof(string)}' was found."); } } + +#endif diff --git a/TUnit.Assertions.Tests/Bugs/Issue5765Tests.cs b/TUnit.Assertions.Tests/Bugs/Issue5765Tests.cs new file mode 100644 index 0000000000..c63b38d8e4 --- /dev/null +++ b/TUnit.Assertions.Tests/Bugs/Issue5765Tests.cs @@ -0,0 +1,40 @@ +using System.Net; + +namespace TUnit.Assertions.Tests.Bugs; + +public class Issue5765Tests +{ + [Test] + public async Task IsEqualTo_SameType_Enum() + { + var status = HttpStatusCode.OK; + + await Assert.That(status).IsEqualTo(HttpStatusCode.OK); + } + + [Test] + public async Task IsEqualTo_SameType_Primitive() + { + var value = 42; + + await Assert.That(value).IsEqualTo(42); + } + + [Test] + public async Task IsEqualTo_SameType_Record() + { + var point = new Point(1, 2); + + await Assert.That(point).IsEqualTo(new Point(1, 2)); + } + + [Test] + public async Task IsNotEqualTo_SameType_Enum() + { + var status = HttpStatusCode.OK; + + await Assert.That(status).IsNotEqualTo(HttpStatusCode.NotFound); + } + + private sealed record Point(int X, int Y); +} diff --git a/TUnit.Assertions/Extensions/ImplicitConversionEqualityExtensions.cs b/TUnit.Assertions/Extensions/ImplicitConversionEqualityExtensions.cs index e9c792fde8..b91c0e0486 100644 --- a/TUnit.Assertions/Extensions/ImplicitConversionEqualityExtensions.cs +++ b/TUnit.Assertions/Extensions/ImplicitConversionEqualityExtensions.cs @@ -1,3 +1,8 @@ +// Gated to .NET 9+ because these overloads rely on [OverloadResolutionPriority] to +// lose to the source-generated single-generic IsEqualTo / IsNotEqualTo on same-type +// calls, and that attribute is silently dropped on net8.0 / netstandard2.0 (Polyfill +// does not supply it), causing CS0121. See issue #5765. +#if NET9_0_OR_GREATER using System.Collections.Concurrent; using System.Diagnostics.CodeAnalysis; using System.Reflection; @@ -146,3 +151,4 @@ internal static class ImplicitConversionCache return null; } } +#endif diff --git a/TUnit.Engine.Tests/Issue5753Tests.cs b/TUnit.Engine.Tests/Issue5753Tests.cs new file mode 100644 index 0000000000..88bd2ff542 --- /dev/null +++ b/TUnit.Engine.Tests/Issue5753Tests.cs @@ -0,0 +1,35 @@ +using Shouldly; +using TUnit.Engine.Tests.Enums; + +namespace TUnit.Engine.Tests; + +public class Issue5753Tests(TestMode testMode) : InvokableTestBase(testMode) +{ + [Test] + public async Task ReflectionPropertyInjection_DoesNotOverwriteExistingValue() + { + await RunTestsWithFilter( + "/*/*/Issue5753ReflectionPropertyInjectionTests/*", + [ + result => result.ResultSummary.Outcome.ShouldBe("Completed"), + result => result.ResultSummary.Counters.Total.ShouldBe(1), + result => result.ResultSummary.Counters.Passed.ShouldBe(1), + result => result.ResultSummary.Counters.Failed.ShouldBe(0), + result => result.ResultSummary.Counters.NotExecuted.ShouldBe(0) + ]); + } + + [Test] + public async Task ValueTypePropertyInjection_DoesNotTreatDefaultValueAsAlreadyPopulated() + { + await RunTestsWithFilter( + "/*/*/Issue5753ValueTypePropertyInjectionTests/*", + [ + result => result.ResultSummary.Outcome.ShouldBe("Completed"), + result => result.ResultSummary.Counters.Total.ShouldBe(1), + result => result.ResultSummary.Counters.Passed.ShouldBe(1), + result => result.ResultSummary.Counters.Failed.ShouldBe(0), + result => result.ResultSummary.Counters.NotExecuted.ShouldBe(0) + ]); + } +} diff --git a/TUnit.Engine/Services/PropertyInjector.cs b/TUnit.Engine/Services/PropertyInjector.cs index 7037082b48..a16767e55d 100644 --- a/TUnit.Engine/Services/PropertyInjector.cs +++ b/TUnit.Engine/Services/PropertyInjector.cs @@ -252,17 +252,10 @@ private async Task InjectSourceGeneratedPropertyAsync( ConcurrentDictionary visitedObjects, CancellationToken cancellationToken) { - // First check if the property already has a value - skip if it does - // This handles nested objects that were already constructed with their properties set var property = GetCachedPropertyInfo(metadata.ContainingType, metadata.PropertyName); - if (property != null && property.CanRead) + if (IsPropertyAlreadyPopulated(property, instance)) { - var existingValue = property.GetValue(instance); - if (existingValue != null) - { - // Property already has a value, don't overwrite it - return; - } + return; } var testContext = TestContext.Current; @@ -329,6 +322,11 @@ private async Task InjectReflectionPropertyAsync( ConcurrentDictionary visitedObjects, CancellationToken cancellationToken) { + if (IsPropertyAlreadyPopulated(property, instance)) + { + return; + } + var testContext = TestContext.Current; var propertySetter = PropertySetterFactory.CreateSetter(property); @@ -350,6 +348,16 @@ private async Task InjectReflectionPropertyAsync( propertySetter(instance, resolvedValue); } + private static bool IsPropertyAlreadyPopulated(PropertyInfo? property, object instance) + { + if (property is null || !property.CanRead || property.PropertyType.IsValueType) + { + return false; + } + + return property.GetValue(instance) is not null; + } + private Task RecurseIntoNestedPropertiesAsync( object instance, PropertyInjectionPlan plan, diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt index c184337bb5..0503d5c1c0 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt @@ -3767,9 +3767,6 @@ namespace .Extensions { public static . IsEqualTo(this . source, TValue? expected, [.("expected")] string? expectedExpression = null) { } public static . IsEqualTo(this . source, TValue? expected, . comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } - [.("Looks up implicit conversion operators via reflection. Trimming may remove user-d" + - "efined operators.")] - public static . IsEqualTo(this . source, TOther? expected, [.("expected")] string? expectedExpression = null) { } } public static class EquatableAssertionExtensions { @@ -4696,9 +4693,6 @@ namespace .Extensions public static class NotEqualsAssertionExtensions { public static . IsNotEqualTo(this . source, TValue notExpected, .? comparer = null, [.("notExpected")] string? notExpectedExpression = null, [.("comparer")] string? comparerExpression = null) { } - [.("Looks up implicit conversion operators via reflection. Trimming may remove user-d" + - "efined operators.")] - public static . IsNotEqualTo(this . source, TOther? notExpected, [.("notExpected")] string? notExpectedExpression = null) { } } public static class NotEquivalentToAssertionExtensions { diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt index 8b9183194a..d4b8c212ba 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt @@ -3360,7 +3360,6 @@ namespace .Extensions { public static . IsEqualTo(this . source, TValue? expected, [.("expected")] string? expectedExpression = null) { } public static . IsEqualTo(this . source, TValue? expected, . comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } - public static . IsEqualTo(this . source, TOther? expected, [.("expected")] string? expectedExpression = null) { } } public static class EquatableAssertionExtensions { @@ -4189,7 +4188,6 @@ namespace .Extensions public static class NotEqualsAssertionExtensions { public static . IsNotEqualTo(this . source, TValue notExpected, .? comparer = null, [.("notExpected")] string? notExpectedExpression = null, [.("comparer")] string? comparerExpression = null) { } - public static . IsNotEqualTo(this . source, TOther? notExpected, [.("notExpected")] string? notExpectedExpression = null) { } } public static class NotEquivalentToAssertionExtensions { diff --git a/TUnit.TestProject/Bugs/5753/Tests.cs b/TUnit.TestProject/Bugs/5753/Tests.cs new file mode 100644 index 0000000000..805fd5a3aa --- /dev/null +++ b/TUnit.TestProject/Bugs/5753/Tests.cs @@ -0,0 +1,63 @@ +using TUnit.Core.Interfaces; +using TUnit.TestProject.Attributes; + +namespace TUnit.TestProject.Bugs._5753; + +[EngineTest(ExpectedResult.Pass)] +public class Issue5753ReflectionPropertyInjectionTests +{ + [Test] + [ClassDataSource] + public async Task InjectedProperty_IsNotResolvedAgain_WhenAlreadySet(Issue5753Container container) + { + await Assert.That(container.Service).IsNotNull(); + await Assert.That(container.Service).IsSameReferenceAs(container.ServiceCapturedDuringInitialization); + await Assert.That(container.Service.IsInitialized).IsTrue(); + } +} + +[EngineTest(ExpectedResult.Pass)] +public class Issue5753ValueTypePropertyInjectionTests +{ + [Issue5753IntDataSource] + public int Value { get; set; } + + [Test] + public async Task ValueTypeProperty_IsInjected_WhenDefaultValueIsBoxed() + { + await Assert.That(Value).IsEqualTo(42); + } +} + +public class Issue5753Container : IAsyncInitializer +{ + [ClassDataSource] + public Issue5753InjectedService Service { get; set; } = null!; + + public Issue5753InjectedService? ServiceCapturedDuringInitialization { get; private set; } + + public Task InitializeAsync() + { + ServiceCapturedDuringInitialization = Service; + return Task.CompletedTask; + } +} + +public class Issue5753InjectedService : IAsyncInitializer +{ + public bool IsInitialized { get; private set; } + + public Task InitializeAsync() + { + IsInitialized = true; + return Task.CompletedTask; + } +} + +public class Issue5753IntDataSourceAttribute : DataSourceGeneratorAttribute +{ + protected override IEnumerable> GenerateDataSources(DataGeneratorMetadata dataGeneratorMetadata) + { + yield return () => 42; + } +} diff --git a/TestProject.props b/TestProject.props index 269d2b50a5..ff3eb49139 100644 --- a/TestProject.props +++ b/TestProject.props @@ -46,12 +46,11 @@ - + + Condition="'$(ContinuousIntegrationBuild)' != 'true' AND '$(EmitCompilerGeneratedFiles)' == 'true' AND Exists('$(ProjectDir)SourceGeneratedViewer')"> diff --git a/docs/docs/benchmarks/AsyncTests.md b/docs/docs/benchmarks/AsyncTests.md index 7e7d91d8bc..95481e20d2 100644 --- a/docs/docs/benchmarks/AsyncTests.md +++ b/docs/docs/benchmarks/AsyncTests.md @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2026-04-26** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.39.0 | 528.4 ms | 526.3 ms | 5.81 ms | -| NUnit | 4.5.1 | 761.5 ms | 764.2 ms | 8.07 ms | -| MSTest | 4.2.1 | 687.1 ms | 682.2 ms | 26.11 ms | -| xUnit3 | 3.2.2 | 806.2 ms | 806.4 ms | 3.71 ms | -| **TUnit (AOT)** | 1.39.0 | 122.4 ms | 122.4 ms | 0.28 ms | +| **TUnit** | 1.40.0 | 520.7 ms | 521.7 ms | 3.02 ms | +| NUnit | 4.5.1 | 740.5 ms | 738.3 ms | 14.21 ms | +| MSTest | 4.2.1 | 639.8 ms | 641.2 ms | 5.65 ms | +| xUnit3 | 3.2.2 | 799.6 ms | 800.7 ms | 12.51 ms | +| **TUnit (AOT)** | 1.40.0 | 122.2 ms | 122.3 ms | 0.53 ms | ## 📈 Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2026-04-26** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 968 - bar [528.4, 761.5, 687.1, 806.2, 122.4] + y-axis "Time (ms)" 0 --> 960 + bar [520.7, 740.5, 639.8, 799.6, 122.2] ``` ## 🎯 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: 2026-04-26T00:47:15.570Z* +*Last generated: 2026-04-26T23:56:55.721Z* diff --git a/docs/docs/benchmarks/BuildTime.md b/docs/docs/benchmarks/BuildTime.md index 78185e6729..997da9643a 100644 --- a/docs/docs/benchmarks/BuildTime.md +++ b/docs/docs/benchmarks/BuildTime.md @@ -18,10 +18,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.39.0 | 1.895 s | 1.910 s | 0.0324 s | -| Build_NUnit | 4.5.1 | 1.697 s | 1.696 s | 0.0099 s | -| Build_MSTest | 4.2.1 | 1.768 s | 1.768 s | 0.0152 s | -| Build_xUnit3 | 3.2.2 | 1.701 s | 1.696 s | 0.0190 s | +| **TUnit** | 1.40.0 | 1.813 s | 1.818 s | 0.0346 s | +| Build_NUnit | 4.5.1 | 1.636 s | 1.640 s | 0.0190 s | +| Build_MSTest | 4.2.1 | 1.697 s | 1.695 s | 0.0139 s | +| Build_xUnit3 | 3.2.2 | 1.642 s | 1.646 s | 0.0356 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 [1.895, 1.697, 1.768, 1.701] + bar [1.813, 1.636, 1.697, 1.642] ``` --- @@ -69,4 +69,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2026-04-26T00:47:15.572Z* +*Last generated: 2026-04-26T23:56:55.723Z* diff --git a/docs/docs/benchmarks/DataDrivenTests.md b/docs/docs/benchmarks/DataDrivenTests.md index 1713f4e470..166ceff6e8 100644 --- a/docs/docs/benchmarks/DataDrivenTests.md +++ b/docs/docs/benchmarks/DataDrivenTests.md @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2026-04-26** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.39.0 | 466.17 ms | 465.86 ms | 2.186 ms | -| NUnit | 4.5.1 | 568.33 ms | 566.14 ms | 8.063 ms | -| MSTest | 4.2.1 | 528.49 ms | 522.89 ms | 12.997 ms | -| xUnit3 | 3.2.2 | 601.22 ms | 601.67 ms | 6.810 ms | -| **TUnit (AOT)** | 1.39.0 | 26.44 ms | 26.82 ms | 1.848 ms | +| **TUnit** | 1.40.0 | 445.94 ms | 444.99 ms | 2.317 ms | +| NUnit | 4.5.1 | 538.46 ms | 537.20 ms | 6.868 ms | +| MSTest | 4.2.1 | 443.26 ms | 442.93 ms | 7.856 ms | +| xUnit3 | 3.2.2 | 573.58 ms | 573.21 ms | 5.061 ms | +| **TUnit (AOT)** | 1.40.0 | 27.30 ms | 27.14 ms | 1.686 ms | ## 📈 Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2026-04-26** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 722 - bar [466.17, 568.33, 528.49, 601.22, 26.44] + y-axis "Time (ms)" 0 --> 689 + bar [445.94, 538.46, 443.26, 573.58, 27.3] ``` ## 🎯 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: 2026-04-26T00:47:15.570Z* +*Last generated: 2026-04-26T23:56:55.721Z* diff --git a/docs/docs/benchmarks/MassiveParallelTests.md b/docs/docs/benchmarks/MassiveParallelTests.md index 736dad6b1e..3b8b3269d9 100644 --- a/docs/docs/benchmarks/MassiveParallelTests.md +++ b/docs/docs/benchmarks/MassiveParallelTests.md @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2026-04-26** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.39.0 | 647.0 ms | 643.1 ms | 8.40 ms | -| NUnit | 4.5.1 | 1,201.3 ms | 1,199.9 ms | 7.06 ms | -| MSTest | 4.2.1 | 2,927.9 ms | 2,928.7 ms | 9.32 ms | -| xUnit3 | 3.2.2 | 3,068.2 ms | 3,066.2 ms | 7.22 ms | -| **TUnit (AOT)** | 1.39.0 | 227.5 ms | 227.6 ms | 0.32 ms | +| **TUnit** | 1.40.0 | 700.9 ms | 699.2 ms | 3.95 ms | +| NUnit | 4.5.1 | 1,266.6 ms | 1,265.2 ms | 5.18 ms | +| MSTest | 4.2.1 | 2,978.8 ms | 2,977.3 ms | 6.47 ms | +| xUnit3 | 3.2.2 | 3,136.1 ms | 3,135.5 ms | 5.12 ms | +| **TUnit (AOT)** | 1.40.0 | 231.1 ms | 231.1 ms | 0.47 ms | ## 📈 Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2026-04-26** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3682 - bar [647, 1201.3, 2927.9, 3068.2, 227.5] + y-axis "Time (ms)" 0 --> 3764 + bar [700.9, 1266.6, 2978.8, 3136.1, 231.1] ``` ## 🎯 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: 2026-04-26T00:47:15.571Z* +*Last generated: 2026-04-26T23:56:55.722Z* diff --git a/docs/docs/benchmarks/MatrixTests.md b/docs/docs/benchmarks/MatrixTests.md index a4983519db..0be817933d 100644 --- a/docs/docs/benchmarks/MatrixTests.md +++ b/docs/docs/benchmarks/MatrixTests.md @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2026-04-26** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.39.0 | 570.7 ms | 569.3 ms | 7.97 ms | -| NUnit | 4.5.1 | 1,609.6 ms | 1,609.2 ms | 12.95 ms | -| MSTest | 4.2.1 | 1,493.0 ms | 1,494.4 ms | 5.99 ms | -| xUnit3 | 3.2.2 | 1,650.8 ms | 1,649.6 ms | 12.40 ms | -| **TUnit (AOT)** | 1.39.0 | 125.9 ms | 125.8 ms | 0.38 ms | +| **TUnit** | 1.40.0 | 536.5 ms | 536.0 ms | 4.27 ms | +| NUnit | 4.5.1 | 1,555.4 ms | 1,554.3 ms | 10.94 ms | +| MSTest | 4.2.1 | 1,460.4 ms | 1,459.1 ms | 9.43 ms | +| xUnit3 | 3.2.2 | 1,601.5 ms | 1,602.9 ms | 8.84 ms | +| **TUnit (AOT)** | 1.40.0 | 124.8 ms | 124.9 ms | 0.33 ms | ## 📈 Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2026-04-26** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1981 - bar [570.7, 1609.6, 1493, 1650.8, 125.9] + y-axis "Time (ms)" 0 --> 1922 + bar [536.5, 1555.4, 1460.4, 1601.5, 124.8] ``` ## 🎯 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: 2026-04-26T00:47:15.571Z* +*Last generated: 2026-04-26T23:56:55.722Z* diff --git a/docs/docs/benchmarks/ScaleTests.md b/docs/docs/benchmarks/ScaleTests.md index c696873d34..74ea42301b 100644 --- a/docs/docs/benchmarks/ScaleTests.md +++ b/docs/docs/benchmarks/ScaleTests.md @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2026-04-26** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.39.0 | 474.48 ms | 472.68 ms | 5.291 ms | -| NUnit | 4.5.1 | 616.99 ms | 616.61 ms | 8.010 ms | -| MSTest | 4.2.1 | 544.34 ms | 545.55 ms | 15.255 ms | -| xUnit3 | 3.2.2 | 626.24 ms | 626.67 ms | 6.241 ms | -| **TUnit (AOT)** | 1.39.0 | 30.80 ms | 30.86 ms | 1.564 ms | +| **TUnit** | 1.40.0 | 469.74 ms | 469.08 ms | 4.380 ms | +| NUnit | 4.5.1 | 604.40 ms | 605.63 ms | 7.170 ms | +| MSTest | 4.2.1 | 476.13 ms | 473.41 ms | 12.010 ms | +| xUnit3 | 3.2.2 | 618.17 ms | 616.44 ms | 9.992 ms | +| **TUnit (AOT)** | 1.40.0 | 30.04 ms | 29.83 ms | 2.259 ms | ## 📈 Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2026-04-26** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 752 - bar [474.48, 616.99, 544.34, 626.24, 30.8] + y-axis "Time (ms)" 0 --> 742 + bar [469.74, 604.4, 476.13, 618.17, 30.04] ``` ## 🎯 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: 2026-04-26T00:47:15.571Z* +*Last generated: 2026-04-26T23:56:55.722Z* diff --git a/docs/docs/benchmarks/SetupTeardownTests.md b/docs/docs/benchmarks/SetupTeardownTests.md index 297660a3c3..8f44376e95 100644 --- a/docs/docs/benchmarks/SetupTeardownTests.md +++ b/docs/docs/benchmarks/SetupTeardownTests.md @@ -16,11 +16,11 @@ This benchmark was automatically generated on **2026-04-26** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.39.0 | 601.3 ms | 601.5 ms | 7.01 ms | -| NUnit | 4.5.1 | 1,240.2 ms | 1,241.0 ms | 8.88 ms | -| MSTest | 4.2.1 | 1,149.8 ms | 1,149.1 ms | 10.45 ms | -| xUnit3 | 3.2.2 | 1,330.4 ms | 1,329.4 ms | 11.15 ms | -| **TUnit (AOT)** | 1.39.0 | NA | NA | NA | +| **TUnit** | 1.40.0 | 567.2 ms | 565.5 ms | 7.64 ms | +| NUnit | 4.5.1 | 1,218.3 ms | 1,219.3 ms | 11.71 ms | +| MSTest | 4.2.1 | 1,131.5 ms | 1,134.1 ms | 7.97 ms | +| xUnit3 | 3.2.2 | 1,279.6 ms | 1,276.5 ms | 8.00 ms | +| **TUnit (AOT)** | 1.40.0 | NA | NA | NA | ## 📈 Visual Comparison @@ -58,8 +58,8 @@ This benchmark was automatically generated on **2026-04-26** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1597 - bar [601.3, 1240.2, 1149.8, 1330.4, 0] + y-axis "Time (ms)" 0 --> 1536 + bar [567.2, 1218.3, 1131.5, 1279.6, 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: 2026-04-26T00:47:15.571Z* +*Last generated: 2026-04-26T23:56:55.723Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index d91f4fd770..e3b06995d6 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -37,7 +37,7 @@ These benchmarks compare TUnit against the most popular .NET testing frameworks: | Framework | Version Tested | |-----------|----------------| -| **TUnit** | 1.39.0 | +| **TUnit** | 1.40.0 | | **xUnit v3** | 3.2.2 | | **NUnit** | 4.5.1 | | **MSTest** | 4.2.1 | @@ -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: 2026-04-26T00:47:15.572Z* +*Last generated: 2026-04-26T23:56:55.724Z* diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index 3492e8d046..37c4d5f31c 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-04-26T00:47:15.570Z", + "timestamp": "2026-04-26T23:56:55.721Z", "category": "AsyncTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.39.0", - "Mean": "528.4 ms", - "Error": "6.55 ms", - "StdDev": "5.81 ms", - "Median": "526.3 ms" + "Version": "1.40.0", + "Mean": "520.7 ms", + "Error": "3.61 ms", + "StdDev": "3.02 ms", + "Median": "521.7 ms" }, { "Method": "NUnit", "Version": "4.5.1", - "Mean": "761.5 ms", - "Error": "9.10 ms", - "StdDev": "8.07 ms", - "Median": "764.2 ms" + "Mean": "740.5 ms", + "Error": "13.84 ms", + "StdDev": "14.21 ms", + "Median": "738.3 ms" }, { "Method": "MSTest", "Version": "4.2.1", - "Mean": "687.1 ms", - "Error": "13.55 ms", - "StdDev": "26.11 ms", - "Median": "682.2 ms" + "Mean": "639.8 ms", + "Error": "6.37 ms", + "StdDev": "5.65 ms", + "Median": "641.2 ms" }, { "Method": "xUnit3", "Version": "3.2.2", - "Mean": "806.2 ms", - "Error": "4.44 ms", - "StdDev": "3.71 ms", - "Median": "806.4 ms" + "Mean": "799.6 ms", + "Error": "14.98 ms", + "StdDev": "12.51 ms", + "Median": "800.7 ms" }, { "Method": "TUnit_AOT", - "Version": "1.39.0", - "Mean": "122.4 ms", - "Error": "0.32 ms", - "StdDev": "0.28 ms", - "Median": "122.4 ms" + "Version": "1.40.0", + "Mean": "122.2 ms", + "Error": "0.56 ms", + "StdDev": "0.53 ms", + "Median": "122.3 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index 95b7178a78..6974670ec3 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-04-26T00:47:15.572Z", + "timestamp": "2026-04-26T23:56:55.723Z", "category": "BuildTime", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", @@ -9,35 +9,35 @@ "results": [ { "Method": "Build_TUnit", - "Version": "1.39.0", - "Mean": "1.895 s", - "Error": "0.0347 s", - "StdDev": "0.0324 s", - "Median": "1.910 s" + "Version": "1.40.0", + "Mean": "1.813 s", + "Error": "0.0353 s", + "StdDev": "0.0346 s", + "Median": "1.818 s" }, { "Method": "Build_NUnit", "Version": "4.5.1", - "Mean": "1.697 s", - "Error": "0.0106 s", - "StdDev": "0.0099 s", - "Median": "1.696 s" + "Mean": "1.636 s", + "Error": "0.0203 s", + "StdDev": "0.0190 s", + "Median": "1.640 s" }, { "Method": "Build_MSTest", "Version": "4.2.1", - "Mean": "1.768 s", - "Error": "0.0162 s", - "StdDev": "0.0152 s", - "Median": "1.768 s" + "Mean": "1.697 s", + "Error": "0.0157 s", + "StdDev": "0.0139 s", + "Median": "1.695 s" }, { "Method": "Build_xUnit3", "Version": "3.2.2", - "Mean": "1.701 s", - "Error": "0.0203 s", - "StdDev": "0.0190 s", - "Median": "1.696 s" + "Mean": "1.642 s", + "Error": "0.0320 s", + "StdDev": "0.0356 s", + "Median": "1.646 s" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index 20055ee55b..3b61923b18 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-04-26T00:47:15.570Z", + "timestamp": "2026-04-26T23:56:55.722Z", "category": "DataDrivenTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.39.0", - "Mean": "466.17 ms", - "Error": "2.617 ms", - "StdDev": "2.186 ms", - "Median": "465.86 ms" + "Version": "1.40.0", + "Mean": "445.94 ms", + "Error": "2.614 ms", + "StdDev": "2.317 ms", + "Median": "444.99 ms" }, { "Method": "NUnit", "Version": "4.5.1", - "Mean": "568.33 ms", - "Error": "9.096 ms", - "StdDev": "8.063 ms", - "Median": "566.14 ms" + "Mean": "538.46 ms", + "Error": "7.748 ms", + "StdDev": "6.868 ms", + "Median": "537.20 ms" }, { "Method": "MSTest", "Version": "4.2.1", - "Mean": "528.49 ms", - "Error": "9.495 ms", - "StdDev": "12.997 ms", - "Median": "522.89 ms" + "Mean": "443.26 ms", + "Error": "8.398 ms", + "StdDev": "7.856 ms", + "Median": "442.93 ms" }, { "Method": "xUnit3", "Version": "3.2.2", - "Mean": "601.22 ms", - "Error": "7.280 ms", - "StdDev": "6.810 ms", - "Median": "601.67 ms" + "Mean": "573.58 ms", + "Error": "5.710 ms", + "StdDev": "5.061 ms", + "Median": "573.21 ms" }, { "Method": "TUnit_AOT", - "Version": "1.39.0", - "Mean": "26.44 ms", - "Error": "0.630 ms", - "StdDev": "1.848 ms", - "Median": "26.82 ms" + "Version": "1.40.0", + "Mean": "27.30 ms", + "Error": "0.575 ms", + "StdDev": "1.686 ms", + "Median": "27.14 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index d0b6ce3ff5..94d35d1f85 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-04-26T00:47:15.571Z", + "timestamp": "2026-04-26T23:56:55.722Z", "category": "MassiveParallelTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.39.0", - "Mean": "647.0 ms", - "Error": "9.48 ms", - "StdDev": "8.40 ms", - "Median": "643.1 ms" + "Version": "1.40.0", + "Mean": "700.9 ms", + "Error": "4.46 ms", + "StdDev": "3.95 ms", + "Median": "699.2 ms" }, { "Method": "NUnit", "Version": "4.5.1", - "Mean": "1,201.3 ms", - "Error": "7.96 ms", - "StdDev": "7.06 ms", - "Median": "1,199.9 ms" + "Mean": "1,266.6 ms", + "Error": "6.21 ms", + "StdDev": "5.18 ms", + "Median": "1,265.2 ms" }, { "Method": "MSTest", "Version": "4.2.1", - "Mean": "2,927.9 ms", - "Error": "10.52 ms", - "StdDev": "9.32 ms", - "Median": "2,928.7 ms" + "Mean": "2,978.8 ms", + "Error": "7.29 ms", + "StdDev": "6.47 ms", + "Median": "2,977.3 ms" }, { "Method": "xUnit3", "Version": "3.2.2", - "Mean": "3,068.2 ms", - "Error": "7.72 ms", - "StdDev": "7.22 ms", - "Median": "3,066.2 ms" + "Mean": "3,136.1 ms", + "Error": "6.13 ms", + "StdDev": "5.12 ms", + "Median": "3,135.5 ms" }, { "Method": "TUnit_AOT", - "Version": "1.39.0", - "Mean": "227.5 ms", - "Error": "0.38 ms", - "StdDev": "0.32 ms", - "Median": "227.6 ms" + "Version": "1.40.0", + "Mean": "231.1 ms", + "Error": "0.53 ms", + "StdDev": "0.47 ms", + "Median": "231.1 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index e49f022887..2a510c8598 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-04-26T00:47:15.571Z", + "timestamp": "2026-04-26T23:56:55.722Z", "category": "MatrixTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.39.0", - "Mean": "570.7 ms", - "Error": "8.53 ms", - "StdDev": "7.97 ms", - "Median": "569.3 ms" + "Version": "1.40.0", + "Mean": "536.5 ms", + "Error": "4.56 ms", + "StdDev": "4.27 ms", + "Median": "536.0 ms" }, { "Method": "NUnit", "Version": "4.5.1", - "Mean": "1,609.6 ms", - "Error": "13.84 ms", - "StdDev": "12.95 ms", - "Median": "1,609.2 ms" + "Mean": "1,555.4 ms", + "Error": "12.34 ms", + "StdDev": "10.94 ms", + "Median": "1,554.3 ms" }, { "Method": "MSTest", "Version": "4.2.1", - "Mean": "1,493.0 ms", - "Error": "7.18 ms", - "StdDev": "5.99 ms", - "Median": "1,494.4 ms" + "Mean": "1,460.4 ms", + "Error": "10.08 ms", + "StdDev": "9.43 ms", + "Median": "1,459.1 ms" }, { "Method": "xUnit3", "Version": "3.2.2", - "Mean": "1,650.8 ms", - "Error": "13.99 ms", - "StdDev": "12.40 ms", - "Median": "1,649.6 ms" + "Mean": "1,601.5 ms", + "Error": "9.45 ms", + "StdDev": "8.84 ms", + "Median": "1,602.9 ms" }, { "Method": "TUnit_AOT", - "Version": "1.39.0", - "Mean": "125.9 ms", - "Error": "0.48 ms", - "StdDev": "0.38 ms", - "Median": "125.8 ms" + "Version": "1.40.0", + "Mean": "124.8 ms", + "Error": "0.35 ms", + "StdDev": "0.33 ms", + "Median": "124.9 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index 8479373835..00a0745a9f 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-04-26T00:47:15.571Z", + "timestamp": "2026-04-26T23:56:55.723Z", "category": "ScaleTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.39.0", - "Mean": "474.48 ms", - "Error": "5.656 ms", - "StdDev": "5.291 ms", - "Median": "472.68 ms" + "Version": "1.40.0", + "Mean": "469.74 ms", + "Error": "4.682 ms", + "StdDev": "4.380 ms", + "Median": "469.08 ms" }, { "Method": "NUnit", "Version": "4.5.1", - "Mean": "616.99 ms", - "Error": "9.035 ms", - "StdDev": "8.010 ms", - "Median": "616.61 ms" + "Mean": "604.40 ms", + "Error": "8.089 ms", + "StdDev": "7.170 ms", + "Median": "605.63 ms" }, { "Method": "MSTest", "Version": "4.2.1", - "Mean": "544.34 ms", - "Error": "10.637 ms", - "StdDev": "15.255 ms", - "Median": "545.55 ms" + "Mean": "476.13 ms", + "Error": "9.237 ms", + "StdDev": "12.010 ms", + "Median": "473.41 ms" }, { "Method": "xUnit3", "Version": "3.2.2", - "Mean": "626.24 ms", - "Error": "7.474 ms", - "StdDev": "6.241 ms", - "Median": "626.67 ms" + "Mean": "618.17 ms", + "Error": "10.682 ms", + "StdDev": "9.992 ms", + "Median": "616.44 ms" }, { "Method": "TUnit_AOT", - "Version": "1.39.0", - "Mean": "30.80 ms", - "Error": "0.610 ms", - "StdDev": "1.564 ms", - "Median": "30.86 ms" + "Version": "1.40.0", + "Mean": "30.04 ms", + "Error": "0.770 ms", + "StdDev": "2.259 ms", + "Median": "29.83 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index 1ec20dfefb..89f44d15ec 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-04-26T00:47:15.572Z", + "timestamp": "2026-04-26T23:56:55.723Z", "category": "SetupTeardownTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", @@ -9,39 +9,39 @@ "results": [ { "Method": "TUnit", - "Version": "1.39.0", - "Mean": "601.3 ms", - "Error": "7.50 ms", - "StdDev": "7.01 ms", - "Median": "601.5 ms" + "Version": "1.40.0", + "Mean": "567.2 ms", + "Error": "8.17 ms", + "StdDev": "7.64 ms", + "Median": "565.5 ms" }, { "Method": "NUnit", "Version": "4.5.1", - "Mean": "1,240.2 ms", - "Error": "10.64 ms", - "StdDev": "8.88 ms", - "Median": "1,241.0 ms" + "Mean": "1,218.3 ms", + "Error": "13.21 ms", + "StdDev": "11.71 ms", + "Median": "1,219.3 ms" }, { "Method": "MSTest", "Version": "4.2.1", - "Mean": "1,149.8 ms", - "Error": "11.18 ms", - "StdDev": "10.45 ms", - "Median": "1,149.1 ms" + "Mean": "1,131.5 ms", + "Error": "8.99 ms", + "StdDev": "7.97 ms", + "Median": "1,134.1 ms" }, { "Method": "xUnit3", "Version": "3.2.2", - "Mean": "1,330.4 ms", - "Error": "12.58 ms", - "StdDev": "11.15 ms", - "Median": "1,329.4 ms" + "Mean": "1,279.6 ms", + "Error": "8.55 ms", + "StdDev": "8.00 ms", + "Median": "1,276.5 ms" }, { "Method": "TUnit_AOT", - "Version": "1.39.0", + "Version": "1.40.0", "Mean": "NA", "Error": "NA", "StdDev": "NA", diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index cf4101d86f..f8b61d0cbb 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -1,8 +1,4 @@ [ - { - "date": "2026-01-29", - "environment": "Ubuntu" - }, { "date": "2026-01-30", "environment": "Ubuntu" @@ -355,6 +351,10 @@ "date": "2026-04-25", "environment": "Ubuntu" }, + { + "date": "2026-04-26", + "environment": "Ubuntu" + }, { "date": "2026-04-26", "environment": "Ubuntu" diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index 11dd4bc291..0972857e8f 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-04-26T00:47:15.572Z", + "timestamp": "2026-04-26T23:56:55.724Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.203", @@ -9,249 +9,249 @@ "AsyncTests": [ { "Method": "TUnit", - "Version": "1.39.0", - "Mean": "528.4 ms", - "Error": "6.55 ms", - "StdDev": "5.81 ms", - "Median": "526.3 ms" + "Version": "1.40.0", + "Mean": "520.7 ms", + "Error": "3.61 ms", + "StdDev": "3.02 ms", + "Median": "521.7 ms" }, { "Method": "NUnit", "Version": "4.5.1", - "Mean": "761.5 ms", - "Error": "9.10 ms", - "StdDev": "8.07 ms", - "Median": "764.2 ms" + "Mean": "740.5 ms", + "Error": "13.84 ms", + "StdDev": "14.21 ms", + "Median": "738.3 ms" }, { "Method": "MSTest", "Version": "4.2.1", - "Mean": "687.1 ms", - "Error": "13.55 ms", - "StdDev": "26.11 ms", - "Median": "682.2 ms" + "Mean": "639.8 ms", + "Error": "6.37 ms", + "StdDev": "5.65 ms", + "Median": "641.2 ms" }, { "Method": "xUnit3", "Version": "3.2.2", - "Mean": "806.2 ms", - "Error": "4.44 ms", - "StdDev": "3.71 ms", - "Median": "806.4 ms" + "Mean": "799.6 ms", + "Error": "14.98 ms", + "StdDev": "12.51 ms", + "Median": "800.7 ms" }, { "Method": "TUnit_AOT", - "Version": "1.39.0", - "Mean": "122.4 ms", - "Error": "0.32 ms", - "StdDev": "0.28 ms", - "Median": "122.4 ms" + "Version": "1.40.0", + "Mean": "122.2 ms", + "Error": "0.56 ms", + "StdDev": "0.53 ms", + "Median": "122.3 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", - "Version": "1.39.0", - "Mean": "466.17 ms", - "Error": "2.617 ms", - "StdDev": "2.186 ms", - "Median": "465.86 ms" + "Version": "1.40.0", + "Mean": "445.94 ms", + "Error": "2.614 ms", + "StdDev": "2.317 ms", + "Median": "444.99 ms" }, { "Method": "NUnit", "Version": "4.5.1", - "Mean": "568.33 ms", - "Error": "9.096 ms", - "StdDev": "8.063 ms", - "Median": "566.14 ms" + "Mean": "538.46 ms", + "Error": "7.748 ms", + "StdDev": "6.868 ms", + "Median": "537.20 ms" }, { "Method": "MSTest", "Version": "4.2.1", - "Mean": "528.49 ms", - "Error": "9.495 ms", - "StdDev": "12.997 ms", - "Median": "522.89 ms" + "Mean": "443.26 ms", + "Error": "8.398 ms", + "StdDev": "7.856 ms", + "Median": "442.93 ms" }, { "Method": "xUnit3", "Version": "3.2.2", - "Mean": "601.22 ms", - "Error": "7.280 ms", - "StdDev": "6.810 ms", - "Median": "601.67 ms" + "Mean": "573.58 ms", + "Error": "5.710 ms", + "StdDev": "5.061 ms", + "Median": "573.21 ms" }, { "Method": "TUnit_AOT", - "Version": "1.39.0", - "Mean": "26.44 ms", - "Error": "0.630 ms", - "StdDev": "1.848 ms", - "Median": "26.82 ms" + "Version": "1.40.0", + "Mean": "27.30 ms", + "Error": "0.575 ms", + "StdDev": "1.686 ms", + "Median": "27.14 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", - "Version": "1.39.0", - "Mean": "647.0 ms", - "Error": "9.48 ms", - "StdDev": "8.40 ms", - "Median": "643.1 ms" + "Version": "1.40.0", + "Mean": "700.9 ms", + "Error": "4.46 ms", + "StdDev": "3.95 ms", + "Median": "699.2 ms" }, { "Method": "NUnit", "Version": "4.5.1", - "Mean": "1,201.3 ms", - "Error": "7.96 ms", - "StdDev": "7.06 ms", - "Median": "1,199.9 ms" + "Mean": "1,266.6 ms", + "Error": "6.21 ms", + "StdDev": "5.18 ms", + "Median": "1,265.2 ms" }, { "Method": "MSTest", "Version": "4.2.1", - "Mean": "2,927.9 ms", - "Error": "10.52 ms", - "StdDev": "9.32 ms", - "Median": "2,928.7 ms" + "Mean": "2,978.8 ms", + "Error": "7.29 ms", + "StdDev": "6.47 ms", + "Median": "2,977.3 ms" }, { "Method": "xUnit3", "Version": "3.2.2", - "Mean": "3,068.2 ms", - "Error": "7.72 ms", - "StdDev": "7.22 ms", - "Median": "3,066.2 ms" + "Mean": "3,136.1 ms", + "Error": "6.13 ms", + "StdDev": "5.12 ms", + "Median": "3,135.5 ms" }, { "Method": "TUnit_AOT", - "Version": "1.39.0", - "Mean": "227.5 ms", - "Error": "0.38 ms", - "StdDev": "0.32 ms", - "Median": "227.6 ms" + "Version": "1.40.0", + "Mean": "231.1 ms", + "Error": "0.53 ms", + "StdDev": "0.47 ms", + "Median": "231.1 ms" } ], "MatrixTests": [ { "Method": "TUnit", - "Version": "1.39.0", - "Mean": "570.7 ms", - "Error": "8.53 ms", - "StdDev": "7.97 ms", - "Median": "569.3 ms" + "Version": "1.40.0", + "Mean": "536.5 ms", + "Error": "4.56 ms", + "StdDev": "4.27 ms", + "Median": "536.0 ms" }, { "Method": "NUnit", "Version": "4.5.1", - "Mean": "1,609.6 ms", - "Error": "13.84 ms", - "StdDev": "12.95 ms", - "Median": "1,609.2 ms" + "Mean": "1,555.4 ms", + "Error": "12.34 ms", + "StdDev": "10.94 ms", + "Median": "1,554.3 ms" }, { "Method": "MSTest", "Version": "4.2.1", - "Mean": "1,493.0 ms", - "Error": "7.18 ms", - "StdDev": "5.99 ms", - "Median": "1,494.4 ms" + "Mean": "1,460.4 ms", + "Error": "10.08 ms", + "StdDev": "9.43 ms", + "Median": "1,459.1 ms" }, { "Method": "xUnit3", "Version": "3.2.2", - "Mean": "1,650.8 ms", - "Error": "13.99 ms", - "StdDev": "12.40 ms", - "Median": "1,649.6 ms" + "Mean": "1,601.5 ms", + "Error": "9.45 ms", + "StdDev": "8.84 ms", + "Median": "1,602.9 ms" }, { "Method": "TUnit_AOT", - "Version": "1.39.0", - "Mean": "125.9 ms", - "Error": "0.48 ms", - "StdDev": "0.38 ms", - "Median": "125.8 ms" + "Version": "1.40.0", + "Mean": "124.8 ms", + "Error": "0.35 ms", + "StdDev": "0.33 ms", + "Median": "124.9 ms" } ], "ScaleTests": [ { "Method": "TUnit", - "Version": "1.39.0", - "Mean": "474.48 ms", - "Error": "5.656 ms", - "StdDev": "5.291 ms", - "Median": "472.68 ms" + "Version": "1.40.0", + "Mean": "469.74 ms", + "Error": "4.682 ms", + "StdDev": "4.380 ms", + "Median": "469.08 ms" }, { "Method": "NUnit", "Version": "4.5.1", - "Mean": "616.99 ms", - "Error": "9.035 ms", - "StdDev": "8.010 ms", - "Median": "616.61 ms" + "Mean": "604.40 ms", + "Error": "8.089 ms", + "StdDev": "7.170 ms", + "Median": "605.63 ms" }, { "Method": "MSTest", "Version": "4.2.1", - "Mean": "544.34 ms", - "Error": "10.637 ms", - "StdDev": "15.255 ms", - "Median": "545.55 ms" + "Mean": "476.13 ms", + "Error": "9.237 ms", + "StdDev": "12.010 ms", + "Median": "473.41 ms" }, { "Method": "xUnit3", "Version": "3.2.2", - "Mean": "626.24 ms", - "Error": "7.474 ms", - "StdDev": "6.241 ms", - "Median": "626.67 ms" + "Mean": "618.17 ms", + "Error": "10.682 ms", + "StdDev": "9.992 ms", + "Median": "616.44 ms" }, { "Method": "TUnit_AOT", - "Version": "1.39.0", - "Mean": "30.80 ms", - "Error": "0.610 ms", - "StdDev": "1.564 ms", - "Median": "30.86 ms" + "Version": "1.40.0", + "Mean": "30.04 ms", + "Error": "0.770 ms", + "StdDev": "2.259 ms", + "Median": "29.83 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", - "Version": "1.39.0", - "Mean": "601.3 ms", - "Error": "7.50 ms", - "StdDev": "7.01 ms", - "Median": "601.5 ms" + "Version": "1.40.0", + "Mean": "567.2 ms", + "Error": "8.17 ms", + "StdDev": "7.64 ms", + "Median": "565.5 ms" }, { "Method": "NUnit", "Version": "4.5.1", - "Mean": "1,240.2 ms", - "Error": "10.64 ms", - "StdDev": "8.88 ms", - "Median": "1,241.0 ms" + "Mean": "1,218.3 ms", + "Error": "13.21 ms", + "StdDev": "11.71 ms", + "Median": "1,219.3 ms" }, { "Method": "MSTest", "Version": "4.2.1", - "Mean": "1,149.8 ms", - "Error": "11.18 ms", - "StdDev": "10.45 ms", - "Median": "1,149.1 ms" + "Mean": "1,131.5 ms", + "Error": "8.99 ms", + "StdDev": "7.97 ms", + "Median": "1,134.1 ms" }, { "Method": "xUnit3", "Version": "3.2.2", - "Mean": "1,330.4 ms", - "Error": "12.58 ms", - "StdDev": "11.15 ms", - "Median": "1,329.4 ms" + "Mean": "1,279.6 ms", + "Error": "8.55 ms", + "StdDev": "8.00 ms", + "Median": "1,276.5 ms" }, { "Method": "TUnit_AOT", - "Version": "1.39.0", + "Version": "1.40.0", "Mean": "NA", "Error": "NA", "StdDev": "NA", @@ -263,35 +263,35 @@ "BuildTime": [ { "Method": "Build_TUnit", - "Version": "1.39.0", - "Mean": "1.895 s", - "Error": "0.0347 s", - "StdDev": "0.0324 s", - "Median": "1.910 s" + "Version": "1.40.0", + "Mean": "1.813 s", + "Error": "0.0353 s", + "StdDev": "0.0346 s", + "Median": "1.818 s" }, { "Method": "Build_NUnit", "Version": "4.5.1", - "Mean": "1.697 s", - "Error": "0.0106 s", - "StdDev": "0.0099 s", - "Median": "1.696 s" + "Mean": "1.636 s", + "Error": "0.0203 s", + "StdDev": "0.0190 s", + "Median": "1.640 s" }, { "Method": "Build_MSTest", "Version": "4.2.1", - "Mean": "1.768 s", - "Error": "0.0162 s", - "StdDev": "0.0152 s", - "Median": "1.768 s" + "Mean": "1.697 s", + "Error": "0.0157 s", + "StdDev": "0.0139 s", + "Median": "1.695 s" }, { "Method": "Build_xUnit3", "Version": "3.2.2", - "Mean": "1.701 s", - "Error": "0.0203 s", - "StdDev": "0.0190 s", - "Median": "1.696 s" + "Mean": "1.642 s", + "Error": "0.0320 s", + "StdDev": "0.0356 s", + "Median": "1.646 s" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2026-04-26T00:47:15.569Z" + "lastUpdated": "2026-04-26T23:56:55.720Z" } } \ No newline at end of file