Skip to content

Writing Tests

Prova simplifies the test authoring experience by adhering to standard conventions while optimizing for AOT.

Test Discovery

Prova does not use reflection at runtime. Instead, it uses Source Generators to discover tests during compilation.

  • Rules:
    • Classes must be public (or internal if InternalVisibleTo is set).
    • Methods must be annotated with [Fact] or [Theory].
    • Methods can be void or Task / ValueTask.

Attributes

[Fact]

Defines a test that has no input arguments.

csharp
[Fact]
public void BasicTest()
{
    Assert.True(true);
}

[Theory] & [InlineData]

Defines a data-driven test.

csharp
[Theory]
[InlineData(1, 1, 2)]
[InlineData(10, 5, 15)]
public void Add_Works(int a, int b, int expected)
{
    Assert.Equal(expected, a + b);
}

Assertions

Prova bundles a fluent and performant assertion library Prova.Assertions.

csharp
int value = 42;

// Standard
Assert.Equal(42, value);

// Fluent
Assert.That(value).IsEqualTo(42);

See the Assertions Reference for the full list.

Lifecycle

Use IAsyncLifetime for setup and teardown logic.

csharp
public class DatabaseTests : IAsyncLifetime
{
    public async Task InitializeAsync()
    {
        await Database.Connect();
    }

    [Fact]
    public void CanQuery() { ... }

    public async Task DisposeAsync()
    {
        await Database.Disconnect();
    }
}

Released under the MIT License.