Official agent skill

Assertion Quality

by dotnet in dotnet/skills

Analyze assertion quality, depth, variety, and false confidence in existing tests.

OfficialMITAuto-check passedTesting & QA

Install Assertion Quality

skills CLI
$ npx skills add dotnet/skills --skill assertion-quality -a claude-code

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

GitHub CLI
$ gh skill install dotnet/skills assertion-quality --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/assertion-quality .claude/skills/assertion-quality && 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
assertion-quality
GitHub stars
5.6k
Used in
1 other repo
Token cost
~4.8k tokens
SKILL.md length
2,186 words
Files
1
Skills in repo
91
Repo updated
First seen
Licence
MIT

At a glance

Analyze assertion quality, depth, variety, and false confidence in existing tests.

  • Works in 6 steps: Detect language and load extension → Gather the test code → Classify every assertion → …
  • Asked about weak
  • SKILL.md covers Why Assertion Diversity Matters, When to Use, When Not to Use and Inputs, plus 3 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Assertion Quality is an agent skill from dotnet/skills, published by the product's own GitHub organization. Analyze assertion quality, depth, variety, and false confidence in existing tests. ALWAYS USE when asked about weak, shallow, trivial, always-true, self-referential, assertion-free, presence/truthiness-only, or insufficiently diverse assertions, including MSTest, Jest, pytest, and Go. DO NOT USE for direct fixes: writing-mstest-tests owns supplied MSTest assertions; code-testing-agent owns new cases. Use test-gap-analysis when asked whether tests would catch a production change, and test-anti-patterns for general…

Its SKILL.md is about 4.8k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Testing & QA, covering Unit testing. It works with Jest, pytest and .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

  • Asked about weak
  • Self-referential
  • Presence/truthiness-only
  • Insufficiently diverse assertions

Example prompts

  • “/assertion-quality”

Requirements

  • Python 3

Workflow steps

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

  1. Detect language and load extension
  2. Gather the test code
  3. Classify every assertion
  4. Compute metrics
  5. Apply calibration rules
  6. Report findings

What it can do on your machine

Read from SKILL.md and the folder at commit 8d670fa. 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

    No scripts in the folder and no shell commands in SKILL.md.

    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

Assertion Quality loads about 4.8k tokens when it runs. Until then it costs about 140 tokens; SKILL.md has 2,186 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~140
When it runs · the whole SKILL.md, loaded when a task matches
~4.8k

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 8d670fa, republished under its MIT licence (© dotnet). 2,186 words, ~4,823 tokens.

Download SKILL.mdSave it as .claude/skills/assertion-quality/SKILL.md (or your agent's skills folder).
name
assertion-quality
description
Analyze assertion quality, depth, variety, and false confidence in existing tests. ALWAYS USE when asked about weak, shallow, trivial, always-true, self-referential, assertion-free, presence/truthiness-only, or insufficiently diverse assertions, including MSTest, Jest, pytest, and Go. DO NOT USE for direct fixes: writing-mstest-tests owns supplied MSTest assertions; code-testing-agent owns new cases. Use test-gap-analysis when asked whether tests would catch a production change, and test-anti-patterns for general severity-ranked audits.
license
MIT

Assertion Diversity Analysis

Analyze test code in any supported language to measure how varied and meaningful the assertions are. Produce a metrics report that reveals whether tests verify different facets of correctness — not just "output equals X" but also structure, exceptions, state transitions, side effects, and invariants.

Language-specific guidance: Call the test-analysis-extensions skill to discover available extension files, then read the file matching the target codebase's language and framework (e.g., dotnet.md for .NET, python.md for pytest, typescript.md for Jest, go.md for the standard testing package). You MUST read the relevant extension file before classifying assertions, because assertion APIs differ significantly across frameworks.

Why Assertion Diversity Matters

Low assertion diversity signals shallow testing. Tests may pass while bugs hide in unasserted logic. Common symptoms:

ProblemSymptomConsequence
Trivial assertionsTest contains only Assert.IsNotNull(result) / assert result is not None / expect(x).toBeDefined()Test passes but doesn't verify correctness
Single-value obsessionAlways check one field or return valueBugs in unasserted logic slip through
No negative assertionsNever check what shouldn't happenRegressions sneak in through false positives
No state checksDon't verify object state changesMissed side-effects or lifecycle issues
No structural checksOnly assert top-level valueBugs in nested objects go unnoticed
Assertion-free testsTests that call but don't verifyCode coverage lies; false security

When to Use

  • User asks to evaluate assertion quality or depth
  • User asks "are my tests actually testing anything meaningful?"
  • User wants to know if test assertions are too shallow or trivial
  • User asks for assertion coverage metrics or diversity analysis
  • User suspects tests give false confidence despite passing
  • The code-testing-generator agent (or any test-generation workflow) calls this skill as a pre-completion self-review step on freshly generated tests, before declaring the run finished

When Not to Use

  • User wants to write new tests (use code-testing-agent for any language, or writing-mstest-tests for MSTest specifically)
  • User wants to detect anti-patterns beyond assertions (use test-anti-patterns)
  • User wants to fix or rewrite assertions (help them directly)
  • User asks about code coverage percentages (out of scope — this analyzes assertion quality, not line coverage)

Inputs

InputRequiredDescription
Test codeYesOne or more test files or a test project directory to analyze
Production codeNoThe code under test, to evaluate whether assertions cover the important behaviors

Workflow

Step 1: Detect language and load extension

Identify the target codebase's language and test framework. Call the test-analysis-extensions skill and read the matching extension file (e.g., extensions/dotnet.md for .NET, extensions/python.md for pytest, extensions/typescript.md for Jest/Vitest, extensions/go.md for Go). The extension file lists the framework-specific assertion APIs you will classify in Step 3.

Step 2: Gather the test code

Read all test files the user provides. If the user points to a directory or project, scan for all test files using the markers in the language extension file (e.g., [TestMethod] for MSTest, def test_* for pytest, it() / test() for Jest, func TestXxx for Go).

Step 3: Classify every assertion

For each test method, identify all assertions and classify them into these language-neutral categories:

CategoryWhat it verifiesExamples across languages
EqualityReturn value matches expectedAssert.AreEqual (MSTest), Assert.Equal (xUnit), assert x == y (pytest), expect(x).toBe(y) (Jest), assertEquals (JUnit), if got != want { t.Error... } / assert.Equal(t, want, got) (Go), x shouldBe y (Kotest), Should -Be (Pester), EXPECT_EQ (GoogleTest)
BooleanCondition holdsAssert.IsTrue, assert flag (Python), expect(x).toBeTruthy() (Jest), assertTrue (JUnit), assert.True(t, ok) (testify), x.shouldBeTrue() (Kotest), Should -BeTrue (Pester), EXPECT_TRUE
Null / None / NilPresence/absence of valueAssert.IsNull (.NET), assert x is None (pytest), expect(x).toBeNull() (Jest), assertNull (JUnit), assert.Nil(t, v) (testify), XCTAssertNil (XCTest), Should -BeNullOrEmpty (Pester)
Exception / ErrorError handling behaviorAssert.Throws<T>(), pytest.raises(E), expect(fn).toThrow(E), assertThrows<E>, assert.Error(t, err) / assert.ErrorIs, #[should_panic] (Rust), XCTAssertThrowsError, Should -Throw, EXPECT_THROW
Type checksRuntime type correctnessAssert.IsInstanceOfType, assert isinstance(x, T), expect(x).toBeInstanceOf(T), assertInstanceOf, assert.IsType(t, T{}, v), assert!(matches!(value, Pattern)) (Rust), Should -BeOfType
StringText content and formatStringAssert.Contains, assert sub in s, expect(s).toMatch(/x/), assertTrue(s.contains(...)), assert.Contains(t, s, sub), s shouldContain sub, Should -Match, EXPECT_THAT(s, HasSubstr(...))
CollectionCollection contents and structureCollectionAssert.Contains, assert item in collection, expect(arr).toContain(x), assertIterableEquals, assert.Contains(t, slice, item), col shouldContainExactly listOf(...), Should -Contain, EXPECT_THAT(c, ElementsAre(...))
ComparisonOrdering and magnitudeAssert.IsTrue(x > y), Is.GreaterThan, assert x > y, expect(x).toBeGreaterThan(y), assertTrue(x > y), assert.Greater(t, x, y) (testify)
ApproximateFloating-point or tolerance-basedAssert.AreEqual(expected, actual, delta), pytest.approx(y), expect(x).toBeCloseTo(y), assertEquals(x, y, delta), assert.InDelta(t, x, y, delta), EXPECT_NEAR, EXPECT_DOUBLE_EQ
NegativeWhat should NOT happenAssert.AreNotEqual, assert x != y, expect(x).not.toBe(y), assertNotEquals, assert.NotEqual(t, x, y), refute (Minitest / Ruby), Should -Not -Be
State / Side-effectState transitions and side effectsAssertions on object properties after mutation; mock-call verifications: mock.Verify(...) (Moq), mock_method.assert_called_with(...) (Python unittest.mock), expect(mock).toHaveBeenCalledWith(...) (Jest), verify(mock).method(...) (Mockito), Should -Invoke (Pester), expect { code }.to change(obj, :attr) (RSpec)
Structural / DeepDeep object correctnessAssert.AreEqual with rich-equality types, assertThat(obj).usingRecursiveComparison() (AssertJ), .toEqual({...}) (Jest deep equality), cmp.Diff (Go go-cmp), snapshot tests (.toMatchSnapshot(), syrupy, SnapshotTesting), assertThat(col).extracting(...) (AssertJ chains)

A single assertion can belong to multiple categories (e.g., Assert.AreNotEqual is both Equality and Negative; expect(mock).toHaveBeenCalledWith(...) is both State/Side-effect and a specific-call assertion).

Read the loaded language extension file for the exact framework-specific list of assertion APIs.

Step 4: Compute metrics

Calculate these metrics for the test suite:

Per-test metrics
  • Assertion count: Number of assertions in each test method
  • Assertion categories: Which categories each test uses
Suite-wide metrics
  • Average assertions per test: Total assertions / total test methods
  • Assertion type spread: Number of distinct assertion categories used across the suite (out of 12)
  • Tests with zero assertions: Count and percentage of test methods with no assertions at all
  • Tests with only trivial assertions: Count and percentage of tests where every assertion is only a null check or Assert.IsTrue(true) — trivial means no meaningful value verification
  • Tests with self-referential assertions: Count and percentage of tests whose assertions compare an input to a round-tripped or identity-transformed version of itself (e.g., Assert.AreEqual(input, Parse(input.ToString()))) or assert a field against itself (Assert.AreEqual(dto.Name, dto.Name)). These are tautological — they verify the plumbing, not the behavior.
  • Tests with negative assertions: Count and percentage (target: at least 10% of tests should verify what should NOT happen)
  • Tests with exception assertions: Count and percentage
  • Tests with state/side-effect assertions: Count and percentage
  • Tests with structural/deep assertions: Count and percentage
  • Single-category tests: Count and percentage of tests that use only one assertion category
Step 5: Apply calibration rules

Before reporting, calibrate findings:

  • Evaluate the matcher predicate before describing its weakness. For every weak assertion, name one realistic defective value or behavior that would still satisfy that exact predicate. For every assertion credited as meaningful, name the behavior it pins. If you cannot give such a counterexample from the test and available production contract, do not speculate that the assertion is weak.
  • Trivial means truly trivial. A null/None/nil check alone is trivial (Assert.IsNotNull(result), assert result is not None, expect(x).toBeDefined()). But a null check followed by a meaningful value assertion is not trivial — the null check is a guard before the real assertion. Only flag a test as "trivial" if it has no meaningful value assertions.
  • Use exact Jest semantics. toBeDefined() rejects only undefined; null does satisfy it, but mention that only when null is a realistic contract-breaking result. toMatchObject(expected) verifies the expected subset structurally; it neither proves object identity nor full-object equality. Never claim that it does.
  • Boolean assertions checking meaningful conditions are not trivial. Assert.IsTrue(result.IsValid) / assert result.is_valid / expect(result.isValid).toBe(true) check a specific property — these are Boolean assertions, not trivial ones. Always-true assertions (Assert.IsTrue(true), assert True, expect(true).toBe(true)) are trivial.
  • Exact construction and mapping checks are meaningful. A test that constructs an object and pins each requested property to an independent expected literal can catch swapped, dropped, or incorrectly assigned values. Do not downgrade it merely because the implementation is a constructor, record, property mapping, or in-memory store.
  • Consider the test's intent. A test for a void method that verifies state change on a dependency is legitimate even if it only uses one Boolean assertion.
  • Exception tests are inherently low-assertion-count. Assert.ThrowsException<T>(() => ...) / with pytest.raises(E): ... / expect(fn).toThrow(E) / #[should_panic] may be the only assertion — that's fine for exception-focused tests. Don't penalize them for low assertion count.
  • Mock-call verifications and bare assertion forms count. Treat verify(mock).method(...) (Mockito), expect(mock).toHaveBeenCalledWith(...) (Jest), Should -Invoke (Pester), bare assert (pytest), if got != want { t.Errorf(...) } (Go) all as real assertions of the appropriate category. Do not treat them as missing-framework-API smells.
  • Snapshot assertions (.toMatchSnapshot(), syrupy, SnapshotTesting) count as Structural/Deep assertions. Flag stale or never-updated snapshots separately.
  • Property-based tests (@given Hypothesis, proptest!, forAll Kotest) generate assertions implicitly through generated cases — count the inner assertion logic, not the outer scaffold.
  • Don't conflate diversity with volume. A test with 20 equality assertions has high volume but low diversity. A test with one equality, one null check, and one exception assertion has low volume but good diversity.
  • Self-referential assertions are not meaningful equality checks. Asserting that an output equals an input round-trip looks like a real equality assertion but is tautological when the operation under test is expected to be identity. Flag these separately from normal equality assertions. If the test's purpose is to verify a round-trip (serialize/deserialize, encode/decode), the assertion is valid — but it should be accompanied by assertions on non-trivial inputs that exercise the transformation.
  • Match recommendations to the named behavior. Formatting tests should pin the exact formatted representation, validation tests need rejected inputs, and round-trip tests need inputs that exercise escaping, null/empty handling, or another transformation boundary. For each assertion-free create/update/delete operation, recommend its specific returned value or observable post-condition rather than one generic "check state" remedy.
  • If assertions are well-diversified, say so. A report concluding the suite has good diversity is perfectly valid.
Show full SKILL.md (678 more words)Show less
Step 6: Report findings

Scale the report depth to the size and complexity of the suite. The structure below is the full template for a substantial suite (roughly 15+ tests or a multi-file project). For a small or simple input (a single file with only a handful of tests), do not emit every section — a padded multi-section dashboard on a trivial input reads as noise and buries the answer. Instead, answer the user's question directly and concisely: which tests are assertion-free or trivial-only, the overall assertion-quality verdict, and concrete recommendations (still distinguishing intentional smoke tests from tests masquerading as real verification). Use only the sections that carry real signal for the input at hand; a short metric summary plus the assertion-free list and recommendations is often enough. Never omit the rubric-relevant substance (assertion-free/trivial identification, the quality verdict, and concrete recommendations) — only trim structural overhead that adds no information.

For a five-to-eight-test file, default to one verdict plus one compact per-test table. Omit category-spread dashboards and hypothetical failure modes unless the caller asks for metrics. State only counterexamples supported by the assertion predicate and available production behavior.

Present the analysis in this structure:

  1. Summary Dashboard — A quick-reference table of key metrics:

    | Metric                        | Value  | Assessment |
    |-------------------------------|--------|------------|
    | Total tests                   | 25     | —          |
    | Average assertions per test   | 2.4    | Moderate   |
    | Assertion type spread         | 5/12   | Low        |
    | Tests with zero assertions    | 3 (12%)| Concerning |
    | Tests with only trivial asserts | 4 (16%)| Acceptable |
    | Tests with negative assertions | 2 (8%) | Below target |
    | Single-category tests         | 15 (60%)| High       |
  2. Category Breakdown — For each assertion category, show:

    • How many tests use it
    • Representative examples from the code
    • Whether it's overused or underused relative to the code under test
  3. Gap Analysis — Based on the production code (if available), identify:

    • Behaviors that are tested but only with equality checks
    • Error paths with no exception assertions
    • State-changing methods with no state verification
    • Collections returned but never checked for contents
  4. Recommendations — Prioritized list of improvements:

    • Which tests would benefit most from additional assertion types
    • Which assertion categories are missing and why they matter
    • Concrete examples of assertions that could be added
  5. Assertion-free tests — If any exist, list each one with its method name and what it appears to be testing, so the user can decide whether to add assertions or mark them as intentional smoke tests.

Validation

  • Every assertion in the test suite was classified into at least one category
  • Metrics are computed correctly (counts add up)
  • Trivial-assertion tests are correctly identified (not over-flagged)
  • Exception tests are not penalized for low assertion count
  • Boolean assertions on meaningful properties are not classified as trivial
  • Every weak-assertion claim includes a realistic counterexample that the exact matcher would accept
  • Jest matcher semantics are precise (toBeDefined versus undefined; toMatchObject subset matching versus identity/full equality)
  • Recommendations are concrete (name specific test methods and suggest specific assertion types)
  • If the suite has good diversity, the report acknowledges this

Common Pitfalls

PitfallSolution
Penalizing exception tests for low assertion countException assertions are complete on their own — skip count warnings for these
Flagging null/None/nil checks before value checks as trivialOnly flag tests where the null/None/nil check is the ONLY assertion
Counting any Boolean assertion as trivialOnly always-true assertions (Assert.IsTrue(true), assert True, expect(true).toBe(true)) are trivial
Ignoring framework differencesEach framework has distinct assertion APIs — always read the matching language extension first. MSTest's Assert.AreEqual, xUnit's Assert.Equal, NUnit's Is.EqualTo, pytest's bare assert ==, Jest's expect().toBe(), Go's if … { t.Error… } all map to the Equality category
Treating bare assertion forms as missing-frameworkBare assert (pytest), if got != want { t.Error... } (Go), and assert!() (Rust) are canonical — count them in the right category
Treating mock-call verifications as assertion-freeverify(mock).method(...), expect(mock).toHaveBeenCalledWith(...), Should -Invoke are State/Side-effect assertions
Recommending diversity for diversity's sakeOnly suggest adding assertion types that would catch real bugs in the code under test
Missing implicit assertionsException assertions are both Exception and Negative; snapshot/property-based tests are real assertions with implicit structure
Async tests with unawaited assertionsTUnit, Jest with .resolves/.rejects, pytest-asyncio, Swift Testing, and Kotest all silently pass tests where assertions are not awaited — treat as assertion-free even when assertion calls are present

© 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

Just SKILL.md in plugins/dotnet-test/skills/assertion-quality of dotnet/skills.

Open the folder on GitHubat commit 8d670fa

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

Assertion Quality 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.

Assertion Quality compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Assertion Quality this skilldotnet/skills5.6k1 repos~4.8kAutomated safety check: PassMIT
Assertion Qualitymicrosoft/testfx1k—~4.1kAutomated safety check: PassMIT
Code Testing Agentmicrosoft/testfx1k—~2.7kAutomated safety check: PassMIT
Test Gap Analysismicrosoft/testfx1k—~4kAutomated safety check: PassMIT
Test Taggingmicrosoft/testfx1k—~4.3kAutomated safety check: PassMIT
Test Anti Patternsmicrosoft/testfx1k—~4.9kAutomated safety check: PassMIT

Similar skills

  • Assertion Quality

    microsoft/testfx

    Official

    Analyzes the variety and depth of assertions across test suites in any language.

    1k GitHub stars~4.1k tokensUpdated today
    Testing & QAAuto-check passed
  • Code Testing Agent

    microsoft/testfx

    Official

    Generates and writes new unit tests for any programming language — scaffolds .NET test projects, pytest suites, Vitest/Jest suites, Go test files, and JUnit suites, and configures coverage tooling…

    1k GitHub stars~2.7k tokensUpdated today
    Testing & QAAuto-check passed
  • Test Gap Analysis

    microsoft/testfx

    Official

    Performs pseudo-mutation analysis on production code in any language to find gaps in existing test suites.

    1k GitHub stars~4k tokensUpdated today
    Testing & QAAuto-check passed
  • Test Tagging

    microsoft/testfx

    Official

    Analyzes test suites in any language and tags each test with a standardized set of traits (positive, negative, critical-path, boundary, smoke, regression, integration, performance, security).

    1k GitHub stars~4.3k tokensUpdated today
    Testing & QAAuto-check passed
  • Test Anti Patterns

    microsoft/testfx

    Official

    Audits existing test code in any language for anti-patterns and quality issues — produces a severity-ranked report (Critical / Warning / Info) with concrete code-level fixes.

    1k GitHub stars~4.9k tokensUpdated today
    Testing & QAAuto-check passed
  • Test Guard

    amElnagdy/guard-skills

    Reviews newly written or edited tests against nine rules that cut test bloat, such as mock-heavy checks and near-duplicate cases, before they are committed.

    1.3k GitHub starsUsed in 2 repos~2.1k tokens
    Testing & QAAuto-check passed

More from dotnet/skills

All 91 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 Assertion Quality

What does Assertion Quality do?

Analyze assertion quality, depth, variety, and false confidence in existing tests. Assertion Quality is an agent skill from dotnet/skills, published by the product's own GitHub organization. Analyze assertion quality, depth, variety, and false confidence in existing tests.

When should I use Assertion Quality?

Assertion Quality fits situations like: asked about weak; self-referential; presence/truthiness-only; insufficiently diverse assertions.

How do I install Assertion Quality in Claude Code?

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

How do I install Assertion Quality in Codex?

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

Can I use Assertion Quality 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 assertion-quality -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/assertion-quality, .gemini/skills/assertion-quality, .github/skills/assertion-quality and .opencode/skills/assertion-quality in your project.

What does Assertion Quality need to run?

SKILL.md names no scripts, command-line tools or credentials: Assertion Quality is instructions for the agent only. Our summary lists: Python 3.

Does Assertion Quality 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 Assertion Quality 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 Assertion Quality use?

Assertion Quality 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 Assertion Quality use?

About 4.8k tokens (SKILL.md is roughly 19k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Assertion Quality?

Skills that share tags, products or a category with Assertion Quality: Assertion Quality (microsoft/testfx, 1k stars), Code Testing Agent (microsoft/testfx, 1k stars), Test Gap Analysis (microsoft/testfx, 1k stars) and Test Tagging (microsoft/testfx, 1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Assertion Quality?

dotnet (a GitHub organization, an official publisher) maintains it in dotnet/skills, which has 5,568 GitHub stars. The repository holds 91 skills in this directory. The repository was last updated on October 7, 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.