Best for
- User wants to run tests in a .NET project
- User needs to run a subset of tests using filters
- User needs help detecting which test platform (VSTest vs MTP) or framework is in use
dotnet/skills/plugins/dotnet-test/skills/run-tests/SKILL.md
Run or recommend the exact .NET test command. ALWAYS USE when asked to run, filter, or troubleshoot .NET tests or provide precise flags/argument order. Supports SDK-style dotnet test and classic non-SDK projects using MSBuild plus vstest.console/MSTest or repository scripts. USE FOR: all tests or subsets by class/category/trait; multi-TFM --framework; TRX reports; crash/hang dumps; VSTest vs Microsoft.Testing.Platform; bridged vs native MTP argument syntax; --filter, --filter-class, --filter-tra
Decision brief
Detect the project system, test platform, and framework, then use the repository-compatible build and test runner.
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/dotnet/skills --skill "plugins/dotnet-test/skills/run-tests"Inspect the Agent Skill "run-tests" from https://github.com/dotnet/skills/blob/1b896e91feb0f613cb54a914f1efd2897810ae02/plugins/dotnet-test/skills/run-tests/SKILL.md at commit 1b896e91feb0f613cb54a914f1efd2897810ae02. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
Detection files to always check (in order): global.json - .csproj - packages.config - Directory.Build.props - Directory.Packages.props - repository scripts/CI documentation
1. Classify SDK-style vs. classic non-SDK using platform-detection. 2. For classic projects, inspect packages.config, assembly references, scripts, CI, README, and AGENTS.md; use their MSBuild/test-runner command. Do not migrate or add modern package references. 3. For SDK-style…
With true, dotnet test bridges to MTP but uses VSTest-style argument parsing. This applies to SDK 8/9 and SDK 10+ when global runner is VSTest or unset. MTP-specific arguments must be passed after --:
See the filter-syntax skill for the complete filter syntax for each platform and framework combination. Key points:
User wants to run tests in a .NET project
Permission review
The documentation asks the agent to read local files, directories, or repositories.
Read `.csproj`, `Directory.Build.props`, and `Directory.Packages.props` toEvidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 97/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 5,248 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
Detect the project system, test platform, and framework, then use the repository-compatible build and test runner.
code-testing-agent; use
writing-mstest-tests for a specifically MSTest API/pattern request)migrate-vstest-to-mtp)mtp-hot-reload)| Input | Required | Description |
|---|---|---|
| Project or solution path | No | Path to the test project (.csproj) or solution (.sln, .slnf, .slnx). Defaults to current directory. |
| Filter expression | No | Filter expression to select specific tests |
| Target framework | No | Target framework moniker to run against (e.g., net8.0) |
These are the most common agent mistakes. Internalize before proceeding:
| Rule | Why |
|---|---|
Do NOT assume dotnet test for classic non-SDK projects | ToolsVersion, explicit compile items, and packages.config often require full MSBuild plus VSTest/MSTest or a repository script |
Do NOT use --logger trx for MTP projects | MTP uses --report-trx (requires the TrxReport extension package) |
Do NOT use --report-trx for VSTest projects | VSTest uses --logger trx |
| Do NOT choose argument syntax from SDK version alone | On SDK 10+, only native MTP mode passes MTP args directly; VSTest mode bridging to MTP still uses -- |
Do NOT omit -- in VSTest mode with MTP | SDK 8/9, and SDK 10 with runner VSTest/unset, require dotnet test -- --report-trx when the bridge is enabled |
Do NOT use --filter "ClassName=..." with xUnit v3 on MTP | xUnit v3 on MTP uses --filter-class, --filter-method, --filter-trait |
| Do NOT use bare positional path in native MTP mode | Use --project <path> or --solution <path>; VSTest mode retains positional paths |
Do NOT use --blame for MTP projects | MTP uses --blame-crash and --blame-hang-timeout separately (each requires its extension package) |
Do NOT use --collect "Code Coverage" for MTP | MTP uses --coverage (requires the CodeCoverage extension package) |
dotnet test mode / platform | SDK | Command pattern |
|---|---|---|
| Classic non-SDK / VSTest or MSTest | n/a | Repository script, or MSBuild followed by vstest.console.exe / MSTest.exe |
| VSTest mode / VSTest | Any | dotnet test [<path>] [--filter <expr>] [--logger trx] |
| VSTest mode / MTP bridge | 8+ | dotnet test [<path>] -- <MTP_ARGS> |
| Native MTP mode | 10+ | dotnet test --project <path> <MTP_ARGS> |
Detection files to always check (in order): global.json -> .csproj ->
packages.config -> Directory.Build.props -> Directory.Packages.props ->
repository scripts/CI documentation
If the prompt names a subset of tests (e.g., "integration tests", "smoke tests", a specific class, a specific TFM), plan to apply the matching filter / --framework in Step 3 — do not run the whole suite.
platform-detection.packages.config, assembly references, scripts,
CI, README*, and AGENTS.md; use their MSBuild/test-runner command. Do not
migrate or add modern package references.dotnet --version in the project directory.global.json to determine dotnet test mode on SDK 10+..csproj, Directory.Build.props, and Directory.Packages.props to
determine whether VSTest mode executes VSTest or bridges to MTP.The checked-in command is authoritative. A common VSTest sequence is:
MSBuild.exe MySolution.sln /t:Build /p:Configuration=Debug
vstest.console.exe path\to\MyTests.dll /Logger:trx
Filtering uses the runner's syntax, for example
/TestCaseFilter:"TestCategory=Integration" with VSTest. Older repositories may
use MSTest.exe or a wrapper script instead. If the required Visual Studio
toolchain is unavailable, report the exact missing prerequisite and the
documented command; do not claim success from dotnet test.
What to look for in each file:
| File | Look for | Indicates |
|---|---|---|
global.json | "test": { "runner": "Microsoft.Testing.Platform" } | Native MTP mode on SDK 10+ |
global.json | "sdk": { "version": "..." } | SDK version (determines -- separator behavior) |
.csproj | MTP runner enabled + <TestingPlatformDotnetTestSupport>true | VSTest mode redirects the MTP application to MTP |
.csproj | MSTest, xunit.v3, NUnit, TUnit packages | Framework identity |
.csproj | Microsoft.NET.Test.Sdk + test adapter | VSTest (unless overridden by MTP signals above) |
.csproj | <TargetFrameworks> (plural) | Multi-TFM — may need --framework |
Directory.Build.props | MTP runner enabled + <TestingPlatformDotnetTestSupport>true | VSTest mode redirects the MTP application to MTP |
Directory.Packages.props | Centrally managed test package versions | Framework identity for CPM repos |
Quick detection summary:
| Signal | Means |
|---|---|
SDK 10+ global runner is Microsoft.Testing.Platform | Native MTP mode — pass args directly |
MTP-capable project + VSTest mode + TestingPlatformDotnetTestSupport=true | MTP bridge — pass MTP args after -- |
| VSTest mode without the bridge | VSTest |
dotnet test [<PROJECT> | <SOLUTION> | <DIRECTORY> | <DLL> | <EXE>]
Common flags:
| Flag | Description |
|---|---|
--framework <TFM> | Target a specific framework in multi-TFM projects (e.g., net8.0) |
--no-build | Skip build, use previously built output |
--filter <EXPRESSION> | Run selected tests (see Step 3) |
--logger trx | Generate TRX results file |
--collect "Code Coverage" | Collect code coverage using Microsoft Code Coverage (built-in, always available) |
--blame | Enable blame mode to detect tests that crash the host |
--blame-crash | Collect a crash dump when the test host crashes |
--blame-hang-timeout <duration> | Abort test if it hangs longer than duration (e.g., 5min) |
-v <level> | Verbosity: quiet, minimal, normal, detailed, diagnostic |
With <TestingPlatformDotnetTestSupport>true</TestingPlatformDotnetTestSupport>,
dotnet test bridges to MTP but uses VSTest-style argument parsing. This applies
to SDK 8/9 and SDK 10+ when global runner is VSTest or unset. MTP-specific
arguments must be passed after --:
dotnet test [<PROJECT> | <SOLUTION> | <DIRECTORY> | <DLL> | <EXE>] -- <MTP_ARGUMENTS>
With the global.json runner set to Microsoft.Testing.Platform, dotnet test natively understands MTP arguments without --:
dotnet test
[--project <PROJECT_OR_DIRECTORY>]
[--solution <SOLUTION_OR_DIRECTORY>]
[--test-modules <EXPRESSION>]
[<MTP_ARGUMENTS>]
Examples:
# Run all tests in a project
dotnet test --project path/to/MyTests.csproj
# Run all tests in a directory containing a project
dotnet test --project path/to/
# Run all tests in a solution (sln, slnf, slnx)
dotnet test --solution path/to/MySolution.sln
dotnet test --solution path/to/MySolution.slnf
dotnet test --solution path/to/MySolution.slnx
# Run all tests in a directory containing a solution
dotnet test --solution path/to/
# Run with MTP flags
dotnet test --project path/to/MyTests.csproj --report-trx --blame-hang-timeout 5min
Note: Native MTP mode does not accept a bare positional argument like VSTest mode. Use
--project,--solution, or--test-modules.
These flags apply to MTP in both modes. Pass them after -- in VSTest mode and
directly in native MTP mode.
Important:
dotnet test/MSBuild flags such as--framework,--no-build,--configuration, and--verbosityalways go before--. Only MTP application arguments go after--in VSTest mode. For example:dotnet test --framework net9.0 -- --report-trx.
Built-in flags (always available):
| Flag | Description |
|---|---|
--results-directory <DIR> | Directory for test result output |
--diagnostic | Enable diagnostic logging for the test platform |
--diagnostic-output-directory <DIR> | Directory for diagnostic log output |
Extension-dependent flags (require the corresponding extension package to be registered):
| Flag | Requires | Description |
|---|---|---|
--filter <EXPRESSION> | Framework-specific (not all frameworks support this) | Run selected tests (see Step 3) |
--report-trx | Microsoft.Testing.Extensions.TrxReport | Generate TRX results file |
--report-trx-filename <FILE> | Microsoft.Testing.Extensions.TrxReport | Set TRX output filename |
--blame-hang-timeout <duration> | Microsoft.Testing.Extensions.HangDump | Abort test if it hangs longer than duration (e.g., 5min) |
--blame-crash | Microsoft.Testing.Extensions.CrashDump | Collect a crash dump when the test host crashes |
--coverage | Microsoft.Testing.Extensions.CodeCoverage | Collect code coverage using Microsoft Code Coverage |
Some frameworks (e.g., MSTest) bundle common extensions by default. Others may require explicit package references. If a flag is not recognized, check that the corresponding extension package is referenced in the project.
MTP test projects are standalone executables. Beyond dotnet test, they can be run directly:
# Build and run
dotnet run --project <PROJECT_PATH>
# Run a previously built DLL
dotnet exec <PATH_TO_DLL>
# Run the executable directly (Windows)
<PATH_TO_EXE>
These alternative invocations accept MTP command line arguments directly (no -- separator needed).
See the filter-syntax skill for the complete filter syntax for each platform and framework combination. Key points:
dotnet test --filter <EXPRESSION> with =, !=, ~, !~ operators--filter syntax as VSTest; pass after -- in VSTest mode and directly in native MTP mode.--filter-class, --filter-method, --filter-trait (not VSTest expression syntax). For a single combined expression (e.g., a class-name pattern AND a trait), use --filter-query with the xUnit v3 query filter language: path segments /<assembly>/<namespace>/<class>/<method> with * wildcards and a [Trait=Value] qualifier — for example dotnet test -- --filter-query "/*/*/*IntegrationTests*/*[Category=Smoke]". See the filter-syntax skill for the full query language.--treenode-filter with path-based syntaxWhen the prompt names a subset of tests by category (e.g., "integration tests", "unit tests", "smoke tests", "fast tests"), do not run all tests — translate the user's vocabulary into the platform-appropriate filter:
Inspect the test source files for filter-attribute annotations that match the named group:
| Framework | Attribute | Filter property |
|---|---|---|
| MSTest | [TestCategory("Integration")] | TestCategory |
| NUnit | [Category("Integration")] | TestCategory (mapped) |
| xUnit v2 | [Trait("Category", "Integration")] | Category |
| xUnit v3 | [Trait("Category", "Integration")] | Category (use --filter-trait) |
| TUnit | [Category("Integration")] | Category |
Build the filter expression and combine it with the platform-correct invocation. For "run the integration tests" against an MSTest project:
| Mode / platform | Framework | Command |
|---|---|---|
| VSTest mode / VSTest | MSTest | dotnet test --filter "TestCategory=Integration" |
| VSTest mode / MTP bridge | MSTest | dotnet test -- --filter "TestCategory=Integration" |
| Native MTP mode | MSTest | dotnet test --filter "TestCategory=Integration" |
| VSTest mode / MTP bridge | xUnit v3 | dotnet test -- --filter-trait "Category=Integration" |
| Native MTP mode | xUnit v3 | dotnet test --filter-trait "Category=Integration" |
| VSTest mode / MTP bridge | TUnit | dotnet test -- --treenode-filter "/*/*/*/*[Category=Integration]" |
| Native MTP mode | TUnit | dotnet test --treenode-filter "/*/*/*/*[Category=Integration]" |
If you cannot find a matching attribute, ask the user to confirm the category name or fall back to a name-pattern filter (e.g., --filter "FullyQualifiedName~Integration").
dotnet test syntax was validated only for SDK-style projects| Pitfall | Solution |
|---|---|
Running dotnet test on a classic packages.config project | Use its documented MSBuild and VSTest/MSTest command; do not modernize implicitly |
Missing Microsoft.NET.Test.Sdk in an SDK-style VSTest project | Tests won't be discovered. Add the SDK-style package reference. For classic projects, preserve packages.config and use the installed adapter/test runner instead |
Using VSTest --filter syntax with xUnit v3 on MTP | xUnit v3 on MTP uses --filter-class, --filter-method, etc. -- not the VSTest expression syntax |
Passing MTP args without -- on .NET SDK 8/9 | Before .NET 10, MTP args must go after --: dotnet test -- --report-trx |
| Assuming every SDK 10 invocation is native MTP mode | Read global.json; SDK 10 VSTest mode still uses the bridge and -- for MTP arguments |
Using --logger trx for MTP or --report-trx for VSTest | Each platform has its own TRX flag — check the Critical Rules table |
Only checking .csproj for MTP signals | Always check Directory.Build.props and Directory.Packages.props too — MTP properties are frequently set there |
| Using bare positional path in native MTP mode | Use --project <path> or --solution <path> |
Common error messages and how to resolve them:
| Error | Cause | Fix |
|---|---|---|
No test is available or No test matches the given testcase filter | Wrong filter syntax for the platform/framework, or tests not discovered | Verify filter syntax matches the platform (see filter-syntax skill). For discovery issues, check that the test SDK and adapter packages are installed |
The --report-trx option is unrecognized | MTP extension package not referenced, or using MTP flag on a VSTest project | Add <PackageReference Include="Microsoft.Testing.Extensions.TrxReport" /> for MTP, or use --logger trx for VSTest |
The --blame-hang-timeout option is unrecognized | Missing HangDump extension on MTP | Add <PackageReference Include="Microsoft.Testing.Extensions.HangDump" /> |
error NETSDK1045: The current .NET SDK does not support targeting .NET X.0 | SDK version in global.json doesn't match the project's target framework | Update global.json SDK version or install the required SDK |
The test runner process exited with non-zero exit code | MTP test host crashed or test failure | Run with --blame-crash (MTP) or --blame (VSTest) to collect a crash dump for diagnosis |
No test source files were found / No test project found | dotnet test can't find a test project in the given path | Specify dotnet test <project.csproj> in VSTest mode or dotnet test --project <path> in native MTP mode |
| Tests discovered but 0 executed | Filter expression matches no tests | Double-check filter property names and values. Common typo: TestCategory (MSTest) vs Category (NUnit) vs trait syntax (xUnit) |
| Using native MTP argument syntax while global.json selects VSTest mode | Use the bridge syntax with --; pass arguments directly only in native MTP mode | |
| Multi-TFM project runs tests for all frameworks | Use --framework <TFM> to target a specific framework | |
global.json runner setting ignored | Requires .NET 10+ SDK. On older SDKs, use <TestingPlatformDotnetTestSupport> MSBuild property instead | |
TUnit --treenode-filter not recognized | TUnit is MTP-only. Use native MTP mode, a configured bridge, or run the test executable directly |
Frequently asked questions
Detect the project system, test platform, and framework, then use the repository-compatible build and test runner.
The source record exposes this install command: npx skills add https://github.com/dotnet/skills --skill "plugins/dotnet-test/skills/run-tests". Inspect the command and pinned source before running it.
Static rules flagged read-files in the source; the page lists the matching lines and excerpts.
Alternatives
garrytan/gbrain
End-to-end discipline for turning any large data source (audio libraries, email takeouts, document corpora, chat exports, API dumps) into brain pages at scale. The lifecycle spine: SCHEMA → ACCESS → TRIAL → EVALUATE → IMPROVE → CODIFY → TEST → SKILLIFY → BULK → MONITOR. State is tracked in a durable JSON manifest (see MANIFEST-PATTERN.md) so any crash, session boundary, or subagent fan-out resumes from ground truth instead of memory.
alirezarezvani/claude-skills
App Store Optimization (ASO) toolkit for researching keywords, analyzing competitor rankings, generating metadata suggestions, and improving app visibility on Apple App Store and Google Play Store. Use when the user asks about ASO, app store rankings, app metadata, app titles and descriptions, app store listings, app visibility, or mobile app marketing on iOS or Android. Supports keyword research and scoring, competitor keyword analysis, metadata optimization, A/B test planning, launch checklist
dotnet/skills
Migrates .NET test projects from VSTest to Microsoft.Testing.Platform (MTP). Use when user asks to "migrate to MTP", "switch from VSTest", "enable Microsoft.Testing.Platform", "use MTP runner", set OutputType=Exe only for test projects in Directory.Build.props, or mentions EnableMSTestRunner, EnableNUnitRunner, or UseMicrosoftTestingPlatformRunner. USE FOR: MTP behavioral differences vs VSTest (exit code 8, zero tests discovered, --ignore-exit-code, TESTINGPLATFORM_EXITCODE_IGNORE); centralizing
vipshop/cache-dit
High-level guide for integrating a new DiT model into cache-dit: Cache (BlockAdapter/ForwardPattern), Context Parallelism, Tensor Parallelism, Text Encoder Parallelism (TE-P), VAE Parallelism (VAE-P), generate CLI, installation, testing workflow, and detailed references. Use when adding support for a new diffusion transformer model in cache-dit.