Prova is a high-performance, MTP-native testing framework for .NET 10. It uses the xUnit syntax you already know, but with zero runtime reflection and full Native AOT compatibility. Theories are "unrolled" at compile-time into parameterless test methods -- no boxing, no reflection, instant startup.
Your tests remain exactly the same. Prova supports standard xUnit attributes ([Fact], [Theory], [InlineData], Assert). You only change the runner.
Prova implements the Microsoft Testing Platform (MTP) natively. This means full dotnet test support, TRX reporting, crash/hang dump collection, and code coverage -- all without a legacy VSTest bridge.
Each [InlineData] row is statically compiled into its own parameterless test method by the Source Generator. There is zero boxing, zero object[] allocation, and zero reflection at runtime. This makes [Theory] tests fully Native AOT compatible.
Prova auto-generates a Program.cs entry point with UTF-8 output. Your test project is a self-executing console app from dotnet new. No boilerplate needed.
Tests run in parallel by default (Task.WhenAll), utilizing all available cores. Use [Parallel(max: N)] to bound concurrency.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Prova" Version="0.5.0" />
</ItemGroup>
</Project>Note:
<OutputType>Exe</OutputType>and<TargetFramework>net10.0</TargetFramework>are required. Prova auto-generates the entry point -- you do not need aProgram.cs.
using Prova;
public class CalculatorTests
{
[Fact]
public void Add_ReturnsSum()
{
Assert.Equal(4, 2 + 2);
}
[Theory]
[InlineData(10, 2, 5)]
[InlineData(20, 4, 5)]
public void Divide_ReturnsQuotient(int a, int b, int expected)
{
Assert.Equal(expected, a / b);
}
}# Run as a self-executing console app (fastest)
dotnet run
# Run via the Microsoft Testing Platform (supports --coverage, --report-trx, etc.)
dotnet testProva natively supports MTP CLI arguments. No adapters or bridges needed.
# List all discovered tests (0ms discovery from static registry)
dotnet run -- --list-tests
# Filter tests by name
dotnet run -- --treenode-filter="*Calculator*"
# Generate TRX report
dotnet test --report-trx
# Collect code coverage
dotnet test --coverage
# Crash dump on failure
dotnet test --crashdump
# Hang dump with timeout
dotnet test --hangdump --hangdump-timeout 30000| Package | Description | NuGet |
|---|---|---|
Prova |
Core framework | |
Prova.AspNetCore |
ASP.NET Core integration | |
Prova.Playwright |
Playwright browser testing | |
Prova.Testcontainers |
Docker container testing | |
Prova.FsCheck |
Property-based testing (FsCheck) |
While Prova is a drop-in replacement, it adds enterprise-grade features for strictly governed codebases.
Prevent thread pool starvation in massive test suites by bounding parallelism.
[Parallel(max: 4)] // Limits concurrency for this class
public class DatabaseTests { ... }Enforce zero-allocation policies or strict memory budgets for critical paths.
[Fact]
[MaxAlloc(0)] // Fails if the test allocates any memory on the heap
public void HotPath_ShouldNotAllocate() { ... }[Fact]
[Retry(3)] // Automatically retry flaky network tests
public void IntegrationTest() { ... }Run only the specific test you are debugging (similar to .only in Jest).
[Fact]
[Focus] // Prova will ONLY generate and run this test
public void DebuggingThisRightNow() { ... }We welcome issues and pull requests. Please see CONTRIBUTING.md for details.
Prova produces clean, hierarchical output that is easy to parse visually.
MIT
