TUnit.Engine
1.18.0
Prefix Reserved
dotnet add package TUnit.Engine --version 1.18.0
NuGet\Install-Package TUnit.Engine -Version 1.18.0
<PackageReference Include="TUnit.Engine" Version="1.18.0" />
<PackageVersion Include="TUnit.Engine" Version="1.18.0" />
<PackageReference Include="TUnit.Engine" />
paket add TUnit.Engine --version 1.18.0
#r "nuget: TUnit.Engine, 1.18.0"
#:package TUnit.Engine@1.18.0
#addin nuget:?package=TUnit.Engine&version=1.18.0
#tool nuget:?package=TUnit.Engine&version=1.18.0
TUnit
A modern .NET testing framework. Tests are source-generated at compile time, run in parallel by default, and support Native AOT — all built on Microsoft.Testing.Platform.
<div align="center">
</div>
Features
- Compile-time test discovery — tests are generated at build time rather than discovered via reflection at runtime, which means faster startup and better IDE integration
- Parallel by default — tests run concurrently; use
[DependsOn]to express ordering and[ParallelLimiter]to cap concurrency - Data-driven testing —
[Arguments],[Matrix],[ClassData], and customDataSourceGenerator<T>sources - Async assertions with detailed failure messages
- Built-in Roslyn analyzers — catch mistakes at compile time, such as missing
async, incorrect method signatures, and invalid attribute combinations - Extensible — write your own skip conditions, retry logic, and attributes
- Native AOT & trimming support
- Lifecycle hooks —
[Before]/[After]at method, class, assembly, or test session scope
Getting Started
Using the Project Template (Recommended)
dotnet new install TUnit.Templates
dotnet new TUnit -n "MyTestProject"
cd MyTestProject
dotnet run
Manual Installation
dotnet add package TUnit
Getting Started Guide · Migration Guides
Examples
Basic test with assertions
[Test]
public async Task Parsing_A_Valid_Date_Succeeds()
{
var date = DateTime.Parse("2025-01-01");
await Assert.That(date.Year).IsEqualTo(2025);
await Assert.That(date.Month).IsEqualTo(1);
}
Data-driven tests
[Test]
[Arguments("user1@test.com", "ValidPassword123")]
[Arguments("user2@test.com", "AnotherPassword456")]
[Arguments("admin@test.com", "AdminPass789")]
public async Task User_Login_Should_Succeed(string email, string password)
{
var result = await authService.LoginAsync(email, password);
await Assert.That(result.IsSuccess).IsTrue();
}
// Matrix — generates a test for every combination (9 total here)
[Test]
[MatrixDataSource]
public async Task Database_Operations_Work(
[Matrix("Create", "Update", "Delete")] string operation,
[Matrix("User", "Product", "Order")] string entity)
{
await Assert.That(await ExecuteOperation(operation, entity))
.IsTrue();
}
Hooks, dependencies, and retry
[Before(Class)]
public static async Task SetupDatabase(ClassHookContext context)
{
await DatabaseHelper.InitializeAsync();
}
[Test]
[MethodDataSource(nameof(GetTestUsers))]
public async Task Register_User(string username, string password) { ... }
[Test, DependsOn(nameof(Register_User))]
[Retry(3)]
public async Task Login_With_Registered_User(string username, string password)
{
// Guaranteed to run after Register_User passes
}
Custom attributes
Extend built-in base classes to create your own skip conditions, retry logic, and more:
public class WindowsOnlyAttribute : SkipAttribute
{
public WindowsOnlyAttribute() : base("Windows only") { }
public override Task<bool> ShouldSkip(TestContext testContext)
=> Task.FromResult(!OperatingSystem.IsWindows());
}
[Test, WindowsOnly]
public async Task Windows_Specific_Feature() { ... }
See the documentation for more examples, including custom retry logic and data sources.
IDE Support
| IDE | Notes |
|---|---|
| Visual Studio 2022 (17.13+) | Works out of the box |
| Visual Studio 2022 (earlier) | Enable "Use testing platform server mode" in Tools > Manage Preview Features |
| JetBrains Rider | Enable "Testing Platform support" in Settings > Build, Execution, Deployment > Unit Testing > Testing Platform |
| VS Code | Install C# Dev Kit and enable "Use Testing Platform Protocol" |
| CLI | Works with dotnet test, dotnet run, and direct execution |
Packages
| Package | Purpose |
|---|---|
TUnit |
Start here — the full framework (Core + Engine + Assertions) |
TUnit.Core |
Shared test library components without an execution engine |
TUnit.Engine |
Execution engine for test projects |
TUnit.Assertions |
Standalone assertions — works with other test frameworks too |
TUnit.Playwright |
Playwright integration with automatic browser lifecycle management |
Migrating from xUnit, NUnit, or MSTest?
The syntax will feel familiar. For example, xUnit's [Fact] becomes [Test], and [Theory] + [InlineData] becomes [Test] + [Arguments]. See the migration guides for full details: xUnit · NUnit · MSTest.
Community
- Documentation — guides, tutorials, and API reference
- GitHub Discussions — questions and ideas welcome
- Issues — bug reports and feature requests
- Changelog
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- EnumerableAsyncProcessor (>= 3.8.4)
- Microsoft.Testing.Extensions.TrxReport.Abstractions (>= 2.1.0)
- Microsoft.Testing.Platform (>= 2.1.0)
- Microsoft.Testing.Platform.MSBuild (>= 2.1.0)
- System.Threading.Channels (>= 9.0.0)
- System.Threading.Tasks.Extensions (>= 4.6.3)
- TUnit.Core (>= 1.18.0)
-
net10.0
- EnumerableAsyncProcessor (>= 3.8.4)
- Microsoft.Testing.Extensions.TrxReport.Abstractions (>= 2.1.0)
- Microsoft.Testing.Platform (>= 2.1.0)
- Microsoft.Testing.Platform.MSBuild (>= 2.1.0)
- TUnit.Core (>= 1.18.0)
-
net8.0
- EnumerableAsyncProcessor (>= 3.8.4)
- Microsoft.Testing.Extensions.TrxReport.Abstractions (>= 2.1.0)
- Microsoft.Testing.Platform (>= 2.1.0)
- Microsoft.Testing.Platform.MSBuild (>= 2.1.0)
- System.Threading.Channels (>= 9.0.0)
- TUnit.Core (>= 1.18.0)
-
net9.0
- EnumerableAsyncProcessor (>= 3.8.4)
- Microsoft.Testing.Extensions.TrxReport.Abstractions (>= 2.1.0)
- Microsoft.Testing.Platform (>= 2.1.0)
- Microsoft.Testing.Platform.MSBuild (>= 2.1.0)
- TUnit.Core (>= 1.18.0)
NuGet packages (2)
Showing the top 2 NuGet packages that depend on TUnit.Engine:
| Package | Downloads |
|---|---|
|
TUnit
A .NET Testing Framework |
|
|
Deepstaging.Roslyn.Testing
Testing infrastructure for Roslyn analyzers and generators. Includes TUnit base classes and Verify snapshot testing support. |
GitHub repositories (4)
Showing the top 4 popular GitHub repositories that depend on TUnit.Engine:
| Repository | Stars |
|---|---|
|
eiriktsarpalis/PolyType
Practical generic programming for .NET
|
|
|
viceroypenguin/RBush
R-Tree Implementation for C#
|
|
|
viceroypenguin/SuperLinq
Extensions to LINQ to Objects
|
|
|
steamcore/TinyIpc
.NET inter process broadcast message bus with supporting classes
|
| Version | Downloads | Last Updated |
|---|---|---|
| 1.18.0 | 0 | 3/2/2026 |
| 1.17.54 | 2,135 | 2/27/2026 |
| 1.17.36 | 3,977 | 2/26/2026 |
| 1.17.29 | 2,629 | 2/26/2026 |
| 1.17.25 | 1,793 | 2/25/2026 |
| 1.17.20 | 530 | 2/25/2026 |
| 1.17.11 | 4,911 | 2/24/2026 |
| 1.17.7 | 4,199 | 2/22/2026 |
| 1.17.4 | 884 | 2/22/2026 |
| 1.17.0 | 767 | 2/22/2026 |
| 1.16.4 | 11,629 | 2/18/2026 |
| 1.16.0 | 1,384 | 2/18/2026 |
| 1.15.11 | 4,211 | 2/18/2026 |
| 1.15.7 | 1,630 | 2/17/2026 |
| 1.15.0 | 9,067 | 2/15/2026 |
| 1.14.0 | 2,910 | 2/14/2026 |
| 1.13.70 | 725 | 2/14/2026 |
| 1.13.69 | 369 | 2/14/2026 |
| 1.13.60 | 3,149 | 2/13/2026 |
| 1.13.56 | 3,093 | 2/12/2026 |