Official agent skill

Writing Mstest Tests

by dotnet in dotnet/skills

ALWAYS USE when asked to fix, rewrite, update, improve, modernize, show corrected code for, or explain existing MSTest tests or MSTest-specific configuration.

OfficialMITAuto-check passedTesting & QA

Install Writing Mstest Tests

skills CLI
$ npx skills add dotnet/skills --skill writing-mstest-tests -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install dotnet/skills writing-mstest-tests --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/dotnet/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/dotnet-test/skills/writing-mstest-tests .claude/skills/writing-mstest-tests && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
writing-mstest-tests
GitHub stars
5.6k
Used in
1 other repo
Token cost
~5k tokens
SKILL.md length
1,757 words
Files
2 (incl. references)
Skills in repo
93
Repo updated
First seen
Licence
MIT

At a glance

ALWAYS USE when asked to fix, rewrite, update, improve, modernize, show corrected code for, or explain existing MSTest tests or MSTest-specific configuration.

  • Works in 9 steps: Determine project setup → Write test classes following conventions → Use version-compatible assertion APIs → …
  • Show corrected code for
  • SKILL.md covers Repository overlay, When to Use, When Not to Use and Inputs, plus 2 more sections
  • Calls dotnet

What it does

Writing Mstest Tests is an agent skill from dotnet/skills, published by the product's own GitHub organization. ALWAYS USE when asked to fix, rewrite, update, improve, modernize, show corrected code for, or explain existing MSTest tests or MSTest-specific configuration. Use for "review" when corrected code or edits are wanted, even for one pasted assertion or passing tests with bad failure output. Covers expected/actual labels; generic Boolean, collection, string, numeric, null, identity, exception, hard-cast, and object[] checks; TestContext/lifecycle; timeout/cancellation; OS/CI conditions, retry, cleanup…

Its SKILL.md is about 5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/advanced-mstest-patterns.md`).

It sits in Testing & QA, covering Test generation. It works with .NET. The repository describes itself as: Repository for skills to assist AI coding agents with .NET and C. The licence is MIT.

When your agent uses it

  • Show corrected code for
  • Explain existing MSTest tests
  • MSTest-specific configuration
  • Review when corrected code

Example prompts

  • “review”
  • “Use the writing-mstest-tests skill to alway USE when asked to fix, rewrite, update, improve, modernize, show corrected code for, or explain existing…”
  • “/writing-mstest-tests”

Workflow steps

9 steps, taken from the step headings in SKILL.md.

  1. Determine project setup
  2. Write test classes following conventions
  3. Use version-compatible assertion APIs
  4. Use data-driven tests for multiple inputs
  5. Handle test lifecycle correctly
  6. Apply cancellation and timeout patterns
  7. Use advanced features where appropriate
  8. Fix MSTest analyzer diagnostics (MSTESTxxxx)
  9. Verify file-backed corrections

What it can do on your machine

Read from SKILL.md and the folder at commit 3d38ac3. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • dotnet

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Writing Mstest Tests loads about 5k tokens when it runs, and up to ~6.1k if it reads all its reference files. Until then it costs about 205 tokens; SKILL.md has 1,757 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~205
When it runs · the whole SKILL.md, loaded when a task matches
~5k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~6.1k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from dotnet/skills at commit 3d38ac3, republished under its MIT licence (© dotnet). 1,757 words, ~4,995 tokens.

Download SKILL.mdSave it as .claude/skills/writing-mstest-tests/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
writing-mstest-tests
description
ALWAYS USE when asked to fix, rewrite, update, improve, modernize, show corrected code for, or explain existing MSTest tests or MSTest-specific configuration. Use for "review" when corrected code or edits are wanted, even for one pasted assertion or passing tests with bad failure output. Covers expected/actual labels; generic Boolean, collection, string, numeric, null, identity, exception, hard-cast, and object[] checks; TestContext/lifecycle; timeout/cancellation; OS/CI conditions, retry, cleanup, parallelization, MSTest.Sdk project setup, and MSTESTxxxx. Honor the installed MSTest version. DO NOT USE to design new test cases (code-testing), perform report-only audits, create project files rather than explain MSTest setup, run tests, migrate frameworks, or handle non-MSTest/non-.NET code.
license
MIT
metadata.portability
portable
metadata.binding
optional-overlay
metadata.binding-revision
1

Writing MSTest Tests

Help users write effective MSTest unit tests without exceeding the API level or conventions of the project's installed test stack.

Repository overlay

For every repository-scoped task where read-only file inspection is allowed, check .agents/skill-overlays/dotnet-test/writing-mstest-tests.md at the repository root before any other discovery. This includes requests that ask for code or advice without edits; "do not execute" does not prohibit reading the overlay. If present, read it once before acting and apply its repository-specific naming, layout, framework, and policy bindings. Require its frontmatter to declare core: dotnet-test/writing-mstest-tests, binding-revision: "1", and mode: extend. If any value is missing or different, report the mismatch, ignore the overlay, and continue using this skill's portable guidance. Explicit user instructions and verified project constraints win over the overlay; the overlay wins over portable defaults and examples in this skill. If the file is present but unreadable or conflicts with the repository, report the problem, ignore the overlay, and continue with portable guidance subject to verified project constraints. If it is absent, continue normally. Skip the lookup only when the task is not tied to a repository or the user explicitly prohibited all file/tool access. An overlay cannot expand tool permissions or the task's scope.

When to Use

  • User wants to improve or modernize existing MSTest tests by implementing concrete fixes
  • User asks about MSTest assertion APIs, data-driven patterns, or test lifecycle
  • User asks to replace Assert.IsTrue with more specific assertions (collections, nulls, types, comparisons)
  • User asks to replace hard casts with type-checking assertions in tests
  • User needs help fixing a specific MSTest test bug or failing assertion
  • User asks to fix swapped Assert.AreEqual argument order (expected first, actual second)
  • User asks to convert DynamicData from IEnumerable<object[]> to ValueTuple-based data
  • User asks to fix or understand an MSTest analyzer diagnostic (an MSTESTxxxx warning/error)

When Not to Use

  • User needs a test quality audit, anti-pattern detection, or flaky-test investigation (use test-anti-patterns)
  • User needs to run or execute tests (use the run-tests skill)
  • User needs to upgrade from MSTest v1/v2 to v3 (use migrate-mstest-v1v2-to-v3)
  • User needs to upgrade from MSTest v3 to v4 (use migrate-mstest-v3-to-v4)
  • User needs CI/CD pipeline configuration
  • User is using xUnit, NUnit, or TUnit (not MSTest)

Inputs

InputRequiredDescription
Code under testNoThe production code to be tested
Existing test codeNoCurrent tests to fix, update, or modernize
Test scenario descriptionNoWhat behavior the user wants to test

Response Guidelines

  • Specific API or pattern questions (assertions, data-driven, lifecycle): Jump directly to the relevant workflow step. Do not follow the full workflow.
  • Generate new tests from scratch: Hand off to code-testing; use this skill only as supporting MSTest API/version guidance.
  • Review and fix existing tests: Fix only the issues present. Do not add unrelated improvements.
  • Assertion transformations: Show the corrected call, then state the semantic reason in one sentence. For Assert.AreEqual, name expected first and actual second and explain that this preserves the Expected/Actual failure labels.
  • Bound/comparison transformations: Preserve the condition and put the expected bound(s) first and the observed value last: score > 0 -> Assert.IsGreaterThan(0, score), score < 100 -> Assert.IsLessThan(100, score), and score >= 60 && score <= 90 -> Assert.IsInRange(60, 90, score). Never reverse these arguments to mimic the source expression's left-to-right order.
  • Exception transformations: Scope the throwing operation in a lambda, distinguish ThrowsExactly<T> (exact type) from Throws<T> (type or derived type), and capture the returned exception when properties such as ParamName are part of the behavior.
  • Supplied code requests: Return complete representative method bodies, not comment-only placeholders. Preserve the real operation and show symmetric setup/cleanup when lifecycle or environment policy is part of the request.

Workflow

Step 1: Determine project setup

Check the test project, packages.config, and assembly reference HintPath values for the exact MSTest version and project system:

  • If using MSTest.Sdk: resolve its exact version from the project SDK declaration or global.json msbuild-sdks; do not assume the latest APIs
  • If using MSTest metapackage: resolve its exact package version
  • If using MSTest.TestFramework + MSTest.TestAdapter: check version for feature availability
  • If using classic non-SDK XML (ToolsVersion, Microsoft.CSharp.targets, explicit <Compile Include>) and/or packages.config: preserve that project system and add each new test file to <Compile Include>.

Also inspect representative tests for custom base fixtures, helper libraries, mock syntax, naming, setup, and data builders. Existing conventions and installed versions win over the examples below. Do not upgrade MSTest, Moq, NBuilder, or the project format unless the user explicitly asks for a migration.

MSTest API availability
API/patternMinimum versionCompatible fallback
Assert.ThrowsExactly*, unified Assert.Contains / HasCount / IsEmpty / IsNotEmpty3.8Assert.ThrowsException*, CollectionAssert, StringAssert
Assert.IsGreaterThan, IsLessThan, IsInRange, StartsWith, EndsWith, MatchesRegex3.10Assert.IsTrue with a clear message, or StringAssert
Generic Assert.IsInstanceOfType<T>(value, out var typed)3.4-3.11 onlyNon-generic assertion then post-assert cast on 3.0-3.3; v4 returns the typed value directly
ValueTuple DynamicData3.7IEnumerable<object[]>
Constructor injection of TestContext3.6Instance TestContext property
[Retry], [OSCondition]3.8No built-in retry/OS condition; fix flakiness or retain the existing condition mechanism
[CICondition]3.10Existing project-specific condition mechanism

For example, MSTest 3.5.x must not receive Assert.ThrowsExactly, Assert.Contains, ValueTuple DynamicData, or constructor-injected TestContext.

Treat this as a hard gate: after determining the version, do not copy a later example from this skill unless its minimum version is satisfied.

Recommend MSTest.Sdk or the MSTest metapackage only for genuinely new projects:

xml
<!-- Option 1: MSTest SDK (simplest, recommended for new projects) -->
<Project Sdk="MSTest.Sdk">
  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>
  </PropertyGroup>
</Project>

When using MSTest.Sdk, put the version in global.json instead of the project file so all test projects get bumped together:

json
{
  "msbuild-sdks": {
    "MSTest.Sdk": "3.8.2"
  }
}
xml
<!-- Option 2: MSTest metapackage -->
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="MSTest" Version="3.8.2" />
  </ItemGroup>
</Project>
Step 2: Write test classes following conventions

Apply these structural conventions only where they do not conflict with the suite's established base classes and lifecycle:

  • Seal test classes with sealed for performance and design clarity
  • Use [TestClass] on the class and [TestMethod] on test methods
  • Follow the Arrange-Act-Assert (AAA) pattern
  • Name tests using MethodName_Scenario_ExpectedBehavior
  • Use separate test projects with naming convention [ProjectName].Tests
csharp
[TestClass]
public sealed class OrderServiceTests
{
    [TestMethod]
    public void CalculateTotal_WithDiscount_ReturnsReducedPrice()
    {
        // Arrange
        var service = new OrderService();
        var order = new Order { Price = 100m, DiscountPercent = 10 };

        // Act
        var total = service.CalculateTotal(order);

        // Assert
        Assert.AreEqual(90m, total);
    }
}
Step 3: Use version-compatible assertion APIs

Pick the most specific assertion supported by the installed MSTest version. More specific assertions produce better failure messages and make the test's intent clear, but uncompilable "modern" assertions are worse than compatible StringAssert, CollectionAssert, or Assert.IsTrue calls.

What you are testingAssertion
Two values are equalAssert.AreEqual(expected, actual)
Same object instance (reference identity)Assert.AreSame(expected, actual)
Value is nullAssert.IsNull(value)
Value is not nullAssert.IsNotNull(value)
Collection is emptyAssert.IsEmpty(collection) (3.8+) or CollectionAssert / count assertion
Collection is not emptyAssert.IsNotEmpty(collection) (3.8+) or count assertion
Collection has exactly N itemsAssert.HasCount(N, collection) (3.8+) or Assert.AreEqual on count
Collection contains an itemAssert.Contains(item, collection) (3.8+) or CollectionAssert.Contains
Collection does not contain an itemAssert.DoesNotContain(item, collection) (3.8+) or CollectionAssert.DoesNotContain
Object is a specific typeAssert.IsInstanceOfType<T>(value)
Code throws an exceptionAssert.ThrowsExactly<T> (3.8+) or Assert.ThrowsException<T> (earlier)

On MSTest 3.8+, prefer Assert class methods over StringAssert or CollectionAssert where both exist. Older versions should keep the compatible specialized classes. When several independent collection properties were requested, keep each semantic check explicit even if another assertion happens to imply it. For example, retain IsNotEmpty when the requested diagnostics distinguish empty/non-empty, then use HasCount and ContainsSingle for their separate cardinality guarantees.

Show full SKILL.md (618 more words)Show less
Equality, null, and reference checks
csharp
Assert.AreEqual(expected, actual);      // Value equality
Assert.AreSame(expected, actual);       // Reference equality -- same object instance
Assert.IsNull(value);
Assert.IsNotNull(value);
Exception testing
csharp
// MSTest 3.8+
var ex = Assert.ThrowsExactly<ArgumentNullException>(() => service.Process(null));
Assert.AreEqual("input", ex.ParamName);

// Async
var ex = await Assert.ThrowsExactlyAsync<InvalidOperationException>(
    async () => await service.ProcessAsync(null));
  • Assert.Throws<T> matches T or any derived type
  • Assert.ThrowsExactly<T> matches only the exact type T

On MSTest 3.7 and earlier, use the compatible API:

csharp
var ex = Assert.ThrowsException<ArgumentNullException>(
    () => service.Process(null));
Collection assertions
csharp
// MSTest 3.8+
Assert.Contains(expectedItem, collection);
Assert.DoesNotContain(unexpectedItem, collection);
var single = Assert.ContainsSingle(collection);  // Returns the single element
Assert.HasCount(3, collection);
Assert.IsEmpty(collection);
Assert.IsNotEmpty(collection);

On earlier versions use CollectionAssert.Contains, CollectionAssert.DoesNotContain, and Assert.AreEqual(expectedCount, collection.Count).

Replace generic Assert.IsTrue with specialized assertions -- they give better failure messages:

Instead ofUse
Assert.IsTrue(list.Count > 0)Assert.IsNotEmpty(list)
Assert.IsTrue(list.Count == 0)Assert.IsEmpty(list)
Assert.IsTrue(list.Count() == 3)Assert.HasCount(3, list)
Assert.IsTrue(x != null)Assert.IsNotNull(x)
Assert.IsTrue(x == null)Assert.IsNull(x)
Assert.AreEqual(a, b) for same instanceAssert.AreSame(a, b) -- reference identity
Assert.IsTrue(!list.Contains(item))Assert.DoesNotContain(item, list)
list.Single(predicate) + Assert.IsNotNullAssert.ContainsSingle(list)
Assert.IsTrue(list.Contains(item))Assert.Contains(item, list)
String assertions
csharp
// MSTest 3.10+
Assert.Contains("expected", actualString);
Assert.StartsWith("prefix", actualString);
Assert.EndsWith("suffix", actualString);
Assert.MatchesRegex(@"\d{3}-\d{4}", phoneNumber);

On earlier versions use StringAssert.Contains, StringAssert.StartsWith, StringAssert.EndsWith, and StringAssert.Matches.

Type assertions

MSTest 3.x is not one API level. Pick the form supported by the installed minor version:

csharp
// MSTest 3.0-3.3
Assert.IsInstanceOfType(result, typeof(MyHandler));
var typed = (MyHandler)result; // Safe because the assertion stops a mismatch.
csharp
// MSTest 3.4-3.11 -- out parameter
Assert.IsInstanceOfType<MyHandler>(result, out var typed);
typed.Handle();
csharp
// MSTest 4.x -- returns the proven value directly
var typed = Assert.IsInstanceOfType<MyHandler>(result);
Comparison assertions
csharp
Assert.IsGreaterThan(lowerBound, actual);
Assert.IsLessThan(upperBound, actual);
Assert.IsInRange(low, high, actual);
Step 4: Use data-driven tests for multiple inputs
DataRow for inline values
csharp
[TestMethod]
[DataRow(1, 2, 3)]
[DataRow(0, 0, 0, DisplayName = "Zeros")]
[DataRow(-1, 1, 0)]
public void Add_ReturnsExpectedSum(int a, int b, int expected)
{
    Assert.AreEqual(expected, Calculator.Add(a, b));
}
DynamicData with ValueTuples (preferred for complex data)

On MSTest 3.7+, prefer ValueTuple return types over IEnumerable<object[]> for type safety. Keep IEnumerable<object[]> on older versions.

Tuple element names document which position maps to which test parameter, and tuple element types catch incompatible values at compile time. They do not make DynamicData position-independent, and swapping two same-typed elements can still compile. Do not claim otherwise. When rows need custom display names or metadata rather than only typed positional data, use TestDataRow<T> on MSTest 3.8+.

csharp
[TestMethod]
[DynamicData(nameof(DiscountTestData))]
public void ApplyDiscount_ReturnsExpectedPrice(decimal price, int percent, decimal expected)
{
    var result = PriceCalculator.ApplyDiscount(price, percent);
    Assert.AreEqual(expected, result);
}

// ValueTuple -- preferred (MSTest 3.7+)
public static IEnumerable<(decimal price, int percent, decimal expected)> DiscountTestData =>
[
    (100m, 10, 90m),
    (200m, 25, 150m),
    (50m, 0, 50m),
];

When you need metadata per test case on MSTest 3.8+, use TestDataRow<T>:

csharp
public static IEnumerable<TestDataRow<(decimal price, int percent, decimal expected)>> DiscountTestDataWithMetadata =>
[
    new((100m, 10, 90m)) { DisplayName = "10% discount" },
    new((200m, 25, 150m)) { DisplayName = "25% discount" },
    new((50m, 0, 50m)) { DisplayName = "No discount" },
];
Step 5: Handle test lifecycle correctly
  • Prefer constructor initialization when the existing suite supports it; retain a shared FixtureBase<TSut> or established [TestInitialize] lifecycle rather than rewriting the fixture architecture incidentally.
  • Use [TestInitialize] only for async initialization, combined with the constructor for sync parts
  • Use [TestCleanup] for cleanup that must run even on failure
  • Inject TestContext via constructor only on MSTest 3.6+; otherwise use the instance property.
csharp
[TestClass]
public sealed class RepositoryTests
{
    private readonly TestContext _testContext;
    private readonly FakeDatabase _db;  // readonly -- guaranteed by constructor

    public RepositoryTests(TestContext testContext)
    {
        _testContext = testContext;
        _db = new FakeDatabase();  // sync init in ctor
    }

    [TestInitialize]
    public async Task InitAsync()
    {
        // Use TestInitialize ONLY for async setup
        await _db.SeedAsync();
    }

    [TestCleanup]
    public void Cleanup() => _db.Reset();
}
Execution order
  1. [AssemblyInitialize] -- once per assembly
  2. [ClassInitialize] -- once per class
  3. Per test:
    • With TestContext property injection: Constructor -> set TestContext property -> [TestInitialize]
    • With constructor injection of TestContext: Constructor (receives TestContext) -> [TestInitialize]
  4. Test method
  5. [TestCleanup] -> DisposeAsync -> Dispose -- per test
  6. [ClassCleanup] -- once per class
  7. [AssemblyCleanup] -- once per assembly
Step 6: Apply cancellation and timeout patterns

Use TestContext.CancellationToken with [Timeout(milliseconds, CooperativeCancellation = true)] when the installed MSTest version exposes the token directly (3.11+). On MSTest 3.6.4-3.10, use TestContext.CancellationTokenSource.Token with cooperative cancellation instead. A plain [Timeout] does not establish that the framework token will stop in-flight work. On older versions, use a test-owned CancellationTokenSource where cancellation itself is under test.

csharp
// MSTest 3.11+
[TestMethod]
[Timeout(5000, CooperativeCancellation = true)]
public async Task FetchData_ReturnsWithinTimeout()
{
    var result = await _client.GetDataAsync(_testContext.CancellationToken);
    Assert.IsNotNull(result);
}
Step 7: Use advanced features where appropriate

For retry, conditional execution, or parallelization requests, read Advanced MSTest patterns. Apply its version gates and keep the real tested operation, assertion, and cleanup.

Step 8: Fix MSTest analyzer diagnostics (MSTESTxxxx)

For an MSTESTxxxx request, read Advanced MSTest patterns, apply the version-compatible fix for that rule, and rebuild to confirm the diagnostic is gone. Prefer fixing the code over suppressing the rule.

Step 9: Verify file-backed corrections

When the user asked for repository edits and did not prohibit execution, run the narrowest affected dotnet test command after editing. A successful process with no discovered-test count is not verification. Require the intended test cases to be discovered and pass.

If compilation exposes a directly coupled source issue that prevents the corrected existing suite from running (for example, a missing namespace import in the supplied production file), make only that minimum fix and rerun. Do not upgrade packages or broaden the modernization. Report the actual test count and the fixes made; never present unrun or output-free tests as passing. In the final handoff, map every requested modernization to the exact corrected construct and cite the passing test command. Do not rely on a generic "modernized" summary when expected/actual order, exact type checks, data discovery, or class shape were explicit requirements.

© dotnet, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file (references) in plugins/dotnet-test/skills/writing-mstest-tests of dotnet/skills.

  • SKILL.md
  • references/advanced-mstest-patterns.md

Open the folder on GitHubat commit 3d38ac3

Used in 1 other repository

We found 2 copies of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in dotnet/skills, which our catalogue first saw on October 7, 2026.

Compare with similar skills

Writing Mstest Tests next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Writing Mstest Tests compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Writing Mstest Tests this skilldotnet/skills5.6k1 repos~5kAutomated safety check: PassMIT
ScottPlot Test RunnerScottPlot/ScottPlot6.8k—~308Automated safety check: PassMIT
Raven Test Triagemarinasundstrom/raven108—~1.4kAutomated safety check: PassMIT
Run Testsrunceel/ReactiveProperty944—~3.6kAutomated safety check: PassMIT
MAUI UI Test Writerdotnet/maui23k—~3kAutomated safety check: PassMIT
MAUI XAML Unit Test Writerdotnet/maui23k—~742Automated safety check: PassMIT

Similar skills

  • ScottPlot Test Runner

    ScottPlot/ScottPlot

    Run or add ScottPlot 5 tests. Use for unit-test and cookbook-test work; unless explicitly asked otherwise, restrict manual test execution to the Unit Tests…

    6.8k GitHub stars~308 tokensUpdated 1 mo ago
    Testing & QAAuto-check passed
  • Raven Test Triage

    marinasundstrom/raven

    Testing and stabilization workflow for the Raven compiler test suite.

    108 GitHub stars~1.4k tokensUpdated today
    Testing & QAAuto-check passed
  • Run Tests

    runceel/ReactiveProperty

    Runs .NET tests with dotnet test. An agent skill from runceel/ReactiveProperty.

    944 GitHub stars~3.6k tokensUpdated 1 mo ago
    Testing & QAAuto-check passed
  • Official

    Writes UI tests that reproduce a GitHub issue in .NET MAUI and keeps iterating until the tests actually fail, proving they catch the bug.

    23k GitHub stars~3k tokensUpdated today
    Testing & QAAuto-check passed
  • Official

    Writes a paired .xaml and .xaml.cs unit test for a .NET MAUI issue that is about XAML behavior itself, such as parsing, XamlC output or generated code.

    23k GitHub stars~742 tokensUpdated today
    Testing & QAAuto-check passed
  • Test Fixer

    mitchdenny/hex1b

    Agent for diagnosing and fixing flaky terminal UI tests in the Hex1b test suite.

    178 GitHub stars~6.5k tokensUpdated today
    Testing & QAAuto-check passed

More from dotnet/skills

All 93 skills in this repo
  • Official

    Resolves .NET runtime frames in Apple .ips crash logs to function names, source files and line numbers using dSYM symbols, atos and the Microsoft symbol server.

    5.6k GitHub starsUsed in 1 repo~2.4k tokens
    Auto-check passed
  • Official

    Resolves native crash frames from .NET Android tombstones to function names, source files and line numbers using BuildIds, Microsoft's symbol server and llvm-symbolizer.

    5.6k GitHub starsUsed in 1 repo~2.1k tokens
    Auto-check passed
  • Official

    Scans C# and .NET code for about 50 performance anti-patterns and reports prioritized findings with concrete fixes, at a scan depth you choose.

    5.6k GitHub starsUsed in 3 repos~3.1k tokens
    Auto-check passed
  • Official

    Statically pairs source files with test files to list code that no test references, using Roslyn for C# or tree-sitter for many languages, with no build.

    5.6k GitHub starsUsed in 1 repo~3.3k tokens
    Auto-check passed
  • Microbenchmarking

    dotnet/skills

    Official

    Activate this skill when BenchmarkDotNet (BDN) is involved in the task — creating, running, configuring, or reviewing BDN benchmarks.

    5.6k GitHub starsUsed in 3 repos~3.3k tokens
    Auto-check passed
  • Official

    Makes .NET projects compatible with Native AOT and trimming by resolving IL trim and AOT analyzer warnings through annotations rather than suppressions.

    5.6k GitHub starsUsed in 2 repos~4.2k tokens
    Auto-check passed

Works with

Categories

Questions about Writing Mstest Tests

What does Writing Mstest Tests do?

ALWAYS USE when asked to fix, rewrite, update, improve, modernize, show corrected code for, or explain existing MSTest tests or MSTest-specific configuration. Writing Mstest Tests is an agent skill from dotnet/skills, published by the product's own GitHub organization. ALWAYS USE when asked to fix, rewrite, update, improve, modernize, show corrected code for, or explain existing MSTest tests or MSTest-specific configuration.

When should I use Writing Mstest Tests?

Writing Mstest Tests fits situations like: show corrected code for; explain existing MSTest tests; MSTest-specific configuration; review when corrected code.

How do I install Writing Mstest Tests in Claude Code?

Run `npx skills add dotnet/skills --skill writing-mstest-tests -a claude-code`. Or copy the skill folder (plugins/dotnet-test/skills/writing-mstest-tests in dotnet/skills) into .claude/skills/writing-mstest-tests in your project. Claude Code loads it when a task matches its description.

How do I install Writing Mstest Tests in Codex?

Run `npx skills add dotnet/skills --skill writing-mstest-tests -a codex`. Or copy the skill folder (plugins/dotnet-test/skills/writing-mstest-tests in dotnet/skills) into .agents/skills/writing-mstest-tests in your project. Codex loads it when a task matches its description.

Can I use Writing Mstest Tests in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add dotnet/skills --skill writing-mstest-tests -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/writing-mstest-tests, .gemini/skills/writing-mstest-tests, .github/skills/writing-mstest-tests and .opencode/skills/writing-mstest-tests in your project.

What does Writing Mstest Tests need to run?

Going by SKILL.md and its folder, Writing Mstest Tests needs the command-line tools its instructions call (dotnet).

Does Writing Mstest Tests access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Writing Mstest Tests safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Writing Mstest Tests use?

Writing Mstest Tests is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Writing Mstest Tests use?

About 5k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 1.1k tokens, read only when the agent opens those files.

What are the alternatives to Writing Mstest Tests?

Skills that share tags, products or a category with Writing Mstest Tests: ScottPlot Test Runner (ScottPlot/ScottPlot, 6.8k stars), Raven Test Triage (marinasundstrom/raven, 108 stars), Run Tests (runceel/ReactiveProperty, 944 stars) and MAUI UI Test Writer (dotnet/maui, 23k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Writing Mstest Tests?

dotnet (a GitHub organization, an official publisher) maintains it in dotnet/skills, which has 5,585 GitHub stars. The repository holds 93 skills in this directory. The repository was last updated on October 9, 2026.

Source: dotnet/skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.