7.4 KiB
name, description
| name | description |
|---|---|
| xunit-mtp | 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 testintegration
essential MSBuild properties
all xunit v3 MTP projects must include:
<PropertyGroup>
<!-- required: makes the test project executable -->
<OutputType>Exe</OutputType>
<!-- required: enables MTP for command-line execution -->
<UseMicrosoftTestingPlatformRunner>true</UseMicrosoftTestingPlatformRunner>
<!-- recommended: enables `dotnet test` support -->
<TestingPlatformDotnetTestSupport>true</TestingPlatformDotnetTestSupport>
<!-- recommended: shows test failures per test (has performance impact) -->
<TestingPlatformShowTestsFailure>true</TestingPlatformShowTestsFailure>
<!-- standard test project flags -->
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
recommended package references
for .NET 8+ projects
<ItemGroup>
<!-- core xunit v3 packages -->
<PackageReference Include="xunit.v3" Version="3.1.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.5" />
<!-- code coverage support -->
<PackageReference Include="Microsoft.Testing.Extensions.CodeCoverage" Version="17.10.1" />
<!-- optional: TRX reporting -->
<PackageReference Include="Microsoft.Testing.Extensions.TrxReport" Version="1.7.0" />
</ItemGroup>
global usings
<ItemGroup>
<Using Include="Xunit" />
</ItemGroup>
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
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:
{
"Microsoft.Testing.Platform": {
"TelemetryOptOut": true,
"ExitProcessOnUnhandledException": false
}
}
environment variables
# disable telemetry
TESTINGPLATFORM_TELEMETRY_OPTOUT=1
# enable diagnostic logging
TESTINGPLATFORM_DIAGNOSTIC=1
TESTINGPLATFORM_DIAGNOSTIC_OUTPUT_DIRECTORY=/path/to/logs
running tests
command-line execution
# 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
# 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
-
update package references:
- replace
xunitwithxunit.v3 - remove
Microsoft.NET.Test.Sdk(optional, but recommended)
- replace
-
add MSBuild properties:
- add
<OutputType>Exe</OutputType> - add
<UseMicrosoftTestingPlatformRunner>true</UseMicrosoftTestingPlatformRunner> - add
<TestingPlatformDotnetTestSupport>true</TestingPlatformDotnetTestSupport>
- add
-
update code coverage:
- replace
coverlet.collectorwithMicrosoft.Testing.Extensions.CodeCoverage - update coverage commands to use
--coverageinstead of/p:CollectCoverage=true
- replace
-
update CI/CD pipelines:
- MTP projects work with standard
dotnet testcommands - update coverage and reporting commands as needed
- MTP projects work with standard
backward compatibility
during migration, you can maintain both VSTest and MTP support:
- keep
Microsoft.NET.Test.Sdkpackage 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:
<TestingPlatformShowTestsFailure>false</TestingPlatformShowTestsFailure>
code review checklist
when reviewing xunit v3 MTP projects, verify:
OutputTypeis set toExeUseMicrosoftTestingPlatformRunneris set totrueTestingPlatformDotnetTestSupportis set totrue(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 Taskinstead ofasync 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