From 05f68143388be78781a9c2137cecaadf00f44d9c Mon Sep 17 00:00:00 2001 From: "Michael A. Volz (Flynn)" Date: Mon, 14 Jul 2025 00:13:03 +0200 Subject: [PATCH] Add C# TUnit testing prompt template (#88) * feat: add C# TUnit testing prompt template - Added csharp-tunit.prompt.md with structured prompt template - Provides testing guidelines and best practices for C# development using TUnit framework - Includes comprehensive testing patterns for .NET projects * docs: add TUnit entry to README.md - Added TUnit Best Practices entry after NUnit and before XUnit - References prompts/csharp-tunit.prompt.md with proper description - Includes VS Code and VS Code Insiders installation badges * move: relocate TUnit prompt to prompts directory - Move csharp-tunit.prompt.md from root to prompts/ directory - Follow established project organization pattern - All prompt files should be in the prompts directory --- README.md | 1 + prompts/csharp-tunit.prompt.md | 101 +++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 prompts/csharp-tunit.prompt.md diff --git a/README.md b/README.md index f7cda0b..4ac6a81 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,7 @@ Ready-to-use prompt templates for specific development scenarios and tasks, defi | [C# Documentation Best Practices](prompts/csharp-docs.prompt.md) | Ensure that C# types are documented with XML comments and follow best practices for documentation. | [![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://vscode.dev/redirect?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fcsharp-docs.prompt.md) [![Install in VS Code](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://insiders.vscode.dev/redirect?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fcsharp-docs.prompt.md) | | [MSTest Best Practices](prompts/csharp-mstest.prompt.md) | Get best practices for MSTest unit testing, including data-driven tests | [![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://vscode.dev/redirect?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fcsharp-mstest.prompt.md) [![Install in VS Code](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://insiders.vscode.dev/redirect?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fcsharp-mstest.prompt.md) | | [NUnit Best Practices](prompts/csharp-nunit.prompt.md) | Get best practices for NUnit unit testing, including data-driven tests | [![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://vscode.dev/redirect?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fcsharp-nunit.prompt.md) [![Install in VS Code](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://insiders.vscode.dev/redirect?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fcsharp-nunit.prompt.md) | +| [TUnit Best Practices](prompts/csharp-tunit.prompt.md) | Get best practices for TUnit unit testing, including data-driven tests | [![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://vscode.dev/redirect?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fcsharp-tunit.prompt.md) [![Install in VS Code](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://insiders.vscode.dev/redirect?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fcsharp-tunit.prompt.md) | | [XUnit Best Practices](prompts/csharp-xunit.prompt.md) | Get best practices for XUnit unit testing, including data-driven tests | [![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://vscode.dev/redirect?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fcsharp-xunit.prompt.md) [![Install in VS Code](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://insiders.vscode.dev/redirect?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fcsharp-xunit.prompt.md) | | [.NET/C# Best Practices](prompts/dotnet-best-practices.prompt.md) | Ensure .NET/C# code meets best practices for the solution/project. | [![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://vscode.dev/redirect?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fdotnet-best-practices.prompt.md) [![Install in VS Code](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://insiders.vscode.dev/redirect?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fdotnet-best-practices.prompt.md) | | [.NET/C# Design Pattern Review](prompts/dotnet-design-pattern-review.prompt.md) | Review the C#/.NET code for design pattern implementation and suggest improvements. | [![Install in VS Code](https://img.shields.io/badge/VS_Code-Install-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://vscode.dev/redirect?url=vscode%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fdotnet-design-pattern-review.prompt.md) [![Install in VS Code](https://img.shields.io/badge/VS_Code_Insiders-Install-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://insiders.vscode.dev/redirect?url=vscode-insiders%3Achat-prompt%2Finstall%3Furl%3Dhttps%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fawesome-copilot%2Fmain%2Fprompts%2Fdotnet-design-pattern-review.prompt.md) | diff --git a/prompts/csharp-tunit.prompt.md b/prompts/csharp-tunit.prompt.md new file mode 100644 index 0000000..9d1190b --- /dev/null +++ b/prompts/csharp-tunit.prompt.md @@ -0,0 +1,101 @@ +--- +mode: 'agent' +tools: ['changes', 'codebase', 'editFiles', 'problems', 'search'] +description: 'Get best practices for TUnit unit testing, including data-driven tests' +--- + +# TUnit Best Practices + +Your goal is to help me write effective unit tests with TUnit, covering both standard and data-driven testing approaches. + +## Project Setup + +- Use a separate test project with naming convention `[ProjectName].Tests` +- Reference TUnit package and TUnit.Assertions for fluent assertions +- Create test classes that match the classes being tested (e.g., `CalculatorTests` for `Calculator`) +- Use .NET SDK test commands: `dotnet test` for running tests +- TUnit requires .NET 8.0 or higher + +## Test Structure + +- No test class attributes required (like xUnit/NUnit) +- Use `[Test]` attribute for test methods (not `[Fact]` like xUnit) +- Follow the Arrange-Act-Assert (AAA) pattern +- Name tests using the pattern `MethodName_Scenario_ExpectedBehavior` +- Use lifecycle hooks: `[Before(Test)]` for setup and `[After(Test)]` for teardown +- Use `[Before(Class)]` and `[After(Class)]` for shared context between tests in a class +- Use `[Before(Assembly)]` and `[After(Assembly)]` for shared context across test classes +- TUnit supports advanced lifecycle hooks like `[Before(TestSession)]` and `[After(TestSession)]` + +## Standard Tests + +- Keep tests focused on a single behavior +- Avoid testing multiple behaviors in one test method +- Use TUnit's fluent assertion syntax with `await Assert.That()` +- Include only the assertions needed to verify the test case +- Make tests independent and idempotent (can run in any order) +- Avoid test interdependencies (use `[DependsOn]` attribute if needed) + +## Data-Driven Tests + +- Use `[Arguments]` attribute for inline test data (equivalent to xUnit's `[InlineData]`) +- Use `[MethodData]` for method-based test data (equivalent to xUnit's `[MemberData]`) +- Use `[ClassData]` for class-based test data +- Create custom data sources by implementing `ITestDataSource` +- Use meaningful parameter names in data-driven tests +- Multiple `[Arguments]` attributes can be applied to the same test method + +## Assertions + +- Use `await Assert.That(value).IsEqualTo(expected)` for value equality +- Use `await Assert.That(value).IsSameReferenceAs(expected)` for reference equality +- Use `await Assert.That(value).IsTrue()` or `await Assert.That(value).IsFalse()` for boolean conditions +- Use `await Assert.That(collection).Contains(item)` or `await Assert.That(collection).DoesNotContain(item)` for collections +- Use `await Assert.That(value).Matches(pattern)` for regex pattern matching +- Use `await Assert.That(action).Throws()` or `await Assert.That(asyncAction).ThrowsAsync()` to test exceptions +- Chain assertions with `.And` operator: `await Assert.That(value).IsNotNull().And.IsEqualTo(expected)` +- Use `.Or` operator for alternative conditions: `await Assert.That(value).IsEqualTo(1).Or.IsEqualTo(2)` +- Use `.Within(tolerance)` for DateTime and numeric comparisons with tolerance +- All assertions are asynchronous and must be awaited + +## Advanced Features + +- Use `[Repeat(n)]` to repeat tests multiple times +- Use `[Retry(n)]` for automatic retry on failure +- Use `[ParallelLimit]` to control parallel execution limits +- Use `[Skip("reason")]` to skip tests conditionally +- Use `[DependsOn(nameof(OtherTest))]` to create test dependencies +- Use `[Timeout(milliseconds)]` to set test timeouts +- Create custom attributes by extending TUnit's base attributes + +## Test Organization + +- Group tests by feature or component +- Use `[Category("CategoryName")]` for test categorization +- Use `[DisplayName("Custom Test Name")]` for custom test names +- Consider using `TestContext` for test diagnostics and information +- Use conditional attributes like custom `[WindowsOnly]` for platform-specific tests + +## Performance and Parallel Execution + +- TUnit runs tests in parallel by default (unlike xUnit which requires explicit configuration) +- Use `[NotInParallel]` to disable parallel execution for specific tests +- Use `[ParallelLimit]` with custom limit classes to control concurrency +- Tests within the same class run sequentially by default +- Use `[Repeat(n)]` with `[ParallelLimit]` for load testing scenarios + +## Migration from xUnit + +- Replace `[Fact]` with `[Test]` +- Replace `[Theory]` with `[Test]` and use `[Arguments]` for data +- Replace `[InlineData]` with `[Arguments]` +- Replace `[MemberData]` with `[MethodData]` +- Replace `Assert.Equal` with `await Assert.That(actual).IsEqualTo(expected)` +- Replace `Assert.True` with `await Assert.That(condition).IsTrue()` +- Replace `Assert.Throws` with `await Assert.That(action).Throws()` +- Replace constructor/IDisposable with `[Before(Test)]`/`[After(Test)]` +- Replace `IClassFixture` with `[Before(Class)]`/`[After(Class)]` + +**Why TUnit over xUnit?** + +TUnit offers a modern, fast, and flexible testing experience with advanced features not present in xUnit, such as asynchronous assertions, more refined lifecycle hooks, and improved data-driven testing capabilities. TUnit's fluent assertions provide clearer and more expressive test validation, making it especially suitable for complex .NET projects. \ No newline at end of file