--- name: xunit-mtp description: use this skill when creating new or reviewing xunit v3 test projects using Microsoft Testing Platform (MTP) to ensure best patterns, practices, and proper configuration --- # xUnit v3 with Microsoft Testing Platform (MTP) - Best Practices this skill provides guidance for creating and reviewing xunit v3 test projects that use Microsoft Testing Platform (MTP) for modern, performant test execution. ## when to use this skill - creating new xunit v3 test projects - reviewing existing xunit test projects for MTP compatibility - migrating from xunit v2 or VSTest to xunit v3 with MTP - troubleshooting xunit v3 MTP project configurations ## project setup requirements ### minimum version requirements - **.NET 8 SDK** later - **xunit.v3** (3.1.0+) - **Microsoft.Testing.Platform** (2.0.0+) for best `dotnet test` integration ### essential MSBuild properties all xunit v3 MTP projects must include: ```xml Exe true true true false true ``` ### recommended package references #### for .NET 8+ projects ```xml ``` #### global usings ```xml ``` ## project structure best practices ### directory organization ``` SolutionRoot/ ├── src/ │ └── YourProject/ └── tests/ └── YourProject.Tests/ # test project ├── YourProject.Tests.csproj ├── testconfig.json # MTP configuration (optional) ├── UnitTests/ # organize by test type ├── IntegrationTests/ └── Fixtures/ # shared test fixtures ``` ### test organization patterns ```csharp namespace YourProject.Tests.UnitTests; // organize tests by the class they're testing public class CalculatorTests { // use descriptive test method names that explain the scenario [Fact] public void Add_WithPositiveNumbers_ReturnsCorrectSum() { // arrange var calculator = new Calculator(); // act var result = calculator.Add(2, 3); // assert Assert.Equal(5, result); } // use theory for parameterized tests [Theory] [InlineData(2, 3, 5)] [InlineData(-1, 1, 0)] [InlineData(0, 0, 0)] public void Add_WithVariousInputs_ReturnsCorrectSum(int a, int b, int expected) { var calculator = new Calculator(); var result = calculator.Add(a, b); Assert.Equal(expected, result); } } ``` ## configuration best practices ### testconfig.json (optional) for MTP-specific configuration, create a `testconfig.json` file: ```json { "Microsoft.Testing.Platform": { "TelemetryOptOut": true, "ExitProcessOnUnhandledException": false } } ``` ### environment variables ```bash # disable telemetry TESTINGPLATFORM_TELEMETRY_OPTOUT=1 # enable diagnostic logging TESTINGPLATFORM_DIAGNOSTIC=1 TESTINGPLATFORM_DIAGNOSTIC_OUTPUT_DIRECTORY=/path/to/logs ``` ## running tests ### command-line execution ```bash # run the test project directly as an executable dotnet run --project YourProject.Tests # or after building ./bin/Debug/net8.0/YourProject.Tests # with MTP options dotnet run --project YourProject.Tests -- --minimum-expected-tests 10 ``` ### using dotnet test ```bash # standard execution dotnet test # with code coverage dotnet test --coverage --coverage-output-format cobertura # with TRX reporting dotnet test -- --report-trx # filter tests dotnet test --filter "FullyQualifiedName~Calculator" ``` ### Visual Studio integration - requires Visual Studio 2022 (17.14.16+) - test explorer automatically detects MTP tests - no additional configuration needed ## migration from VSTest/xUnit v2 ### migration checklist 1. **update package references**: - replace `xunit` with `xunit.v3` - remove `Microsoft.NET.Test.Sdk` (optional, but recommended) 2. **add MSBuild properties**: - add `Exe` - add `true` - add `true` 3. **update code coverage**: - replace `coverlet.collector` with `Microsoft.Testing.Extensions.CodeCoverage` - update coverage commands to use `--coverage` instead of `/p:CollectCoverage=true` 4. **update CI/CD pipelines**: - MTP projects work with standard `dotnet test` commands - update coverage and reporting commands as needed ### backward compatibility during migration, you can maintain both VSTest and MTP support: - keep `Microsoft.NET.Test.Sdk` package reference - use conditional MSBuild properties - gradually migrate as development environments update ## common issues and solutions ### issue: tests don't run in dotnet test **solution**: ensure `TestingPlatformDotnetTestSupport` is set to `true` in the project file. ### issue: coverage not collected **solution**: add `Microsoft.Testing.Extensions.CodeCoverage` package and use `--coverage` flag. ### issue: tests not discovered in Visual Studio **solution**: ensure Visual Studio 2022 version is 17.14.16 or later, and rebuild the solution. ### issue: performance issues with TestingPlatformShowTestsFailure **solution**: this property has a performance impact. disable it for large test suites: ```xml false ``` ## code review checklist when reviewing xunit v3 MTP projects, verify: - [ ] `OutputType` is set to `Exe` - [ ] `UseMicrosoftTestingPlatformRunner` is set to `true` - [ ] `TestingPlatformDotnetTestSupport` is set to `true` (if using dotnet test) - [ ] package references are up to date (xunit.v3 3.1.0+ ) - [ ] tests follow naming conventions and organizational patterns - [ ] async tests properly use `async Task` instead of `async void` - [ ] theory tests have appropriate test data - [ ] test isolation is maintained (no shared mutable state) - [ ] proper use of fixtures for expensive setup/teardown - [ ] appropriate assertions are used ## additional resources - [Microsoft Testing Platform documentation](https://learn.microsoft.com/en-us/dotnet/core/testing/microsoft-testing-platform-intro) - [xUnit.net v3 documentation](https://xunit.net/docs/getting-started/v3/microsoft-testing-platform) - [Migration guide from VSTest to MTP](https://learn.microsoft.com/en-us/dotnet/core/testing/migrating-vstest-microsoft-testing-platform) - [Unit testing best practices](https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-best-practices)