Agent skill

Test Reviewer

by axelixlabs in axelixlabs/axelix

Reviews test code in GitHub pull requests for isolation, public-API contract coverage, AAA structure, and correct exception assertions.

LGPL-3.0Auto-check passedMobile

Install Test Reviewer

skills CLI
$ npx skills add axelixlabs/axelix --skill test-reviewer -a claude-code

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

GitHub CLI
$ gh skill install axelixlabs/axelix test-reviewer --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/axelixlabs/axelix.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agent_skills/test-reviewer .claude/skills/test-reviewer && 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
test-reviewer
GitHub stars
148
Token cost
~3.2k tokens
SKILL.md length
1,332 words
Files
1
Skills in repo
9
Repo updated
First seen
Licence
LGPL-3.0

At a glance

Reviews test code in GitHub pull requests for isolation, public-API contract coverage, AAA structure, and correct exception assertions.

  • Works in 5 steps: Test isolation (merge-blocking) → Test the public API only → AAA structure — given, when, then → …
  • Reviewing a PR that adds
  • SKILL.md covers When to apply, Review workflow, Standards and Severity, plus 5 more sections
  • Calls git

What it does

Test Reviewer is an agent skill from axelixlabs/axelix. Reviews test code in GitHub pull requests for isolation, public-API contract coverage, AAA structure, and correct exception assertions. Use whenever reviewing a PR that adds, modifies, or deletes tests (Java, Kotlin, TypeScript, JavaScript), when the user asks to review tests or test quality, when evaluating whether test changes are merge-ready, or when commenting on PR test coverage — even if the user only says "review this PR" and the diff includes test files.

Its SKILL.md is about 3.2k 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 Mobile, covering Android development, Test coverage and Pull requests. It works with Java, Kotlin, GitHub and JavaScript. The repository describes itself as: The source code of Axelix - a Delta Force for your Spring Boot ecosystem. The licence is LGPL-3.0.

When your agent uses it

  • Reviewing a PR that adds
  • Deletes tests (Java
  • The user asks to review tests
  • Evaluating whether test changes are merge-ready

Example prompts

  • “review this PR”
  • “Use the test-reviewer skill to review test code in GitHub pull requests for isolation, public-API contract coverage, AAA structure, and correct…”
  • “/test-reviewer”

Workflow steps

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

  1. Test isolation (merge-blocking)
  2. Test the public API only
  3. AAA structure — given, when, then
  4. Positive and negative coverage
  5. Exception type only — not message text

What it can do on your machine

Read from SKILL.md and the folder at commit 1372f71. 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:

    • git

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

  • Network

    No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.

    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

Test Reviewer loads about 3.2k tokens when it runs. Until then it costs about 120 tokens; SKILL.md has 1,332 words of instructions outside code blocks.

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

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 axelixlabs/axelix at commit 1372f71, republished under its LGPL-3.0 licence (© axelixlabs). 1,332 words, ~3,210 tokens.

Download SKILL.mdSave it as .claude/skills/test-reviewer/SKILL.md (or your agent's skills folder).
name
test-reviewer
description
Reviews test code in GitHub pull requests for isolation, public-API contract coverage, AAA structure, and correct exception assertions. Use whenever reviewing a PR that adds, modifies, or deletes tests (Java, Kotlin, TypeScript, JavaScript), when the user asks to review tests or test quality, when evaluating whether test changes are merge-ready, or when commenting on PR test coverage — even if the user only says "review this PR" and the diff includes test files.

Test Reviewer

Guide for AI agents reviewing test changes in GitHub pull requests for the Axelix monorepo (master/, sbs/, common/, front-end/).

Apply this skill whenever a PR creates, modifies, or deletes test files — including when test changes are a small part of a larger PR.

When to apply

  • PR diff touches *Test.java, *Test.kt, *.test.ts, *.test.tsx, *.spec.ts, Cypress specs, or similar.
  • User asks to review tests, test quality, or whether tests follow project standards.
  • User asks whether a PR is merge-ready and tests are in scope.

If the PR has no test changes, do not apply this skill unless the user explicitly asks you to evaluate missing test coverage for new production code.

Review workflow

  1. Identify scope — List added/changed test files and the production code they claim to cover (git diff / PR files API).
  2. Find the contract — For each tested unit, locate the public API:
    • Java/Kotlin: public methods on interfaces or classes; prefer interface Javadoc as the contract source.
    • TypeScript/JavaScript: exported functions, classes, hooks, or components from the module under test.
  3. Map contract → cases — From Javadoc/TSDoc and declared behavior, list required positive and negative test cases before reading assertions.
  4. Review each test method against the five standards below.
  5. Report using the output format at the end. Block merge on any 🔴 finding.
  6. If blocked — add the blocked-by-ai-reviewer label and post one brief PR comment outlining why (see Blocking a PR).

Standards

1. Test isolation (merge-blocking)

Tests must be isolated. Test A must not in any way possible depend on the data/outcome of test B. Every test must fully clean up after itself the changes it potentially made:

  • to the database
  • to the shared state in the context and so on

If the test does not clean that up — that is a bug and it must be addressed. We cannot merge such PR.

Look for:

  • Shared mutable static fields, singletons, or Spring test context pollution without reset.
  • Database rows, files, or caches left behind (missing @Transactional rollback, @DirtiesContext used as a crutch, no afterEach/@AfterEach cleanup).
  • Order-dependent tests (@Order, implicit reliance on execution sequence).
  • Reuse of IDs or tokens created by another test without setup in the same test.

Acceptable patterns: @BeforeEach / @AfterEach (or JUnit 5 equivalents) that reset state; transactional tests that roll back; fresh mocks per test; dedicated test containers with per-test schema/data setup.

2. Test the public API only

The public API is the API that is:

  • in Java, it is marked with public keyword and it ideally present on the interface and has a javadoc
  • in javascript/typescript, it is a function that is exported from the module

Do not test the private/internal methods — these are the details of implementation. Good test just tests the contract. The contract is:

  • What the API accepts
  • What the API returns in what cases
  • What exceptions/errors does it throws and in what cases
  • What concurrency guarantees it has and in what cases

And so on.

Example — interface contract:

java
public interface AuthorityResolver {

    /**
     * Resolves the required {@link Authority} for the given request relative path.
     *
     * @param relativeRequestPath  the relative request path with prefix already split. E.g. {@code /axelix-beans}
     *                             is correct, {@code /actuator/axelix-beans} is not, {@code /beans/feed} is correct,
     *                             {@code /api/external/beans/feed} is not.
     * @param httpMethod           the HTTP method (e.g. {@link HttpMethod#GET}).
     *
     * @return                     an {@link Optional} containing the required {@link Authority},
     *                             or {@link Optional#empty()} if no authority is associated with the relative request path
     */
    Optional<Authority> resolve(String relativeRequestPath, HttpMethod httpMethod);
}
java
public class CachingAuthorityResolver implements AuthorityResolver {

    private final AuthorityResolver delegate;

    /**
     * Resolves the required {@link Authority} for the given request relative path, possibly from cache
     * if already resolved. If not - we just hit the delegate.
     */
    public Optional<Authority> resolve(String relativeRequestPath, HttpMethod httpMethod) {
        // implementation
    }
}

What we should test is:

  • the contract outlined in the javadoc of the interface
  • and the capabilities that this implementation also declares. In this particular case, it declares that it may take data from cache. In this particular case it may be done by inserting the Mock into the delegate and then counting invocations on the mock.

Flag as 🔴 when:

  • Tests call package-private/private methods via reflection or @VisibleForTesting solely to assert internals.
  • Tests duplicate production logic instead of asserting observable outcomes.
  • Implementation-only behavior is tested but the interface contract is not.

Flag as 🟡 when:

  • Public API is tested but implementation-specific guarantees (e.g. caching) declared in the class Javadoc are untested.
3. AAA structure — given, when, then

Tests should have clear stages: given, when, then. Patterns like

  • when, then, when, then

or any other duplications or permutations are bad. The golden rule is AAA — Arrange, Act, Assert. We never do things like Act, Assert, Act, Assert and so on. If we have to do that — this must be a separate test case. It must not be a single test case.

Required: One // given., one // when., one // then. per test method (Axelix convention from AGENTS.md).

Flag as 🔴 when: Multiple act/assert cycles in one test; missing stage comments; several scenarios packed into one @Test.

Acceptable: Parameterized tests (@ParameterizedTest) where each invocation is a single AAA scenario.

4. Positive and negative coverage

Tests must be present for all cases — both positive and negative. Most of the time both negative and positive cases can be derived from the contract (like by reading javadoc).

Example — derive cases from Javadoc:

java
public interface JwtDecoderService {

    /**
     * Parses the given JWT token and converts it into a {@link User}.
     *
     * @param token the JWT token to decode
     * @return the reconstructed {@link User}
     * @throws ExpiredJwtTokenException if the JWT token has expired
     * @throws InvalidJwtTokenException if the JWT token is invalid or tampered with
     * @throws JwtParsingException if the token cannot be parsed or contains insufficient data
     */
    PasswordlessUser decodeTokenToUser(String token)
            throws ExpiredJwtTokenException, InvalidJwtTokenException, JwtParsingException;
}

We should not only test the successful user decoding from the token, but we should test the cases when we got the expired JWT, the JWS is not valid, or JWT cannot be parsed at all. These are negative cases and they absolutely must be present along with the "happy path".

Workflow: Build a contract checklist (inputs, success outputs, each documented exception, boundary values). Mark each item covered / missing.

Flag as 🔴 when: Documented failure modes or edge cases have no test.

Flag as 🟡 when: Coverage is plausible but contract checklist was not obvious from test names — suggest renaming or a missing-case comment in the PR.

Show full SKILL.md (475 more words)Show less
5. Exception type only — not message text

The exception's error textual message is never a part of the contract. Some "errorCode" very well might be, but textual descriptive message — never. Thus, it should never be verified in tests as it is not the part of the contract.

For example, in the JwtDecoderService's case, checking for the exception's message in the test, whether this message contains something is bad. The message of the exception is not the part of the exception's contract. The nominal type IS the part of the exception's contract, but the message is not.

Assert: assertThrows(ExpiredJwtTokenException.class, ...) or assertThatThrownBy(...).isInstanceOf(...).

Do not assert: hasMessage, hasMessageContaining, expectErrorMessage, snapshot of exception text, unless the contract explicitly documents a stable machine-readable code (not prose).

Flag as 🔴 when: Tests assert exception message strings or human-readable descriptions.

Severity

LevelMeaningMerge
🔴 BlockingViolates isolation, tests internals, broken AAA, missing contract cases, or asserts exception messagesDo not approve until fixed
🟡 SuggestionStyle, naming, optional implementation-guarantee coverage, clearer arrange setupApprove with comments optional
🟢 NoteMinor polish, unrelated to standardsInformational

Any 🔴 finding means: we cannot merge such PR (for test-related defects).

Blocking a PR

When the review has one or more 🔴 blocking findings, take both actions on the PR:

  1. Add the label blocked-by-ai-reviewer:
  2. Post one PR comment — a single top-level comment, not multiple threads — briefly listing why the PR is blocked. Use short bullets; do not repeat the full review report.

Example:

markdown
## Test review — blocked

This PR cannot be merged until these blocking test issues are fixed:

- [isolation] `FooTest.bar` — shared DB state not cleaned up between tests
- [AAA] `BazTest.qux` — multiple act/assert cycles in one test
- [exception message] `QuxTest.fail` — asserts message text instead of exception type only

Do not add the label or post a blocking comment when there are only 🟡 suggestions or 🟢 notes.

Deriving the contract checklist

For each public entry point under test:

  1. Read interface Javadoc / exported function TSDoc.
  2. List parameters and valid/invalid domains.
  3. List return shapes for success paths.
  4. List each declared exception or error type and its documented trigger.
  5. List implementation-added guarantees (cache, idempotency, concurrency) from class-level docs.
  6. Compare checklist to test methods — report gaps.

For REST or integration tests, the contract is the HTTP API (status codes, response body shape, auth behavior) — same rules apply.

Project conventions (Axelix)

  • Prefer @Nested inner classes when multiple groups of related tests exist for the same API; avoid a single @Nested for only one category.
  • Test file naming: <SourceName>Test in the same Gradle/npm module as the source.
  • Use explicit types instead of var when the type is not obvious from the right-hand side (Java style guide in AGENTS.md).

Review output format

Use this structure in PR review comments or summary:

markdown
## Test review

**Scope:** [files / APIs reviewed]

### Contract coverage
| Case | Status |
|------|--------|
| [happy path / exception / edge] | ✅ covered in `FileTest.method` / ❌ missing |

### Findings

#### 🔴 Blocking
- **[file:line]** — [isolation | internal API | AAA | missing case | exception message] — [what's wrong] — [what to do]

#### 🟡 Suggestions
- **[file:line]** — [brief suggestion]

### Verdict
**[Approve tests / Request changes — N blocking issue(s)]**

When the verdict is Request changes (any 🔴 findings), also apply Blocking a PR: add blocked-by-ai-reviewer and post the single brief blocking comment.

For inline GitHub comments on specific lines, one finding per comment is fine; the blocking PR comment must still be one summary message only. Cite the test method and link the production contract (interface Javadoc or export).

Quick checklist

Copy and complete when reviewing:

- [ ] All changed tests are isolated (DB + shared state cleaned per test)
- [ ] Only public/exported API is exercised; no private/internal testing
- [ ] Each test: single given → when → then (one act, one assert phase)
- [ ] Positive + negative cases derived from contract are present
- [ ] Exceptions asserted by type only (no message text assertions)
- [ ] Implementation-declared guarantees (e.g. caching) covered when applicable

© axelixlabs, LGPL-3.0. 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 .agent_skills/test-reviewer of axelixlabs/axelix.

Open the folder on GitHubat commit 1372f71

Compare with similar skills

Test Reviewer 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.

Test Reviewer compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Test Reviewer this skillaxelixlabs/axelix148—~3.2kAutomated safety check: PassLGPL-3.0
Corvus Java Evaluatorcorvus-dotnet/Corvus.JsonSchema200—~1.6kAutomated safety check: PassApache-2.0
Supercovsupercorp-ai/supercov1521 repos~415Automated safety check: PassMIT
Test Smell Detectionmicrosoft/testfx1k2 repos~2.5kAutomated safety check: PassMIT
Java TestingHoangNguyen0403/agent-skills-standard572—~1kAutomated safety check: PassMIT
Code Reviewerjewbetcha/opentrace1162 repos~1.1kAutomated safety check: NotesMIT

Similar skills

  • Corvus Java Evaluator

    corvus-dotnet/Corvus.JsonSchema

    Work on the Java port of the V5 standalone schema evaluator (src-java/corvus-json-schema, Maven artifact io.github.corvus-dotnet:corvus-json-schema): loader, compiler, the ASM bytecode generator…

    200 GitHub stars~1.6k tokensUpdated yesterday
    MobileAuto-check passed
  • Supercov

    supercorp-ai/supercov

    Measures test coverage and code quality in a repository with the supercov CLI, and turns what it finds into small, focused tests or fixes.

    152 GitHub starsUsed in 1 repo~415 tokens
    Testing & QAAuto-check passed
  • Test Smell Detection

    microsoft/testfx

    Official

    Audits existing tests in any language using formal, research-backed test smell names and the testsmells.org 19-smell academic taxonomy.

    1k GitHub starsUsed in 2 repos~2.5k tokens
    MobileAuto-check passed
  • Java Testing

    HoangNguyen0403/agent-skills-standard

    Testing standards using JUnit 5, AssertJ, Mockito, Cucumber, and Spring Boot integration tests for Java.

    572 GitHub stars~1k tokensUpdated yesterday
    Testing & QAAuto-check passed
  • Code Reviewer

    jewbetcha/opentrace

    Comprehensive code review skill for TypeScript, JavaScript, Python, Swift, Kotlin, Go.

    116 GitHub starsUsed in 2 repos~1.1k tokens
    DevelopmentAuto-check: notes
  • Answers questions about code structure, history, bugs and PR risk using a CodeScope knowledge graph and semantic index built from the repository.

    28k GitHub starsUsed in 1 repo~9.3k tokens
    DevelopmentAuto-check passed

More from axelixlabs/axelix

All 9 skills in this repo
  • Config Breaking Changes

    axelixlabs/axelix

    Review configuration property changes in the Axelix project for breaking changes and migration-policy compliance.

    148 GitHub stars~2.6k tokensUpdated today
    Auto-check passed
  • Backlog Refiner

    axelixlabs/axelix

    Refine and triage GitHub backlog by finding open issues that are stale, obsolete, or resolved by another path.

    148 GitHub stars~1.7k tokensUpdated today
    Auto-check passed
  • Pick open GitHub issues in the Axelix monorepo that are suitable for unpaid volunteer contributors working in their spare time.

    148 GitHub stars~2.2k tokensUpdated today
    Auto-check passed
  • Prepare Minor Release

    axelixlabs/axelix

    Prepare an Axelix minor lockstep release — the pre-release housekeeping changes, a hand-editable release-notes draft, and the post-release bump to the next -SNAPSHOT.

    148 GitHub stars~2.5k tokensUpdated today
    Auto-check passed
  • Create batched Dependabot-style pull requests for GitHub security findings in axelixlabs/axelix, grouped by dependency surface such as master/front-end, master/build.gradle.kts, or starter Gradle…

    148 GitHub stars~4.2k tokensUpdated today
    Auto-check passed
  • Starter Domain Reviewer

    axelixlabs/axelix

    Reviews changes in sbs/starter-domain for technology-agnostic domain logic, forbidden production dependencies, and Java 11+ compatibility.

    148 GitHub stars~3.3k tokensUpdated today
    Auto-check passed

Questions about Test Reviewer

What does Test Reviewer do?

Reviews test code in GitHub pull requests for isolation, public-API contract coverage, AAA structure, and correct exception assertions. Test Reviewer is an agent skill from axelixlabs/axelix. Reviews test code in GitHub pull requests for isolation, public-API contract coverage, AAA structure, and correct exception assertions.

When should I use Test Reviewer?

Test Reviewer fits situations like: reviewing a PR that adds; deletes tests (Java; the user asks to review tests; evaluating whether test changes are merge-ready.

How do I install Test Reviewer in Claude Code?

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

How do I install Test Reviewer in Codex?

Run `npx skills add axelixlabs/axelix --skill test-reviewer -a codex`. Or copy the skill folder (.agent_skills/test-reviewer in axelixlabs/axelix) into .agents/skills/test-reviewer in your project. Codex loads it when a task matches its description.

Can I use Test Reviewer 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 axelixlabs/axelix --skill test-reviewer -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/test-reviewer, .gemini/skills/test-reviewer, .github/skills/test-reviewer and .opencode/skills/test-reviewer in your project.

What does Test Reviewer need to run?

Going by SKILL.md and its folder, Test Reviewer needs the command-line tools its instructions call (git).

Does Test Reviewer access the network?

SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Test Reviewer 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 Test Reviewer use?

Test Reviewer is published under the LGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Test Reviewer use?

About 3.2k tokens (SKILL.md is roughly 13k 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 Test Reviewer?

Skills that share tags, products or a category with Test Reviewer: Corvus Java Evaluator (corvus-dotnet/Corvus.JsonSchema, 200 stars), Supercov (supercorp-ai/supercov, 152 stars), Test Smell Detection (microsoft/testfx, 1k stars) and Java Testing (HoangNguyen0403/agent-skills-standard, 572 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Test Reviewer?

axelixlabs (a GitHub organization) maintains it in axelixlabs/axelix, which has 148 GitHub stars. The repository holds 9 skills in this directory. The repository was last updated on October 10, 2026.

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