acc-analyze-test-coverage

Analyzes PHP codebase for test coverage gaps. Detects untested classes, methods, branches, exception paths, and edge cases. Provides actionable recommendations.

181 stars

Best use case

acc-analyze-test-coverage is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Analyzes PHP codebase for test coverage gaps. Detects untested classes, methods, branches, exception paths, and edge cases. Provides actionable recommendations.

Teams using acc-analyze-test-coverage should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/acc-analyze-test-coverage/SKILL.md --create-dirs "https://raw.githubusercontent.com/majiayu000/claude-skill-registry/main/skills/data/acc-analyze-test-coverage/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/acc-analyze-test-coverage/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How acc-analyze-test-coverage Compares

Feature / Agentacc-analyze-test-coverageStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Analyzes PHP codebase for test coverage gaps. Detects untested classes, methods, branches, exception paths, and edge cases. Provides actionable recommendations.

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

Related Guides

SKILL.md Source

# Test Coverage Analysis

Analyzes PHP codebase to identify untested code and coverage gaps.

## Detection Patterns

### 1. Classes Without Tests

```bash
# Find all PHP classes in src/
Glob: src/**/*.php

# Find all test files
Glob: tests/**/*Test.php

# Compare: class Foo in src/ should have FooTest in tests/
```

**Pattern Matching:**
```
src/Domain/User/User.php → tests/Unit/Domain/User/UserTest.php
src/Application/PlaceOrder/PlaceOrderHandler.php → tests/Unit/Application/PlaceOrder/PlaceOrderHandlerTest.php
```

### 2. Methods Without Tests

```php
// For each public method in class
Grep: "public function [a-z]" --glob "src/**/*.php"

// Check if test method exists
Grep: "test_methodName" --glob "tests/**/*Test.php"
```

**Detection Logic:**
```
Class: Order
├── confirm() → test_confirm_* exists? ✅/❌
├── cancel() → test_cancel_* exists? ✅/❌
├── ship() → test_ship_* exists? ✅/❌
└── addItem() → test_addItem_* / test_add_item_* exists? ✅/❌
```

### 3. Branches Not Covered

**If/Else Branches:**
```php
// Source code
public function process(Order $order): void
{
    if ($order->isPending()) {     // Branch 1: pending
        $this->processPending($order);
    } elseif ($order->isConfirmed()) { // Branch 2: confirmed
        $this->processConfirmed($order);
    } else {                       // Branch 3: other
        throw new InvalidStateException();
    }
}

// Required tests:
// - test_process_when_pending_*
// - test_process_when_confirmed_*
// - test_process_when_other_throws_exception
```

**Switch Statements:**
```php
// Source code
match ($status) {
    'pending' => $this->handlePending(),
    'confirmed' => $this->handleConfirmed(),
    'shipped' => $this->handleShipped(),
    default => throw new UnexpectedValueException(),
};

// Required tests: one per case + default
```

### 4. Exception Paths

```php
// Detect throw statements
Grep: "throw new" --glob "src/**/*.php"

// Each throw should have corresponding test with expectException
```

**Example:**
```php
// Source
public function withdraw(Money $amount): void
{
    if ($amount->greaterThan($this->balance)) {
        throw new InsufficientFundsException();  // Line 15
    }
}

// Required test
public function test_withdraw_throws_for_insufficient_funds(): void
{
    $this->expectException(InsufficientFundsException::class);
    // ...
}
```

### 5. Edge Cases

| Type | Values to Test | Detection |
|------|---------------|-----------|
| **Null** | `null` input | Parameters without type hint or nullable |
| **Empty** | `[]`, `''`, `0` | Collection/string/numeric parameters |
| **Boundary** | min, max, min-1, max+1 | Constants, validation limits |
| **Unicode** | `'émoji 🎉'` | String parameters |
| **Concurrent** | Race conditions | Shared state, repositories |

**Detection Patterns:**
```php
// Nullable parameters
Grep: "\?[A-Z]" --glob "src/**/*.php"  // ?Type
Grep: "null\|" --glob "src/**/*.php"   // Type|null

// Collections
Grep: "array \$" --glob "src/**/*.php"
Grep: "iterable" --glob "src/**/*.php"

// Numeric limits
Grep: "const MAX_" --glob "src/**/*.php"
Grep: "const MIN_" --glob "src/**/*.php"
```

## Analysis Process

### Phase 1: Inventory

1. List all production classes:
   ```
   Glob: src/**/*.php
   ```

2. List all test classes:
   ```
   Glob: tests/**/*Test.php
   ```

3. Build mapping:
   ```
   ProductionClass → [TestClass, TestClass]
   ```

### Phase 2: Class Coverage

For each production class:
1. Check if corresponding test exists
2. Calculate: `covered_classes / total_classes * 100`

### Phase 3: Method Coverage

For each public method:
1. Extract method names from production code
2. Search for `test_{method}` patterns in tests
3. Calculate: `tested_methods / total_methods * 100`

### Phase 4: Branch Coverage

For each conditional:
1. Count branches (if/elseif/else, match cases)
2. Search for tests covering each branch
3. Report uncovered branches

### Phase 5: Edge Cases

1. Identify nullable/optional parameters
2. Identify collections
3. Identify numeric limits
4. Check if edge case tests exist

## Output Format

```markdown
# Test Coverage Analysis Report

## Summary

| Metric | Value | Target |
|--------|-------|--------|
| Class Coverage | 75% | 90% |
| Method Coverage | 60% | 80% |
| Branch Coverage | 45% | 70% |

## Untested Classes

| Class | Location | Priority |
|-------|----------|----------|
| `PaymentProcessor` | src/Domain/Payment/ | High |
| `EmailNotifier` | src/Infrastructure/ | Medium |

## Untested Methods

| Class | Method | Reason |
|-------|--------|--------|
| `Order` | `splitShipment()` | No test found |
| `User` | `resetPassword()` | Only happy path tested |

## Uncovered Branches

| File | Line | Branch | Missing Test |
|------|------|--------|--------------|
| Order.php | 45 | else (cancelled) | test_ship_when_cancelled |
| User.php | 23 | null check | test_with_null_email |

## Missing Edge Cases

| Class | Method | Edge Case |
|-------|--------|-----------|
| `Cart` | `addItem()` | Empty cart, max items |
| `Money` | `add()` | Zero amount, overflow |

## Action Items

### Critical (Must Have)
1. Add `PaymentProcessorTest` — handles money
2. Add `test_order_ship_when_cancelled` — business rule

### High Priority
1. Add null checks for `User::resetPassword()`
2. Add boundary tests for `Cart::addItem()`

### Recommended Skills

| Gap | Skill | Action |
|-----|-------|--------|
| Missing unit test | `acc-create-unit-test` | Generate test class |
| Missing integration test | `acc-create-integration-test` | Generate DB test |
| Need test data | `acc-create-test-builder` | Generate builder |
```

## Severity Levels

| Level | Coverage | Action |
|-------|----------|--------|
| **Critical** | <50% | Immediate attention |
| **Warning** | 50-70% | Prioritize improvement |
| **Good** | 70-90% | Monitor and maintain |
| **Excellent** | >90% | Focus on edge cases |

## Integration with Generator

After analysis, recommend using:

- `acc-create-unit-test` — for missing unit tests
- `acc-create-integration-test` — for missing integration tests
- `acc-create-test-builder` — for complex test data
- `acc-create-mock-repository` — for repository tests

Related Skills

add-unit-tests

181
from majiayu000/claude-skill-registry

Guide for adding unit tests to AReaL. Use when user wants to add tests for new functionality or increase test coverage.

add-test

181
from majiayu000/claude-skill-registry

Add unit tests for component or function: $ARGUMENTS

add-test-whatifwedigdeeper-application-tracker

181
from majiayu000/claude-skill-registry

Add unit tests for a component or function

add-test-coverage

181
from majiayu000/claude-skill-registry

Analyze recent changes and add test coverage for HEAD commit

add-backend-testing

181
from majiayu000/claude-skill-registry

Add backend integration testing with Vitest to an existing app. Sets up isolated test database schema and writes tests for tRPC routers.

adb-device-testing

181
from majiayu000/claude-skill-registry

Use when testing Android apps on ADB-connected devices/emulators - UI automation, screenshots, location spoofing, navigation, app management. Triggers on ADB, emulator, Android testing, location mock, UI test, screenshot walkthrough.

act-local-testing

181
from majiayu000/claude-skill-registry

Use when testing GitHub Actions workflows locally with act. Covers act CLI usage, Docker configuration, debugging workflows, and troubleshooting common issues when running workflows on your local machine.

accessibility-testing

181
from majiayu000/claude-skill-registry

WCAG 2.2 compliance testing, screen reader validation, and inclusive design verification. Use when ensuring legal compliance (ADA, Section 508), testing for disabilities, or building accessible applications for 1 billion disabled users globally.

accessibility-tester

181
from majiayu000/claude-skill-registry

Expert accessibility tester specializing in WCAG compliance, inclusive design, and universal access. Masters screen reader compatibility, keyboard navigation, and assistive technology integration with focus on creating barrier-free digital experiences.

accessibility-test-axe

181
from majiayu000/claude-skill-registry

Эксперт по a11y тестированию. Используй для axe-core, automated testing и accessibility audits.

acceptance-testing

181
from majiayu000/claude-skill-registry

Plan and (when feasible) implement or execute user acceptance tests (UAT) / end-to-end acceptance scenarios. Converts requirements or user stories into acceptance criteria, test cases, test data, and a sign-off checklist; suggests automation (Playwright/Cypress for web, golden/snapshot tests for CLIs/APIs). Use when validating user-visible behavior for a release, or mapping requirements to acceptance coverage.

acceptance-tester

181
from majiayu000/claude-skill-registry

Execute systematic acceptance testing to verify implementations against acceptance criteria. Use this skill when tasks mention "驗收測試", "acceptance testing", "驗收", "validate implementation", or when Gherkin scenarios need to be executed.