# Results

## Startup floor: one test

| Framework | MTP | Native AOT | `dotnet test` |
| --- | ---: | ---: | ---: |
| xUnit.net v3 | 178 ms | 24 ms | 715 ms |
| NUnit | 204 ms | reflection based discovery, no source generator | 540 ms |
| MSTest | 151 ms | 28 ms | 469 ms |
| TUnit | 146 ms | 24 ms | no VSTest adapter |

## Scaling (MTP, maximum parallelism)

| Framework | 1 test | 1000 tests | 10000 tests | Per test |
| --- | ---: | ---: | ---: | ---: |
| xUnit.net v3 | 178 ms | 240 ms | 743 ms | 55.9 us |
| NUnit | 204 ms | 296 ms | 1,057 ms | 84.6 us |
| MSTest | 151 ms | 172 ms | 311 ms | 15.4 us |
| TUnit | 146 ms | 197 ms | 575 ms | 42.0 us |

## Microsoft.Testing.Platform vs dotnet test

| Framework | Tests | MTP | `dotnet test` | Ratio |
| --- | ---: | ---: | ---: | ---: |
| xUnit.net v3 | 1 | 178 ms | 715 ms | 4.02x |
| xUnit.net v3 | 1000 | 240 ms | 975 ms | 4.07x |
| xUnit.net v3 | 10000 | 743 ms | 3,619 ms | 4.87x |
| NUnit | 1 | 204 ms | 540 ms | 2.65x |
| NUnit | 1000 | 296 ms | 621 ms | 2.10x |
| NUnit | 10000 | 1,057 ms | 1,604 ms | 1.52x |
| MSTest | 1 | 151 ms | 469 ms | 3.11x |
| MSTest | 1000 | 172 ms | 541 ms | 3.14x |
| MSTest | 10000 | 311 ms | 1,596 ms | 5.14x |
| TUnit | 1 | 146 ms | no VSTest adapter | no VSTest adapter |
| TUnit | 1000 | 197 ms | no VSTest adapter | no VSTest adapter |
| TUnit | 10000 | 575 ms | no VSTest adapter | no VSTest adapter |

## Native AOT

| Framework | Tests | JIT | AOT | Publish time | Binary size |
| --- | ---: | ---: | ---: | ---: | ---: |
| xUnit.net v3 | 1 | 178 ms | 24 ms | 6,872 ms | 12.7 MB |
| xUnit.net v3 | 1000 | 240 ms | 45 ms | 8,062 ms | 13.9 MB |
| xUnit.net v3 | 10000 | 743 ms | 249 ms | 43.3 s | 25.1 MB |
| NUnit | 1 | 204 ms | reflection based discovery, no source generator | n/a | n/a |
| NUnit | 1000 | 296 ms | reflection based discovery, no source generator | n/a | n/a |
| NUnit | 10000 | 1,057 ms | reflection based discovery, no source generator | n/a | n/a |
| MSTest | 1 | 151 ms | 28 ms | 9,005 ms | 16.6 MB |
| MSTest | 1000 | 172 ms | 40 ms | 59.7 s | 17.3 MB |
| MSTest | 10000 | 311 ms | 144 ms | 5031.8 s | 25.3 MB |
| TUnit | 1 | 146 ms | 24 ms | 9,392 ms | 16.0 MB |
| TUnit | 1000 | 197 ms | 39 ms | 10.9 s | 16.7 MB |
| TUnit | 10000 | 575 ms | 211 ms | 23.2 s | 23.1 MB |

## All passing vs all failing (1000 tests, MTP)

| Framework | Passing | Failing | Ratio |
| --- | ---: | ---: | ---: |
| xUnit.net v3 | 240 ms | 281 ms | 1.17x |
| NUnit | 296 ms | 359 ms | 1.21x |
| MSTest | 172 ms | 224 ms | 1.30x |
| TUnit | 197 ms | 233 ms | 1.19x |

## Compilation

| Framework | Tests | Cold build | Incremental build | Restore |
| --- | ---: | ---: | ---: | ---: |
| xUnit.net v3 | 1 | 338 ms | 299 ms | 395 ms |
| xUnit.net v3 | 1000 | 368 ms | 326 ms | 381 ms |
| xUnit.net v3 | 10000 | 542 ms | 504 ms | 383 ms |
| NUnit | 1 | 353 ms | 312 ms | 380 ms |
| NUnit | 1000 | 379 ms | 333 ms | 384 ms |
| NUnit | 10000 | 510 ms | 461 ms | 388 ms |
| MSTest | 1 | 380 ms | 325 ms | 379 ms |
| MSTest | 1000 | 419 ms | 360 ms | 387 ms |
| MSTest | 10000 | 606 ms | 549 ms | 408 ms |
| TUnit | 1 | 352 ms | 308 ms | 375 ms |
| TUnit | 1000 | 447 ms | 401 ms | 385 ms |
| TUnit | 10000 | 1,167 ms | 1,210 ms | 942 ms |

## Lifecycle scenarios (1000 tests, MTP)

| Framework | Bare | PerTestHooks | ClassFixture | AssemblyFixture | DataDriven | Async |
| --- | ---: | ---: | ---: | ---: | ---: | ---: |
| xUnit.net v3 | 240 ms | 243 ms | 242 ms | 242 ms | 270 ms | 316 ms |
| NUnit | 296 ms | 295 ms | 297 ms | 297 ms | 366 ms | 352 ms |
| MSTest | 172 ms | 174 ms | 175 ms | 174 ms | 176 ms | 256 ms |
| TUnit | 197 ms | 213 ms | 210 ms | 203 ms | 304 ms | 273 ms |

