Agent skill

java-coverage

JaCoCo code coverage configuration for Java/Gradle projects. Covers report generation, coverage thresholds, multi-module aggregation, and SonarQube integration. Use when setting up or troubleshooting code coverage.

Stars 163
Forks 31

Install this agent skill to your Project

npx add-skill https://github.com/majiayu000/claude-skill-registry/tree/main/skills/other/java-coverage-bitsoex-bitso-java-2

Metadata

Additional technical details for this skill

tags
java jacoco coverage testing
version
2.0.0
category
quality
technology
java

SKILL.md

Java Coverage

JaCoCo code coverage configuration for Java/Gradle projects.

When to use this skill

  • Setting up code coverage reporting
  • Configuring coverage thresholds
  • Aggregating coverage across modules
  • Integrating with SonarQube
  • Troubleshooting coverage reports
  • When asked to "improve test coverage"

Skill Contents

Sections

  • When to use this skill
  • Quick Start
  • Coverage Thresholds
  • Exclusions
  • Multi-Module Aggregation
  • SonarQube Integration
  • Checking Coverage via SonarQube MCP
  • References
  • Related Rules
  • Related Skills

Available Resources

references/ - Detailed documentation

  • coverage targets
  • coverage via mcp
  • exclusion patterns
  • improvement workflow
  • multi module
  • prioritization

Quick Start

1. Apply JaCoCo Plugin

groovy
plugins {
    id 'jacoco'
}

jacoco {
    toolVersion = "0.8.14"
}

2. Configure Report Task

groovy
jacocoTestReport {
    dependsOn test

    reports {
        xml.required = true  // For SonarQube
        html.required = true // For local viewing
    }
}

test {
    finalizedBy jacocoTestReport
}

3. Run Coverage

bash
./gradlew test jacocoTestReport
# Report at: build/reports/jacoco/test/html/index.html

Coverage Thresholds

groovy
jacocoTestCoverageVerification {
    violationRules {
        rule {
            limit {
                minimum = 0.80  // 80% minimum coverage
            }
        }

        rule {
            element = 'CLASS'
            excludes = ['*.generated.*', '*.config.*']
            limit {
                counter = 'LINE'
                minimum = 0.70
            }
        }
    }
}

check.dependsOn jacocoTestCoverageVerification

Exclusions

Common patterns to exclude from coverage:

groovy
jacocoTestReport {
    afterEvaluate {
        classDirectories.setFrom(files(classDirectories.files.collect {
            fileTree(dir: it, exclude: [
                '**/generated/**',
                '**/config/**',
                '**/*Config.class',
                '**/*Properties.class',
                '**/Application.class'
            ])
        }))
    }
}

Multi-Module Aggregation

For aggregated reports across modules, use the modern jacoco-report-aggregation plugin (Gradle 7.4+):

groovy
// In root build.gradle
plugins {
    id 'base'
    id 'jacoco-report-aggregation'
}

// Ensure subprojects are evaluated first
subprojects.each { evaluationDependsOn(it.path) }

dependencies {
    subprojects.each { jacocoAggregation it }
}

reporting {
    reports {
        testCodeCoverageReport(JacocoCoverageReport) {
            testType = TestSuiteType.UNIT_TEST
        }
    }
}

For older Gradle versions, use a manual task with defensive filtering:

groovy
// In root build.gradle (Gradle < 7.4)
task jacocoRootReport(type: JacocoReport) {
    dependsOn subprojects*.test

    // Use defensive filtering to avoid missing-directory errors
    def srcDirs = files(subprojects*.sourceSets*.main*.allSource*.srcDirs).filter { it.exists() }
    def classDirs = files(subprojects*.sourceSets*.main*.output).filter { it.exists() }
    def execData = files(subprojects*.jacocoTestReport*.executionData).filter { it.exists() }

    additionalSourceDirs.from(srcDirs)
    sourceDirectories.from(srcDirs)
    classDirectories.from(classDirs)
    executionData.from(execData)

    reports {
        xml.required = true
        html.required = true
    }
}

SonarQube Integration

groovy
sonar {
    properties {
        property 'sonar.coverage.jacoco.xmlReportPaths',
            "${projectDir}/build/reports/jacoco/test/jacocoTestReport.xml"
    }
}

Checking Coverage via SonarQube MCP

Instead of running local JaCoCo builds to check current coverage state, use SonarQube MCP tools for faster feedback:

Tool Purpose
search_files_by_coverage Find files with lowest coverage
get_file_coverage_details Line-by-line coverage for a specific file
get_component_measures Project/module-level coverage metric
get_project_quality_gate_status Check if coverage gate passes
text
# Find low-coverage files
search_files_by_coverage: projectKey: "my-service"

# Check specific file coverage
get_file_coverage_details: key: "my-service:src/main/java/com/bitso/Service.java"

# Check overall coverage
get_component_measures: component: "my-service", metricKeys: ["coverage"]

MCP reflects the last CI analysis. Use JaCoCo locally to generate new coverage after writing tests.

See fix-sonarqube coverage reference for the full MCP coverage workflow.

References

Reference Description
references/exclusion-patterns.md Common exclusion patterns
references/multi-module.md Multi-module aggregation

Related Rules

  • java-jacoco-coverage - Full JaCoCo reference

Related Skills

Skill Purpose
java-testing Test configuration
fix-sonarqube SonarQube setup
gradle-standards Gradle configuration

Expand your agent's capabilities with these related and highly-rated skills.

Didn't find tool you were looking for?

Be as detailed as possible for better results