thomhurst/TUnit
Fork: 127 Star: 3871 (更新于 2026-06-11 22:17:46)
license: MIT
Language: C# .
最后发布版本: v1.53.0 ( 2026-06-09 07:56:02)
A modern, fast and flexible .NET testing framework

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.
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.Assertions.Should |
Optional FluentAssertions-style value.Should().BeEqualTo(...) syntax over TUnit.Assertions (beta) |
TUnit.Mocks |
Source-generated, AOT-compatible mocking framework — works with any test runner |
TUnit.Mocks.Http |
HttpClient mocking helpers built on TUnit.Mocks |
TUnit.Mocks.Logging |
ILogger capture/verification helpers built on TUnit.Mocks |
TUnit.AspNetCore |
ASP.NET Core integration — WebApplicationFactory-based test fixtures |
TUnit.Aspire |
Aspire integration — distributed app host fixtures with OpenTelemetry capture |
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
最近版本更新:(数据更新于 2026-06-11 22:17:29)
2026-06-09 07:56:02 v1.53.0
2026-06-08 05:29:59 v1.51.0
2026-06-06 04:06:40 v1.50.0
2026-06-04 05:36:27 v1.49.0
2026-06-01 17:59:57 v1.48.6
2026-06-01 07:28:54 v1.48.0
2026-05-29 08:11:42 v1.47.0
2026-05-29 00:21:47 v1.46.0
2026-05-21 23:32:08 v1.45.29
2026-05-21 01:33:45 v1.45.22
主题(topics):
csharp, dotnet, test, testing
thomhurst/TUnit同语言 C#最近更新仓库
2026-06-11 17:54:02 Achuan-2/SlideSCI
2026-06-11 13:10:07 umbraco/Umbraco-CMS
2026-06-11 03:17:59 rnwood/smtp4dev
2026-06-10 16:57:09 abpframework/abp
2026-06-10 12:21:04 microsoft/PowerToys
2026-06-10 03:45:05 icosa-foundation/open-brush
