diff --git a/.github/workflows/speed-comparison.yml b/.github/workflows/speed-comparison.yml index 96ae2d33e2..d2adcb9346 100644 --- a/.github/workflows/speed-comparison.yml +++ b/.github/workflows/speed-comparison.yml @@ -8,11 +8,7 @@ on: jobs: build-test-artifacts: environment: ${{ github.ref == 'refs/heads/main' && 'Production' || 'Pull Requests' }} - strategy: - matrix: - os: [ubuntu-latest, windows-latest, macos-latest] - fail-fast: false - runs-on: ${{ matrix.os }} + runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 @@ -34,13 +30,13 @@ jobs: - name: Publish TUnit AOT run: | - dotnet publish -c Release -p:TestFramework=TUNIT -p:Aot=true --runtime ${{ matrix.os == 'windows-latest' && 'win-x64' || matrix.os == 'ubuntu-latest' && 'linux-x64' || 'osx-arm64' }} --output bin/Release-TUNIT-AOT/net10.0 + dotnet publish -c Release -p:TestFramework=TUNIT -p:Aot=true --use-current-runtime --output bin/Release-TUNIT-AOT/net10.0 working-directory: "tools/speed-comparison/UnifiedTests" - name: Upload Build Artifacts uses: actions/upload-artifact@v5 with: - name: test-builds-${{ matrix.os }} + name: test-builds-ubuntu path: tools/speed-comparison/UnifiedTests/bin/ retention-days: 1 @@ -49,12 +45,11 @@ jobs: environment: ${{ github.ref == 'refs/heads/main' && 'Production' || 'Pull Requests' }} strategy: matrix: - os: [ubuntu-latest, windows-latest, macos-latest] - class: [DataDrivenTests, AsyncTests, ScaleTests, MatrixTests, LifecycleTests, MassiveParallelTests] + class: [DataDrivenTests, AsyncTests, ScaleTests, MatrixTests, MassiveParallelTests] fail-fast: false - runs-on: ${{ matrix.os }} + runs-on: ubuntu-latest concurrency: - group: "speed-comparison-run-time-${{matrix.os}}-${{matrix.class}}" + group: "speed-comparison-run-time-${{matrix.class}}" cancel-in-progress: true steps: @@ -70,11 +65,10 @@ jobs: - name: Download Build Artifacts uses: actions/download-artifact@v6 with: - name: test-builds-${{ matrix.os }} + name: test-builds-ubuntu path: tools/speed-comparison/UnifiedTests/bin/ - - name: Set Execute Permissions (Linux/macOS) - if: runner.os != 'Windows' + - name: Set Execute Permissions run: | find tools/speed-comparison/UnifiedTests/bin -type f -name "UnifiedTests" -exec chmod +x {} \; 2>/dev/null || true find tools/speed-comparison/UnifiedTests/bin -type f -name "xunit.v3.runner.console" -exec chmod +x {} \; 2>/dev/null || true @@ -90,21 +84,16 @@ jobs: uses: actions/upload-artifact@v5 if: always() with: - name: ${{ matrix.os }}_markdown_run_time_${{ matrix.class }} + name: ubuntu_markdown_run_time_${{ matrix.class }} path: | **/BenchmarkDotNet.Artifacts/** build-time-benchmarks: environment: ${{ github.ref == 'refs/heads/main' && 'Production' || 'Pull Requests' }} - strategy: - matrix: - os: [ubuntu-latest, windows-latest, macos-latest] - # framework: [net8.0, net9.0] - fail-fast: false - runs-on: ${{ matrix.os }} + runs-on: ubuntu-latest concurrency: - group: "speed-comparison-build-time-${{matrix.os}}" + group: "speed-comparison-build-time" cancel-in-progress: true steps: @@ -130,7 +119,7 @@ jobs: uses: actions/upload-artifact@v5 if: always() with: - name: ${{ matrix.os }}_markdown_build_time + name: ubuntu_markdown_build_time path: | **/BenchmarkDotNet.Artifacts/** diff --git a/Directory.Packages.props b/Directory.Packages.props index e903eca582..b7e54df848 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -83,9 +83,9 @@ - - - + + + diff --git a/TUnit.Engine/Scheduling/TestScheduler.cs b/TUnit.Engine/Scheduling/TestScheduler.cs index 4fe130f97a..0d07540594 100644 --- a/TUnit.Engine/Scheduling/TestScheduler.cs +++ b/TUnit.Engine/Scheduling/TestScheduler.cs @@ -316,14 +316,46 @@ private async Task WaitForTasksWithFailFastHandling(IEnumerable tasks, Can private static int GetMaxParallelism(ILogger logger, ICommandLineOptions commandLineOptions) { - if (!commandLineOptions.TryGetOptionArgumentList( + // Check command line argument first (highest priority) + if (commandLineOptions.TryGetOptionArgumentList( MaximumParallelTestsCommandProvider.MaximumParallelTests, - out var args) || args.Length <= 0 || !int.TryParse(args[0], out var maxParallelTests) || maxParallelTests <= 0) + out var args) && args.Length > 0 && int.TryParse(args[0], out var maxParallelTests)) { - return int.MaxValue; + if (maxParallelTests == 0) + { + // 0 means unlimited (backwards compat for advanced users) + logger.LogDebug("Maximum parallel tests: unlimited (from command line)"); + return int.MaxValue; + } + + if (maxParallelTests > 0) + { + logger.LogDebug($"Maximum parallel tests limit set to {maxParallelTests} (from command line)"); + return maxParallelTests; + } + } + + // Check environment variable (second priority) + if (Environment.GetEnvironmentVariable("TUNIT_MAX_PARALLEL_TESTS") is string envVar + && int.TryParse(envVar, out var envLimit)) + { + if (envLimit == 0) + { + logger.LogDebug("Maximum parallel tests: unlimited (from TUNIT_MAX_PARALLEL_TESTS environment variable)"); + return int.MaxValue; + } + + if (envLimit > 0) + { + logger.LogDebug($"Maximum parallel tests limit set to {envLimit} (from TUNIT_MAX_PARALLEL_TESTS environment variable)"); + return envLimit; + } } - logger.LogDebug($"Maximum parallel tests limit set to {maxParallelTests}"); - return maxParallelTests; + // Default: 4x CPU cores (balances CPU-bound and I/O-bound tests) + // This prevents resource exhaustion (DB connections, memory, etc.) while allowing I/O overlap + var defaultLimit = Environment.ProcessorCount * 4; + logger.LogDebug($"Maximum parallel tests limit defaulting to {defaultLimit} ({Environment.ProcessorCount} processors * 4)"); + return defaultLimit; } } diff --git a/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj b/TUnit.Templates/content/TUnit.AspNet.FSharp/TestProject/TestProject.fsproj index 8e18828a2d..d99ea78447 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 ba023fd72f..a5d0584afe 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 db66778c00..095cfce880 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 75439e4d14..778697668b 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 c739525068..86b4ed7c86 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 077fb150fd..2f9dca5c37 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 7076083044..5aaf9813b0 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 53f327da27..dcdb0ac86c 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/tools/speed-comparison/Tests.Benchmark/BenchmarkConfig.cs b/tools/speed-comparison/Tests.Benchmark/BenchmarkConfig.cs index 5c0eff4abc..bf8b669662 100644 --- a/tools/speed-comparison/Tests.Benchmark/BenchmarkConfig.cs +++ b/tools/speed-comparison/Tests.Benchmark/BenchmarkConfig.cs @@ -4,6 +4,7 @@ using BenchmarkDotNet.Exporters; using BenchmarkDotNet.Jobs; using BenchmarkDotNet.Loggers; +using Perfolizer.Mathematics.OutlierDetection; namespace Tests.Benchmark; @@ -11,7 +12,13 @@ public class BenchmarkConfig : ManualConfig { public BenchmarkConfig() { - AddJob(Job.Default.WithRuntime(CoreRuntime.Core10_0)); + var job = Job.RyuJitX64 + .WithRuntime(CoreRuntime.Core10_0) + .WithGcConcurrent(true) + .WithGcServer(true) + .DontEnforcePowerPlan(); + + AddJob(job); AddLogger(ConsoleLogger.Default); AddExporter(MarkdownExporter.GitHub); diff --git a/tools/speed-comparison/UnifiedTests/ConstructorCostTests.cs b/tools/speed-comparison/UnifiedTests/ConstructorCostTests.cs deleted file mode 100644 index e7be0aa25c..0000000000 --- a/tools/speed-comparison/UnifiedTests/ConstructorCostTests.cs +++ /dev/null @@ -1,526 +0,0 @@ -using System.Text.Json; -using System.Threading.Tasks; - -namespace UnifiedTests; - -/// -/// Tests measuring the overhead of expensive constructor initialization. -/// All tests in this class share the same constructor, allowing measurement -/// of per-class initialization cost amortized across multiple tests. -/// -#if MSTEST -[TestClass] -public class ConstructorCostTests -#elif NUNIT -[TestFixture] -public class ConstructorCostTests -#elif XUNIT || XUNIT3 -public class ConstructorCostTests -#else -public class ConstructorCostTests -#endif -{ - private readonly Dictionary _configCache; - private readonly List _processedData; - private readonly HashSet _indexLookup; - private readonly string _serializedConfig; - private readonly int _totalRecords; - - public ConstructorCostTests() - { - // Simulate expensive constructor initialization - // Realistic work: JSON parsing, collection building, computation - - // Build configuration cache (simulates loading config) - _configCache = []; - for (var i = 0; i < 50; i++) - { - var config = new - { - Id = i, - Name = $"Config_{i}", - Enabled = i % 2 == 0, - Priority = i * 10, - Tags = new[] { $"tag_{i}", $"category_{i % 5}" }, - Timestamp = DateTime.UtcNow.Ticks - }; - _configCache[$"config_{i}"] = config; - } - - // Process and cache data (simulates data transformation) - _processedData = []; - for (var i = 0; i < 100; i++) - { - var data = $"Record_{i}_Data_{Guid.NewGuid().ToString()[..8]}"; - var processed = data.ToUpperInvariant() + $"_Processed_{i * 2}"; - _processedData.Add(processed); - } - - // Build index lookup (simulates index creation) - _indexLookup = []; - for (var i = 0; i < 100; i++) - { - _indexLookup.Add(i * 3); - } - - // Serialize configuration (simulates config serialization) - _serializedConfig = JsonSerializer.Serialize(_configCache); - - _totalRecords = _processedData.Count; - } - -#if TUNIT - [Test] - public async Task Constructor_Test_AccessConfigCache() -#elif XUNIT || XUNIT3 - [Fact] - public void Constructor_Test_AccessConfigCache() -#elif NUNIT - [Test] - public void Constructor_Test_AccessConfigCache() -#elif MSTEST - [TestMethod] - public void Constructor_Test_AccessConfigCache() -#endif - { - var config = _configCache["config_10"]; - -#if TUNIT - await Assert.That(config).IsNotNull(); - await Assert.That(_configCache).HasCount(50); -#elif XUNIT || XUNIT3 - Assert.NotNull(config); - Assert.Equal(50, _configCache.Count); -#elif NUNIT - Assert.That(config, Is.Not.Null); - Assert.That(_configCache.Count, Is.EqualTo(50)); -#elif MSTEST - Assert.IsNotNull(config); - Assert.AreEqual(50, _configCache.Count); -#endif - } - -#if TUNIT - [Test] - public async Task Constructor_Test_AccessProcessedData() -#elif XUNIT || XUNIT3 - [Fact] - public void Constructor_Test_AccessProcessedData() -#elif NUNIT - [Test] - public void Constructor_Test_AccessProcessedData() -#elif MSTEST - [TestMethod] - public void Constructor_Test_AccessProcessedData() -#endif - { - var firstRecord = _processedData[0]; - -#if TUNIT - await Assert.That(firstRecord).Contains("RECORD_0"); - await Assert.That(firstRecord).Contains("Processed_0"); -#elif XUNIT || XUNIT3 - Assert.Contains("RECORD_0", firstRecord); - Assert.Contains("Processed_0", firstRecord); -#elif NUNIT - Assert.That(firstRecord, Does.Contain("RECORD_0")); - Assert.That(firstRecord, Does.Contain("Processed_0")); -#elif MSTEST - Assert.IsTrue(firstRecord.Contains("RECORD_0")); - Assert.IsTrue(firstRecord.Contains("Processed_0")); -#endif - } - -#if TUNIT - [Test] - public async Task Constructor_Test_IndexLookup() -#elif XUNIT || XUNIT3 - [Fact] - public void Constructor_Test_IndexLookup() -#elif NUNIT - [Test] - public void Constructor_Test_IndexLookup() -#elif MSTEST - [TestMethod] - public void Constructor_Test_IndexLookup() -#endif - { - var hasValue = _indexLookup.Contains(15); - -#if TUNIT - await Assert.That(hasValue).IsTrue(); - await Assert.That(_indexLookup).HasCount(100); -#elif XUNIT || XUNIT3 - Assert.True(hasValue); - Assert.Equal(100, _indexLookup.Count); -#elif NUNIT - Assert.That(hasValue, Is.True); - Assert.That(_indexLookup.Count, Is.EqualTo(100)); -#elif MSTEST - Assert.IsTrue(hasValue); - Assert.AreEqual(100, _indexLookup.Count); -#endif - } - -#if TUNIT - [Test] - public async Task Constructor_Test_SerializedConfig() -#elif XUNIT || XUNIT3 - [Fact] - public void Constructor_Test_SerializedConfig() -#elif NUNIT - [Test] - public void Constructor_Test_SerializedConfig() -#elif MSTEST - [TestMethod] - public void Constructor_Test_SerializedConfig() -#endif - { - var isValid = _serializedConfig.Length > 100; - -#if TUNIT - await Assert.That(_serializedConfig).IsNotEmpty(); - await Assert.That(isValid).IsTrue(); -#elif XUNIT || XUNIT3 - Assert.NotEmpty(_serializedConfig); - Assert.True(isValid); -#elif NUNIT - Assert.That(_serializedConfig, Is.Not.Empty); - Assert.That(isValid, Is.True); -#elif MSTEST - Assert.IsTrue(_serializedConfig.Length > 0); - Assert.IsTrue(isValid); -#endif - } - -#if TUNIT - [Test] - public async Task Constructor_Test_TotalRecords() -#elif XUNIT || XUNIT3 - [Fact] - public void Constructor_Test_TotalRecords() -#elif NUNIT - [Test] - public void Constructor_Test_TotalRecords() -#elif MSTEST - [TestMethod] - public void Constructor_Test_TotalRecords() -#endif - { -#if TUNIT - await Assert.That(_totalRecords).IsEqualTo(100); - await Assert.That(_processedData).HasCount(_totalRecords); -#elif XUNIT || XUNIT3 - Assert.Equal(100, _totalRecords); - Assert.Equal(_totalRecords, _processedData.Count); -#elif NUNIT - Assert.That(_totalRecords, Is.EqualTo(100)); - Assert.That(_processedData.Count, Is.EqualTo(_totalRecords)); -#elif MSTEST - Assert.AreEqual(100, _totalRecords); - Assert.AreEqual(_totalRecords, _processedData.Count); -#endif - } - -#if TUNIT - [Test] - public async Task Constructor_Test_DataRange() -#elif XUNIT || XUNIT3 - [Fact] - public void Constructor_Test_DataRange() -#elif NUNIT - [Test] - public void Constructor_Test_DataRange() -#elif MSTEST - [TestMethod] - public void Constructor_Test_DataRange() -#endif - { - var midRecord = _processedData[50]; - -#if TUNIT - await Assert.That(midRecord).Contains("RECORD_50"); - await Assert.That(midRecord).IsNotEmpty(); -#elif XUNIT || XUNIT3 - Assert.Contains("RECORD_50", midRecord); - Assert.NotEmpty(midRecord); -#elif NUNIT - Assert.That(midRecord, Does.Contain("RECORD_50")); - Assert.That(midRecord, Is.Not.Empty); -#elif MSTEST - Assert.IsTrue(midRecord.Contains("RECORD_50")); - Assert.IsTrue(midRecord.Length > 0); -#endif - } - -#if TUNIT - [Test] - public async Task Constructor_Test_ConfigLookup() -#elif XUNIT || XUNIT3 - [Fact] - public void Constructor_Test_ConfigLookup() -#elif NUNIT - [Test] - public void Constructor_Test_ConfigLookup() -#elif MSTEST - [TestMethod] - public void Constructor_Test_ConfigLookup() -#endif - { - var hasKey = _configCache.ContainsKey("config_25"); - -#if TUNIT - await Assert.That(hasKey).IsTrue(); - await Assert.That(_configCache["config_25"]).IsNotNull(); -#elif XUNIT || XUNIT3 - Assert.True(hasKey); - Assert.NotNull(_configCache["config_25"]); -#elif NUNIT - Assert.That(hasKey, Is.True); - Assert.That(_configCache["config_25"], Is.Not.Null); -#elif MSTEST - Assert.IsTrue(hasKey); - Assert.IsNotNull(_configCache["config_25"]); -#endif - } - -#if TUNIT - [Test] - public async Task Constructor_Test_IndexContains() -#elif XUNIT || XUNIT3 - [Fact] - public void Constructor_Test_IndexContains() -#elif NUNIT - [Test] - public void Constructor_Test_IndexContains() -#elif MSTEST - [TestMethod] - public void Constructor_Test_IndexContains() -#endif - { - var contains30 = _indexLookup.Contains(30); - var contains99 = _indexLookup.Contains(99); - -#if TUNIT - await Assert.That(contains30).IsTrue(); - await Assert.That(contains99).IsTrue(); -#elif XUNIT || XUNIT3 - Assert.True(contains30); - Assert.True(contains99); -#elif NUNIT - Assert.That(contains30, Is.True); - Assert.That(contains99, Is.True); -#elif MSTEST - Assert.IsTrue(contains30); - Assert.IsTrue(contains99); -#endif - } - -#if TUNIT - [Test] - public async Task Constructor_Test_DataEndRange() -#elif XUNIT || XUNIT3 - [Fact] - public void Constructor_Test_DataEndRange() -#elif NUNIT - [Test] - public void Constructor_Test_DataEndRange() -#elif MSTEST - [TestMethod] - public void Constructor_Test_DataEndRange() -#endif - { - var lastRecord = _processedData[^1]; - -#if TUNIT - await Assert.That(lastRecord).Contains("RECORD_99"); - await Assert.That(lastRecord).Contains("Processed_198"); -#elif XUNIT || XUNIT3 - Assert.Contains("RECORD_99", lastRecord); - Assert.Contains("Processed_198", lastRecord); -#elif NUNIT - Assert.That(lastRecord, Does.Contain("RECORD_99")); - Assert.That(lastRecord, Does.Contain("Processed_198")); -#elif MSTEST - Assert.IsTrue(lastRecord.Contains("RECORD_99")); - Assert.IsTrue(lastRecord.Contains("Processed_198")); -#endif - } - -#if TUNIT - [Test] - public async Task Constructor_Test_ConfigRange() -#elif XUNIT || XUNIT3 - [Fact] - public void Constructor_Test_ConfigRange() -#elif NUNIT - [Test] - public void Constructor_Test_ConfigRange() -#elif MSTEST - [TestMethod] - public void Constructor_Test_ConfigRange() -#endif - { - var firstConfig = _configCache["config_0"]; - var lastConfig = _configCache["config_49"]; - -#if TUNIT - await Assert.That(firstConfig).IsNotNull(); - await Assert.That(lastConfig).IsNotNull(); -#elif XUNIT || XUNIT3 - Assert.NotNull(firstConfig); - Assert.NotNull(lastConfig); -#elif NUNIT - Assert.That(firstConfig, Is.Not.Null); - Assert.That(lastConfig, Is.Not.Null); -#elif MSTEST - Assert.IsNotNull(firstConfig); - Assert.IsNotNull(lastConfig); -#endif - } - -#if TUNIT - [Test] - public async Task Constructor_Test_IndexMax() -#elif XUNIT || XUNIT3 - [Fact] - public void Constructor_Test_IndexMax() -#elif NUNIT - [Test] - public void Constructor_Test_IndexMax() -#elif MSTEST - [TestMethod] - public void Constructor_Test_IndexMax() -#endif - { - var maxValue = _indexLookup.Max(); - -#if TUNIT - await Assert.That(maxValue).IsEqualTo(297); -#elif XUNIT || XUNIT3 - Assert.Equal(297, maxValue); -#elif NUNIT - Assert.That(maxValue, Is.EqualTo(297)); -#elif MSTEST - Assert.AreEqual(297, maxValue); -#endif - } - -#if TUNIT - [Test] - public async Task Constructor_Test_SerializedLength() -#elif XUNIT || XUNIT3 - [Fact] - public void Constructor_Test_SerializedLength() -#elif NUNIT - [Test] - public void Constructor_Test_SerializedLength() -#elif MSTEST - [TestMethod] - public void Constructor_Test_SerializedLength() -#endif - { - var length = _serializedConfig.Length; - var hasContent = length > 1000; - -#if TUNIT - await Assert.That(hasContent).IsTrue(); -#elif XUNIT || XUNIT3 - Assert.True(hasContent); -#elif NUNIT - Assert.That(hasContent, Is.True); -#elif MSTEST - Assert.IsTrue(hasContent); -#endif - } - -#if TUNIT - [Test] - public async Task Constructor_Test_DataConsistency() -#elif XUNIT || XUNIT3 - [Fact] - public void Constructor_Test_DataConsistency() -#elif NUNIT - [Test] - public void Constructor_Test_DataConsistency() -#elif MSTEST - [TestMethod] - public void Constructor_Test_DataConsistency() -#endif - { - var allProcessed = _processedData.All(d => d.Contains("Processed_")); - -#if TUNIT - await Assert.That(allProcessed).IsTrue(); - await Assert.That(_processedData).IsNotEmpty(); -#elif XUNIT || XUNIT3 - Assert.True(allProcessed); - Assert.NotEmpty(_processedData); -#elif NUNIT - Assert.That(allProcessed, Is.True); - Assert.That(_processedData, Is.Not.Empty); -#elif MSTEST - Assert.IsTrue(allProcessed); - Assert.IsTrue(_processedData.Count > 0); -#endif - } - -#if TUNIT - [Test] - public async Task Constructor_Test_IndexMin() -#elif XUNIT || XUNIT3 - [Fact] - public void Constructor_Test_IndexMin() -#elif NUNIT - [Test] - public void Constructor_Test_IndexMin() -#elif MSTEST - [TestMethod] - public void Constructor_Test_IndexMin() -#endif - { - var minValue = _indexLookup.Min(); - -#if TUNIT - await Assert.That(minValue).IsEqualTo(0); -#elif XUNIT || XUNIT3 - Assert.Equal(0, minValue); -#elif NUNIT - Assert.That(minValue, Is.EqualTo(0)); -#elif MSTEST - Assert.AreEqual(0, minValue); -#endif - } - -#if TUNIT - [Test] - public async Task Constructor_Test_ConfigCount() -#elif XUNIT || XUNIT3 - [Fact] - public void Constructor_Test_ConfigCount() -#elif NUNIT - [Test] - public void Constructor_Test_ConfigCount() -#elif MSTEST - [TestMethod] - public void Constructor_Test_ConfigCount() -#endif - { - var count = _configCache.Count; - var keysValid = _configCache.Keys.All(k => k.StartsWith("config_")); - -#if TUNIT - await Assert.That(count).IsEqualTo(50); - await Assert.That(keysValid).IsTrue(); -#elif XUNIT || XUNIT3 - Assert.Equal(50, count); - Assert.True(keysValid); -#elif NUNIT - Assert.That(count, Is.EqualTo(50)); - Assert.That(keysValid, Is.True); -#elif MSTEST - Assert.AreEqual(50, count); - Assert.IsTrue(keysValid); -#endif - } -} diff --git a/tools/speed-comparison/UnifiedTests/PerTestFixtureTests.cs b/tools/speed-comparison/UnifiedTests/PerTestFixtureTests.cs deleted file mode 100644 index 53c18649b1..0000000000 --- a/tools/speed-comparison/UnifiedTests/PerTestFixtureTests.cs +++ /dev/null @@ -1,493 +0,0 @@ -using System.Text.Json; -using System.Threading.Tasks; - -namespace UnifiedTests; - -/// -/// Tests measuring the overhead of per-test isolated fixture creation. -/// Each test gets its own fresh fixture instance, simulating scenarios -/// where tests require isolated state and cannot share resources. -/// -#if MSTEST -[TestClass] -public class PerTestFixtureTests : IDisposable -#elif NUNIT -[TestFixture] -public class PerTestFixtureTests : IDisposable -#elif XUNIT || XUNIT3 -public class PerTestFixtureTests : IDisposable -#else -public class PerTestFixtureTests : IDisposable -#endif -{ - private Dictionary _testCache; - private List _processedItems; - private HashSet _usedIds; - private string _testId; - - public PerTestFixtureTests() - { - // Per-test initialization - each test gets a fresh fixture - // Simulates scenarios requiring isolation (e.g., database transactions, file handles) - - _testId = Guid.NewGuid().ToString()[..8]; - _testCache = []; - _processedItems = []; - _usedIds = []; - - // Initialize test-specific data - for (var i = 0; i < 30; i++) - { - _testCache[$"item_{i}"] = i * 10; - _usedIds.Add(i); - } - - // Process some initial data - for (var i = 0; i < 20; i++) - { - var item = $"TestData_{_testId}_{i}_{DateTime.UtcNow.Ticks % 1000}"; - _processedItems.Add(item); - } - } - - public void Dispose() - { - // Cleanup per-test resources - _testCache?.Clear(); - _processedItems?.Clear(); - _usedIds?.Clear(); - } - -#if TUNIT - [Test] - public async Task PerTestFixture_Test1() -#elif XUNIT || XUNIT3 - [Fact] - public void PerTestFixture_Test1() -#elif NUNIT - [Test] - public void PerTestFixture_Test1() -#elif MSTEST - [TestMethod] - public void PerTestFixture_Test1() -#endif - { - var value = _testCache["item_5"]; - -#if TUNIT - await Assert.That(value).IsEqualTo(50); - await Assert.That(_testCache).HasCount(30); -#elif XUNIT || XUNIT3 - Assert.Equal(50, value); - Assert.Equal(30, _testCache.Count); -#elif NUNIT - Assert.That(value, Is.EqualTo(50)); - Assert.That(_testCache.Count, Is.EqualTo(30)); -#elif MSTEST - Assert.AreEqual(50, value); - Assert.AreEqual(30, _testCache.Count); -#endif - } - -#if TUNIT - [Test] - public async Task PerTestFixture_Test2() -#elif XUNIT || XUNIT3 - [Fact] - public void PerTestFixture_Test2() -#elif NUNIT - [Test] - public void PerTestFixture_Test2() -#elif MSTEST - [TestMethod] - public void PerTestFixture_Test2() -#endif - { - var count = _processedItems.Count; - -#if TUNIT - await Assert.That(count).IsEqualTo(20); - await Assert.That(_processedItems[0]).Contains(_testId); -#elif XUNIT || XUNIT3 - Assert.Equal(20, count); - Assert.Contains(_testId, _processedItems[0]); -#elif NUNIT - Assert.That(count, Is.EqualTo(20)); - Assert.That(_processedItems[0], Does.Contain(_testId)); -#elif MSTEST - Assert.AreEqual(20, count); - Assert.IsTrue(_processedItems[0].Contains(_testId)); -#endif - } - -#if TUNIT - [Test] - public async Task PerTestFixture_Test3() -#elif XUNIT || XUNIT3 - [Fact] - public void PerTestFixture_Test3() -#elif NUNIT - [Test] - public void PerTestFixture_Test3() -#elif MSTEST - [TestMethod] - public void PerTestFixture_Test3() -#endif - { - var hasId = _usedIds.Contains(15); - -#if TUNIT - await Assert.That(hasId).IsTrue(); - await Assert.That(_usedIds).HasCount(30); -#elif XUNIT || XUNIT3 - Assert.True(hasId); - Assert.Equal(30, _usedIds.Count); -#elif NUNIT - Assert.That(hasId, Is.True); - Assert.That(_usedIds.Count, Is.EqualTo(30)); -#elif MSTEST - Assert.IsTrue(hasId); - Assert.AreEqual(30, _usedIds.Count); -#endif - } - -#if TUNIT - [Test] - public async Task PerTestFixture_Test4() -#elif XUNIT || XUNIT3 - [Fact] - public void PerTestFixture_Test4() -#elif NUNIT - [Test] - public void PerTestFixture_Test4() -#elif MSTEST - [TestMethod] - public void PerTestFixture_Test4() -#endif - { - var testIdLength = _testId.Length; - -#if TUNIT - await Assert.That(testIdLength).IsEqualTo(8); - await Assert.That(_testId).IsNotEmpty(); -#elif XUNIT || XUNIT3 - Assert.Equal(8, testIdLength); - Assert.NotEmpty(_testId); -#elif NUNIT - Assert.That(testIdLength, Is.EqualTo(8)); - Assert.That(_testId, Is.Not.Empty); -#elif MSTEST - Assert.AreEqual(8, testIdLength); - Assert.IsTrue(_testId.Length > 0); -#endif - } - -#if TUNIT - [Test] - public async Task PerTestFixture_Test5() -#elif XUNIT || XUNIT3 - [Fact] - public void PerTestFixture_Test5() -#elif NUNIT - [Test] - public void PerTestFixture_Test5() -#elif MSTEST - [TestMethod] - public void PerTestFixture_Test5() -#endif - { - var sum = _testCache.Values.Sum(); - -#if TUNIT - await Assert.That(sum).IsEqualTo(4350); -#elif XUNIT || XUNIT3 - Assert.Equal(4350, sum); -#elif NUNIT - Assert.That(sum, Is.EqualTo(4350)); -#elif MSTEST - Assert.AreEqual(4350, sum); -#endif - } - -#if TUNIT - [Test] - public async Task PerTestFixture_Test6() -#elif XUNIT || XUNIT3 - [Fact] - public void PerTestFixture_Test6() -#elif NUNIT - [Test] - public void PerTestFixture_Test6() -#elif MSTEST - [TestMethod] - public void PerTestFixture_Test6() -#endif - { - var lastItem = _processedItems[^1]; - -#if TUNIT - await Assert.That(lastItem).Contains("TestData_"); - await Assert.That(lastItem).Contains(_testId); -#elif XUNIT || XUNIT3 - Assert.Contains("TestData_", lastItem); - Assert.Contains(_testId, lastItem); -#elif NUNIT - Assert.That(lastItem, Does.Contain("TestData_")); - Assert.That(lastItem, Does.Contain(_testId)); -#elif MSTEST - Assert.IsTrue(lastItem.Contains("TestData_")); - Assert.IsTrue(lastItem.Contains(_testId)); -#endif - } - -#if TUNIT - [Test] - public async Task PerTestFixture_Test7() -#elif XUNIT || XUNIT3 - [Fact] - public void PerTestFixture_Test7() -#elif NUNIT - [Test] - public void PerTestFixture_Test7() -#elif MSTEST - [TestMethod] - public void PerTestFixture_Test7() -#endif - { - var maxId = _usedIds.Max(); - -#if TUNIT - await Assert.That(maxId).IsEqualTo(29); -#elif XUNIT || XUNIT3 - Assert.Equal(29, maxId); -#elif NUNIT - Assert.That(maxId, Is.EqualTo(29)); -#elif MSTEST - Assert.AreEqual(29, maxId); -#endif - } - -#if TUNIT - [Test] - public async Task PerTestFixture_Test8() -#elif XUNIT || XUNIT3 - [Fact] - public void PerTestFixture_Test8() -#elif NUNIT - [Test] - public void PerTestFixture_Test8() -#elif MSTEST - [TestMethod] - public void PerTestFixture_Test8() -#endif - { - var hasKey = _testCache.ContainsKey("item_20"); - -#if TUNIT - await Assert.That(hasKey).IsTrue(); - await Assert.That(_testCache["item_20"]).IsEqualTo(200); -#elif XUNIT || XUNIT3 - Assert.True(hasKey); - Assert.Equal(200, _testCache["item_20"]); -#elif NUNIT - Assert.That(hasKey, Is.True); - Assert.That(_testCache["item_20"], Is.EqualTo(200)); -#elif MSTEST - Assert.IsTrue(hasKey); - Assert.AreEqual(200, _testCache["item_20"]); -#endif - } - -#if TUNIT - [Test] - public async Task PerTestFixture_Test9() -#elif XUNIT || XUNIT3 - [Fact] - public void PerTestFixture_Test9() -#elif NUNIT - [Test] - public void PerTestFixture_Test9() -#elif MSTEST - [TestMethod] - public void PerTestFixture_Test9() -#endif - { - var allContainTestId = _processedItems.All(item => item.Contains(_testId)); - -#if TUNIT - await Assert.That(allContainTestId).IsTrue(); -#elif XUNIT || XUNIT3 - Assert.True(allContainTestId); -#elif NUNIT - Assert.That(allContainTestId, Is.True); -#elif MSTEST - Assert.IsTrue(allContainTestId); -#endif - } - -#if TUNIT - [Test] - public async Task PerTestFixture_Test10() -#elif XUNIT || XUNIT3 - [Fact] - public void PerTestFixture_Test10() -#elif NUNIT - [Test] - public void PerTestFixture_Test10() -#elif MSTEST - [TestMethod] - public void PerTestFixture_Test10() -#endif - { - var minId = _usedIds.Min(); - -#if TUNIT - await Assert.That(minId).IsEqualTo(0); -#elif XUNIT || XUNIT3 - Assert.Equal(0, minId); -#elif NUNIT - Assert.That(minId, Is.EqualTo(0)); -#elif MSTEST - Assert.AreEqual(0, minId); -#endif - } - -#if TUNIT - [Test] - public async Task PerTestFixture_Test11() -#elif XUNIT || XUNIT3 - [Fact] - public void PerTestFixture_Test11() -#elif NUNIT - [Test] - public void PerTestFixture_Test11() -#elif MSTEST - [TestMethod] - public void PerTestFixture_Test11() -#endif - { - var firstValue = _testCache["item_0"]; - -#if TUNIT - await Assert.That(firstValue).IsEqualTo(0); -#elif XUNIT || XUNIT3 - Assert.Equal(0, firstValue); -#elif NUNIT - Assert.That(firstValue, Is.EqualTo(0)); -#elif MSTEST - Assert.AreEqual(0, firstValue); -#endif - } - -#if TUNIT - [Test] - public async Task PerTestFixture_Test12() -#elif XUNIT || XUNIT3 - [Fact] - public void PerTestFixture_Test12() -#elif NUNIT - [Test] - public void PerTestFixture_Test12() -#elif MSTEST - [TestMethod] - public void PerTestFixture_Test12() -#endif - { - var avg = _testCache.Values.Average(); - -#if TUNIT - await Assert.That(avg).IsEqualTo(145.0); -#elif XUNIT || XUNIT3 - Assert.Equal(145.0, avg); -#elif NUNIT - Assert.That(avg, Is.EqualTo(145.0)); -#elif MSTEST - Assert.AreEqual(145.0, avg); -#endif - } - -#if TUNIT - [Test] - public async Task PerTestFixture_Test13() -#elif XUNIT || XUNIT3 - [Fact] - public void PerTestFixture_Test13() -#elif NUNIT - [Test] - public void PerTestFixture_Test13() -#elif MSTEST - [TestMethod] - public void PerTestFixture_Test13() -#endif - { - var firstItem = _processedItems[0]; - -#if TUNIT - await Assert.That(firstItem).StartsWith("TestData_"); -#elif XUNIT || XUNIT3 - Assert.StartsWith("TestData_", firstItem); -#elif NUNIT - Assert.That(firstItem, Does.StartWith("TestData_")); -#elif MSTEST - Assert.IsTrue(firstItem.StartsWith("TestData_")); -#endif - } - -#if TUNIT - [Test] - public async Task PerTestFixture_Test14() -#elif XUNIT || XUNIT3 - [Fact] - public void PerTestFixture_Test14() -#elif NUNIT - [Test] - public void PerTestFixture_Test14() -#elif MSTEST - [TestMethod] - public void PerTestFixture_Test14() -#endif - { - var lastValue = _testCache["item_29"]; - -#if TUNIT - await Assert.That(lastValue).IsEqualTo(290); -#elif XUNIT || XUNIT3 - Assert.Equal(290, lastValue); -#elif NUNIT - Assert.That(lastValue, Is.EqualTo(290)); -#elif MSTEST - Assert.AreEqual(290, lastValue); -#endif - } - -#if TUNIT - [Test] - public async Task PerTestFixture_Test15() -#elif XUNIT || XUNIT3 - [Fact] - public void PerTestFixture_Test15() -#elif NUNIT - [Test] - public void PerTestFixture_Test15() -#elif MSTEST - [TestMethod] - public void PerTestFixture_Test15() -#endif - { - var keys = _testCache.Keys.ToList(); - -#if TUNIT - await Assert.That(keys).HasCount(30); - await Assert.That(keys.All(k => k.StartsWith("item_"))).IsTrue(); -#elif XUNIT || XUNIT3 - Assert.Equal(30, keys.Count); - Assert.True(keys.All(k => k.StartsWith("item_"))); -#elif NUNIT - Assert.That(keys.Count, Is.EqualTo(30)); - Assert.That(keys.All(k => k.StartsWith("item_")), Is.True); -#elif MSTEST - Assert.AreEqual(30, keys.Count); - Assert.IsTrue(keys.All(k => k.StartsWith("item_"))); -#endif - } -} diff --git a/tools/speed-comparison/UnifiedTests/SetupTeardownTests.cs b/tools/speed-comparison/UnifiedTests/SetupTeardownTests.cs deleted file mode 100644 index d550afea0a..0000000000 --- a/tools/speed-comparison/UnifiedTests/SetupTeardownTests.cs +++ /dev/null @@ -1,611 +0,0 @@ -using System.Threading.Tasks; - -namespace UnifiedTests; - -/// -/// Tests measuring the overhead of setup and teardown lifecycle hooks. -/// Each test goes through setup before execution and teardown after, -/// allowing measurement of per-test lifecycle hook overhead. -/// -#if MSTEST -[TestClass] -public class SetupTeardownTests : IDisposable -#elif NUNIT -[TestFixture] -public class SetupTeardownTests : IDisposable -#elif XUNIT || XUNIT3 -public class SetupTeardownTests : IDisposable -#else -public class SetupTeardownTests : IDisposable -#endif -{ - private Dictionary _testState; - private List _workingData; - private HashSet _processedKeys; - private int _setupCounter; - - public SetupTeardownTests() - { - // Lightweight constructor - just initialize empty collections - _testState = []; - _workingData = []; - _processedKeys = []; - _setupCounter = 0; - } - -#if !XUNIT && !XUNIT3 -#if TUNIT - [Before(Test)] -#elif MSTEST - [TestInitialize] -#elif NUNIT - [SetUp] -#endif - public void Setup() - { - // Reset and prepare state for each test - _testState.Clear(); - _workingData.Clear(); - _processedKeys.Clear(); - - // Simulate realistic setup work - for (var i = 0; i < 20; i++) - { - _testState[$"key_{i}"] = $"value_{i}_{Guid.NewGuid().ToString()[..8]}"; - _workingData.Add(i * 10); - } - - _setupCounter++; - } -#else - // xUnit doesn't have per-test setup - constructor is called per test - // This creates a fair comparison of lifecycle overhead - private void Setup() - { - // Reset and prepare state for each test - _testState.Clear(); - _workingData.Clear(); - _processedKeys.Clear(); - - // Simulate realistic setup work - for (var i = 0; i < 20; i++) - { - _testState[$"key_{i}"] = $"value_{i}_{Guid.NewGuid().ToString()[..8]}"; - _workingData.Add(i * 10); - } - - _setupCounter++; - } -#endif - -#if !XUNIT && !XUNIT3 -#if TUNIT - [After(Test)] -#elif MSTEST - [TestCleanup] -#elif NUNIT - [TearDown] -#endif - public void Teardown() - { - // Actual cleanup work - _testState.Clear(); - _workingData.Clear(); - _processedKeys.Clear(); - } -#endif - - public void Dispose() - { -#if XUNIT || XUNIT3 - // For xUnit, Dispose is called after each test - _testState?.Clear(); - _workingData?.Clear(); - _processedKeys?.Clear(); -#else - // For other frameworks, cleanup happens in class disposal - _testState?.Clear(); - _workingData?.Clear(); - _processedKeys?.Clear(); -#endif - } - -#if TUNIT - [Test] - public async Task SetupTeardown_Test1() -#elif XUNIT || XUNIT3 - [Fact] - public void SetupTeardown_Test1() -#elif NUNIT - [Test] - public void SetupTeardown_Test1() -#elif MSTEST - [TestMethod] - public void SetupTeardown_Test1() -#endif - { -#if XUNIT || XUNIT3 - // Simulate setup for xUnit to maintain fairness - Setup(); -#endif - - var value = _testState.GetValueOrDefault("key_5", ""); - -#if TUNIT - await Assert.That(value).IsNotEmpty(); - await Assert.That(value).StartsWith("value_5"); -#elif XUNIT || XUNIT3 - Assert.NotEmpty(value); - Assert.StartsWith("value_5", value); -#elif NUNIT - Assert.That(value, Is.Not.Empty); - Assert.That(value, Does.StartWith("value_5")); -#elif MSTEST - Assert.IsTrue(value.Length > 0); - Assert.IsTrue(value.StartsWith("value_5")); -#endif - } - -#if TUNIT - [Test] - public async Task SetupTeardown_Test2() -#elif XUNIT || XUNIT3 - [Fact] - public void SetupTeardown_Test2() -#elif NUNIT - [Test] - public void SetupTeardown_Test2() -#elif MSTEST - [TestMethod] - public void SetupTeardown_Test2() -#endif - { -#if XUNIT || XUNIT3 - Setup(); -#endif - - var count = _workingData.Count; - -#if TUNIT - await Assert.That(count).IsEqualTo(20); - await Assert.That(_workingData[0]).IsEqualTo(0); -#elif XUNIT || XUNIT3 - Assert.Equal(20, count); - Assert.Equal(0, _workingData[0]); -#elif NUNIT - Assert.That(count, Is.EqualTo(20)); - Assert.That(_workingData[0], Is.EqualTo(0)); -#elif MSTEST - Assert.AreEqual(20, count); - Assert.AreEqual(0, _workingData[0]); -#endif - } - -#if TUNIT - [Test] - public async Task SetupTeardown_Test3() -#elif XUNIT || XUNIT3 - [Fact] - public void SetupTeardown_Test3() -#elif NUNIT - [Test] - public void SetupTeardown_Test3() -#elif MSTEST - [TestMethod] - public void SetupTeardown_Test3() -#endif - { -#if XUNIT || XUNIT3 - Setup(); -#endif - - _processedKeys.Add("test_key_1"); - _processedKeys.Add("test_key_2"); - -#if TUNIT - await Assert.That(_processedKeys).HasCount(2); - await Assert.That(_processedKeys.Contains("test_key_1")).IsTrue(); -#elif XUNIT || XUNIT3 - Assert.Equal(2, _processedKeys.Count); - Assert.True(_processedKeys.Contains("test_key_1")); -#elif NUNIT - Assert.That(_processedKeys.Count, Is.EqualTo(2)); - Assert.That(_processedKeys.Contains("test_key_1"), Is.True); -#elif MSTEST - Assert.AreEqual(2, _processedKeys.Count); - Assert.IsTrue(_processedKeys.Contains("test_key_1")); -#endif - } - -#if TUNIT - [Test] - public async Task SetupTeardown_Test4() -#elif XUNIT || XUNIT3 - [Fact] - public void SetupTeardown_Test4() -#elif NUNIT - [Test] - public void SetupTeardown_Test4() -#elif MSTEST - [TestMethod] - public void SetupTeardown_Test4() -#endif - { -#if XUNIT || XUNIT3 - Setup(); -#endif - - var lastValue = _workingData[^1]; - -#if TUNIT - await Assert.That(lastValue).IsEqualTo(190); -#elif XUNIT || XUNIT3 - Assert.Equal(190, lastValue); -#elif NUNIT - Assert.That(lastValue, Is.EqualTo(190)); -#elif MSTEST - Assert.AreEqual(190, lastValue); -#endif - } - -#if TUNIT - [Test] - public async Task SetupTeardown_Test5() -#elif XUNIT || XUNIT3 - [Fact] - public void SetupTeardown_Test5() -#elif NUNIT - [Test] - public void SetupTeardown_Test5() -#elif MSTEST - [TestMethod] - public void SetupTeardown_Test5() -#endif - { -#if XUNIT || XUNIT3 - Setup(); -#endif - - var hasKey = _testState.ContainsKey("key_10"); - -#if TUNIT - await Assert.That(hasKey).IsTrue(); - await Assert.That(_testState).HasCount(20); -#elif XUNIT || XUNIT3 - Assert.True(hasKey); - Assert.Equal(20, _testState.Count); -#elif NUNIT - Assert.That(hasKey, Is.True); - Assert.That(_testState.Count, Is.EqualTo(20)); -#elif MSTEST - Assert.IsTrue(hasKey); - Assert.AreEqual(20, _testState.Count); -#endif - } - -#if TUNIT - [Test] - public async Task SetupTeardown_Test6() -#elif XUNIT || XUNIT3 - [Fact] - public void SetupTeardown_Test6() -#elif NUNIT - [Test] - public void SetupTeardown_Test6() -#elif MSTEST - [TestMethod] - public void SetupTeardown_Test6() -#endif - { -#if XUNIT || XUNIT3 - Setup(); -#endif - - var sum = _workingData.Sum(); - -#if TUNIT - await Assert.That(sum).IsEqualTo(1900); -#elif XUNIT || XUNIT3 - Assert.Equal(1900, sum); -#elif NUNIT - Assert.That(sum, Is.EqualTo(1900)); -#elif MSTEST - Assert.AreEqual(1900, sum); -#endif - } - -#if TUNIT - [Test] - public async Task SetupTeardown_Test7() -#elif XUNIT || XUNIT3 - [Fact] - public void SetupTeardown_Test7() -#elif NUNIT - [Test] - public void SetupTeardown_Test7() -#elif MSTEST - [TestMethod] - public void SetupTeardown_Test7() -#endif - { -#if XUNIT || XUNIT3 - Setup(); -#endif - - var keys = _testState.Keys.ToList(); - -#if TUNIT - await Assert.That(keys).HasCount(20); - await Assert.That(keys[0]).StartsWith("key_"); -#elif XUNIT || XUNIT3 - Assert.Equal(20, keys.Count); - Assert.StartsWith("key_", keys[0]); -#elif NUNIT - Assert.That(keys.Count, Is.EqualTo(20)); - Assert.That(keys[0], Does.StartWith("key_")); -#elif MSTEST - Assert.AreEqual(20, keys.Count); - Assert.IsTrue(keys[0].StartsWith("key_")); -#endif - } - -#if TUNIT - [Test] - public async Task SetupTeardown_Test8() -#elif XUNIT || XUNIT3 - [Fact] - public void SetupTeardown_Test8() -#elif NUNIT - [Test] - public void SetupTeardown_Test8() -#elif MSTEST - [TestMethod] - public void SetupTeardown_Test8() -#endif - { -#if XUNIT || XUNIT3 - Setup(); -#endif - - _processedKeys.Add("processed_1"); - var hasProcessed = _processedKeys.Contains("processed_1"); - -#if TUNIT - await Assert.That(hasProcessed).IsTrue(); -#elif XUNIT || XUNIT3 - Assert.True(hasProcessed); -#elif NUNIT - Assert.That(hasProcessed, Is.True); -#elif MSTEST - Assert.IsTrue(hasProcessed); -#endif - } - -#if TUNIT - [Test] - public async Task SetupTeardown_Test9() -#elif XUNIT || XUNIT3 - [Fact] - public void SetupTeardown_Test9() -#elif NUNIT - [Test] - public void SetupTeardown_Test9() -#elif MSTEST - [TestMethod] - public void SetupTeardown_Test9() -#endif - { -#if XUNIT || XUNIT3 - Setup(); -#endif - - var midValue = _workingData[10]; - -#if TUNIT - await Assert.That(midValue).IsEqualTo(100); -#elif XUNIT || XUNIT3 - Assert.Equal(100, midValue); -#elif NUNIT - Assert.That(midValue, Is.EqualTo(100)); -#elif MSTEST - Assert.AreEqual(100, midValue); -#endif - } - -#if TUNIT - [Test] - public async Task SetupTeardown_Test10() -#elif XUNIT || XUNIT3 - [Fact] - public void SetupTeardown_Test10() -#elif NUNIT - [Test] - public void SetupTeardown_Test10() -#elif MSTEST - [TestMethod] - public void SetupTeardown_Test10() -#endif - { -#if XUNIT || XUNIT3 - Setup(); -#endif - - var allValues = _testState.Values.ToList(); - -#if TUNIT - await Assert.That(allValues).HasCount(20); - await Assert.That(allValues.All(v => v.StartsWith("value_"))).IsTrue(); -#elif XUNIT || XUNIT3 - Assert.Equal(20, allValues.Count); - Assert.True(allValues.All(v => v.StartsWith("value_"))); -#elif NUNIT - Assert.That(allValues.Count, Is.EqualTo(20)); - Assert.That(allValues.All(v => v.StartsWith("value_")), Is.True); -#elif MSTEST - Assert.AreEqual(20, allValues.Count); - Assert.IsTrue(allValues.All(v => v.StartsWith("value_"))); -#endif - } - -#if TUNIT - [Test] - public async Task SetupTeardown_Test11() -#elif XUNIT || XUNIT3 - [Fact] - public void SetupTeardown_Test11() -#elif NUNIT - [Test] - public void SetupTeardown_Test11() -#elif MSTEST - [TestMethod] - public void SetupTeardown_Test11() -#endif - { -#if XUNIT || XUNIT3 - Setup(); -#endif - - var avg = _workingData.Average(); - -#if TUNIT - await Assert.That(avg).IsEqualTo(95.0); -#elif XUNIT || XUNIT3 - Assert.Equal(95.0, avg); -#elif NUNIT - Assert.That(avg, Is.EqualTo(95.0)); -#elif MSTEST - Assert.AreEqual(95.0, avg); -#endif - } - -#if TUNIT - [Test] - public async Task SetupTeardown_Test12() -#elif XUNIT || XUNIT3 - [Fact] - public void SetupTeardown_Test12() -#elif NUNIT - [Test] - public void SetupTeardown_Test12() -#elif MSTEST - [TestMethod] - public void SetupTeardown_Test12() -#endif - { -#if XUNIT || XUNIT3 - Setup(); -#endif - - var firstKey = "key_0"; - var value = _testState[firstKey]; - -#if TUNIT - await Assert.That(value).StartsWith("value_0"); -#elif XUNIT || XUNIT3 - Assert.StartsWith("value_0", value); -#elif NUNIT - Assert.That(value, Does.StartWith("value_0")); -#elif MSTEST - Assert.IsTrue(value.StartsWith("value_0")); -#endif - } - -#if TUNIT - [Test] - public async Task SetupTeardown_Test13() -#elif XUNIT || XUNIT3 - [Fact] - public void SetupTeardown_Test13() -#elif NUNIT - [Test] - public void SetupTeardown_Test13() -#elif MSTEST - [TestMethod] - public void SetupTeardown_Test13() -#endif - { -#if XUNIT || XUNIT3 - Setup(); -#endif - - var max = _workingData.Max(); - -#if TUNIT - await Assert.That(max).IsEqualTo(190); -#elif XUNIT || XUNIT3 - Assert.Equal(190, max); -#elif NUNIT - Assert.That(max, Is.EqualTo(190)); -#elif MSTEST - Assert.AreEqual(190, max); -#endif - } - -#if TUNIT - [Test] - public async Task SetupTeardown_Test14() -#elif XUNIT || XUNIT3 - [Fact] - public void SetupTeardown_Test14() -#elif NUNIT - [Test] - public void SetupTeardown_Test14() -#elif MSTEST - [TestMethod] - public void SetupTeardown_Test14() -#elif MSTEST - [TestMethod] - public void SetupTeardown_Test14() -#endif - { -#if XUNIT || XUNIT3 - Setup(); -#endif - - _processedKeys.Add("temp_1"); - _processedKeys.Add("temp_2"); - _processedKeys.Add("temp_3"); - -#if TUNIT - await Assert.That(_processedKeys).HasCount(3); -#elif XUNIT || XUNIT3 - Assert.Equal(3, _processedKeys.Count); -#elif NUNIT - Assert.That(_processedKeys.Count, Is.EqualTo(3)); -#elif MSTEST - Assert.AreEqual(3, _processedKeys.Count); -#endif - } - -#if TUNIT - [Test] - public async Task SetupTeardown_Test15() -#elif XUNIT || XUNIT3 - [Fact] - public void SetupTeardown_Test15() -#elif NUNIT - [Test] - public void SetupTeardown_Test15() -#elif MSTEST - [TestMethod] - public void SetupTeardown_Test15() -#endif - { -#if XUNIT || XUNIT3 - Setup(); -#endif - - var lastKey = "key_19"; - var hasLastKey = _testState.ContainsKey(lastKey); - -#if TUNIT - await Assert.That(hasLastKey).IsTrue(); -#elif XUNIT || XUNIT3 - Assert.True(hasLastKey); -#elif NUNIT - Assert.That(hasLastKey, Is.True); -#elif MSTEST - Assert.IsTrue(hasLastKey); -#endif - } -} diff --git a/tools/speed-comparison/UnifiedTests/SharedFixtureTests.cs b/tools/speed-comparison/UnifiedTests/SharedFixtureTests.cs deleted file mode 100644 index 5776af7639..0000000000 --- a/tools/speed-comparison/UnifiedTests/SharedFixtureTests.cs +++ /dev/null @@ -1,609 +0,0 @@ -using System.Text.Json; -using System.Threading.Tasks; - -namespace UnifiedTests; - -/// -/// Tests measuring the efficiency of shared class-level fixtures. -/// The fixture is initialized once and reused across all tests, -/// allowing measurement of fixture sharing and reuse overhead. -/// - -// Shared fixture class for xUnit -#if XUNIT || XUNIT3 -public class SharedTestFixture : IDisposable -{ - public Dictionary SharedCache { get; } - public List ProcessedRecords { get; } - public string ConfigurationJson { get; } - - public SharedTestFixture() - { - // Expensive one-time initialization - SharedCache = []; - ProcessedRecords = []; - - // Build shared cache - for (var i = 0; i < 100; i++) - { - SharedCache[i] = $"CachedValue_{i}_{Guid.NewGuid().ToString()[..8]}"; - } - - // Process records - for (var i = 0; i < 50; i++) - { - ProcessedRecords.Add(new ProcessedRecord - { - Id = i, - Name = $"Record_{i}", - Value = i * 100, - Timestamp = DateTime.UtcNow - }); - } - - // Serialize configuration - ConfigurationJson = JsonSerializer.Serialize(new - { - Version = "1.0", - Environment = "Test", - Settings = SharedCache.Take(10).ToDictionary(kvp => kvp.Key.ToString(), kvp => kvp.Value) - }); - } - - public void Dispose() - { - SharedCache?.Clear(); - ProcessedRecords?.Clear(); - } -} - -public class ProcessedRecord -{ - public int Id { get; set; } - public string Name { get; set; } = ""; - public int Value { get; set; } - public DateTime Timestamp { get; set; } -} -#endif - -#if MSTEST -[TestClass] -public class SharedFixtureTests -#elif NUNIT -[TestFixture] -public class SharedFixtureTests -#elif XUNIT || XUNIT3 -public class SharedFixtureTests : IClassFixture -#else -public class SharedFixtureTests -#endif -{ -#if !XUNIT && !XUNIT3 - private static Dictionary _sharedCache; - private static List _processedRecords; - private static string _configurationJson; - - public class ProcessedRecord - { - public int Id { get; set; } - public string Name { get; set; } = ""; - public int Value { get; set; } - public DateTime Timestamp { get; set; } - } -#endif - -#if XUNIT || XUNIT3 - private readonly SharedTestFixture _fixture; - - public SharedFixtureTests(SharedTestFixture fixture) - { - _fixture = fixture; - } -#endif - -#if !XUNIT && !XUNIT3 -#if TUNIT - [Before(Class)] - public static void ClassSetup() -#elif MSTEST - [ClassInitialize] - public static void ClassSetup(TestContext context) -#elif NUNIT - [OneTimeSetUp] - public void ClassSetup() -#endif - { - // One-time expensive initialization shared across all tests - _sharedCache = []; - _processedRecords = []; - - // Build shared cache - for (var i = 0; i < 100; i++) - { - _sharedCache[i] = $"CachedValue_{i}_{Guid.NewGuid().ToString()[..8]}"; - } - - // Process records - for (var i = 0; i < 50; i++) - { - _processedRecords.Add(new ProcessedRecord - { - Id = i, - Name = $"Record_{i}", - Value = i * 100, - Timestamp = DateTime.UtcNow - }); - } - - // Serialize configuration - _configurationJson = JsonSerializer.Serialize(new - { - Version = "1.0", - Environment = "Test", - Settings = _sharedCache.Take(10).ToDictionary(kvp => kvp.Key.ToString(), kvp => kvp.Value) - }); - } - -#if TUNIT - [After(Class)] - public static void ClassCleanup() -#elif MSTEST - [ClassCleanup] - public static void ClassCleanup() -#elif NUNIT - [OneTimeTearDown] - public void ClassCleanup() -#endif - { - _sharedCache?.Clear(); - _processedRecords?.Clear(); - } -#endif - -#if TUNIT - [Test] - public async Task SharedFixture_Test1() -#elif XUNIT || XUNIT3 - [Fact] - public void SharedFixture_Test1() -#elif NUNIT - [Test] - public void SharedFixture_Test1() -#elif MSTEST - [TestMethod] - public void SharedFixture_Test1() -#endif - { -#if XUNIT || XUNIT3 - var value = _fixture.SharedCache[10]; - Assert.NotEmpty(value); - Assert.Contains("CachedValue_10", value); -#elif TUNIT - var value = _sharedCache[10]; - await Assert.That(value).IsNotEmpty(); - await Assert.That(value).Contains("CachedValue_10"); -#elif NUNIT - var value = _sharedCache[10]; - Assert.That(value, Is.Not.Empty); - Assert.That(value, Does.Contain("CachedValue_10")); -#elif MSTEST - var value = _sharedCache[10]; - Assert.IsTrue(value.Length > 0); - Assert.IsTrue(value.Contains("CachedValue_10")); -#endif - } - -#if TUNIT - [Test] - public async Task SharedFixture_Test2() -#elif XUNIT || XUNIT3 - [Fact] - public void SharedFixture_Test2() -#elif NUNIT - [Test] - public void SharedFixture_Test2() -#elif MSTEST - [TestMethod] - public void SharedFixture_Test2() -#endif - { -#if XUNIT || XUNIT3 - var count = _fixture.SharedCache.Count; - Assert.Equal(100, count); -#elif TUNIT - var count = _sharedCache.Count; - await Assert.That(count).IsEqualTo(100); -#elif NUNIT - var count = _sharedCache.Count; - Assert.That(count, Is.EqualTo(100)); -#elif MSTEST - var count = _sharedCache.Count; - Assert.AreEqual(100, count); -#endif - } - -#if TUNIT - [Test] - public async Task SharedFixture_Test3() -#elif XUNIT || XUNIT3 - [Fact] - public void SharedFixture_Test3() -#elif NUNIT - [Test] - public void SharedFixture_Test3() -#elif MSTEST - [TestMethod] - public void SharedFixture_Test3() -#endif - { -#if XUNIT || XUNIT3 - var record = _fixture.ProcessedRecords[0]; - Assert.Equal(0, record.Id); - Assert.Equal("Record_0", record.Name); -#elif TUNIT - var record = _processedRecords[0]; - await Assert.That(record.Id).IsEqualTo(0); - await Assert.That(record.Name).IsEqualTo("Record_0"); -#elif NUNIT - var record = _processedRecords[0]; - Assert.That(record.Id, Is.EqualTo(0)); - Assert.That(record.Name, Is.EqualTo("Record_0")); -#elif MSTEST - var record = _processedRecords[0]; - Assert.AreEqual(0, record.Id); - Assert.AreEqual("Record_0", record.Name); -#endif - } - -#if TUNIT - [Test] - public async Task SharedFixture_Test4() -#elif XUNIT || XUNIT3 - [Fact] - public void SharedFixture_Test4() -#elif NUNIT - [Test] - public void SharedFixture_Test4() -#elif MSTEST - [TestMethod] - public void SharedFixture_Test4() -#endif - { -#if XUNIT || XUNIT3 - var recordCount = _fixture.ProcessedRecords.Count; - Assert.Equal(50, recordCount); -#elif TUNIT - var recordCount = _processedRecords.Count; - await Assert.That(recordCount).IsEqualTo(50); -#elif NUNIT - var recordCount = _processedRecords.Count; - Assert.That(recordCount, Is.EqualTo(50)); -#elif MSTEST - var recordCount = _processedRecords.Count; - Assert.AreEqual(50, recordCount); -#endif - } - -#if TUNIT - [Test] - public async Task SharedFixture_Test5() -#elif XUNIT || XUNIT3 - [Fact] - public void SharedFixture_Test5() -#elif NUNIT - [Test] - public void SharedFixture_Test5() -#elif MSTEST - [TestMethod] - public void SharedFixture_Test5() -#endif - { -#if XUNIT || XUNIT3 - var json = _fixture.ConfigurationJson; - Assert.NotEmpty(json); - Assert.Contains("Version", json); -#elif TUNIT - var json = _configurationJson; - await Assert.That(json).IsNotEmpty(); - await Assert.That(json).Contains("Version"); -#elif NUNIT - var json = _configurationJson; - Assert.That(json, Is.Not.Empty); - Assert.That(json, Does.Contain("Version")); -#elif MSTEST - var json = _configurationJson; - Assert.IsTrue(json.Length > 0); - Assert.IsTrue(json.Contains("Version")); -#endif - } - -#if TUNIT - [Test] - public async Task SharedFixture_Test6() -#elif XUNIT || XUNIT3 - [Fact] - public void SharedFixture_Test6() -#elif NUNIT - [Test] - public void SharedFixture_Test6() -#elif MSTEST - [TestMethod] - public void SharedFixture_Test6() -#endif - { -#if XUNIT || XUNIT3 - var lastRecord = _fixture.ProcessedRecords[^1]; - Assert.Equal(49, lastRecord.Id); -#elif TUNIT - var lastRecord = _processedRecords[^1]; - await Assert.That(lastRecord.Id).IsEqualTo(49); -#elif NUNIT - var lastRecord = _processedRecords[^1]; - Assert.That(lastRecord.Id, Is.EqualTo(49)); -#elif MSTEST - var lastRecord = _processedRecords[^1]; - Assert.AreEqual(49, lastRecord.Id); -#endif - } - -#if TUNIT - [Test] - public async Task SharedFixture_Test7() -#elif XUNIT || XUNIT3 - [Fact] - public void SharedFixture_Test7() -#elif NUNIT - [Test] - public void SharedFixture_Test7() -#elif MSTEST - [TestMethod] - public void SharedFixture_Test7() -#endif - { -#if XUNIT || XUNIT3 - var midValue = _fixture.SharedCache[50]; - Assert.Contains("CachedValue_50", midValue); -#elif TUNIT - var midValue = _sharedCache[50]; - await Assert.That(midValue).Contains("CachedValue_50"); -#elif NUNIT - var midValue = _sharedCache[50]; - Assert.That(midValue, Does.Contain("CachedValue_50")); -#elif MSTEST - var midValue = _sharedCache[50]; - Assert.IsTrue(midValue.Contains("CachedValue_50")); -#endif - } - -#if TUNIT - [Test] - public async Task SharedFixture_Test8() -#elif XUNIT || XUNIT3 - [Fact] - public void SharedFixture_Test8() -#elif NUNIT - [Test] - public void SharedFixture_Test8() -#elif MSTEST - [TestMethod] - public void SharedFixture_Test8() -#endif - { -#if XUNIT || XUNIT3 - var totalValue = _fixture.ProcessedRecords.Sum(r => r.Value); - Assert.Equal(122500, totalValue); -#elif TUNIT - var totalValue = _processedRecords.Sum(r => r.Value); - await Assert.That(totalValue).IsEqualTo(122500); -#elif NUNIT - var totalValue = _processedRecords.Sum(r => r.Value); - Assert.That(totalValue, Is.EqualTo(122500)); -#elif MSTEST - var totalValue = _processedRecords.Sum(r => r.Value); - Assert.AreEqual(122500, totalValue); -#endif - } - -#if TUNIT - [Test] - public async Task SharedFixture_Test9() -#elif XUNIT || XUNIT3 - [Fact] - public void SharedFixture_Test9() -#elif NUNIT - [Test] - public void SharedFixture_Test9() -#elif MSTEST - [TestMethod] - public void SharedFixture_Test9() -#endif - { -#if XUNIT || XUNIT3 - var hasKey = _fixture.SharedCache.ContainsKey(99); - Assert.True(hasKey); -#elif TUNIT - var hasKey = _sharedCache.ContainsKey(99); - await Assert.That(hasKey).IsTrue(); -#elif NUNIT - var hasKey = _sharedCache.ContainsKey(99); - Assert.That(hasKey, Is.True); -#elif MSTEST - var hasKey = _sharedCache.ContainsKey(99); - Assert.IsTrue(hasKey); -#endif - } - -#if TUNIT - [Test] - public async Task SharedFixture_Test10() -#elif XUNIT || XUNIT3 - [Fact] - public void SharedFixture_Test10() -#elif NUNIT - [Test] - public void SharedFixture_Test10() -#elif MSTEST - [TestMethod] - public void SharedFixture_Test10() -#endif - { -#if XUNIT || XUNIT3 - var record = _fixture.ProcessedRecords[25]; - Assert.Equal(2500, record.Value); -#elif TUNIT - var record = _processedRecords[25]; - await Assert.That(record.Value).IsEqualTo(2500); -#elif NUNIT - var record = _processedRecords[25]; - Assert.That(record.Value, Is.EqualTo(2500)); -#elif MSTEST - var record = _processedRecords[25]; - Assert.AreEqual(2500, record.Value); -#endif - } - -#if TUNIT - [Test] - public async Task SharedFixture_Test11() -#elif XUNIT || XUNIT3 - [Fact] - public void SharedFixture_Test11() -#elif NUNIT - [Test] - public void SharedFixture_Test11() -#elif MSTEST - [TestMethod] - public void SharedFixture_Test11() -#endif - { -#if XUNIT || XUNIT3 - var firstValue = _fixture.SharedCache[0]; - Assert.StartsWith("CachedValue_0", firstValue); -#elif TUNIT - var firstValue = _sharedCache[0]; - await Assert.That(firstValue).StartsWith("CachedValue_0"); -#elif NUNIT - var firstValue = _sharedCache[0]; - Assert.That(firstValue, Does.StartWith("CachedValue_0")); -#elif MSTEST - var firstValue = _sharedCache[0]; - Assert.IsTrue(firstValue.StartsWith("CachedValue_0")); -#endif - } - -#if TUNIT - [Test] - public async Task SharedFixture_Test12() -#elif XUNIT || XUNIT3 - [Fact] - public void SharedFixture_Test12() -#elif NUNIT - [Test] - public void SharedFixture_Test12() -#elif MSTEST - [TestMethod] - public void SharedFixture_Test12() -#endif - { -#if XUNIT || XUNIT3 - var names = _fixture.ProcessedRecords.Select(r => r.Name).ToList(); - Assert.Equal(50, names.Count); -#elif TUNIT - var names = _processedRecords.Select(r => r.Name).ToList(); - await Assert.That(names).HasCount(50); -#elif NUNIT - var names = _processedRecords.Select(r => r.Name).ToList(); - Assert.That(names.Count, Is.EqualTo(50)); -#elif MSTEST - var names = _processedRecords.Select(r => r.Name).ToList(); - Assert.AreEqual(50, names.Count); -#endif - } - -#if TUNIT - [Test] - public async Task SharedFixture_Test13() -#elif XUNIT || XUNIT3 - [Fact] - public void SharedFixture_Test13() -#elif NUNIT - [Test] - public void SharedFixture_Test13() -#elif MSTEST - [TestMethod] - public void SharedFixture_Test13() -#endif - { -#if XUNIT || XUNIT3 - var json = _fixture.ConfigurationJson; - Assert.Contains("Environment", json); -#elif TUNIT - var json = _configurationJson; - await Assert.That(json).Contains("Environment"); -#elif NUNIT - var json = _configurationJson; - Assert.That(json, Does.Contain("Environment")); -#elif MSTEST - var json = _configurationJson; - Assert.IsTrue(json.Contains("Environment")); -#endif - } - -#if TUNIT - [Test] - public async Task SharedFixture_Test14() -#elif XUNIT || XUNIT3 - [Fact] - public void SharedFixture_Test14() -#elif NUNIT - [Test] - public void SharedFixture_Test14() -#elif MSTEST - [TestMethod] - public void SharedFixture_Test14() -#endif - { -#if XUNIT || XUNIT3 - var lastValue = _fixture.SharedCache[99]; - Assert.NotEmpty(lastValue); -#elif TUNIT - var lastValue = _sharedCache[99]; - await Assert.That(lastValue).IsNotEmpty(); -#elif NUNIT - var lastValue = _sharedCache[99]; - Assert.That(lastValue, Is.Not.Empty); -#elif MSTEST - var lastValue = _sharedCache[99]; - Assert.IsTrue(lastValue.Length > 0); -#endif - } - -#if TUNIT - [Test] - public async Task SharedFixture_Test15() -#elif XUNIT || XUNIT3 - [Fact] - public void SharedFixture_Test15() -#elif NUNIT - [Test] - public void SharedFixture_Test15() -#elif MSTEST - [TestMethod] - public void SharedFixture_Test15() -#endif - { -#if XUNIT || XUNIT3 - var avgValue = _fixture.ProcessedRecords.Average(r => r.Value); - Assert.Equal(2450.0, avgValue); -#elif TUNIT - var avgValue = _processedRecords.Average(r => r.Value); - await Assert.That(avgValue).IsEqualTo(2450.0); -#elif NUNIT - var avgValue = _processedRecords.Average(r => r.Value); - Assert.That(avgValue, Is.EqualTo(2450.0)); -#elif MSTEST - var avgValue = _processedRecords.Average(r => r.Value); - Assert.AreEqual(2450.0, avgValue); -#endif - } -}