grade-tests
Grades a specified set of test methods individually and produces a concise table mapping each test (fully-qualified name) to a letter grade (A–F), a score band, and a one-line note — designed to be posted as a PR comment. Use when the caller wants per-test feedback on a curated list of methods (for example, the new or modified tests in a pull request), not a suite-wide audit. Polyglot: .NET, Python, TS/JS, Java, Go, Ruby, Rust, Swift, Kotlin, PowerShell, C++. Input is a list of test methods (or method bodies / file+line spans); output is a compact markdown table plus a short summary. DO NOT US
npx skills add dotnet/skills --skill grade-tests --agent claude-code
Same command for any agent — swap --agent for codex, cursor, copilot.
Weekly change comes from our own snapshots, not the repository page — it measures attention, not adoption.
What it does
Grades a specified set of test methods individually and produces a concise table mapping each test (fully-qualified name) to a letter grade (A–F), a score band, and a one-line note — designed to be posted as a PR comment. The skill does not discover tests on its own; the caller provides the test methods to grade.
How it works
- Validate input to ensure an explicit list of test methods or file paths with a grade instruction is provided. If ambiguous, respond with a request for explicit scope.
- Detect language and load language-specific extension via the
test-analysis-extensionsskill and the matching extension file (e.g., extensions/dotnet.md, extensions/python.md). - For each listed test, resolve the test body either from provided inline body or by reading the file and locating the fully-qualified method; if not found, mark as
N/A — method not found. - Score each test starting at A (90–100) and apply deductions based on observable issues in the test body, producing three sub-grades: Assertion strength, Structure & focus, and Anti-pattern hygiene, following the detailed guidance in the skill.
- Compute final sub-grades using the provided rules, derive an overall grade by converting sub-grades to numeric points (A=4, B=3, C=2, D=1, F=0) with the weighted formula: 0.45 × Assertion + 0.30 × Anti-pattern + 0.25 × Structure, then cap the overall grade to the worst sub-grade. If any sub-grade is F, the overall grade is F, etc.
- Build the note as a short sentence (≤ 120 characters) explaining the primary reason for the grade, with examples like those in the Step 4 description.
- Produce a report with two sections: Summary and Per-test table, formatted in Markdown. The table lists Test, Grade, Band, and Notes for each graded test.
When to use it
- When a PR automation workflow needs to post a comment grading the tests introduced or changed in a PR.
- When a reviewer has a specific list of tests and wants per-test verdicts instead of a full suite report.
- When a maintainer wants to triage which tests deserve follow-up improvements.
What it can touch
- Uses language-specific extensions loaded via
test-analysis-extensionsto determine assertion APIs and idioms for the target language.
Caveats
- The skill does not discover tests on its own; it requires explicit test method inputs or file lists with clear grading scope.
- Production code availability affects whether certain findings can be inferred; if production code is unavailable, mark related findings as "Unverified" in the summary.
- The skill is intended for per-test grading and should not be used for full-suite audits or test-writing tasks.
# Grade Tests Grade a curated list of test methods and produce a compact, PR-comment-friendly report: one row per test method with a letter grade, a score band, and a one-line note explaining the grade. The skill **does not discover tests on its own** — the caller (typically a PR automation workflow or a human reviewer holding a specific list) provides the test methods to grade. > **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., `extensions/dotnet.md`, > `extensions/python.md`, `extensions/typescript.md`, `extensions/go.md`). > You MUST read the relevant extension file before scoring assertions or > anti-patterns, because assertion APIs and idiomatic patterns differ > significantly across frameworks. ## Why a Per-Test Grade Suite-wide audits (`test-anti-patterns`, `assertion-quality`, `test-smell-detection`) produce excellent diagnostic reports, but they are hard to consume as a short PR comment. Reviewers of a PR mostly want to know: *for the tests this PR adds or changes, are they good?* This skill answers that question with a one-row
- Why a Per-Test Grade
- When to Use
- When Not to Use
- Inputs
- Step 0: Validate the input
- Workflow
- Step 1: Detect language and load extension
- Step 2: Resolve the test bodies
- Step 3: Score each test
- Step 4: Build the note
- Step 5: Report
- Validation
- Common Pitfalls
What does the grade-tests skill do?
Grades a specified set of test methods individually and produces a concise table mapping each test (fully-qualified name) to a letter grade (A–F), a score band, and a one-line note — designed to be posted as a PR comment. Use when the caller wants per-test feedback on a curated list of methods (for example, the new or modified tests in a pull request), not a suite-wide audit. Polyglot: .NET, Python, TS/JS, Java, Go, Ruby, Rust, Swift, Kotlin, PowerShell, C++. Input is a list of test methods (or method bodies / file+line spans); output is a compact markdown table plus a short summary. DO NOT US
How do I install it?
Run `npx skills add dotnet/skills --skill grade-tests --agent claude-code` — it drops the skill into your project so the agent can pick it up. Swap the --agent value for codex, cursor or copilot if you use one of those.
Where does this skill come from?
From dotnet/skills, a repository with 4,927 stars. We read it straight from the repository tree rather than a submitted listing, so what you see here is what is actually published.
Is a popular skill a good skill?
Not necessarily. Stars measure attention, not adoption — a repository can trend for a week and be abandoned. That is why we show the weekly change from our own snapshots next to the total, instead of a single flattering number.
