diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 79d8388ff5..75cdd4ebda 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -26,6 +26,9 @@ jobs: os: [ubuntu-latest, windows-latest, macos-latest] fail-fast: false runs-on: ${{ matrix.os }} + permissions: + contents: write + id-token: write steps: - name: Free Disk Space (Ubuntu) @@ -151,12 +154,19 @@ jobs: core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env['ACTIONS_RUNTIME_TOKEN']); core.exportVariable('ACTIONS_RESULTS_URL', process.env['ACTIONS_RESULTS_URL']); + - name: NuGet login + if: ${{ github.ref == 'refs/heads/main' && github.event.inputs.publish-packages == 'true' && matrix.os == 'ubuntu-latest' }} + uses: NuGet/login@v1 + id: login + with: + user: ${{ secrets.NUGET_USER }} + - name: Run Pipeline uses: ./.github/actions/execute-pipeline with: admin-token: ${{ secrets.ADMIN_TOKEN }} environment: ${{ github.ref == 'refs/heads/main' && 'Production' || 'Development' }} - nuget-apikey: ${{ secrets.NUGET__APIKEY }} + nuget-apikey: ${{ steps.login.outputs.NUGET_API_KEY }} publish-packages: ${{ (github.event.inputs.publish-packages || false) && matrix.os == 'ubuntu-latest' }} - name: Upload Diagnostic Logs diff --git a/Directory.Packages.props b/Directory.Packages.props index b570006cac..c68e16b6c5 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -102,14 +102,14 @@ - + - - - - - + + + + + diff --git a/README.md b/README.md index b99b62252c..98ebce7fc2 100644 --- a/README.md +++ b/README.md @@ -61,14 +61,14 @@ Source generation shifts work from run time to build time: you pay a little up f | Scenario | TUnit (AOT) | TUnit | xUnit v3 | NUnit | MSTest | |----------|---|---|---|---|---| -| Data-driven tests | 12.99 ms | 280.70 ms | 520.02 ms | 502.48 ms | 493.15 ms | -| Async-heavy tests | 115.7 ms | 371.9 ms | 593.1 ms | 581.4 ms | 647.1 ms | -| Matrix combinations | 116.1 ms | 382.4 ms | 1,455.4 ms | 1,432.9 ms | 1,523.1 ms | -| Large suites (scale) | 14.57 ms | 284.56 ms | 506.40 ms | 509.08 ms | 497.92 ms | -| Massive parallelism | 218.3 ms | 467.8 ms | 2,927.5 ms | 1,079.8 ms | 3,004.0 ms | -| Setup/teardown lifecycle | 64.70 ms | 337.77 ms | 1,052.38 ms | 1,003.23 ms | 1,105.44 ms | - -Mean wall-clock time to run the same test suite. TUnit (AOT) 1.63.0 · TUnit 1.63.0 · xUnit v3 3.2.2 · NUnit 4.6.1 · MSTest 4.3.3. .NET SDK 10.0.302, .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v4. Updated 2026-08-02 — regenerated weekly by the [Speed Comparison workflow](https://github.com/thomhurst/TUnit/actions/workflows/speed-comparison.yml). Full results and methodology: [tunit.dev/docs/benchmarks](https://tunit.dev/docs/benchmarks/). +| Data-driven tests | 17.74 ms | 308.59 ms | 534.14 ms | 547.52 ms | 552.18 ms | +| Async-heavy tests | 120.7 ms | 406.5 ms | 671.9 ms | 657.7 ms | 750.7 ms | +| Matrix combinations | 115.4 ms | 375.1 ms | 1,443.5 ms | 1,420.2 ms | 1,530.7 ms | +| Large suites (scale) | 15.92 ms | 272.51 ms | 500.67 ms | 502.50 ms | 494.11 ms | +| Massive parallelism | 217.8 ms | 469.3 ms | 2,926.8 ms | 1,073.9 ms | 2,981.5 ms | +| Setup/teardown lifecycle | 66.11 ms | 327.59 ms | 1,024.32 ms | 996.24 ms | 1,066.16 ms | + +Mean wall-clock time to run the same test suite. TUnit (AOT) 1.64.0 · TUnit 1.64.0 · xUnit v3 3.2.2 · NUnit 4.6.1 · MSTest 4.3.3. .NET SDK 10.0.302, .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v4. Updated 2026-08-09 — regenerated weekly by the [Speed Comparison workflow](https://github.com/thomhurst/TUnit/actions/workflows/speed-comparison.yml). Full results and methodology: [tunit.dev/docs/benchmarks](https://tunit.dev/docs/benchmarks/). ## Getting Started diff --git a/docs/docs/benchmarks/engine/AsyncTests.md b/docs/docs/benchmarks/engine/AsyncTests.md index 5b3caee8e9..4ae4ce22a2 100644 --- a/docs/docs/benchmarks/engine/AsyncTests.md +++ b/docs/docs/benchmarks/engine/AsyncTests.md @@ -9,7 +9,7 @@ sidebar_position: 3 > Realistic async/await patterns with I/O simulation :::info Last Updated -This benchmark was automatically generated on **2026-08-02** from the latest CI run. +This benchmark was automatically generated on **2026-08-09** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.302 ::: @@ -18,11 +18,11 @@ This benchmark was automatically generated on **2026-08-02** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.63.0 | 371.9 ms | 371.3 ms | 10.77 ms | -| NUnit | 4.6.1 | 581.4 ms | 575.0 ms | 22.81 ms | -| MSTest | 4.3.3 | 647.1 ms | 644.3 ms | 6.41 ms | -| xUnit3 | 3.2.2 | 593.1 ms | 593.1 ms | 4.59 ms | -| **TUnit (AOT)** | 1.63.0 | 115.7 ms | 115.8 ms | 0.26 ms | +| **TUnit** | 1.64.0 | 406.5 ms | 401.4 ms | 20.76 ms | +| NUnit | 4.6.1 | 657.7 ms | 649.5 ms | 38.73 ms | +| MSTest | 4.3.3 | 750.7 ms | 745.6 ms | 38.09 ms | +| xUnit3 | 3.2.2 | 671.9 ms | 670.0 ms | 22.31 ms | +| **TUnit (AOT)** | 1.64.0 | 120.7 ms | 120.7 ms | 1.57 ms | ## 📈 Visual Comparison @@ -60,8 +60,8 @@ This benchmark was automatically generated on **2026-08-02** from the latest CI xychart-beta title "AsyncTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 777 - bar [371.9, 581.4, 647.1, 593.1, 115.7] + y-axis "Time (ms)" 0 --> 901 + bar [406.5, 657.7, 750.7, 671.9, 120.7] ``` ## 🎯 Key Insights @@ -74,4 +74,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-08-02T00:39:00.699Z* +*Last generated: 2026-08-09T00:23:17.026Z* diff --git a/docs/docs/benchmarks/engine/BuildTime.md b/docs/docs/benchmarks/engine/BuildTime.md index 9b61a89263..8413057a06 100644 --- a/docs/docs/benchmarks/engine/BuildTime.md +++ b/docs/docs/benchmarks/engine/BuildTime.md @@ -9,7 +9,7 @@ sidebar_position: 9 > Compilation time from a clean build across frameworks — how long it takes to build an identical test project. :::info Last Updated -This benchmark was automatically generated on **2026-08-02** from the latest CI run. +This benchmark was automatically generated on **2026-08-09** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.302 ::: @@ -20,10 +20,10 @@ Compilation time comparison across frameworks: | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.63.0 | 979.5 ms | 973.6 ms | 31.64 ms | -| Build_NUnit | 4.6.1 | 936.7 ms | 931.0 ms | 21.86 ms | -| Build_MSTest | 4.3.3 | 1,035.8 ms | 1,030.7 ms | 51.38 ms | -| Build_xUnit3 | 3.2.2 | 912.5 ms | 908.4 ms | 11.55 ms | +| **TUnit** | 1.64.0 | 940.2 ms | 938.3 ms | 27.85 ms | +| Build_NUnit | 4.6.1 | 925.3 ms | 924.0 ms | 17.10 ms | +| Build_MSTest | 4.3.3 | 1,033.0 ms | 1,024.9 ms | 49.06 ms | +| Build_xUnit3 | 3.2.2 | 930.5 ms | 927.8 ms | 16.14 ms | ## 📈 Visual Comparison @@ -61,8 +61,8 @@ Compilation time comparison across frameworks: xychart-beta title "Build Time Comparison" x-axis ["Build_TUnit", "Build_NUnit", "Build_MSTest", "Build_xUnit3"] - y-axis "Time (ms)" 0 --> 1243 - bar [979.5, 936.7, 1035.8, 912.5] + y-axis "Time (ms)" 0 --> 1240 + bar [940.2, 925.3, 1033, 930.5] ``` --- @@ -71,4 +71,4 @@ xychart-beta View the [benchmarks overview](/docs/benchmarks) for methodology details and environment information. ::: -*Last generated: 2026-08-02T00:39:00.701Z* +*Last generated: 2026-08-09T00:23:17.061Z* diff --git a/docs/docs/benchmarks/engine/DataDrivenTests.md b/docs/docs/benchmarks/engine/DataDrivenTests.md index 10be056bce..c16ae69a09 100644 --- a/docs/docs/benchmarks/engine/DataDrivenTests.md +++ b/docs/docs/benchmarks/engine/DataDrivenTests.md @@ -9,7 +9,7 @@ sidebar_position: 4 > Parameterized tests with multiple data sources :::info Last Updated -This benchmark was automatically generated on **2026-08-02** from the latest CI run. +This benchmark was automatically generated on **2026-08-09** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.302 ::: @@ -18,11 +18,11 @@ This benchmark was automatically generated on **2026-08-02** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.63.0 | 280.70 ms | 279.14 ms | 5.578 ms | -| NUnit | 4.6.1 | 502.48 ms | 502.48 ms | 13.978 ms | -| MSTest | 4.3.3 | 493.15 ms | 494.68 ms | 5.387 ms | -| xUnit3 | 3.2.2 | 520.02 ms | 510.65 ms | 26.760 ms | -| **TUnit (AOT)** | 1.63.0 | 12.99 ms | 12.99 ms | 0.051 ms | +| **TUnit** | 1.64.0 | 308.59 ms | 307.89 ms | 5.350 ms | +| NUnit | 4.6.1 | 547.52 ms | 541.49 ms | 31.636 ms | +| MSTest | 4.3.3 | 552.18 ms | 551.76 ms | 41.191 ms | +| xUnit3 | 3.2.2 | 534.14 ms | 529.06 ms | 9.859 ms | +| **TUnit (AOT)** | 1.64.0 | 17.74 ms | 17.58 ms | 0.933 ms | ## 📈 Visual Comparison @@ -60,8 +60,8 @@ This benchmark was automatically generated on **2026-08-02** from the latest CI xychart-beta title "DataDrivenTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 625 - bar [280.7, 502.48, 493.15, 520.02, 12.99] + y-axis "Time (ms)" 0 --> 663 + bar [308.59, 547.52, 552.18, 534.14, 17.74] ``` ## 🎯 Key Insights @@ -74,4 +74,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-08-02T00:39:00.699Z* +*Last generated: 2026-08-09T00:23:17.026Z* diff --git a/docs/docs/benchmarks/engine/MassiveParallelTests.md b/docs/docs/benchmarks/engine/MassiveParallelTests.md index a0c6fac561..0a04b87a1e 100644 --- a/docs/docs/benchmarks/engine/MassiveParallelTests.md +++ b/docs/docs/benchmarks/engine/MassiveParallelTests.md @@ -9,7 +9,7 @@ sidebar_position: 5 > Parallel execution stress tests :::info Last Updated -This benchmark was automatically generated on **2026-08-02** from the latest CI run. +This benchmark was automatically generated on **2026-08-09** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.302 ::: @@ -18,11 +18,11 @@ This benchmark was automatically generated on **2026-08-02** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.63.0 | 467.8 ms | 469.3 ms | 3.93 ms | -| NUnit | 4.6.1 | 1,079.8 ms | 1,076.9 ms | 8.41 ms | -| MSTest | 4.3.3 | 3,004.0 ms | 2,990.8 ms | 32.83 ms | -| xUnit3 | 3.2.2 | 2,927.5 ms | 2,926.2 ms | 6.02 ms | -| **TUnit (AOT)** | 1.63.0 | 218.3 ms | 218.1 ms | 0.57 ms | +| **TUnit** | 1.64.0 | 469.3 ms | 469.4 ms | 3.00 ms | +| NUnit | 4.6.1 | 1,073.9 ms | 1,067.0 ms | 12.86 ms | +| MSTest | 4.3.3 | 2,981.5 ms | 2,993.4 ms | 30.52 ms | +| xUnit3 | 3.2.2 | 2,926.8 ms | 2,928.2 ms | 12.70 ms | +| **TUnit (AOT)** | 1.64.0 | 217.8 ms | 217.7 ms | 0.39 ms | ## 📈 Visual Comparison @@ -60,8 +60,8 @@ This benchmark was automatically generated on **2026-08-02** from the latest CI xychart-beta title "MassiveParallelTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 3605 - bar [467.8, 1079.8, 3004, 2927.5, 218.3] + y-axis "Time (ms)" 0 --> 3578 + bar [469.3, 1073.9, 2981.5, 2926.8, 217.8] ``` ## 🎯 Key Insights @@ -74,4 +74,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-08-02T00:39:00.700Z* +*Last generated: 2026-08-09T00:23:17.027Z* diff --git a/docs/docs/benchmarks/engine/MatrixTests.md b/docs/docs/benchmarks/engine/MatrixTests.md index 918a471cc4..4558de1966 100644 --- a/docs/docs/benchmarks/engine/MatrixTests.md +++ b/docs/docs/benchmarks/engine/MatrixTests.md @@ -9,7 +9,7 @@ sidebar_position: 6 > Combinatorial test generation and execution :::info Last Updated -This benchmark was automatically generated on **2026-08-02** from the latest CI run. +This benchmark was automatically generated on **2026-08-09** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.302 ::: @@ -18,11 +18,11 @@ This benchmark was automatically generated on **2026-08-02** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.63.0 | 382.4 ms | 382.4 ms | 2.03 ms | -| NUnit | 4.6.1 | 1,432.9 ms | 1,431.1 ms | 5.50 ms | -| MSTest | 4.3.3 | 1,523.1 ms | 1,517.4 ms | 16.98 ms | -| xUnit3 | 3.2.2 | 1,455.4 ms | 1,456.1 ms | 4.38 ms | -| **TUnit (AOT)** | 1.63.0 | 116.1 ms | 116.1 ms | 0.14 ms | +| **TUnit** | 1.64.0 | 375.1 ms | 375.9 ms | 5.58 ms | +| NUnit | 4.6.1 | 1,420.2 ms | 1,421.2 ms | 7.71 ms | +| MSTest | 4.3.3 | 1,530.7 ms | 1,525.7 ms | 22.65 ms | +| xUnit3 | 3.2.2 | 1,443.5 ms | 1,440.6 ms | 6.54 ms | +| **TUnit (AOT)** | 1.64.0 | 115.4 ms | 115.3 ms | 0.63 ms | ## 📈 Visual Comparison @@ -60,8 +60,8 @@ This benchmark was automatically generated on **2026-08-02** from the latest CI xychart-beta title "MatrixTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1828 - bar [382.4, 1432.9, 1523.1, 1455.4, 116.1] + y-axis "Time (ms)" 0 --> 1837 + bar [375.1, 1420.2, 1530.7, 1443.5, 115.4] ``` ## 🎯 Key Insights @@ -74,4 +74,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-08-02T00:39:00.700Z* +*Last generated: 2026-08-09T00:23:17.027Z* diff --git a/docs/docs/benchmarks/engine/ScaleTests.md b/docs/docs/benchmarks/engine/ScaleTests.md index 8613d971f0..579847adff 100644 --- a/docs/docs/benchmarks/engine/ScaleTests.md +++ b/docs/docs/benchmarks/engine/ScaleTests.md @@ -9,7 +9,7 @@ sidebar_position: 7 > Large test suites (150+ tests) measuring scalability :::info Last Updated -This benchmark was automatically generated on **2026-08-02** from the latest CI run. +This benchmark was automatically generated on **2026-08-09** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.302 ::: @@ -18,11 +18,11 @@ This benchmark was automatically generated on **2026-08-02** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.63.0 | 284.56 ms | 283.96 ms | 1.759 ms | -| NUnit | 4.6.1 | 509.08 ms | 507.99 ms | 11.598 ms | -| MSTest | 4.3.3 | 497.92 ms | 497.23 ms | 4.708 ms | -| xUnit3 | 3.2.2 | 506.40 ms | 505.96 ms | 8.711 ms | -| **TUnit (AOT)** | 1.63.0 | 14.57 ms | 14.52 ms | 0.121 ms | +| **TUnit** | 1.64.0 | 272.51 ms | 271.73 ms | 3.031 ms | +| NUnit | 4.6.1 | 502.50 ms | 495.10 ms | 21.289 ms | +| MSTest | 4.3.3 | 494.11 ms | 495.49 ms | 4.829 ms | +| xUnit3 | 3.2.2 | 500.67 ms | 496.60 ms | 13.537 ms | +| **TUnit (AOT)** | 1.64.0 | 15.92 ms | 15.92 ms | 0.588 ms | ## 📈 Visual Comparison @@ -60,8 +60,8 @@ This benchmark was automatically generated on **2026-08-02** from the latest CI xychart-beta title "ScaleTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 611 - bar [284.56, 509.08, 497.92, 506.4, 14.57] + y-axis "Time (ms)" 0 --> 603 + bar [272.51, 502.5, 494.11, 500.67, 15.92] ``` ## 🎯 Key Insights @@ -74,4 +74,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-08-02T00:39:00.700Z* +*Last generated: 2026-08-09T00:23:17.060Z* diff --git a/docs/docs/benchmarks/engine/SetupTeardownTests.md b/docs/docs/benchmarks/engine/SetupTeardownTests.md index b615dd2627..a77ce4cc69 100644 --- a/docs/docs/benchmarks/engine/SetupTeardownTests.md +++ b/docs/docs/benchmarks/engine/SetupTeardownTests.md @@ -9,7 +9,7 @@ sidebar_position: 8 > Expensive test fixtures with setup/teardown overhead :::info Last Updated -This benchmark was automatically generated on **2026-08-02** from the latest CI run. +This benchmark was automatically generated on **2026-08-09** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.302 ::: @@ -18,11 +18,11 @@ This benchmark was automatically generated on **2026-08-02** from the latest CI | Framework | Version | Mean | Median | StdDev | |-----------|---------|------|--------|--------| -| **TUnit** | 1.63.0 | 337.77 ms | 337.90 ms | 1.649 ms | -| NUnit | 4.6.1 | 1,003.23 ms | 1,003.81 ms | 4.437 ms | -| MSTest | 4.3.3 | 1,105.44 ms | 1,096.64 ms | 22.596 ms | -| xUnit3 | 3.2.2 | 1,052.38 ms | 1,048.62 ms | 20.447 ms | -| **TUnit (AOT)** | 1.63.0 | 64.70 ms | 64.46 ms | 0.499 ms | +| **TUnit** | 1.64.0 | 327.59 ms | 326.78 ms | 2.732 ms | +| NUnit | 4.6.1 | 996.24 ms | 995.63 ms | 7.547 ms | +| MSTest | 4.3.3 | 1,066.16 ms | 1,060.72 ms | 17.292 ms | +| xUnit3 | 3.2.2 | 1,024.32 ms | 1,023.42 ms | 9.380 ms | +| **TUnit (AOT)** | 1.64.0 | 66.11 ms | 66.06 ms | 0.728 ms | ## 📈 Visual Comparison @@ -60,8 +60,8 @@ This benchmark was automatically generated on **2026-08-02** from the latest CI xychart-beta title "SetupTeardownTests Performance Comparison" x-axis ["TUnit", "NUnit", "MSTest", "xUnit3", "TUnit_AOT"] - y-axis "Time (ms)" 0 --> 1327 - bar [337.77, 1003.23, 1105.44, 1052.38, 64.7] + y-axis "Time (ms)" 0 --> 1280 + bar [327.59, 996.24, 1066.16, 1024.32, 66.11] ``` ## 🎯 Key Insights @@ -74,4 +74,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-08-02T00:39:00.700Z* +*Last generated: 2026-08-09T00:23:17.061Z* diff --git a/docs/docs/benchmarks/index.md b/docs/docs/benchmarks/index.md index 552fefe433..5f45b8f392 100644 --- a/docs/docs/benchmarks/index.md +++ b/docs/docs/benchmarks/index.md @@ -7,7 +7,7 @@ sidebar_position: 1 # Performance Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2026-08-02** from the latest CI run. +These benchmarks were automatically generated on **2026-08-09** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.302 ::: @@ -37,7 +37,7 @@ These benchmarks compare TUnit against the most popular .NET testing frameworks: | Framework | Version Tested | |-----------|----------------| -| **TUnit** | 1.63.0 | +| **TUnit** | 1.64.0 | | **xUnit v3** | 3.2.2 | | **NUnit** | 4.6.1 | | **MSTest** | 4.3.3 | @@ -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-08-02T00:39:00.701Z* +*Last generated: 2026-08-09T00:23:17.061Z* diff --git a/docs/docs/benchmarks/mocks/Callback.md b/docs/docs/benchmarks/mocks/Callback.md index 547690e39d..6522ac6554 100644 --- a/docs/docs/benchmarks/mocks/Callback.md +++ b/docs/docs/benchmarks/mocks/Callback.md @@ -9,7 +9,7 @@ sidebar_position: 2 > Callback registration and execution — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-08-08** from the latest CI run. +This benchmark was automatically generated on **2026-08-09** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.302 ::: @@ -20,12 +20,12 @@ Callback registration and execution: | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 657.8 ns | 8.52 ns | 7.97 ns | 3.11 KB | -| Imposter | 493.9 ns | 4.06 ns | 3.79 ns | 2.66 KB | -| Mockolate | 347.1 ns | 3.55 ns | 3.32 ns | 1.8 KB | -| Moq | 140,525.6 ns | 957.11 ns | 848.46 ns | 13.14 KB | -| NSubstitute | 4,281.5 ns | 69.29 ns | 64.81 ns | 7.85 KB | -| FakeItEasy | 4,790.3 ns | 82.14 ns | 72.82 ns | 7.44 KB | +| **TUnit.Mocks** | 743.5 ns | 10.83 ns | 9.04 ns | 3.11 KB | +| Imposter | 503.1 ns | 5.08 ns | 4.50 ns | 2.66 KB | +| Mockolate | 368.2 ns | 7.03 ns | 6.57 ns | 1.8 KB | +| Moq | 139,650.3 ns | 1,091.82 ns | 967.87 ns | 13.14 KB | +| NSubstitute | 4,727.9 ns | 92.15 ns | 81.69 ns | 7.85 KB | +| FakeItEasy | 5,176.0 ns | 51.93 ns | 46.03 ns | 7.44 KB | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Callback registration and execution: xychart-beta title "Callback Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 168631 - bar [657.8, 493.9, 347.1, 140525.6, 4281.5, 4790.3] + y-axis "Time (ns)" 0 --> 167581 + bar [743.5, 503.1, 368.2, 139650.3, 4727.9, 5176] ``` --- @@ -61,12 +61,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 789.6 ns | 14.59 ns | 12.93 ns | 3.2 KB | -| Imposter | 564.2 ns | 5.41 ns | 5.06 ns | 2.82 KB | -| Mockolate | 392.6 ns | 6.66 ns | 6.23 ns | 1.84 KB | -| Moq | 145,527.5 ns | 1,135.04 ns | 1,061.72 ns | 13.73 KB | -| NSubstitute | 4,960.2 ns | 38.64 ns | 32.27 ns | 8.41 KB | -| FakeItEasy | 5,776.2 ns | 79.36 ns | 74.23 ns | 9.4 KB | +| **TUnit.Mocks** | 837.6 ns | 7.54 ns | 6.69 ns | 3.2 KB | +| Imposter | 582.3 ns | 11.45 ns | 16.42 ns | 2.82 KB | +| Mockolate | 396.1 ns | 5.80 ns | 5.43 ns | 1.84 KB | +| Moq | 145,933.4 ns | 1,328.24 ns | 1,242.43 ns | 13.73 KB | +| NSubstitute | 5,276.3 ns | 68.88 ns | 53.78 ns | 8.41 KB | +| FakeItEasy | 5,958.8 ns | 62.36 ns | 58.34 ns | 9.4 KB | ```mermaid %%{init: { @@ -92,8 +92,8 @@ xychart-beta xychart-beta title "Callback (with args) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 174633 - bar [789.6, 564.2, 392.6, 145527.5, 4960.2, 5776.2] + y-axis "Time (ns)" 0 --> 175121 + bar [837.6, 582.3, 396.1, 145933.4, 5276.3, 5958.8] ``` ## 🎯 Key Insights @@ -106,4 +106,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-08-08T02:56:03.834Z* +*Last generated: 2026-08-09T03:02:07.270Z* diff --git a/docs/docs/benchmarks/mocks/CombinedWorkflow.md b/docs/docs/benchmarks/mocks/CombinedWorkflow.md index b69b5f1cb6..bdd258b1aa 100644 --- a/docs/docs/benchmarks/mocks/CombinedWorkflow.md +++ b/docs/docs/benchmarks/mocks/CombinedWorkflow.md @@ -9,7 +9,7 @@ sidebar_position: 3 > Full workflow: create → setup → invoke → verify — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-08-08** from the latest CI run. +This benchmark was automatically generated on **2026-08-09** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.302 ::: @@ -20,12 +20,12 @@ Full workflow: create → setup → invoke → verify: | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 1.855 μs | 0.0233 μs | 0.0207 μs | 6.23 KB | -| Imposter | 2.639 μs | 0.0180 μs | 0.0169 μs | 15.71 KB | -| Mockolate | 1.609 μs | 0.0064 μs | 0.0053 μs | 7.36 KB | -| Moq | 405.447 μs | 4.3504 μs | 3.6328 μs | 36.16 KB | -| NSubstitute | 17.009 μs | 0.0490 μs | 0.0434 μs | 26.72 KB | -| FakeItEasy | 19.196 μs | 0.2048 μs | 0.1915 μs | 25.63 KB | +| **TUnit.Mocks** | 1.962 μs | 0.0368 μs | 0.0326 μs | 6.23 KB | +| Imposter | 2.709 μs | 0.0291 μs | 0.0273 μs | 15.71 KB | +| Mockolate | 1.696 μs | 0.0334 μs | 0.0358 μs | 7.36 KB | +| Moq | 410.977 μs | 2.1739 μs | 1.9271 μs | 36.27 KB | +| NSubstitute | 17.649 μs | 0.2649 μs | 0.2478 μs | 26.72 KB | +| FakeItEasy | 18.513 μs | 0.3696 μs | 0.3457 μs | 25.68 KB | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Full workflow: create → setup → invoke → verify: xychart-beta title "CombinedWorkflow Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (μs)" 0 --> 487 - bar [1.855, 2.639, 1.609, 405.447, 17.009, 19.196] + y-axis "Time (μs)" 0 --> 494 + bar [1.962, 2.709, 1.696, 410.977, 17.649, 18.513] ``` ## 🎯 Key Insights @@ -65,4 +65,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-08-08T02:56:03.834Z* +*Last generated: 2026-08-09T03:02:07.270Z* diff --git a/docs/docs/benchmarks/mocks/Invocation.md b/docs/docs/benchmarks/mocks/Invocation.md index 126aacc2eb..a94276febb 100644 --- a/docs/docs/benchmarks/mocks/Invocation.md +++ b/docs/docs/benchmarks/mocks/Invocation.md @@ -9,7 +9,7 @@ sidebar_position: 4 > Calling methods on mock objects — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-08-08** from the latest CI run. +This benchmark was automatically generated on **2026-08-09** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.302 ::: @@ -20,12 +20,12 @@ Calling methods on mock objects: | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 280.23 ns | 63.399 ns | 3.475 ns | 128 B | -| Imposter | 305.69 ns | 59.821 ns | 3.279 ns | 168 B | -| Mockolate | 125.16 ns | 11.538 ns | 0.632 ns | 84 B | -| Moq | 792.49 ns | 210.510 ns | 11.539 ns | 376 B | -| NSubstitute | 720.44 ns | 88.247 ns | 4.837 ns | 304 B | -| FakeItEasy | 1,654.13 ns | 90.165 ns | 4.942 ns | 944 B | +| **TUnit.Mocks** | 278.98 ns | 100.15 ns | 5.490 ns | 128 B | +| Imposter | 295.43 ns | 102.58 ns | 5.623 ns | 168 B | +| Mockolate | 107.08 ns | 39.43 ns | 2.162 ns | 84 B | +| Moq | 823.66 ns | 61.62 ns | 3.378 ns | 376 B | +| NSubstitute | 722.95 ns | 161.88 ns | 8.873 ns | 304 B | +| FakeItEasy | 1,794.39 ns | 374.06 ns | 20.503 ns | 944 B | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Calling methods on mock objects: xychart-beta title "Invocation Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 1985 - bar [280.23, 305.69, 125.16, 792.49, 720.44, 1654.13] + y-axis "Time (ns)" 0 --> 2154 + bar [278.98, 295.43, 107.08, 823.66, 722.95, 1794.39] ``` --- @@ -61,12 +61,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 165.84 ns | 65.299 ns | 3.579 ns | 96 B | -| Imposter | 294.01 ns | 122.124 ns | 6.694 ns | 168 B | -| Mockolate | 93.40 ns | 7.171 ns | 0.393 ns | 60 B | -| Moq | 544.33 ns | 169.639 ns | 9.298 ns | 296 B | -| NSubstitute | 615.83 ns | 230.650 ns | 12.643 ns | 272 B | -| FakeItEasy | 1,585.26 ns | 996.476 ns | 54.620 ns | 776 B | +| **TUnit.Mocks** | 166.28 ns | 74.56 ns | 4.087 ns | 96 B | +| Imposter | 301.58 ns | 74.85 ns | 4.103 ns | 168 B | +| Mockolate | 99.12 ns | 25.15 ns | 1.378 ns | 60 B | +| Moq | 573.48 ns | 183.22 ns | 10.043 ns | 296 B | +| NSubstitute | 660.88 ns | 235.83 ns | 12.927 ns | 272 B | +| FakeItEasy | 1,677.56 ns | 180.80 ns | 9.910 ns | 776 B | ```mermaid %%{init: { @@ -92,8 +92,8 @@ xychart-beta xychart-beta title "Invocation (String) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 1903 - bar [165.84, 294.01, 93.4, 544.33, 615.83, 1585.26] + y-axis "Time (ns)" 0 --> 2014 + bar [166.28, 301.58, 99.12, 573.48, 660.88, 1677.56] ``` --- @@ -102,12 +102,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 27,380.54 ns | 15,339.772 ns | 840.825 ns | 12736 B | -| Imposter | 29,751.31 ns | 10,946.571 ns | 600.018 ns | 16800 B | -| Mockolate | 12,090.37 ns | 4,286.149 ns | 234.938 ns | 8400 B | -| Moq | 80,856.50 ns | 24,432.557 ns | 1,339.231 ns | 37600 B | -| NSubstitute | 70,181.92 ns | 16,750.463 ns | 918.149 ns | 30848 B | -| FakeItEasy | 178,852.86 ns | 33,989.630 ns | 1,863.086 ns | 94400 B | +| **TUnit.Mocks** | 28,012.03 ns | 14,418.30 ns | 790.316 ns | 12736 B | +| Imposter | 30,301.44 ns | 8,409.07 ns | 460.930 ns | 16800 B | +| Mockolate | 11,845.57 ns | 4,495.45 ns | 246.411 ns | 8400 B | +| Moq | 86,814.61 ns | 35,464.72 ns | 1,943.941 ns | 37600 B | +| NSubstitute | 74,072.23 ns | 9,500.99 ns | 520.781 ns | 30848 B | +| FakeItEasy | 191,167.94 ns | 17,272.06 ns | 946.740 ns | 94400 B | ```mermaid %%{init: { @@ -133,8 +133,8 @@ xychart-beta xychart-beta title "Invocation (100 calls) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 214624 - bar [27380.54, 29751.31, 12090.37, 80856.5, 70181.92, 178852.86] + y-axis "Time (ns)" 0 --> 229402 + bar [28012.03, 30301.44, 11845.57, 86814.61, 74072.23, 191167.94] ``` ## 🎯 Key Insights @@ -147,4 +147,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-08-08T02:56:03.834Z* +*Last generated: 2026-08-09T03:02:07.270Z* diff --git a/docs/docs/benchmarks/mocks/MockCreation.md b/docs/docs/benchmarks/mocks/MockCreation.md index dd8f6b2cc9..ce1722b3b7 100644 --- a/docs/docs/benchmarks/mocks/MockCreation.md +++ b/docs/docs/benchmarks/mocks/MockCreation.md @@ -9,7 +9,7 @@ sidebar_position: 5 > Mock instance creation performance — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-08-08** from the latest CI run. +This benchmark was automatically generated on **2026-08-09** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.302 ::: @@ -20,12 +20,12 @@ Mock instance creation performance: | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 29.04 ns | 0.568 ns | 0.719 ns | 200 B | -| Imposter | 93.62 ns | 1.271 ns | 1.127 ns | 440 B | -| Mockolate | 17.71 ns | 0.358 ns | 0.335 ns | 160 B | -| Moq | 1,344.12 ns | 25.948 ns | 25.484 ns | 2048 B | -| NSubstitute | 1,935.60 ns | 27.568 ns | 25.787 ns | 5000 B | -| FakeItEasy | 1,843.83 ns | 30.029 ns | 28.090 ns | 2715 B | +| **TUnit.Mocks** | 32.00 ns | 0.697 ns | 0.716 ns | 200 B | +| Imposter | 99.84 ns | 0.804 ns | 0.752 ns | 440 B | +| Mockolate | 19.45 ns | 0.355 ns | 0.332 ns | 160 B | +| Moq | 1,396.66 ns | 27.840 ns | 26.042 ns | 2048 B | +| NSubstitute | 1,981.38 ns | 21.556 ns | 19.109 ns | 5000 B | +| FakeItEasy | 1,884.17 ns | 27.232 ns | 24.140 ns | 2715 B | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Mock instance creation performance: xychart-beta title "MockCreation Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 2323 - bar [29.04, 93.62, 17.71, 1344.12, 1935.6, 1843.83] + y-axis "Time (ns)" 0 --> 2378 + bar [32, 99.84, 19.45, 1396.66, 1981.38, 1884.17] ``` --- @@ -61,12 +61,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 95.78 ns | 0.446 ns | 0.395 ns | 200 B | -| Imposter | 155.49 ns | 2.826 ns | 2.643 ns | 696 B | -| Mockolate | 17.76 ns | 0.223 ns | 0.197 ns | 176 B | -| Moq | 1,309.32 ns | 6.127 ns | 5.431 ns | 1912 B | -| NSubstitute | 1,936.82 ns | 16.714 ns | 15.634 ns | 5000 B | -| FakeItEasy | 1,727.69 ns | 17.892 ns | 15.861 ns | 2715 B | +| **TUnit.Mocks** | 31.89 ns | 0.677 ns | 0.600 ns | 200 B | +| Imposter | 156.80 ns | 1.616 ns | 1.512 ns | 696 B | +| Mockolate | 20.22 ns | 0.451 ns | 0.586 ns | 176 B | +| Moq | 1,411.97 ns | 5.741 ns | 5.090 ns | 1912 B | +| NSubstitute | 1,968.82 ns | 29.645 ns | 27.730 ns | 5000 B | +| FakeItEasy | 1,970.15 ns | 27.717 ns | 25.926 ns | 2715 B | ```mermaid %%{init: { @@ -92,8 +92,8 @@ xychart-beta xychart-beta title "MockCreation (Repository) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 2325 - bar [95.78, 155.49, 17.76, 1309.32, 1936.82, 1727.69] + y-axis "Time (ns)" 0 --> 2365 + bar [31.89, 156.8, 20.22, 1411.97, 1968.82, 1970.15] ``` ## 🎯 Key Insights @@ -106,4 +106,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-08-08T02:56:03.834Z* +*Last generated: 2026-08-09T03:02:07.270Z* diff --git a/docs/docs/benchmarks/mocks/Setup.md b/docs/docs/benchmarks/mocks/Setup.md index 25467168b5..068a93be5c 100644 --- a/docs/docs/benchmarks/mocks/Setup.md +++ b/docs/docs/benchmarks/mocks/Setup.md @@ -9,7 +9,7 @@ sidebar_position: 6 > Mock behavior configuration (returns, matchers) — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-08-08** from the latest CI run. +This benchmark was automatically generated on **2026-08-09** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.302 ::: @@ -20,12 +20,12 @@ Mock behavior configuration (returns, matchers): | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 535.7 ns | 4.47 ns | 4.18 ns | 2.34 KB | -| Imposter | 838.7 ns | 16.62 ns | 15.55 ns | 6.12 KB | -| Mockolate | 336.5 ns | 4.17 ns | 3.70 ns | 1.41 KB | -| Moq | 437,823.2 ns | 1,802.25 ns | 1,504.96 ns | 28.67 KB | -| NSubstitute | 5,935.9 ns | 47.81 ns | 44.72 ns | 9.01 KB | -| FakeItEasy | 8,670.0 ns | 85.24 ns | 79.73 ns | 10.45 KB | +| **TUnit.Mocks** | 542.2 ns | 4.01 ns | 3.55 ns | 2.34 KB | +| Imposter | 777.7 ns | 4.92 ns | 4.36 ns | 6.12 KB | +| Mockolate | 328.5 ns | 3.07 ns | 2.72 ns | 1.41 KB | +| Moq | 301,488.3 ns | 2,223.31 ns | 1,970.91 ns | 28.52 KB | +| NSubstitute | 5,315.1 ns | 63.31 ns | 59.22 ns | 9.01 KB | +| FakeItEasy | 7,089.2 ns | 47.34 ns | 41.97 ns | 10.45 KB | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Mock behavior configuration (returns, matchers): xychart-beta title "Setup Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 525388 - bar [535.7, 838.7, 336.5, 437823.2, 5935.9, 8670] + y-axis "Time (ns)" 0 --> 361786 + bar [542.2, 777.7, 328.5, 301488.3, 5315.1, 7089.2] ``` --- @@ -61,12 +61,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 815.5 ns | 16.32 ns | 19.42 ns | 3.15 KB | -| Imposter | 1,479.5 ns | 29.19 ns | 60.28 ns | 10.59 KB | -| Mockolate | 581.4 ns | 9.08 ns | 8.49 ns | 2.35 KB | -| Moq | 114,005.4 ns | 1,156.97 ns | 1,082.23 ns | 16.53 KB | -| NSubstitute | 11,875.4 ns | 166.42 ns | 155.67 ns | 20.31 KB | -| FakeItEasy | 7,836.1 ns | 100.42 ns | 83.85 ns | 11.71 KB | +| **TUnit.Mocks** | 807.8 ns | 5.72 ns | 5.35 ns | 3.15 KB | +| Imposter | 1,391.3 ns | 24.21 ns | 22.65 ns | 10.59 KB | +| Mockolate | 565.4 ns | 4.81 ns | 4.50 ns | 2.35 KB | +| Moq | 87,912.4 ns | 728.63 ns | 645.91 ns | 16.53 KB | +| NSubstitute | 10,799.3 ns | 188.72 ns | 176.53 ns | 20.31 KB | +| FakeItEasy | 6,970.8 ns | 97.95 ns | 86.83 ns | 11.79 KB | ```mermaid %%{init: { @@ -92,8 +92,8 @@ xychart-beta xychart-beta title "Setup (Multiple) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 136807 - bar [815.5, 1479.5, 581.4, 114005.4, 11875.4, 7836.1] + y-axis "Time (ns)" 0 --> 105495 + bar [807.8, 1391.3, 565.4, 87912.4, 10799.3, 6970.8] ``` ## 🎯 Key Insights @@ -106,4 +106,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-08-08T02:56:03.834Z* +*Last generated: 2026-08-09T03:02:07.270Z* diff --git a/docs/docs/benchmarks/mocks/Verification.md b/docs/docs/benchmarks/mocks/Verification.md index 2b1f3c4042..382832284a 100644 --- a/docs/docs/benchmarks/mocks/Verification.md +++ b/docs/docs/benchmarks/mocks/Verification.md @@ -9,7 +9,7 @@ sidebar_position: 7 > Verifying mock method calls — comparing **TUnit.Mocks** (source-generated) against runtime proxy-based mocking libraries. :::info Last Updated -This benchmark was automatically generated on **2026-08-08** from the latest CI run. +This benchmark was automatically generated on **2026-08-09** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.302 ::: @@ -20,12 +20,12 @@ Verifying mock method calls: | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 572.48 ns | 1.760 ns | 1.470 ns | 3008 B | -| Imposter | 526.78 ns | 2.156 ns | 1.911 ns | 4688 B | -| Mockolate | 305.86 ns | 0.614 ns | 0.544 ns | 2128 B | -| Moq | 190,694.43 ns | 1,162.150 ns | 1,030.216 ns | 24324 B | -| NSubstitute | 4,440.29 ns | 23.511 ns | 20.842 ns | 10064 B | -| FakeItEasy | 5,114.93 ns | 29.379 ns | 26.044 ns | 10722 B | +| **TUnit.Mocks** | 850.61 ns | 10.672 ns | 9.982 ns | 3008 B | +| Imposter | 883.33 ns | 16.989 ns | 18.178 ns | 4688 B | +| Mockolate | 482.71 ns | 5.530 ns | 4.902 ns | 2128 B | +| Moq | 360,656.91 ns | 3,261.115 ns | 2,723.179 ns | 24564 B | +| NSubstitute | 6,660.30 ns | 12.520 ns | 10.455 ns | 10064 B | +| FakeItEasy | 7,936.47 ns | 35.916 ns | 31.839 ns | 10722 B | ```mermaid %%{init: { @@ -51,8 +51,8 @@ Verifying mock method calls: xychart-beta title "Verification Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 228834 - bar [572.48, 526.78, 305.86, 190694.43, 4440.29, 5114.93] + y-axis "Time (ns)" 0 --> 432789 + bar [850.61, 883.33, 482.71, 360656.91, 6660.3, 7936.47] ``` --- @@ -61,12 +61,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 42.41 ns | 0.097 ns | 0.086 ns | 320 B | -| Imposter | 257.31 ns | 4.418 ns | 4.132 ns | 2400 B | -| Mockolate | 195.94 ns | 2.076 ns | 1.840 ns | 1144 B | -| Moq | 49,344.14 ns | 201.488 ns | 178.614 ns | 6925 B | -| NSubstitute | 2,618.94 ns | 12.484 ns | 11.067 ns | 7088 B | -| FakeItEasy | 2,523.83 ns | 9.448 ns | 8.376 ns | 5210 B | +| **TUnit.Mocks** | 62.53 ns | 1.069 ns | 1.000 ns | 320 B | +| Imposter | 383.58 ns | 7.612 ns | 7.120 ns | 2400 B | +| Mockolate | 258.60 ns | 5.092 ns | 6.621 ns | 1144 B | +| Moq | 90,970.40 ns | 364.060 ns | 340.542 ns | 6918 B | +| NSubstitute | 3,865.43 ns | 29.036 ns | 27.160 ns | 7088 B | +| FakeItEasy | 3,774.42 ns | 27.993 ns | 23.375 ns | 5209 B | ```mermaid %%{init: { @@ -92,8 +92,8 @@ xychart-beta xychart-beta title "Verification (Never) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 59213 - bar [42.41, 257.31, 195.94, 49344.14, 2618.94, 2523.83] + y-axis "Time (ns)" 0 --> 109165 + bar [62.53, 383.58, 258.6, 90970.4, 3865.43, 3774.42] ``` --- @@ -102,12 +102,12 @@ xychart-beta | Library | Mean | Error | StdDev | Allocated | |---------|------|-------|--------|-----------| -| **TUnit.Mocks** | 977.60 ns | 3.398 ns | 3.179 ns | 4472 B | -| Imposter | 1,310.13 ns | 8.740 ns | 8.176 ns | 11192 B | -| Mockolate | 843.21 ns | 5.315 ns | 4.972 ns | 5240 B | -| Moq | 274,473.63 ns | 1,371.182 ns | 1,215.517 ns | 34842 B | -| NSubstitute | 7,921.79 ns | 45.596 ns | 40.420 ns | 16762 B | -| FakeItEasy | 8,981.93 ns | 75.203 ns | 70.345 ns | 19232 B | +| **TUnit.Mocks** | 1,318.74 ns | 15.285 ns | 14.298 ns | 4472 B | +| Imposter | 1,954.59 ns | 37.666 ns | 36.993 ns | 11192 B | +| Mockolate | 1,172.60 ns | 22.811 ns | 34.835 ns | 5240 B | +| Moq | 485,595.43 ns | 3,281.595 ns | 2,740.280 ns | 34811 B | +| NSubstitute | 11,747.82 ns | 112.006 ns | 99.290 ns | 16763 B | +| FakeItEasy | 14,345.40 ns | 209.651 ns | 196.108 ns | 19233 B | ```mermaid %%{init: { @@ -133,8 +133,8 @@ xychart-beta xychart-beta title "Verification (Multiple) Performance Comparison" x-axis ["TUnit.Mocks", "Imposter", "Mockolate", "Moq", "NSubstitute", "FakeItEasy"] - y-axis "Time (ns)" 0 --> 329369 - bar [977.6, 1310.13, 843.21, 274473.63, 7921.79, 8981.93] + y-axis "Time (ns)" 0 --> 582715 + bar [1318.74, 1954.59, 1172.6, 485595.43, 11747.82, 14345.4] ``` ## 🎯 Key Insights @@ -147,4 +147,4 @@ This benchmark compares **TUnit.Mocks** (source-generated) against runtime proxy View the [mock benchmarks overview](/docs/benchmarks/mocks) for methodology details and environment information. ::: -*Last generated: 2026-08-08T02:56:03.834Z* +*Last generated: 2026-08-09T03:02:07.270Z* diff --git a/docs/docs/benchmarks/mocks/index.md b/docs/docs/benchmarks/mocks/index.md index 2c5cbc714a..ddea39667f 100644 --- a/docs/docs/benchmarks/mocks/index.md +++ b/docs/docs/benchmarks/mocks/index.md @@ -7,7 +7,7 @@ sidebar_position: 4 # Mock Library Benchmarks :::info Last Updated -These benchmarks were automatically generated on **2026-08-08** from the latest CI run. +These benchmarks were automatically generated on **2026-08-09** from the latest CI run. **Environment:** Ubuntu Latest • .NET SDK 10.0.302 ::: @@ -51,7 +51,7 @@ Each benchmark category tests a specific aspect of mocking library usage: - **Tool**: BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat) - **OS**: Ubuntu Latest (GitHub Actions) -- **Runtime**: .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v4 +- **Runtime**: .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v3 - **Statistical Rigor**: Multiple iterations with warm-up and outlier detection - **Memory**: Allocation tracking enabled via `[MemoryDiagnoser]` @@ -76,4 +76,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-08-08T02:56:03.834Z* +*Last generated: 2026-08-09T03:02:07.270Z* diff --git a/docs/docs/writing-tests/artifacts.md b/docs/docs/writing-tests/artifacts.md index 0189678c7e..ebc7595e42 100644 --- a/docs/docs/writing-tests/artifacts.md +++ b/docs/docs/writing-tests/artifacts.md @@ -10,6 +10,23 @@ TUnit supports attaching artifacts at two levels: Attach files to individual tests using `TestContext.Current.Output.AttachArtifact()`. +### Writing Artifacts to the Results Directory + +Use `TestContext.ResultsDirectory` to place generated files alongside reports and other +artifacts. The property returns the absolute directory selected by Microsoft.Testing.Platform, +including any `--results-directory` override. + +```csharp +[Test] +public async Task CaptureLog() +{ + var artifactPath = Path.Combine(TestContext.ResultsDirectory, "application.log"); + + await File.WriteAllTextAsync(artifactPath, "Diagnostic information"); + TestContext.Current!.Output.AttachArtifact(artifactPath); +} +``` + ### Basic Usage The simplest way to attach an artifact is by providing just the file path: diff --git a/docs/docs/writing-tests/test-context.md b/docs/docs/writing-tests/test-context.md index d59604a00c..8c4786f6b5 100644 --- a/docs/docs/writing-tests/test-context.md +++ b/docs/docs/writing-tests/test-context.md @@ -53,6 +53,10 @@ Both `Output.WriteLine()` and `OutputWriter.WriteLine()` are valid - the `Output Artifacts are particularly useful for debugging test failures, especially in integration tests. You can attach screenshots, logs, videos, configuration files, or any other files that help diagnose issues. +Use `TestContext.ResultsDirectory` to get the absolute Microsoft.Testing.Platform results +directory. It respects configuration such as `--results-directory` and is suitable for files +that should live alongside test reports. + For complete information about working with test artifacts, including session-level artifacts, best practices, and common use cases, see the [Test Artifacts](./artifacts.md) guide. ## Test Isolation diff --git a/docs/static/benchmarks/AsyncTests.json b/docs/static/benchmarks/AsyncTests.json index 6e9da4e594..737ea60794 100644 --- a/docs/static/benchmarks/AsyncTests.json +++ b/docs/static/benchmarks/AsyncTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-08-02T00:39:00.699Z", + "timestamp": "2026-08-09T00:23:17.026Z", "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.63.0", - "Mean": "371.9 ms", - "Error": "7.35 ms", - "StdDev": "10.77 ms", - "Median": "371.3 ms" + "Version": "1.64.0", + "Mean": "406.5 ms", + "Error": "8.10 ms", + "StdDev": "20.76 ms", + "Median": "401.4 ms" }, { "Method": "NUnit", "Version": "4.6.1", - "Mean": "581.4 ms", - "Error": "10.81 ms", - "StdDev": "22.81 ms", - "Median": "575.0 ms" + "Mean": "657.7 ms", + "Error": "13.35 ms", + "StdDev": "38.73 ms", + "Median": "649.5 ms" }, { "Method": "MSTest", "Version": "4.3.3", - "Mean": "647.1 ms", - "Error": "8.22 ms", - "StdDev": "6.41 ms", - "Median": "644.3 ms" + "Mean": "750.7 ms", + "Error": "14.86 ms", + "StdDev": "38.09 ms", + "Median": "745.6 ms" }, { "Method": "xUnit3", "Version": "3.2.2", - "Mean": "593.1 ms", - "Error": "5.88 ms", - "StdDev": "4.59 ms", - "Median": "593.1 ms" + "Mean": "671.9 ms", + "Error": "13.35 ms", + "StdDev": "22.31 ms", + "Median": "670.0 ms" }, { "Method": "TUnit_AOT", - "Version": "1.63.0", - "Mean": "115.7 ms", - "Error": "0.28 ms", - "StdDev": "0.26 ms", - "Median": "115.8 ms" + "Version": "1.64.0", + "Mean": "120.7 ms", + "Error": "1.88 ms", + "StdDev": "1.57 ms", + "Median": "120.7 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/BuildTime.json b/docs/static/benchmarks/BuildTime.json index c42a925571..57b6004614 100644 --- a/docs/static/benchmarks/BuildTime.json +++ b/docs/static/benchmarks/BuildTime.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-08-02T00:39:00.701Z", + "timestamp": "2026-08-09T00:23:17.061Z", "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.63.0", - "Mean": "979.5 ms", - "Error": "19.26 ms", - "StdDev": "31.64 ms", - "Median": "973.6 ms" + "Version": "1.64.0", + "Mean": "940.2 ms", + "Error": "16.67 ms", + "StdDev": "27.85 ms", + "Median": "938.3 ms" }, { "Method": "Build_NUnit", "Version": "4.6.1", - "Mean": "936.7 ms", - "Error": "17.80 ms", - "StdDev": "21.86 ms", - "Median": "931.0 ms" + "Mean": "925.3 ms", + "Error": "18.28 ms", + "StdDev": "17.10 ms", + "Median": "924.0 ms" }, { "Method": "Build_MSTest", "Version": "4.3.3", - "Mean": "1,035.8 ms", - "Error": "20.33 ms", - "StdDev": "51.38 ms", - "Median": "1,030.7 ms" + "Mean": "1,033.0 ms", + "Error": "20.48 ms", + "StdDev": "49.06 ms", + "Median": "1,024.9 ms" }, { "Method": "Build_xUnit3", "Version": "3.2.2", - "Mean": "912.5 ms", - "Error": "12.35 ms", - "StdDev": "11.55 ms", - "Median": "908.4 ms" + "Mean": "930.5 ms", + "Error": "17.26 ms", + "StdDev": "16.14 ms", + "Median": "927.8 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/DataDrivenTests.json b/docs/static/benchmarks/DataDrivenTests.json index 13632a5775..4b1e3d8c52 100644 --- a/docs/static/benchmarks/DataDrivenTests.json +++ b/docs/static/benchmarks/DataDrivenTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-08-02T00:39:00.699Z", + "timestamp": "2026-08-09T00:23:17.026Z", "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.63.0", - "Mean": "280.70 ms", - "Error": "5.431 ms", - "StdDev": "5.578 ms", - "Median": "279.14 ms" + "Version": "1.64.0", + "Mean": "308.59 ms", + "Error": "5.719 ms", + "StdDev": "5.350 ms", + "Median": "307.89 ms" }, { "Method": "NUnit", "Version": "4.6.1", - "Mean": "502.48 ms", - "Error": "9.971 ms", - "StdDev": "13.978 ms", - "Median": "502.48 ms" + "Mean": "547.52 ms", + "Error": "11.282 ms", + "StdDev": "31.636 ms", + "Median": "541.49 ms" }, { "Method": "MSTest", "Version": "4.3.3", - "Mean": "493.15 ms", - "Error": "6.899 ms", - "StdDev": "5.387 ms", - "Median": "494.68 ms" + "Mean": "552.18 ms", + "Error": "14.121 ms", + "StdDev": "41.191 ms", + "Median": "551.76 ms" }, { "Method": "xUnit3", "Version": "3.2.2", - "Mean": "520.02 ms", - "Error": "10.367 ms", - "StdDev": "26.760 ms", - "Median": "510.65 ms" + "Mean": "534.14 ms", + "Error": "10.540 ms", + "StdDev": "9.859 ms", + "Median": "529.06 ms" }, { "Method": "TUnit_AOT", - "Version": "1.63.0", - "Mean": "12.99 ms", - "Error": "0.065 ms", - "StdDev": "0.051 ms", - "Median": "12.99 ms" + "Version": "1.64.0", + "Mean": "17.74 ms", + "Error": "0.354 ms", + "StdDev": "0.933 ms", + "Median": "17.58 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MassiveParallelTests.json b/docs/static/benchmarks/MassiveParallelTests.json index de4db78c67..4d62e67dd2 100644 --- a/docs/static/benchmarks/MassiveParallelTests.json +++ b/docs/static/benchmarks/MassiveParallelTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-08-02T00:39:00.700Z", + "timestamp": "2026-08-09T00:23:17.027Z", "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.63.0", - "Mean": "467.8 ms", - "Error": "4.20 ms", - "StdDev": "3.93 ms", - "Median": "469.3 ms" + "Version": "1.64.0", + "Mean": "469.3 ms", + "Error": "3.21 ms", + "StdDev": "3.00 ms", + "Median": "469.4 ms" }, { "Method": "NUnit", "Version": "4.6.1", - "Mean": "1,079.8 ms", - "Error": "10.07 ms", - "StdDev": "8.41 ms", - "Median": "1,076.9 ms" + "Mean": "1,073.9 ms", + "Error": "14.51 ms", + "StdDev": "12.86 ms", + "Median": "1,067.0 ms" }, { "Method": "MSTest", "Version": "4.3.3", - "Mean": "3,004.0 ms", - "Error": "35.10 ms", - "StdDev": "32.83 ms", - "Median": "2,990.8 ms" + "Mean": "2,981.5 ms", + "Error": "32.62 ms", + "StdDev": "30.52 ms", + "Median": "2,993.4 ms" }, { "Method": "xUnit3", "Version": "3.2.2", - "Mean": "2,927.5 ms", - "Error": "6.44 ms", - "StdDev": "6.02 ms", - "Median": "2,926.2 ms" + "Mean": "2,926.8 ms", + "Error": "15.21 ms", + "StdDev": "12.70 ms", + "Median": "2,928.2 ms" }, { "Method": "TUnit_AOT", - "Version": "1.63.0", - "Mean": "218.3 ms", - "Error": "0.61 ms", - "StdDev": "0.57 ms", - "Median": "218.1 ms" + "Version": "1.64.0", + "Mean": "217.8 ms", + "Error": "0.42 ms", + "StdDev": "0.39 ms", + "Median": "217.7 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/MatrixTests.json b/docs/static/benchmarks/MatrixTests.json index 56c6c50aff..87ff1f77f4 100644 --- a/docs/static/benchmarks/MatrixTests.json +++ b/docs/static/benchmarks/MatrixTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-08-02T00:39:00.700Z", + "timestamp": "2026-08-09T00:23:17.027Z", "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.63.0", - "Mean": "382.4 ms", - "Error": "2.29 ms", - "StdDev": "2.03 ms", - "Median": "382.4 ms" + "Version": "1.64.0", + "Mean": "375.1 ms", + "Error": "5.96 ms", + "StdDev": "5.58 ms", + "Median": "375.9 ms" }, { "Method": "NUnit", "Version": "4.6.1", - "Mean": "1,432.9 ms", - "Error": "5.88 ms", - "StdDev": "5.50 ms", - "Median": "1,431.1 ms" + "Mean": "1,420.2 ms", + "Error": "9.23 ms", + "StdDev": "7.71 ms", + "Median": "1,421.2 ms" }, { "Method": "MSTest", "Version": "4.3.3", - "Mean": "1,523.1 ms", - "Error": "20.34 ms", - "StdDev": "16.98 ms", - "Median": "1,517.4 ms" + "Mean": "1,530.7 ms", + "Error": "25.55 ms", + "StdDev": "22.65 ms", + "Median": "1,525.7 ms" }, { "Method": "xUnit3", "Version": "3.2.2", - "Mean": "1,455.4 ms", - "Error": "4.94 ms", - "StdDev": "4.38 ms", - "Median": "1,456.1 ms" + "Mean": "1,443.5 ms", + "Error": "7.38 ms", + "StdDev": "6.54 ms", + "Median": "1,440.6 ms" }, { "Method": "TUnit_AOT", - "Version": "1.63.0", - "Mean": "116.1 ms", - "Error": "0.16 ms", - "StdDev": "0.14 ms", - "Median": "116.1 ms" + "Version": "1.64.0", + "Mean": "115.4 ms", + "Error": "0.71 ms", + "StdDev": "0.63 ms", + "Median": "115.3 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/ScaleTests.json b/docs/static/benchmarks/ScaleTests.json index 476a52e8eb..19d00d56d9 100644 --- a/docs/static/benchmarks/ScaleTests.json +++ b/docs/static/benchmarks/ScaleTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-08-02T00:39:00.700Z", + "timestamp": "2026-08-09T00:23:17.060Z", "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.63.0", - "Mean": "284.56 ms", - "Error": "1.985 ms", - "StdDev": "1.759 ms", - "Median": "283.96 ms" + "Version": "1.64.0", + "Mean": "272.51 ms", + "Error": "3.420 ms", + "StdDev": "3.031 ms", + "Median": "271.73 ms" }, { "Method": "NUnit", "Version": "4.6.1", - "Mean": "509.08 ms", - "Error": "9.444 ms", - "StdDev": "11.598 ms", - "Median": "507.99 ms" + "Mean": "502.50 ms", + "Error": "9.990 ms", + "StdDev": "21.289 ms", + "Median": "495.10 ms" }, { "Method": "MSTest", "Version": "4.3.3", - "Mean": "497.92 ms", - "Error": "6.030 ms", - "StdDev": "4.708 ms", - "Median": "497.23 ms" + "Mean": "494.11 ms", + "Error": "5.782 ms", + "StdDev": "4.829 ms", + "Median": "495.49 ms" }, { "Method": "xUnit3", "Version": "3.2.2", - "Mean": "506.40 ms", - "Error": "9.826 ms", - "StdDev": "8.711 ms", - "Median": "505.96 ms" + "Mean": "500.67 ms", + "Error": "9.657 ms", + "StdDev": "13.537 ms", + "Median": "496.60 ms" }, { "Method": "TUnit_AOT", - "Version": "1.63.0", - "Mean": "14.57 ms", - "Error": "0.129 ms", - "StdDev": "0.121 ms", - "Median": "14.52 ms" + "Version": "1.64.0", + "Mean": "15.92 ms", + "Error": "0.317 ms", + "StdDev": "0.588 ms", + "Median": "15.92 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/SetupTeardownTests.json b/docs/static/benchmarks/SetupTeardownTests.json index 04e582d1a7..648df37fe0 100644 --- a/docs/static/benchmarks/SetupTeardownTests.json +++ b/docs/static/benchmarks/SetupTeardownTests.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-08-02T00:39:00.701Z", + "timestamp": "2026-08-09T00:23:17.061Z", "category": "SetupTeardownTests", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", @@ -9,43 +9,43 @@ "results": [ { "Method": "TUnit", - "Version": "1.63.0", - "Mean": "337.77 ms", - "Error": "2.112 ms", - "StdDev": "1.649 ms", - "Median": "337.90 ms" + "Version": "1.64.0", + "Mean": "327.59 ms", + "Error": "2.921 ms", + "StdDev": "2.732 ms", + "Median": "326.78 ms" }, { "Method": "NUnit", "Version": "4.6.1", - "Mean": "1,003.23 ms", - "Error": "5.683 ms", - "StdDev": "4.437 ms", - "Median": "1,003.81 ms" + "Mean": "996.24 ms", + "Error": "8.514 ms", + "StdDev": "7.547 ms", + "Median": "995.63 ms" }, { "Method": "MSTest", "Version": "4.3.3", - "Mean": "1,105.44 ms", - "Error": "22.003 ms", - "StdDev": "22.596 ms", - "Median": "1,096.64 ms" + "Mean": "1,066.16 ms", + "Error": "18.486 ms", + "StdDev": "17.292 ms", + "Median": "1,060.72 ms" }, { "Method": "xUnit3", "Version": "3.2.2", - "Mean": "1,052.38 ms", - "Error": "20.819 ms", - "StdDev": "20.447 ms", - "Median": "1,048.62 ms" + "Mean": "1,024.32 ms", + "Error": "10.028 ms", + "StdDev": "9.380 ms", + "Median": "1,023.42 ms" }, { "Method": "TUnit_AOT", - "Version": "1.63.0", - "Mean": "64.70 ms", - "Error": "0.533 ms", - "StdDev": "0.499 ms", - "Median": "64.46 ms" + "Version": "1.64.0", + "Mean": "66.11 ms", + "Error": "0.872 ms", + "StdDev": "0.728 ms", + "Median": "66.06 ms" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/historical.json b/docs/static/benchmarks/historical.json index 2b02421cce..d907ed2338 100644 --- a/docs/static/benchmarks/historical.json +++ b/docs/static/benchmarks/historical.json @@ -1,8 +1,4 @@ [ - { - "date": "2026-03-19", - "environment": "Ubuntu" - }, { "date": "2026-03-20", "environment": "Ubuntu" @@ -358,5 +354,9 @@ { "date": "2026-08-02", "environment": "Ubuntu" + }, + { + "date": "2026-08-09", + "environment": "Ubuntu" } ] \ No newline at end of file diff --git a/docs/static/benchmarks/latest.json b/docs/static/benchmarks/latest.json index fb34fa0bd0..320f304546 100644 --- a/docs/static/benchmarks/latest.json +++ b/docs/static/benchmarks/latest.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-08-02T00:39:00.701Z", + "timestamp": "2026-08-09T00:23:17.061Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.302", @@ -9,253 +9,253 @@ "AsyncTests": [ { "Method": "TUnit", - "Version": "1.63.0", - "Mean": "371.9 ms", - "Error": "7.35 ms", - "StdDev": "10.77 ms", - "Median": "371.3 ms" + "Version": "1.64.0", + "Mean": "406.5 ms", + "Error": "8.10 ms", + "StdDev": "20.76 ms", + "Median": "401.4 ms" }, { "Method": "NUnit", "Version": "4.6.1", - "Mean": "581.4 ms", - "Error": "10.81 ms", - "StdDev": "22.81 ms", - "Median": "575.0 ms" + "Mean": "657.7 ms", + "Error": "13.35 ms", + "StdDev": "38.73 ms", + "Median": "649.5 ms" }, { "Method": "MSTest", "Version": "4.3.3", - "Mean": "647.1 ms", - "Error": "8.22 ms", - "StdDev": "6.41 ms", - "Median": "644.3 ms" + "Mean": "750.7 ms", + "Error": "14.86 ms", + "StdDev": "38.09 ms", + "Median": "745.6 ms" }, { "Method": "xUnit3", "Version": "3.2.2", - "Mean": "593.1 ms", - "Error": "5.88 ms", - "StdDev": "4.59 ms", - "Median": "593.1 ms" + "Mean": "671.9 ms", + "Error": "13.35 ms", + "StdDev": "22.31 ms", + "Median": "670.0 ms" }, { "Method": "TUnit_AOT", - "Version": "1.63.0", - "Mean": "115.7 ms", - "Error": "0.28 ms", - "StdDev": "0.26 ms", - "Median": "115.8 ms" + "Version": "1.64.0", + "Mean": "120.7 ms", + "Error": "1.88 ms", + "StdDev": "1.57 ms", + "Median": "120.7 ms" } ], "DataDrivenTests": [ { "Method": "TUnit", - "Version": "1.63.0", - "Mean": "280.70 ms", - "Error": "5.431 ms", - "StdDev": "5.578 ms", - "Median": "279.14 ms" + "Version": "1.64.0", + "Mean": "308.59 ms", + "Error": "5.719 ms", + "StdDev": "5.350 ms", + "Median": "307.89 ms" }, { "Method": "NUnit", "Version": "4.6.1", - "Mean": "502.48 ms", - "Error": "9.971 ms", - "StdDev": "13.978 ms", - "Median": "502.48 ms" + "Mean": "547.52 ms", + "Error": "11.282 ms", + "StdDev": "31.636 ms", + "Median": "541.49 ms" }, { "Method": "MSTest", "Version": "4.3.3", - "Mean": "493.15 ms", - "Error": "6.899 ms", - "StdDev": "5.387 ms", - "Median": "494.68 ms" + "Mean": "552.18 ms", + "Error": "14.121 ms", + "StdDev": "41.191 ms", + "Median": "551.76 ms" }, { "Method": "xUnit3", "Version": "3.2.2", - "Mean": "520.02 ms", - "Error": "10.367 ms", - "StdDev": "26.760 ms", - "Median": "510.65 ms" + "Mean": "534.14 ms", + "Error": "10.540 ms", + "StdDev": "9.859 ms", + "Median": "529.06 ms" }, { "Method": "TUnit_AOT", - "Version": "1.63.0", - "Mean": "12.99 ms", - "Error": "0.065 ms", - "StdDev": "0.051 ms", - "Median": "12.99 ms" + "Version": "1.64.0", + "Mean": "17.74 ms", + "Error": "0.354 ms", + "StdDev": "0.933 ms", + "Median": "17.58 ms" } ], "MassiveParallelTests": [ { "Method": "TUnit", - "Version": "1.63.0", - "Mean": "467.8 ms", - "Error": "4.20 ms", - "StdDev": "3.93 ms", - "Median": "469.3 ms" + "Version": "1.64.0", + "Mean": "469.3 ms", + "Error": "3.21 ms", + "StdDev": "3.00 ms", + "Median": "469.4 ms" }, { "Method": "NUnit", "Version": "4.6.1", - "Mean": "1,079.8 ms", - "Error": "10.07 ms", - "StdDev": "8.41 ms", - "Median": "1,076.9 ms" + "Mean": "1,073.9 ms", + "Error": "14.51 ms", + "StdDev": "12.86 ms", + "Median": "1,067.0 ms" }, { "Method": "MSTest", "Version": "4.3.3", - "Mean": "3,004.0 ms", - "Error": "35.10 ms", - "StdDev": "32.83 ms", - "Median": "2,990.8 ms" + "Mean": "2,981.5 ms", + "Error": "32.62 ms", + "StdDev": "30.52 ms", + "Median": "2,993.4 ms" }, { "Method": "xUnit3", "Version": "3.2.2", - "Mean": "2,927.5 ms", - "Error": "6.44 ms", - "StdDev": "6.02 ms", - "Median": "2,926.2 ms" + "Mean": "2,926.8 ms", + "Error": "15.21 ms", + "StdDev": "12.70 ms", + "Median": "2,928.2 ms" }, { "Method": "TUnit_AOT", - "Version": "1.63.0", - "Mean": "218.3 ms", - "Error": "0.61 ms", - "StdDev": "0.57 ms", - "Median": "218.1 ms" + "Version": "1.64.0", + "Mean": "217.8 ms", + "Error": "0.42 ms", + "StdDev": "0.39 ms", + "Median": "217.7 ms" } ], "MatrixTests": [ { "Method": "TUnit", - "Version": "1.63.0", - "Mean": "382.4 ms", - "Error": "2.29 ms", - "StdDev": "2.03 ms", - "Median": "382.4 ms" + "Version": "1.64.0", + "Mean": "375.1 ms", + "Error": "5.96 ms", + "StdDev": "5.58 ms", + "Median": "375.9 ms" }, { "Method": "NUnit", "Version": "4.6.1", - "Mean": "1,432.9 ms", - "Error": "5.88 ms", - "StdDev": "5.50 ms", - "Median": "1,431.1 ms" + "Mean": "1,420.2 ms", + "Error": "9.23 ms", + "StdDev": "7.71 ms", + "Median": "1,421.2 ms" }, { "Method": "MSTest", "Version": "4.3.3", - "Mean": "1,523.1 ms", - "Error": "20.34 ms", - "StdDev": "16.98 ms", - "Median": "1,517.4 ms" + "Mean": "1,530.7 ms", + "Error": "25.55 ms", + "StdDev": "22.65 ms", + "Median": "1,525.7 ms" }, { "Method": "xUnit3", "Version": "3.2.2", - "Mean": "1,455.4 ms", - "Error": "4.94 ms", - "StdDev": "4.38 ms", - "Median": "1,456.1 ms" + "Mean": "1,443.5 ms", + "Error": "7.38 ms", + "StdDev": "6.54 ms", + "Median": "1,440.6 ms" }, { "Method": "TUnit_AOT", - "Version": "1.63.0", - "Mean": "116.1 ms", - "Error": "0.16 ms", - "StdDev": "0.14 ms", - "Median": "116.1 ms" + "Version": "1.64.0", + "Mean": "115.4 ms", + "Error": "0.71 ms", + "StdDev": "0.63 ms", + "Median": "115.3 ms" } ], "ScaleTests": [ { "Method": "TUnit", - "Version": "1.63.0", - "Mean": "284.56 ms", - "Error": "1.985 ms", - "StdDev": "1.759 ms", - "Median": "283.96 ms" + "Version": "1.64.0", + "Mean": "272.51 ms", + "Error": "3.420 ms", + "StdDev": "3.031 ms", + "Median": "271.73 ms" }, { "Method": "NUnit", "Version": "4.6.1", - "Mean": "509.08 ms", - "Error": "9.444 ms", - "StdDev": "11.598 ms", - "Median": "507.99 ms" + "Mean": "502.50 ms", + "Error": "9.990 ms", + "StdDev": "21.289 ms", + "Median": "495.10 ms" }, { "Method": "MSTest", "Version": "4.3.3", - "Mean": "497.92 ms", - "Error": "6.030 ms", - "StdDev": "4.708 ms", - "Median": "497.23 ms" + "Mean": "494.11 ms", + "Error": "5.782 ms", + "StdDev": "4.829 ms", + "Median": "495.49 ms" }, { "Method": "xUnit3", "Version": "3.2.2", - "Mean": "506.40 ms", - "Error": "9.826 ms", - "StdDev": "8.711 ms", - "Median": "505.96 ms" + "Mean": "500.67 ms", + "Error": "9.657 ms", + "StdDev": "13.537 ms", + "Median": "496.60 ms" }, { "Method": "TUnit_AOT", - "Version": "1.63.0", - "Mean": "14.57 ms", - "Error": "0.129 ms", - "StdDev": "0.121 ms", - "Median": "14.52 ms" + "Version": "1.64.0", + "Mean": "15.92 ms", + "Error": "0.317 ms", + "StdDev": "0.588 ms", + "Median": "15.92 ms" } ], "SetupTeardownTests": [ { "Method": "TUnit", - "Version": "1.63.0", - "Mean": "337.77 ms", - "Error": "2.112 ms", - "StdDev": "1.649 ms", - "Median": "337.90 ms" + "Version": "1.64.0", + "Mean": "327.59 ms", + "Error": "2.921 ms", + "StdDev": "2.732 ms", + "Median": "326.78 ms" }, { "Method": "NUnit", "Version": "4.6.1", - "Mean": "1,003.23 ms", - "Error": "5.683 ms", - "StdDev": "4.437 ms", - "Median": "1,003.81 ms" + "Mean": "996.24 ms", + "Error": "8.514 ms", + "StdDev": "7.547 ms", + "Median": "995.63 ms" }, { "Method": "MSTest", "Version": "4.3.3", - "Mean": "1,105.44 ms", - "Error": "22.003 ms", - "StdDev": "22.596 ms", - "Median": "1,096.64 ms" + "Mean": "1,066.16 ms", + "Error": "18.486 ms", + "StdDev": "17.292 ms", + "Median": "1,060.72 ms" }, { "Method": "xUnit3", "Version": "3.2.2", - "Mean": "1,052.38 ms", - "Error": "20.819 ms", - "StdDev": "20.447 ms", - "Median": "1,048.62 ms" + "Mean": "1,024.32 ms", + "Error": "10.028 ms", + "StdDev": "9.380 ms", + "Median": "1,023.42 ms" }, { "Method": "TUnit_AOT", - "Version": "1.63.0", - "Mean": "64.70 ms", - "Error": "0.533 ms", - "StdDev": "0.499 ms", - "Median": "64.46 ms" + "Version": "1.64.0", + "Mean": "66.11 ms", + "Error": "0.872 ms", + "StdDev": "0.728 ms", + "Median": "66.06 ms" } ] }, @@ -263,35 +263,35 @@ "BuildTime": [ { "Method": "Build_TUnit", - "Version": "1.63.0", - "Mean": "979.5 ms", - "Error": "19.26 ms", - "StdDev": "31.64 ms", - "Median": "973.6 ms" + "Version": "1.64.0", + "Mean": "940.2 ms", + "Error": "16.67 ms", + "StdDev": "27.85 ms", + "Median": "938.3 ms" }, { "Method": "Build_NUnit", "Version": "4.6.1", - "Mean": "936.7 ms", - "Error": "17.80 ms", - "StdDev": "21.86 ms", - "Median": "931.0 ms" + "Mean": "925.3 ms", + "Error": "18.28 ms", + "StdDev": "17.10 ms", + "Median": "924.0 ms" }, { "Method": "Build_MSTest", "Version": "4.3.3", - "Mean": "1,035.8 ms", - "Error": "20.33 ms", - "StdDev": "51.38 ms", - "Median": "1,030.7 ms" + "Mean": "1,033.0 ms", + "Error": "20.48 ms", + "StdDev": "49.06 ms", + "Median": "1,024.9 ms" }, { "Method": "Build_xUnit3", "Version": "3.2.2", - "Mean": "912.5 ms", - "Error": "12.35 ms", - "StdDev": "11.55 ms", - "Median": "908.4 ms" + "Mean": "930.5 ms", + "Error": "17.26 ms", + "StdDev": "16.14 ms", + "Median": "927.8 ms" } ] }, @@ -299,6 +299,6 @@ "runtimeCategories": 6, "buildCategories": 1, "totalBenchmarks": 7, - "lastUpdated": "2026-08-02T00:39:00.698Z" + "lastUpdated": "2026-08-09T00:23:17.026Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/mocks/Callback.json b/docs/static/benchmarks/mocks/Callback.json index c9b3fe4940..458d884ee5 100644 --- a/docs/static/benchmarks/mocks/Callback.json +++ b/docs/static/benchmarks/mocks/Callback.json @@ -1,117 +1,117 @@ { - "timestamp": "2026-08-08T02:56:03.834Z", + "timestamp": "2026-08-09T03:02:07.270Z", "category": "Callback", "description": "Callback registration and execution", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.302", - "host": ".NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit.Mocks", - "Mean": "657.8 ns", - "Error": "8.52 ns", - "StdDev": "7.97 ns", + "Mean": "743.5 ns", + "Error": "10.83 ns", + "StdDev": "9.04 ns", "Gen0": "0.1898", "Gen1": "0.0019", "Allocated": "3.11 KB" }, { "Method": "Imposter", - "Mean": "493.9 ns", - "Error": "4.06 ns", - "StdDev": "3.79 ns", + "Mean": "503.1 ns", + "Error": "5.08 ns", + "StdDev": "4.50 ns", "Gen0": "0.1621", "Gen1": "0.0010", "Allocated": "2.66 KB" }, { "Method": "Mockolate", - "Mean": "347.1 ns", - "Error": "3.55 ns", - "StdDev": "3.32 ns", + "Mean": "368.2 ns", + "Error": "7.03 ns", + "StdDev": "6.57 ns", "Gen0": "0.1097", "Gen1": "0.0005", "Allocated": "1.8 KB" }, { "Method": "Moq", - "Mean": "140,525.6 ns", - "Error": "957.11 ns", - "StdDev": "848.46 ns", + "Mean": "139,650.3 ns", + "Error": "1,091.82 ns", + "StdDev": "967.87 ns", "Gen0": "0.4883", "Gen1": "-", "Allocated": "13.14 KB" }, { "Method": "NSubstitute", - "Mean": "4,281.5 ns", - "Error": "69.29 ns", - "StdDev": "64.81 ns", + "Mean": "4,727.9 ns", + "Error": "92.15 ns", + "StdDev": "81.69 ns", "Gen0": "0.4578", "Gen1": "-", "Allocated": "7.85 KB" }, { "Method": "FakeItEasy", - "Mean": "4,790.3 ns", - "Error": "82.14 ns", - "StdDev": "72.82 ns", + "Mean": "5,176.0 ns", + "Error": "51.93 ns", + "StdDev": "46.03 ns", "Gen0": "0.4501", "Gen1": "0.0153", "Allocated": "7.44 KB" }, { "Method": "'TUnit.Mocks (with args)'", - "Mean": "789.6 ns", - "Error": "14.59 ns", - "StdDev": "12.93 ns", + "Mean": "837.6 ns", + "Error": "7.54 ns", + "StdDev": "6.69 ns", "Gen0": "0.1955", "Gen1": "0.0019", "Allocated": "3.2 KB" }, { "Method": "'Imposter (with args)'", - "Mean": "564.2 ns", - "Error": "5.41 ns", - "StdDev": "5.06 ns", + "Mean": "582.3 ns", + "Error": "11.45 ns", + "StdDev": "16.42 ns", "Gen0": "0.1726", "Gen1": "0.0010", "Allocated": "2.82 KB" }, { "Method": "'Mockolate (with args)'", - "Mean": "392.6 ns", - "Error": "6.66 ns", - "StdDev": "6.23 ns", + "Mean": "396.1 ns", + "Error": "5.80 ns", + "StdDev": "5.43 ns", "Gen0": "0.1125", "Gen1": "0.0005", "Allocated": "1.84 KB" }, { "Method": "'Moq (with args)'", - "Mean": "145,527.5 ns", - "Error": "1,135.04 ns", - "StdDev": "1,061.72 ns", + "Mean": "145,933.4 ns", + "Error": "1,328.24 ns", + "StdDev": "1,242.43 ns", "Gen0": "0.4883", "Gen1": "-", "Allocated": "13.73 KB" }, { "Method": "'NSubstitute (with args)'", - "Mean": "4,960.2 ns", - "Error": "38.64 ns", - "StdDev": "32.27 ns", + "Mean": "5,276.3 ns", + "Error": "68.88 ns", + "StdDev": "53.78 ns", "Gen0": "0.5112", "Gen1": "0.0076", "Allocated": "8.41 KB" }, { "Method": "'FakeItEasy (with args)'", - "Mean": "5,776.2 ns", - "Error": "79.36 ns", - "StdDev": "74.23 ns", + "Mean": "5,958.8 ns", + "Error": "62.36 ns", + "StdDev": "58.34 ns", "Gen0": "0.5493", "Gen1": "0.0305", "Allocated": "9.4 KB" diff --git a/docs/static/benchmarks/mocks/CombinedWorkflow.json b/docs/static/benchmarks/mocks/CombinedWorkflow.json index 84a4afb836..4de11bc2b1 100644 --- a/docs/static/benchmarks/mocks/CombinedWorkflow.json +++ b/docs/static/benchmarks/mocks/CombinedWorkflow.json @@ -1,66 +1,66 @@ { - "timestamp": "2026-08-08T02:56:03.834Z", + "timestamp": "2026-08-09T03:02:07.270Z", "category": "CombinedWorkflow", "description": "Full workflow: create → setup → invoke → verify", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.302", - "host": ".NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit.Mocks", - "Mean": "1.855 μs", - "Error": "0.0233 μs", - "StdDev": "0.0207 μs", - "Gen0": "0.3796", - "Gen1": "0.0057", + "Mean": "1.962 μs", + "Error": "0.0368 μs", + "StdDev": "0.0326 μs", + "Gen0": "0.3777", + "Gen1": "0.0038", "Allocated": "6.23 KB" }, { "Method": "Imposter", - "Mean": "2.639 μs", - "Error": "0.0180 μs", - "StdDev": "0.0169 μs", + "Mean": "2.709 μs", + "Error": "0.0291 μs", + "StdDev": "0.0273 μs", "Gen0": "0.9613", "Gen1": "0.0458", "Allocated": "15.71 KB" }, { "Method": "Mockolate", - "Mean": "1.609 μs", - "Error": "0.0064 μs", - "StdDev": "0.0053 μs", + "Mean": "1.696 μs", + "Error": "0.0334 μs", + "StdDev": "0.0358 μs", "Gen0": "0.4501", "Gen1": "0.0076", "Allocated": "7.36 KB" }, { "Method": "Moq", - "Mean": "405.447 μs", - "Error": "4.3504 μs", - "StdDev": "3.6328 μs", + "Mean": "410.977 μs", + "Error": "2.1739 μs", + "StdDev": "1.9271 μs", "Gen0": "1.9531", "Gen1": "0.9766", - "Allocated": "36.16 KB" + "Allocated": "36.27 KB" }, { "Method": "NSubstitute", - "Mean": "17.009 μs", - "Error": "0.0490 μs", - "StdDev": "0.0434 μs", + "Mean": "17.649 μs", + "Error": "0.2649 μs", + "StdDev": "0.2478 μs", "Gen0": "1.6174", "Gen1": "0.0305", "Allocated": "26.72 KB" }, { "Method": "FakeItEasy", - "Mean": "19.196 μs", - "Error": "0.2048 μs", - "StdDev": "0.1915 μs", + "Mean": "18.513 μs", + "Error": "0.3696 μs", + "StdDev": "0.3457 μs", "Gen0": "1.4648", "Gen1": "0.1221", - "Allocated": "25.63 KB" + "Allocated": "25.68 KB" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/mocks/Invocation.json b/docs/static/benchmarks/mocks/Invocation.json index cdf5a15312..f1542bc8ec 100644 --- a/docs/static/benchmarks/mocks/Invocation.json +++ b/docs/static/benchmarks/mocks/Invocation.json @@ -1,171 +1,171 @@ { - "timestamp": "2026-08-08T02:56:03.834Z", + "timestamp": "2026-08-09T03:02:07.270Z", "category": "Invocation", "description": "Calling methods on mock objects", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.302", - "host": ".NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit.Mocks", - "Mean": "280.23 ns", - "Error": "63.399 ns", - "StdDev": "3.475 ns", + "Mean": "278.98 ns", + "Error": "100.15 ns", + "StdDev": "5.490 ns", "Gen0": "0.0067", "Gen1": "0.0062", "Allocated": "128 B" }, { "Method": "Imposter", - "Mean": "305.69 ns", - "Error": "59.821 ns", - "StdDev": "3.279 ns", + "Mean": "295.43 ns", + "Error": "102.58 ns", + "StdDev": "5.623 ns", "Gen0": "0.0100", "Gen1": "0.0095", "Allocated": "168 B" }, { "Method": "Mockolate", - "Mean": "125.16 ns", - "Error": "11.538 ns", - "StdDev": "0.632 ns", + "Mean": "107.08 ns", + "Error": "39.43 ns", + "StdDev": "2.162 ns", "Gen0": "0.0050", "Gen1": "0.0048", "Allocated": "84 B" }, { "Method": "Moq", - "Mean": "792.49 ns", - "Error": "210.510 ns", - "StdDev": "11.539 ns", + "Mean": "823.66 ns", + "Error": "61.62 ns", + "StdDev": "3.378 ns", "Gen0": "0.0219", "Gen1": "0.0210", "Allocated": "376 B" }, { "Method": "NSubstitute", - "Mean": "720.44 ns", - "Error": "88.247 ns", - "StdDev": "4.837 ns", + "Mean": "722.95 ns", + "Error": "161.88 ns", + "StdDev": "8.873 ns", "Gen0": "0.0172", "Gen1": "0.0162", "Allocated": "304 B" }, { "Method": "FakeItEasy", - "Mean": "1,654.13 ns", - "Error": "90.165 ns", - "StdDev": "4.942 ns", + "Mean": "1,794.39 ns", + "Error": "374.06 ns", + "StdDev": "20.503 ns", "Gen0": "0.0553", "Gen1": "0.0534", "Allocated": "944 B" }, { "Method": "'TUnit.Mocks (String)'", - "Mean": "165.84 ns", - "Error": "65.299 ns", - "StdDev": "3.579 ns", + "Mean": "166.28 ns", + "Error": "74.56 ns", + "StdDev": "4.087 ns", "Gen0": "0.0052", "Gen1": "0.0050", "Allocated": "96 B" }, { "Method": "'Imposter (String)'", - "Mean": "294.01 ns", - "Error": "122.124 ns", - "StdDev": "6.694 ns", + "Mean": "301.58 ns", + "Error": "74.85 ns", + "StdDev": "4.103 ns", "Gen0": "0.0100", "Gen1": "0.0095", "Allocated": "168 B" }, { "Method": "'Mockolate (String)'", - "Mean": "93.40 ns", - "Error": "7.171 ns", - "StdDev": "0.393 ns", + "Mean": "99.12 ns", + "Error": "25.15 ns", + "StdDev": "1.378 ns", "Gen0": "0.0036", "Gen1": "0.0035", "Allocated": "60 B" }, { "Method": "'Moq (String)'", - "Mean": "544.33 ns", - "Error": "169.639 ns", - "StdDev": "9.298 ns", + "Mean": "573.48 ns", + "Error": "183.22 ns", + "StdDev": "10.043 ns", "Gen0": "0.0172", "Gen1": "0.0162", "Allocated": "296 B" }, { "Method": "'NSubstitute (String)'", - "Mean": "615.83 ns", - "Error": "230.650 ns", - "StdDev": "12.643 ns", + "Mean": "660.88 ns", + "Error": "235.83 ns", + "StdDev": "12.927 ns", "Gen0": "0.0153", "Gen1": "0.0143", "Allocated": "272 B" }, { "Method": "'FakeItEasy (String)'", - "Mean": "1,585.26 ns", - "Error": "996.476 ns", - "StdDev": "54.620 ns", + "Mean": "1,677.56 ns", + "Error": "180.80 ns", + "StdDev": "9.910 ns", "Gen0": "0.0458", "Gen1": "0.0439", "Allocated": "776 B" }, { "Method": "'TUnit.Mocks (100 calls)'", - "Mean": "27,380.54 ns", - "Error": "15,339.772 ns", - "StdDev": "840.825 ns", + "Mean": "28,012.03 ns", + "Error": "14,418.30 ns", + "StdDev": "790.316 ns", "Gen0": "0.6409", "Gen1": "0.6104", "Allocated": "12736 B" }, { "Method": "'Imposter (100 calls)'", - "Mean": "29,751.31 ns", - "Error": "10,946.571 ns", - "StdDev": "600.018 ns", + "Mean": "30,301.44 ns", + "Error": "8,409.07 ns", + "StdDev": "460.930 ns", "Gen0": "0.9766", "Gen1": "0.9155", "Allocated": "16800 B" }, { "Method": "'Mockolate (100 calls)'", - "Mean": "12,090.37 ns", - "Error": "4,286.149 ns", - "StdDev": "234.938 ns", + "Mean": "11,845.57 ns", + "Error": "4,495.45 ns", + "StdDev": "246.411 ns", "Gen0": "0.4883", "Gen1": "0.4730", "Allocated": "8400 B" }, { "Method": "'Moq (100 calls)'", - "Mean": "80,856.50 ns", - "Error": "24,432.557 ns", - "StdDev": "1,339.231 ns", + "Mean": "86,814.61 ns", + "Error": "35,464.72 ns", + "StdDev": "1,943.941 ns", "Gen0": "2.1973", "Gen1": "2.0752", "Allocated": "37600 B" }, { "Method": "'NSubstitute (100 calls)'", - "Mean": "70,181.92 ns", - "Error": "16,750.463 ns", - "StdDev": "918.149 ns", + "Mean": "74,072.23 ns", + "Error": "9,500.99 ns", + "StdDev": "520.781 ns", "Gen0": "1.7090", "Gen1": "1.5869", "Allocated": "30848 B" }, { "Method": "'FakeItEasy (100 calls)'", - "Mean": "178,852.86 ns", - "Error": "33,989.630 ns", - "StdDev": "1,863.086 ns", + "Mean": "191,167.94 ns", + "Error": "17,272.06 ns", + "StdDev": "946.740 ns", "Gen0": "5.6152", "Gen1": "5.3711", "Allocated": "94400 B" diff --git a/docs/static/benchmarks/mocks/MockCreation.json b/docs/static/benchmarks/mocks/MockCreation.json index ccfa5ad4af..ee964d13a5 100644 --- a/docs/static/benchmarks/mocks/MockCreation.json +++ b/docs/static/benchmarks/mocks/MockCreation.json @@ -1,18 +1,18 @@ { - "timestamp": "2026-08-08T02:56:03.834Z", + "timestamp": "2026-08-09T03:02:07.270Z", "category": "MockCreation", "description": "Mock instance creation performance", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.302", - "host": ".NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit.Mocks", - "Mean": "29.04 ns", - "Error": "0.568 ns", - "StdDev": "0.719 ns", + "Mean": "32.00 ns", + "Error": "0.697 ns", + "StdDev": "0.716 ns", "Gen0": "0.0119", "Gen1": "-", "Gen2": "-", @@ -20,9 +20,9 @@ }, { "Method": "Imposter", - "Mean": "93.62 ns", - "Error": "1.271 ns", - "StdDev": "1.127 ns", + "Mean": "99.84 ns", + "Error": "0.804 ns", + "StdDev": "0.752 ns", "Gen0": "0.0262", "Gen1": "-", "Gen2": "-", @@ -30,9 +30,9 @@ }, { "Method": "Mockolate", - "Mean": "17.71 ns", - "Error": "0.358 ns", - "StdDev": "0.335 ns", + "Mean": "19.45 ns", + "Error": "0.355 ns", + "StdDev": "0.332 ns", "Gen0": "0.0095", "Gen1": "-", "Gen2": "-", @@ -40,9 +40,9 @@ }, { "Method": "Moq", - "Mean": "1,344.12 ns", - "Error": "25.948 ns", - "StdDev": "25.484 ns", + "Mean": "1,396.66 ns", + "Error": "27.840 ns", + "StdDev": "26.042 ns", "Gen0": "0.1221", "Gen1": "-", "Gen2": "-", @@ -50,19 +50,19 @@ }, { "Method": "NSubstitute", - "Mean": "1,935.60 ns", - "Error": "27.568 ns", - "StdDev": "25.787 ns", + "Mean": "1,981.38 ns", + "Error": "21.556 ns", + "StdDev": "19.109 ns", "Gen0": "0.2975", - "Gen1": "0.0019", + "Gen1": "-", "Gen2": "-", "Allocated": "5000 B" }, { "Method": "FakeItEasy", - "Mean": "1,843.83 ns", - "Error": "30.029 ns", - "StdDev": "28.090 ns", + "Mean": "1,884.17 ns", + "Error": "27.232 ns", + "StdDev": "24.140 ns", "Gen0": "0.1602", "Gen1": "0.0038", "Gen2": "0.0019", @@ -70,9 +70,9 @@ }, { "Method": "'TUnit.Mocks (Repository)'", - "Mean": "95.78 ns", - "Error": "0.446 ns", - "StdDev": "0.395 ns", + "Mean": "31.89 ns", + "Error": "0.677 ns", + "StdDev": "0.600 ns", "Gen0": "0.0119", "Gen1": "-", "Gen2": "-", @@ -80,9 +80,9 @@ }, { "Method": "'Imposter (Repository)'", - "Mean": "155.49 ns", - "Error": "2.826 ns", - "StdDev": "2.643 ns", + "Mean": "156.80 ns", + "Error": "1.616 ns", + "StdDev": "1.512 ns", "Gen0": "0.0415", "Gen1": "-", "Gen2": "-", @@ -90,9 +90,9 @@ }, { "Method": "'Mockolate (Repository)'", - "Mean": "17.76 ns", - "Error": "0.223 ns", - "StdDev": "0.197 ns", + "Mean": "20.22 ns", + "Error": "0.451 ns", + "StdDev": "0.586 ns", "Gen0": "0.0105", "Gen1": "-", "Gen2": "-", @@ -100,9 +100,9 @@ }, { "Method": "'Moq (Repository)'", - "Mean": "1,309.32 ns", - "Error": "6.127 ns", - "StdDev": "5.431 ns", + "Mean": "1,411.97 ns", + "Error": "5.741 ns", + "StdDev": "5.090 ns", "Gen0": "0.1125", "Gen1": "-", "Gen2": "-", @@ -110,9 +110,9 @@ }, { "Method": "'NSubstitute (Repository)'", - "Mean": "1,936.82 ns", - "Error": "16.714 ns", - "StdDev": "15.634 ns", + "Mean": "1,968.82 ns", + "Error": "29.645 ns", + "StdDev": "27.730 ns", "Gen0": "0.2975", "Gen1": "-", "Gen2": "-", @@ -120,9 +120,9 @@ }, { "Method": "'FakeItEasy (Repository)'", - "Mean": "1,727.69 ns", - "Error": "17.892 ns", - "StdDev": "15.861 ns", + "Mean": "1,970.15 ns", + "Error": "27.717 ns", + "StdDev": "25.926 ns", "Gen0": "0.1602", "Gen1": "0.0038", "Gen2": "0.0019", diff --git a/docs/static/benchmarks/mocks/Setup.json b/docs/static/benchmarks/mocks/Setup.json index ef69332b79..828d4921a1 100644 --- a/docs/static/benchmarks/mocks/Setup.json +++ b/docs/static/benchmarks/mocks/Setup.json @@ -1,120 +1,120 @@ { - "timestamp": "2026-08-08T02:56:03.834Z", + "timestamp": "2026-08-09T03:02:07.270Z", "category": "Setup", "description": "Mock behavior configuration (returns, matchers)", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.302", - "host": ".NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit.Mocks", - "Mean": "535.7 ns", - "Error": "4.47 ns", - "StdDev": "4.18 ns", + "Mean": "542.2 ns", + "Error": "4.01 ns", + "StdDev": "3.55 ns", "Gen0": "0.1431", "Gen1": "0.0010", "Allocated": "2.34 KB" }, { "Method": "Imposter", - "Mean": "838.7 ns", - "Error": "16.62 ns", - "StdDev": "15.55 ns", + "Mean": "777.7 ns", + "Error": "4.92 ns", + "StdDev": "4.36 ns", "Gen0": "0.3738", "Gen1": "0.0076", "Allocated": "6.12 KB" }, { "Method": "Mockolate", - "Mean": "336.5 ns", - "Error": "4.17 ns", - "StdDev": "3.70 ns", + "Mean": "328.5 ns", + "Error": "3.07 ns", + "StdDev": "2.72 ns", "Gen0": "0.0863", "Gen1": "-", "Allocated": "1.41 KB" }, { "Method": "Moq", - "Mean": "437,823.2 ns", - "Error": "1,802.25 ns", - "StdDev": "1,504.96 ns", + "Mean": "301,488.3 ns", + "Error": "2,223.31 ns", + "StdDev": "1,970.91 ns", "Gen0": "0.9766", "Gen1": "-", - "Allocated": "28.67 KB" + "Allocated": "28.52 KB" }, { "Method": "NSubstitute", - "Mean": "5,935.9 ns", - "Error": "47.81 ns", - "StdDev": "44.72 ns", + "Mean": "5,315.1 ns", + "Error": "63.31 ns", + "StdDev": "59.22 ns", "Gen0": "0.5493", "Gen1": "0.0076", "Allocated": "9.01 KB" }, { "Method": "FakeItEasy", - "Mean": "8,670.0 ns", - "Error": "85.24 ns", - "StdDev": "79.73 ns", + "Mean": "7,089.2 ns", + "Error": "47.34 ns", + "StdDev": "41.97 ns", "Gen0": "0.6256", "Gen1": "0.0153", "Allocated": "10.45 KB" }, { "Method": "'TUnit.Mocks (Multiple)'", - "Mean": "815.5 ns", - "Error": "16.32 ns", - "StdDev": "19.42 ns", + "Mean": "807.8 ns", + "Error": "5.72 ns", + "StdDev": "5.35 ns", "Gen0": "0.1926", "Gen1": "0.0019", "Allocated": "3.15 KB" }, { "Method": "'Imposter (Multiple)'", - "Mean": "1,479.5 ns", - "Error": "29.19 ns", - "StdDev": "60.28 ns", + "Mean": "1,391.3 ns", + "Error": "24.21 ns", + "StdDev": "22.65 ns", "Gen0": "0.6485", "Gen1": "0.0248", "Allocated": "10.59 KB" }, { "Method": "'Mockolate (Multiple)'", - "Mean": "581.4 ns", - "Error": "9.08 ns", - "StdDev": "8.49 ns", + "Mean": "565.4 ns", + "Error": "4.81 ns", + "StdDev": "4.50 ns", "Gen0": "0.1431", "Gen1": "0.0010", "Allocated": "2.35 KB" }, { "Method": "'Moq (Multiple)'", - "Mean": "114,005.4 ns", - "Error": "1,156.97 ns", - "StdDev": "1,082.23 ns", + "Mean": "87,912.4 ns", + "Error": "728.63 ns", + "StdDev": "645.91 ns", "Gen0": "0.9766", "Gen1": "0.7324", "Allocated": "16.53 KB" }, { "Method": "'NSubstitute (Multiple)'", - "Mean": "11,875.4 ns", - "Error": "166.42 ns", - "StdDev": "155.67 ns", + "Mean": "10,799.3 ns", + "Error": "188.72 ns", + "StdDev": "176.53 ns", "Gen0": "1.2207", "Gen1": "-", "Allocated": "20.31 KB" }, { "Method": "'FakeItEasy (Multiple)'", - "Mean": "7,836.1 ns", - "Error": "100.42 ns", - "StdDev": "83.85 ns", - "Gen0": "0.6714", - "Gen1": "0.0610", - "Allocated": "11.71 KB" + "Mean": "6,970.8 ns", + "Error": "97.95 ns", + "StdDev": "86.83 ns", + "Gen0": "0.7019", + "Gen1": "0.0305", + "Allocated": "11.79 KB" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/mocks/Verification.json b/docs/static/benchmarks/mocks/Verification.json index d7490b4650..bfcfe2d22c 100644 --- a/docs/static/benchmarks/mocks/Verification.json +++ b/docs/static/benchmarks/mocks/Verification.json @@ -1,174 +1,174 @@ { - "timestamp": "2026-08-08T02:56:03.834Z", + "timestamp": "2026-08-09T03:02:07.270Z", "category": "Verification", "description": "Verifying mock method calls", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.302", - "host": ".NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v3" }, "results": [ { "Method": "TUnit.Mocks", - "Mean": "572.48 ns", - "Error": "1.760 ns", - "StdDev": "1.470 ns", + "Mean": "850.61 ns", + "Error": "10.672 ns", + "StdDev": "9.982 ns", "Gen0": "0.1793", "Gen1": "0.0010", "Allocated": "3008 B" }, { "Method": "Imposter", - "Mean": "526.78 ns", - "Error": "2.156 ns", - "StdDev": "1.911 ns", + "Mean": "883.33 ns", + "Error": "16.989 ns", + "StdDev": "18.178 ns", "Gen0": "0.2794", "Gen1": "0.0038", "Allocated": "4688 B" }, { "Method": "Mockolate", - "Mean": "305.86 ns", - "Error": "0.614 ns", - "StdDev": "0.544 ns", + "Mean": "482.71 ns", + "Error": "5.530 ns", + "StdDev": "4.902 ns", "Gen0": "0.1268", - "Gen1": "0.0005", + "Gen1": "-", "Allocated": "2128 B" }, { "Method": "Moq", - "Mean": "190,694.43 ns", - "Error": "1,162.150 ns", - "StdDev": "1,030.216 ns", + "Mean": "360,656.91 ns", + "Error": "3,261.115 ns", + "StdDev": "2,723.179 ns", "Gen0": "0.9766", - "Gen1": "0.4883", - "Allocated": "24324 B" + "Gen1": "-", + "Allocated": "24564 B" }, { "Method": "NSubstitute", - "Mean": "4,440.29 ns", - "Error": "23.511 ns", - "StdDev": "20.842 ns", - "Gen0": "0.5951", - "Gen1": "0.0076", + "Mean": "6,660.30 ns", + "Error": "12.520 ns", + "StdDev": "10.455 ns", + "Gen0": "0.5493", + "Gen1": "-", "Allocated": "10064 B" }, { "Method": "FakeItEasy", - "Mean": "5,114.93 ns", - "Error": "29.379 ns", - "StdDev": "26.044 ns", + "Mean": "7,936.47 ns", + "Error": "35.916 ns", + "StdDev": "31.839 ns", "Gen0": "0.6409", "Gen1": "0.0153", "Allocated": "10722 B" }, { "Method": "'TUnit.Mocks (Never)'", - "Mean": "42.41 ns", - "Error": "0.097 ns", - "StdDev": "0.086 ns", + "Mean": "62.53 ns", + "Error": "1.069 ns", + "StdDev": "1.000 ns", "Gen0": "0.0191", "Gen1": "-", "Allocated": "320 B" }, { "Method": "'Imposter (Never)'", - "Mean": "257.31 ns", - "Error": "4.418 ns", - "StdDev": "4.132 ns", + "Mean": "383.58 ns", + "Error": "7.612 ns", + "StdDev": "7.120 ns", "Gen0": "0.1431", "Gen1": "0.0010", "Allocated": "2400 B" }, { "Method": "'Mockolate (Never)'", - "Mean": "195.94 ns", - "Error": "2.076 ns", - "StdDev": "1.840 ns", + "Mean": "258.60 ns", + "Error": "5.092 ns", + "StdDev": "6.621 ns", "Gen0": "0.0682", "Gen1": "-", "Allocated": "1144 B" }, { "Method": "'Moq (Never)'", - "Mean": "49,344.14 ns", - "Error": "201.488 ns", - "StdDev": "178.614 ns", - "Gen0": "0.3662", - "Gen1": "0.2441", - "Allocated": "6925 B" + "Mean": "90,970.40 ns", + "Error": "364.060 ns", + "StdDev": "340.542 ns", + "Gen0": "0.2441", + "Gen1": "-", + "Allocated": "6918 B" }, { "Method": "'NSubstitute (Never)'", - "Mean": "2,618.94 ns", - "Error": "12.484 ns", - "StdDev": "11.067 ns", - "Gen0": "0.4234", - "Gen1": "0.0038", + "Mean": "3,865.43 ns", + "Error": "29.036 ns", + "StdDev": "27.160 ns", + "Gen0": "0.4196", + "Gen1": "-", "Allocated": "7088 B" }, { "Method": "'FakeItEasy (Never)'", - "Mean": "2,523.83 ns", - "Error": "9.448 ns", - "StdDev": "8.376 ns", + "Mean": "3,774.42 ns", + "Error": "27.993 ns", + "StdDev": "23.375 ns", "Gen0": "0.3052", - "Gen1": "0.0153", - "Allocated": "5210 B" + "Gen1": "0.0305", + "Allocated": "5209 B" }, { "Method": "'TUnit.Mocks (Multiple)'", - "Mean": "977.60 ns", - "Error": "3.398 ns", - "StdDev": "3.179 ns", + "Mean": "1,318.74 ns", + "Error": "15.285 ns", + "StdDev": "14.298 ns", "Gen0": "0.2670", "Gen1": "0.0019", "Allocated": "4472 B" }, { "Method": "'Imposter (Multiple)'", - "Mean": "1,310.13 ns", - "Error": "8.740 ns", - "StdDev": "8.176 ns", + "Mean": "1,954.59 ns", + "Error": "37.666 ns", + "StdDev": "36.993 ns", "Gen0": "0.6676", - "Gen1": "0.0210", + "Gen1": "0.0191", "Allocated": "11192 B" }, { "Method": "'Mockolate (Multiple)'", - "Mean": "843.21 ns", - "Error": "5.315 ns", - "StdDev": "4.972 ns", + "Mean": "1,172.60 ns", + "Error": "22.811 ns", + "StdDev": "34.835 ns", "Gen0": "0.3128", "Gen1": "0.0038", "Allocated": "5240 B" }, { "Method": "'Moq (Multiple)'", - "Mean": "274,473.63 ns", - "Error": "1,371.182 ns", - "StdDev": "1,215.517 ns", + "Mean": "485,595.43 ns", + "Error": "3,281.595 ns", + "StdDev": "2,740.280 ns", "Gen0": "1.9531", - "Gen1": "1.4648", - "Allocated": "34842 B" + "Gen1": "0.9766", + "Allocated": "34811 B" }, { "Method": "'NSubstitute (Multiple)'", - "Mean": "7,921.79 ns", - "Error": "45.596 ns", - "StdDev": "40.420 ns", - "Gen0": "0.9918", - "Gen1": "0.0153", - "Allocated": "16762 B" + "Mean": "11,747.82 ns", + "Error": "112.006 ns", + "StdDev": "99.290 ns", + "Gen0": "0.9766", + "Gen1": "-", + "Allocated": "16763 B" }, { "Method": "'FakeItEasy (Multiple)'", - "Mean": "8,981.93 ns", - "Error": "75.203 ns", - "StdDev": "70.345 ns", + "Mean": "14,345.40 ns", + "Error": "209.651 ns", + "StdDev": "196.108 ns", "Gen0": "1.0986", - "Gen1": "0.0610", - "Allocated": "19232 B" + "Gen1": "-", + "Allocated": "19233 B" } ] } \ No newline at end of file diff --git a/docs/static/benchmarks/mocks/latest.json b/docs/static/benchmarks/mocks/latest.json index f043f7452d..352d0206ca 100644 --- a/docs/static/benchmarks/mocks/latest.json +++ b/docs/static/benchmarks/mocks/latest.json @@ -1,116 +1,116 @@ { - "timestamp": "2026-08-08T02:56:03.834Z", + "timestamp": "2026-08-09T03:02:07.270Z", "environment": { "benchmarkDotNetVersion": "BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)", "sdk": ".NET SDK 10.0.302", - "host": ".NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v4" + "host": ".NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v3" }, "categories": { "Callback": [ { "Method": "TUnit.Mocks", - "Mean": "657.8 ns", - "Error": "8.52 ns", - "StdDev": "7.97 ns", + "Mean": "743.5 ns", + "Error": "10.83 ns", + "StdDev": "9.04 ns", "Gen0": "0.1898", "Gen1": "0.0019", "Allocated": "3.11 KB" }, { "Method": "Imposter", - "Mean": "493.9 ns", - "Error": "4.06 ns", - "StdDev": "3.79 ns", + "Mean": "503.1 ns", + "Error": "5.08 ns", + "StdDev": "4.50 ns", "Gen0": "0.1621", "Gen1": "0.0010", "Allocated": "2.66 KB" }, { "Method": "Mockolate", - "Mean": "347.1 ns", - "Error": "3.55 ns", - "StdDev": "3.32 ns", + "Mean": "368.2 ns", + "Error": "7.03 ns", + "StdDev": "6.57 ns", "Gen0": "0.1097", "Gen1": "0.0005", "Allocated": "1.8 KB" }, { "Method": "Moq", - "Mean": "140,525.6 ns", - "Error": "957.11 ns", - "StdDev": "848.46 ns", + "Mean": "139,650.3 ns", + "Error": "1,091.82 ns", + "StdDev": "967.87 ns", "Gen0": "0.4883", "Gen1": "-", "Allocated": "13.14 KB" }, { "Method": "NSubstitute", - "Mean": "4,281.5 ns", - "Error": "69.29 ns", - "StdDev": "64.81 ns", + "Mean": "4,727.9 ns", + "Error": "92.15 ns", + "StdDev": "81.69 ns", "Gen0": "0.4578", "Gen1": "-", "Allocated": "7.85 KB" }, { "Method": "FakeItEasy", - "Mean": "4,790.3 ns", - "Error": "82.14 ns", - "StdDev": "72.82 ns", + "Mean": "5,176.0 ns", + "Error": "51.93 ns", + "StdDev": "46.03 ns", "Gen0": "0.4501", "Gen1": "0.0153", "Allocated": "7.44 KB" }, { "Method": "'TUnit.Mocks (with args)'", - "Mean": "789.6 ns", - "Error": "14.59 ns", - "StdDev": "12.93 ns", + "Mean": "837.6 ns", + "Error": "7.54 ns", + "StdDev": "6.69 ns", "Gen0": "0.1955", "Gen1": "0.0019", "Allocated": "3.2 KB" }, { "Method": "'Imposter (with args)'", - "Mean": "564.2 ns", - "Error": "5.41 ns", - "StdDev": "5.06 ns", + "Mean": "582.3 ns", + "Error": "11.45 ns", + "StdDev": "16.42 ns", "Gen0": "0.1726", "Gen1": "0.0010", "Allocated": "2.82 KB" }, { "Method": "'Mockolate (with args)'", - "Mean": "392.6 ns", - "Error": "6.66 ns", - "StdDev": "6.23 ns", + "Mean": "396.1 ns", + "Error": "5.80 ns", + "StdDev": "5.43 ns", "Gen0": "0.1125", "Gen1": "0.0005", "Allocated": "1.84 KB" }, { "Method": "'Moq (with args)'", - "Mean": "145,527.5 ns", - "Error": "1,135.04 ns", - "StdDev": "1,061.72 ns", + "Mean": "145,933.4 ns", + "Error": "1,328.24 ns", + "StdDev": "1,242.43 ns", "Gen0": "0.4883", "Gen1": "-", "Allocated": "13.73 KB" }, { "Method": "'NSubstitute (with args)'", - "Mean": "4,960.2 ns", - "Error": "38.64 ns", - "StdDev": "32.27 ns", + "Mean": "5,276.3 ns", + "Error": "68.88 ns", + "StdDev": "53.78 ns", "Gen0": "0.5112", "Gen1": "0.0076", "Allocated": "8.41 KB" }, { "Method": "'FakeItEasy (with args)'", - "Mean": "5,776.2 ns", - "Error": "79.36 ns", - "StdDev": "74.23 ns", + "Mean": "5,958.8 ns", + "Error": "62.36 ns", + "StdDev": "58.34 ns", "Gen0": "0.5493", "Gen1": "0.0305", "Allocated": "9.4 KB" @@ -119,218 +119,218 @@ "CombinedWorkflow": [ { "Method": "TUnit.Mocks", - "Mean": "1.855 μs", - "Error": "0.0233 μs", - "StdDev": "0.0207 μs", - "Gen0": "0.3796", - "Gen1": "0.0057", + "Mean": "1.962 μs", + "Error": "0.0368 μs", + "StdDev": "0.0326 μs", + "Gen0": "0.3777", + "Gen1": "0.0038", "Allocated": "6.23 KB" }, { "Method": "Imposter", - "Mean": "2.639 μs", - "Error": "0.0180 μs", - "StdDev": "0.0169 μs", + "Mean": "2.709 μs", + "Error": "0.0291 μs", + "StdDev": "0.0273 μs", "Gen0": "0.9613", "Gen1": "0.0458", "Allocated": "15.71 KB" }, { "Method": "Mockolate", - "Mean": "1.609 μs", - "Error": "0.0064 μs", - "StdDev": "0.0053 μs", + "Mean": "1.696 μs", + "Error": "0.0334 μs", + "StdDev": "0.0358 μs", "Gen0": "0.4501", "Gen1": "0.0076", "Allocated": "7.36 KB" }, { "Method": "Moq", - "Mean": "405.447 μs", - "Error": "4.3504 μs", - "StdDev": "3.6328 μs", + "Mean": "410.977 μs", + "Error": "2.1739 μs", + "StdDev": "1.9271 μs", "Gen0": "1.9531", "Gen1": "0.9766", - "Allocated": "36.16 KB" + "Allocated": "36.27 KB" }, { "Method": "NSubstitute", - "Mean": "17.009 μs", - "Error": "0.0490 μs", - "StdDev": "0.0434 μs", + "Mean": "17.649 μs", + "Error": "0.2649 μs", + "StdDev": "0.2478 μs", "Gen0": "1.6174", "Gen1": "0.0305", "Allocated": "26.72 KB" }, { "Method": "FakeItEasy", - "Mean": "19.196 μs", - "Error": "0.2048 μs", - "StdDev": "0.1915 μs", + "Mean": "18.513 μs", + "Error": "0.3696 μs", + "StdDev": "0.3457 μs", "Gen0": "1.4648", "Gen1": "0.1221", - "Allocated": "25.63 KB" + "Allocated": "25.68 KB" } ], "Invocation": [ { "Method": "TUnit.Mocks", - "Mean": "280.23 ns", - "Error": "63.399 ns", - "StdDev": "3.475 ns", + "Mean": "278.98 ns", + "Error": "100.15 ns", + "StdDev": "5.490 ns", "Gen0": "0.0067", "Gen1": "0.0062", "Allocated": "128 B" }, { "Method": "Imposter", - "Mean": "305.69 ns", - "Error": "59.821 ns", - "StdDev": "3.279 ns", + "Mean": "295.43 ns", + "Error": "102.58 ns", + "StdDev": "5.623 ns", "Gen0": "0.0100", "Gen1": "0.0095", "Allocated": "168 B" }, { "Method": "Mockolate", - "Mean": "125.16 ns", - "Error": "11.538 ns", - "StdDev": "0.632 ns", + "Mean": "107.08 ns", + "Error": "39.43 ns", + "StdDev": "2.162 ns", "Gen0": "0.0050", "Gen1": "0.0048", "Allocated": "84 B" }, { "Method": "Moq", - "Mean": "792.49 ns", - "Error": "210.510 ns", - "StdDev": "11.539 ns", + "Mean": "823.66 ns", + "Error": "61.62 ns", + "StdDev": "3.378 ns", "Gen0": "0.0219", "Gen1": "0.0210", "Allocated": "376 B" }, { "Method": "NSubstitute", - "Mean": "720.44 ns", - "Error": "88.247 ns", - "StdDev": "4.837 ns", + "Mean": "722.95 ns", + "Error": "161.88 ns", + "StdDev": "8.873 ns", "Gen0": "0.0172", "Gen1": "0.0162", "Allocated": "304 B" }, { "Method": "FakeItEasy", - "Mean": "1,654.13 ns", - "Error": "90.165 ns", - "StdDev": "4.942 ns", + "Mean": "1,794.39 ns", + "Error": "374.06 ns", + "StdDev": "20.503 ns", "Gen0": "0.0553", "Gen1": "0.0534", "Allocated": "944 B" }, { "Method": "'TUnit.Mocks (String)'", - "Mean": "165.84 ns", - "Error": "65.299 ns", - "StdDev": "3.579 ns", + "Mean": "166.28 ns", + "Error": "74.56 ns", + "StdDev": "4.087 ns", "Gen0": "0.0052", "Gen1": "0.0050", "Allocated": "96 B" }, { "Method": "'Imposter (String)'", - "Mean": "294.01 ns", - "Error": "122.124 ns", - "StdDev": "6.694 ns", + "Mean": "301.58 ns", + "Error": "74.85 ns", + "StdDev": "4.103 ns", "Gen0": "0.0100", "Gen1": "0.0095", "Allocated": "168 B" }, { "Method": "'Mockolate (String)'", - "Mean": "93.40 ns", - "Error": "7.171 ns", - "StdDev": "0.393 ns", + "Mean": "99.12 ns", + "Error": "25.15 ns", + "StdDev": "1.378 ns", "Gen0": "0.0036", "Gen1": "0.0035", "Allocated": "60 B" }, { "Method": "'Moq (String)'", - "Mean": "544.33 ns", - "Error": "169.639 ns", - "StdDev": "9.298 ns", + "Mean": "573.48 ns", + "Error": "183.22 ns", + "StdDev": "10.043 ns", "Gen0": "0.0172", "Gen1": "0.0162", "Allocated": "296 B" }, { "Method": "'NSubstitute (String)'", - "Mean": "615.83 ns", - "Error": "230.650 ns", - "StdDev": "12.643 ns", + "Mean": "660.88 ns", + "Error": "235.83 ns", + "StdDev": "12.927 ns", "Gen0": "0.0153", "Gen1": "0.0143", "Allocated": "272 B" }, { "Method": "'FakeItEasy (String)'", - "Mean": "1,585.26 ns", - "Error": "996.476 ns", - "StdDev": "54.620 ns", + "Mean": "1,677.56 ns", + "Error": "180.80 ns", + "StdDev": "9.910 ns", "Gen0": "0.0458", "Gen1": "0.0439", "Allocated": "776 B" }, { "Method": "'TUnit.Mocks (100 calls)'", - "Mean": "27,380.54 ns", - "Error": "15,339.772 ns", - "StdDev": "840.825 ns", + "Mean": "28,012.03 ns", + "Error": "14,418.30 ns", + "StdDev": "790.316 ns", "Gen0": "0.6409", "Gen1": "0.6104", "Allocated": "12736 B" }, { "Method": "'Imposter (100 calls)'", - "Mean": "29,751.31 ns", - "Error": "10,946.571 ns", - "StdDev": "600.018 ns", + "Mean": "30,301.44 ns", + "Error": "8,409.07 ns", + "StdDev": "460.930 ns", "Gen0": "0.9766", "Gen1": "0.9155", "Allocated": "16800 B" }, { "Method": "'Mockolate (100 calls)'", - "Mean": "12,090.37 ns", - "Error": "4,286.149 ns", - "StdDev": "234.938 ns", + "Mean": "11,845.57 ns", + "Error": "4,495.45 ns", + "StdDev": "246.411 ns", "Gen0": "0.4883", "Gen1": "0.4730", "Allocated": "8400 B" }, { "Method": "'Moq (100 calls)'", - "Mean": "80,856.50 ns", - "Error": "24,432.557 ns", - "StdDev": "1,339.231 ns", + "Mean": "86,814.61 ns", + "Error": "35,464.72 ns", + "StdDev": "1,943.941 ns", "Gen0": "2.1973", "Gen1": "2.0752", "Allocated": "37600 B" }, { "Method": "'NSubstitute (100 calls)'", - "Mean": "70,181.92 ns", - "Error": "16,750.463 ns", - "StdDev": "918.149 ns", + "Mean": "74,072.23 ns", + "Error": "9,500.99 ns", + "StdDev": "520.781 ns", "Gen0": "1.7090", "Gen1": "1.5869", "Allocated": "30848 B" }, { "Method": "'FakeItEasy (100 calls)'", - "Mean": "178,852.86 ns", - "Error": "33,989.630 ns", - "StdDev": "1,863.086 ns", + "Mean": "191,167.94 ns", + "Error": "17,272.06 ns", + "StdDev": "946.740 ns", "Gen0": "5.6152", "Gen1": "5.3711", "Allocated": "94400 B" @@ -339,9 +339,9 @@ "MockCreation": [ { "Method": "TUnit.Mocks", - "Mean": "29.04 ns", - "Error": "0.568 ns", - "StdDev": "0.719 ns", + "Mean": "32.00 ns", + "Error": "0.697 ns", + "StdDev": "0.716 ns", "Gen0": "0.0119", "Gen1": "-", "Gen2": "-", @@ -349,9 +349,9 @@ }, { "Method": "Imposter", - "Mean": "93.62 ns", - "Error": "1.271 ns", - "StdDev": "1.127 ns", + "Mean": "99.84 ns", + "Error": "0.804 ns", + "StdDev": "0.752 ns", "Gen0": "0.0262", "Gen1": "-", "Gen2": "-", @@ -359,9 +359,9 @@ }, { "Method": "Mockolate", - "Mean": "17.71 ns", - "Error": "0.358 ns", - "StdDev": "0.335 ns", + "Mean": "19.45 ns", + "Error": "0.355 ns", + "StdDev": "0.332 ns", "Gen0": "0.0095", "Gen1": "-", "Gen2": "-", @@ -369,9 +369,9 @@ }, { "Method": "Moq", - "Mean": "1,344.12 ns", - "Error": "25.948 ns", - "StdDev": "25.484 ns", + "Mean": "1,396.66 ns", + "Error": "27.840 ns", + "StdDev": "26.042 ns", "Gen0": "0.1221", "Gen1": "-", "Gen2": "-", @@ -379,19 +379,19 @@ }, { "Method": "NSubstitute", - "Mean": "1,935.60 ns", - "Error": "27.568 ns", - "StdDev": "25.787 ns", + "Mean": "1,981.38 ns", + "Error": "21.556 ns", + "StdDev": "19.109 ns", "Gen0": "0.2975", - "Gen1": "0.0019", + "Gen1": "-", "Gen2": "-", "Allocated": "5000 B" }, { "Method": "FakeItEasy", - "Mean": "1,843.83 ns", - "Error": "30.029 ns", - "StdDev": "28.090 ns", + "Mean": "1,884.17 ns", + "Error": "27.232 ns", + "StdDev": "24.140 ns", "Gen0": "0.1602", "Gen1": "0.0038", "Gen2": "0.0019", @@ -399,9 +399,9 @@ }, { "Method": "'TUnit.Mocks (Repository)'", - "Mean": "95.78 ns", - "Error": "0.446 ns", - "StdDev": "0.395 ns", + "Mean": "31.89 ns", + "Error": "0.677 ns", + "StdDev": "0.600 ns", "Gen0": "0.0119", "Gen1": "-", "Gen2": "-", @@ -409,9 +409,9 @@ }, { "Method": "'Imposter (Repository)'", - "Mean": "155.49 ns", - "Error": "2.826 ns", - "StdDev": "2.643 ns", + "Mean": "156.80 ns", + "Error": "1.616 ns", + "StdDev": "1.512 ns", "Gen0": "0.0415", "Gen1": "-", "Gen2": "-", @@ -419,9 +419,9 @@ }, { "Method": "'Mockolate (Repository)'", - "Mean": "17.76 ns", - "Error": "0.223 ns", - "StdDev": "0.197 ns", + "Mean": "20.22 ns", + "Error": "0.451 ns", + "StdDev": "0.586 ns", "Gen0": "0.0105", "Gen1": "-", "Gen2": "-", @@ -429,9 +429,9 @@ }, { "Method": "'Moq (Repository)'", - "Mean": "1,309.32 ns", - "Error": "6.127 ns", - "StdDev": "5.431 ns", + "Mean": "1,411.97 ns", + "Error": "5.741 ns", + "StdDev": "5.090 ns", "Gen0": "0.1125", "Gen1": "-", "Gen2": "-", @@ -439,9 +439,9 @@ }, { "Method": "'NSubstitute (Repository)'", - "Mean": "1,936.82 ns", - "Error": "16.714 ns", - "StdDev": "15.634 ns", + "Mean": "1,968.82 ns", + "Error": "29.645 ns", + "StdDev": "27.730 ns", "Gen0": "0.2975", "Gen1": "-", "Gen2": "-", @@ -449,9 +449,9 @@ }, { "Method": "'FakeItEasy (Repository)'", - "Mean": "1,727.69 ns", - "Error": "17.892 ns", - "StdDev": "15.861 ns", + "Mean": "1,970.15 ns", + "Error": "27.717 ns", + "StdDev": "25.926 ns", "Gen0": "0.1602", "Gen1": "0.0038", "Gen2": "0.0019", @@ -461,281 +461,281 @@ "Setup": [ { "Method": "TUnit.Mocks", - "Mean": "535.7 ns", - "Error": "4.47 ns", - "StdDev": "4.18 ns", + "Mean": "542.2 ns", + "Error": "4.01 ns", + "StdDev": "3.55 ns", "Gen0": "0.1431", "Gen1": "0.0010", "Allocated": "2.34 KB" }, { "Method": "Imposter", - "Mean": "838.7 ns", - "Error": "16.62 ns", - "StdDev": "15.55 ns", + "Mean": "777.7 ns", + "Error": "4.92 ns", + "StdDev": "4.36 ns", "Gen0": "0.3738", "Gen1": "0.0076", "Allocated": "6.12 KB" }, { "Method": "Mockolate", - "Mean": "336.5 ns", - "Error": "4.17 ns", - "StdDev": "3.70 ns", + "Mean": "328.5 ns", + "Error": "3.07 ns", + "StdDev": "2.72 ns", "Gen0": "0.0863", "Gen1": "-", "Allocated": "1.41 KB" }, { "Method": "Moq", - "Mean": "437,823.2 ns", - "Error": "1,802.25 ns", - "StdDev": "1,504.96 ns", + "Mean": "301,488.3 ns", + "Error": "2,223.31 ns", + "StdDev": "1,970.91 ns", "Gen0": "0.9766", "Gen1": "-", - "Allocated": "28.67 KB" + "Allocated": "28.52 KB" }, { "Method": "NSubstitute", - "Mean": "5,935.9 ns", - "Error": "47.81 ns", - "StdDev": "44.72 ns", + "Mean": "5,315.1 ns", + "Error": "63.31 ns", + "StdDev": "59.22 ns", "Gen0": "0.5493", "Gen1": "0.0076", "Allocated": "9.01 KB" }, { "Method": "FakeItEasy", - "Mean": "8,670.0 ns", - "Error": "85.24 ns", - "StdDev": "79.73 ns", + "Mean": "7,089.2 ns", + "Error": "47.34 ns", + "StdDev": "41.97 ns", "Gen0": "0.6256", "Gen1": "0.0153", "Allocated": "10.45 KB" }, { "Method": "'TUnit.Mocks (Multiple)'", - "Mean": "815.5 ns", - "Error": "16.32 ns", - "StdDev": "19.42 ns", + "Mean": "807.8 ns", + "Error": "5.72 ns", + "StdDev": "5.35 ns", "Gen0": "0.1926", "Gen1": "0.0019", "Allocated": "3.15 KB" }, { "Method": "'Imposter (Multiple)'", - "Mean": "1,479.5 ns", - "Error": "29.19 ns", - "StdDev": "60.28 ns", + "Mean": "1,391.3 ns", + "Error": "24.21 ns", + "StdDev": "22.65 ns", "Gen0": "0.6485", "Gen1": "0.0248", "Allocated": "10.59 KB" }, { "Method": "'Mockolate (Multiple)'", - "Mean": "581.4 ns", - "Error": "9.08 ns", - "StdDev": "8.49 ns", + "Mean": "565.4 ns", + "Error": "4.81 ns", + "StdDev": "4.50 ns", "Gen0": "0.1431", "Gen1": "0.0010", "Allocated": "2.35 KB" }, { "Method": "'Moq (Multiple)'", - "Mean": "114,005.4 ns", - "Error": "1,156.97 ns", - "StdDev": "1,082.23 ns", + "Mean": "87,912.4 ns", + "Error": "728.63 ns", + "StdDev": "645.91 ns", "Gen0": "0.9766", "Gen1": "0.7324", "Allocated": "16.53 KB" }, { "Method": "'NSubstitute (Multiple)'", - "Mean": "11,875.4 ns", - "Error": "166.42 ns", - "StdDev": "155.67 ns", + "Mean": "10,799.3 ns", + "Error": "188.72 ns", + "StdDev": "176.53 ns", "Gen0": "1.2207", "Gen1": "-", "Allocated": "20.31 KB" }, { "Method": "'FakeItEasy (Multiple)'", - "Mean": "7,836.1 ns", - "Error": "100.42 ns", - "StdDev": "83.85 ns", - "Gen0": "0.6714", - "Gen1": "0.0610", - "Allocated": "11.71 KB" + "Mean": "6,970.8 ns", + "Error": "97.95 ns", + "StdDev": "86.83 ns", + "Gen0": "0.7019", + "Gen1": "0.0305", + "Allocated": "11.79 KB" } ], "Verification": [ { "Method": "TUnit.Mocks", - "Mean": "572.48 ns", - "Error": "1.760 ns", - "StdDev": "1.470 ns", + "Mean": "850.61 ns", + "Error": "10.672 ns", + "StdDev": "9.982 ns", "Gen0": "0.1793", "Gen1": "0.0010", "Allocated": "3008 B" }, { "Method": "Imposter", - "Mean": "526.78 ns", - "Error": "2.156 ns", - "StdDev": "1.911 ns", + "Mean": "883.33 ns", + "Error": "16.989 ns", + "StdDev": "18.178 ns", "Gen0": "0.2794", "Gen1": "0.0038", "Allocated": "4688 B" }, { "Method": "Mockolate", - "Mean": "305.86 ns", - "Error": "0.614 ns", - "StdDev": "0.544 ns", + "Mean": "482.71 ns", + "Error": "5.530 ns", + "StdDev": "4.902 ns", "Gen0": "0.1268", - "Gen1": "0.0005", + "Gen1": "-", "Allocated": "2128 B" }, { "Method": "Moq", - "Mean": "190,694.43 ns", - "Error": "1,162.150 ns", - "StdDev": "1,030.216 ns", + "Mean": "360,656.91 ns", + "Error": "3,261.115 ns", + "StdDev": "2,723.179 ns", "Gen0": "0.9766", - "Gen1": "0.4883", - "Allocated": "24324 B" + "Gen1": "-", + "Allocated": "24564 B" }, { "Method": "NSubstitute", - "Mean": "4,440.29 ns", - "Error": "23.511 ns", - "StdDev": "20.842 ns", - "Gen0": "0.5951", - "Gen1": "0.0076", + "Mean": "6,660.30 ns", + "Error": "12.520 ns", + "StdDev": "10.455 ns", + "Gen0": "0.5493", + "Gen1": "-", "Allocated": "10064 B" }, { "Method": "FakeItEasy", - "Mean": "5,114.93 ns", - "Error": "29.379 ns", - "StdDev": "26.044 ns", + "Mean": "7,936.47 ns", + "Error": "35.916 ns", + "StdDev": "31.839 ns", "Gen0": "0.6409", "Gen1": "0.0153", "Allocated": "10722 B" }, { "Method": "'TUnit.Mocks (Never)'", - "Mean": "42.41 ns", - "Error": "0.097 ns", - "StdDev": "0.086 ns", + "Mean": "62.53 ns", + "Error": "1.069 ns", + "StdDev": "1.000 ns", "Gen0": "0.0191", "Gen1": "-", "Allocated": "320 B" }, { "Method": "'Imposter (Never)'", - "Mean": "257.31 ns", - "Error": "4.418 ns", - "StdDev": "4.132 ns", + "Mean": "383.58 ns", + "Error": "7.612 ns", + "StdDev": "7.120 ns", "Gen0": "0.1431", "Gen1": "0.0010", "Allocated": "2400 B" }, { "Method": "'Mockolate (Never)'", - "Mean": "195.94 ns", - "Error": "2.076 ns", - "StdDev": "1.840 ns", + "Mean": "258.60 ns", + "Error": "5.092 ns", + "StdDev": "6.621 ns", "Gen0": "0.0682", "Gen1": "-", "Allocated": "1144 B" }, { "Method": "'Moq (Never)'", - "Mean": "49,344.14 ns", - "Error": "201.488 ns", - "StdDev": "178.614 ns", - "Gen0": "0.3662", - "Gen1": "0.2441", - "Allocated": "6925 B" + "Mean": "90,970.40 ns", + "Error": "364.060 ns", + "StdDev": "340.542 ns", + "Gen0": "0.2441", + "Gen1": "-", + "Allocated": "6918 B" }, { "Method": "'NSubstitute (Never)'", - "Mean": "2,618.94 ns", - "Error": "12.484 ns", - "StdDev": "11.067 ns", - "Gen0": "0.4234", - "Gen1": "0.0038", + "Mean": "3,865.43 ns", + "Error": "29.036 ns", + "StdDev": "27.160 ns", + "Gen0": "0.4196", + "Gen1": "-", "Allocated": "7088 B" }, { "Method": "'FakeItEasy (Never)'", - "Mean": "2,523.83 ns", - "Error": "9.448 ns", - "StdDev": "8.376 ns", + "Mean": "3,774.42 ns", + "Error": "27.993 ns", + "StdDev": "23.375 ns", "Gen0": "0.3052", - "Gen1": "0.0153", - "Allocated": "5210 B" + "Gen1": "0.0305", + "Allocated": "5209 B" }, { "Method": "'TUnit.Mocks (Multiple)'", - "Mean": "977.60 ns", - "Error": "3.398 ns", - "StdDev": "3.179 ns", + "Mean": "1,318.74 ns", + "Error": "15.285 ns", + "StdDev": "14.298 ns", "Gen0": "0.2670", "Gen1": "0.0019", "Allocated": "4472 B" }, { "Method": "'Imposter (Multiple)'", - "Mean": "1,310.13 ns", - "Error": "8.740 ns", - "StdDev": "8.176 ns", + "Mean": "1,954.59 ns", + "Error": "37.666 ns", + "StdDev": "36.993 ns", "Gen0": "0.6676", - "Gen1": "0.0210", + "Gen1": "0.0191", "Allocated": "11192 B" }, { "Method": "'Mockolate (Multiple)'", - "Mean": "843.21 ns", - "Error": "5.315 ns", - "StdDev": "4.972 ns", + "Mean": "1,172.60 ns", + "Error": "22.811 ns", + "StdDev": "34.835 ns", "Gen0": "0.3128", "Gen1": "0.0038", "Allocated": "5240 B" }, { "Method": "'Moq (Multiple)'", - "Mean": "274,473.63 ns", - "Error": "1,371.182 ns", - "StdDev": "1,215.517 ns", + "Mean": "485,595.43 ns", + "Error": "3,281.595 ns", + "StdDev": "2,740.280 ns", "Gen0": "1.9531", - "Gen1": "1.4648", - "Allocated": "34842 B" + "Gen1": "0.9766", + "Allocated": "34811 B" }, { "Method": "'NSubstitute (Multiple)'", - "Mean": "7,921.79 ns", - "Error": "45.596 ns", - "StdDev": "40.420 ns", - "Gen0": "0.9918", - "Gen1": "0.0153", - "Allocated": "16762 B" + "Mean": "11,747.82 ns", + "Error": "112.006 ns", + "StdDev": "99.290 ns", + "Gen0": "0.9766", + "Gen1": "-", + "Allocated": "16763 B" }, { "Method": "'FakeItEasy (Multiple)'", - "Mean": "8,981.93 ns", - "Error": "75.203 ns", - "StdDev": "70.345 ns", + "Mean": "14,345.40 ns", + "Error": "209.651 ns", + "StdDev": "196.108 ns", "Gen0": "1.0986", - "Gen1": "0.0610", - "Allocated": "19232 B" + "Gen1": "-", + "Allocated": "19233 B" } ] }, "stats": { "categoryCount": 6, "totalBenchmarks": 78, - "lastUpdated": "2026-08-08T02:56:03.834Z" + "lastUpdated": "2026-08-09T03:02:07.270Z" } } \ No newline at end of file diff --git a/docs/static/benchmarks/mocks/summary.json b/docs/static/benchmarks/mocks/summary.json index 33bf5de06e..4f47c13fb8 100644 --- a/docs/static/benchmarks/mocks/summary.json +++ b/docs/static/benchmarks/mocks/summary.json @@ -7,7 +7,7 @@ "Setup", "Verification" ], - "timestamp": "2026-08-08", + "timestamp": "2026-08-09", "environment": "Ubuntu Latest • .NET SDK 10.0.302", "libraries": [ "TUnit.Mocks", diff --git a/docs/static/benchmarks/summary.json b/docs/static/benchmarks/summary.json index d798fa3428..f01b78fc0e 100644 --- a/docs/static/benchmarks/summary.json +++ b/docs/static/benchmarks/summary.json @@ -10,6 +10,6 @@ "build": [ "BuildTime" ], - "timestamp": "2026-08-02", + "timestamp": "2026-08-09", "environment": "Ubuntu Latest • .NET SDK 10.0.302" } \ No newline at end of file diff --git a/src/TUnit.Core/TestContext.cs b/src/TUnit.Core/TestContext.cs index 7bb54f23ed..7fb2c86961 100644 --- a/src/TUnit.Core/TestContext.cs +++ b/src/TUnit.Core/TestContext.cs @@ -231,6 +231,7 @@ public ContextScope MakeCurrent() public static IReadOnlyDictionary> Parameters => InternalParametersDictionary; private static IConfiguration? _configuration; + private static string? _resultsDirectory; /// /// Gets the test configuration. Throws a descriptive exception if accessed before initialization. @@ -246,6 +247,22 @@ public static IConfiguration Configuration internal set => _configuration = value; } + /// + /// Gets the absolute path to the directory where test results are written. + /// This respects Microsoft.Testing.Platform configuration, including the + /// --results-directory command-line option. + /// + /// Thrown if accessed before the test engine initializes it. + public static string ResultsDirectory + { + get => _resultsDirectory ?? throw new InvalidOperationException( + "TestContext.ResultsDirectory has not been initialized. " + + "This property is only available after the TUnit test engine has started. " + + "If you are accessing this from a static constructor or field initializer, " + + "consider moving the code to a test setup method or test body instead."); + internal set => _resultsDirectory = value; + } + /// /// Gets the output directory of the test assembly, or null if it cannot be determined. /// This is typically the directory where the test binaries are located. diff --git a/src/TUnit.Engine/Framework/TUnitServiceProvider.cs b/src/TUnit.Engine/Framework/TUnitServiceProvider.cs index 94edfe3850..94adb348e9 100644 --- a/src/TUnit.Engine/Framework/TUnitServiceProvider.cs +++ b/src/TUnit.Engine/Framework/TUnitServiceProvider.cs @@ -2,6 +2,7 @@ using System.Runtime.CompilerServices; using Microsoft.Testing.Platform.Capabilities.TestFramework; using Microsoft.Testing.Platform.CommandLine; +using Microsoft.Testing.Platform.Configurations; using Microsoft.Testing.Platform.Extensions; using Microsoft.Testing.Platform.Extensions.TestFramework; using Microsoft.Testing.Platform.Logging; @@ -77,6 +78,7 @@ public TUnitServiceProvider(IExtension extension, var configuration = frameworkServiceProvider.GetConfiguration(); TestContext.Configuration = new ConfigurationAdapter(configuration); + TestContext.ResultsDirectory = configuration.GetTestResultDirectory(); // Register capabilities so they're available to test contexts Register(capabilities); diff --git a/src/TUnit.Engine/Reporters/Html/TestReport.template.html b/src/TUnit.Engine/Reporters/Html/TestReport.template.html index 471b23de10..4814fe09d9 100644 --- a/src/TUnit.Engine/Reporters/Html/TestReport.template.html +++ b/src/TUnit.Engine/Reporters/Html/TestReport.template.html @@ -615,8 +615,8 @@ /* ============================== run view ============================== */ .run-wrap { max-width: 1280px; margin: 0 auto; padding: 28px 28px 80px; } - .run-grid-1 { display: grid; grid-template-columns: 320px 1fr 1fr; gap: 16px; margin-bottom: 16px; } - @media (max-width: 1100px) { .run-grid-1 { grid-template-columns: 1fr; } } + .run-grid-1 { display: grid; grid-template-columns: 320px minmax(0, 1fr) minmax(0, 1fr); gap: 16px; margin-bottom: 16px; } + @media (max-width: 1100px) { .run-grid-1 { grid-template-columns: minmax(0, 1fr); } } .run-grid-2 { display: grid; grid-template-columns: 1.3fr 1fr; gap: 16px; margin-bottom: 16px; } @media (max-width: 1100px) { .run-grid-2 { grid-template-columns: 1fr; } } @@ -656,6 +656,8 @@ /* strip card */ .strip-card { padding: 20px; } .strip-card .card-title { margin-bottom: 14px; } + .outcome-strip-scroll { overflow-x: auto; overflow-y: hidden; padding: 2px 0; } + .outcome-strip-content { width: max-content; min-width: 100%; } .outcome-strip { display: flex; gap: 1px; height: 60px; align-items: stretch; } .outcome-strip .tick { flex: 1; min-width: 2px; border-radius: 2px; opacity: 0.85; transition: opacity 100ms, transform 100ms; cursor: pointer; } .outcome-strip .tick:hover { opacity: 1; transform: scaleY(1.06); } @@ -994,7 +996,7 @@ /* run view: stacked, tighter */ .run-wrap { padding: 20px 18px 80px; } - .run-grid-1, .run-grid-2 { grid-template-columns: 1fr; gap: 12px; } + .run-grid-1, .run-grid-2 { grid-template-columns: minmax(0, 1fr); gap: 12px; } .donut-card { padding: 18px; } .panel-head { padding: 12px 16px; } } @@ -1236,11 +1238,15 @@

Select a test

Outcome timeline
-
-
- start - - end +
+
+
+
+ start + + end +
+
diff --git a/tests/TUnit.Engine.Tests/HtmlReporterTests.cs b/tests/TUnit.Engine.Tests/HtmlReporterTests.cs index 1f03524ade..5d7d646d22 100644 --- a/tests/TUnit.Engine.Tests/HtmlReporterTests.cs +++ b/tests/TUnit.Engine.Tests/HtmlReporterTests.cs @@ -375,6 +375,30 @@ public void GenerateHtml_SubstitutesTitleAndProjectPlaceholders() html.ShouldContain("id=\"projectName\">MyProject.Tests<"); } + [Test] + public void GenerateHtml_EmitsOutcomeTimelineOverflowCss() + { + var html = HtmlReportGenerator.GenerateHtml(new ReportData + { + AssemblyName = "Tests", + MachineName = "machine", + Timestamp = "2026-08-09T00:00:00.0000000Z", + TUnitVersion = "1.0.0", + OperatingSystem = "Windows", + RuntimeVersion = ".NET 10.0", + TotalDurationMs = 0, + Summary = new ReportSummary(), + Groups = [], + }); + + html.ShouldContain("grid-template-columns: 320px minmax(0, 1fr) minmax(0, 1fr)"); + html.ShouldContain("@media (max-width: 1100px) { .run-grid-1 { grid-template-columns: minmax(0, 1fr); } }"); + html.ShouldContain(".run-grid-1, .run-grid-2 { grid-template-columns: minmax(0, 1fr); gap: 12px; }"); + html.ShouldContain(".outcome-strip-scroll { overflow-x: auto; overflow-y: hidden; padding: 2px 0; }"); + html.ShouldContain(".outcome-strip-content { width: max-content; min-width: 100%; }"); + html.ShouldContain("
"); + } + [Test] public void GenerateHtml_EmitsAttemptsArray_WhenTestWasRetried() { diff --git a/tests/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt b/tests/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt index 79572a5307..5a112227cf 100644 --- a/tests/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt +++ b/tests/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet10_0.verified.txt @@ -1419,6 +1419,7 @@ namespace public new static .TestContext? Current { get; } public static string? OutputDirectory { get; } public static .> Parameters { get; } + public static string ResultsDirectory { get; } public static string? TestDirectory { get; } public static string WorkingDirectory { get; set; } public override string GetErrorOutput() { } diff --git a/tests/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt b/tests/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt index 2474a6a6a6..d88750b2f6 100644 --- a/tests/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt +++ b/tests/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt @@ -1419,6 +1419,7 @@ namespace public new static .TestContext? Current { get; } public static string? OutputDirectory { get; } public static .> Parameters { get; } + public static string ResultsDirectory { get; } public static string? TestDirectory { get; } public static string WorkingDirectory { get; set; } public override string GetErrorOutput() { } diff --git a/tests/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt b/tests/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt index 2b264f0477..44da96916c 100644 --- a/tests/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt +++ b/tests/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt @@ -1419,6 +1419,7 @@ namespace public new static .TestContext? Current { get; } public static string? OutputDirectory { get; } public static .> Parameters { get; } + public static string ResultsDirectory { get; } public static string? TestDirectory { get; } public static string WorkingDirectory { get; set; } public override string GetErrorOutput() { } diff --git a/tests/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt b/tests/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt index 9d54d88026..6d64639253 100644 --- a/tests/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt +++ b/tests/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt @@ -1363,6 +1363,7 @@ namespace public new static .TestContext? Current { get; } public static string? OutputDirectory { get; } public static .> Parameters { get; } + public static string ResultsDirectory { get; } public static string? TestDirectory { get; } public static string WorkingDirectory { get; set; } public override string GetErrorOutput() { } diff --git a/tests/TUnit.TestProject/TestContextTests.cs b/tests/TUnit.TestProject/TestContextTests.cs index b02c214794..8aa01b51cf 100644 --- a/tests/TUnit.TestProject/TestContextTests.cs +++ b/tests/TUnit.TestProject/TestContextTests.cs @@ -6,6 +6,17 @@ namespace TUnit.TestProject; [EngineTest(ExpectedResult.Pass)] public class TestContextTests { + [Test] + public async Task ResultsDirectory_Is_Exposed() + { + var resultsDirectory = TestContext.ResultsDirectory; + + await Assert.That(Path.IsPathFullyQualified(resultsDirectory)).IsTrue(); + await Assert.That(Directory.Exists(resultsDirectory)).IsTrue(); + await Assert.That(resultsDirectory) + .IsEqualTo(TestContext.Configuration.Get("platformOptions:resultDirectory")); + } + [Test] public async Task Test() {