Skip to content

Test Events ​

Prova provides a structured event system that allows you to observe test lifecycle events (Start, End) independently of the test reporter. This is useful for custom logging, analytics, or performance monitoring.

Interfaces ​

The event system uses the following interfaces, located in the Prova namespace:

ITestEventReceiver ​

The base marker interface for all event receivers.

ITestStartEventReceiver ​

Implement this interface to observe when a test is about to start.

csharp
public interface ITestStartEventReceiver : ITestEventReceiver
{
    Task OnTestStartAsync(ProvaTest test);
}

ITestEndEventReceiver ​

Implement this interface to observe when a test has completed.

csharp
public interface ITestEndEventReceiver : ITestEventReceiver
{
    Task OnTestEndAsync(ProvaTest test, TestResult result, long durationMs);
}

Global Event Registry ​

To observe events, you must register your receiver with the EventRegistry. Registration is typically done during application startup or within a [ConfigureServices] method.

csharp
using Prova;

public class MyEventReceiver : ITestStartEventReceiver, ITestEndEventReceiver
{
    public Task OnTestStartAsync(ProvaTest test)
    {
        Console.WriteLine($"[START] {test.DisplayName}");
        return Task.CompletedTask;
    }

    public Task OnTestEndAsync(ProvaTest test, TestResult result, long durationMs)
    {
        Console.WriteLine($"[END] {test.DisplayName} - {result} ({durationMs}ms)");
        return Task.CompletedTask;
    }
}

// Registration
EventRegistry.Register(new MyEventReceiver());

Standard Integration ​

The EventRegistry is automatically integrated into:

  • Hybrid MTP Adapter: Events are dispatched when running tests via dotnet test.
  • Source Generated Runner: Calls to the event registry are injected into the generated RunTestSafe method for standalone execution.

Thread Safety ​

The EventRegistry is thread-safe and supports concurrent dispatching. It uses internal locking to ensure that registration and unregistration do not interfere with active test runs.

Example ​

You can find a complete example in the Prova.Demo project under EventSample.cs.

csharp
[ConfigureServices]
public void Configure(IServiceCollection services)
{
    EventRegistry.Register(new EventSample());
}

Released under the MIT License.