GitAuto Logo
  1. Home
  2. Pricing
  3. Docs
  4. Dashboard
  5. Blog
  6. Contact
  1. Home
  2. How It Works
  3. Use Cases
  4. Pricing
  5. Docs
  6. Dashboard
  7. FAQ
  8. Blog
  9. Contact

Java Coverage

Framework Configuration

Key Requirements

  • Coverage report must be in LCOV format
  • Report must be saved as coverage/lcov.info
  • Report must be uploaded as a GitHub Actions artifact named coverage-report

JaCoCo is the most popular code coverage tool for Java projects. It integrates seamlessly with Maven and Gradle, generating coverage reports in XML format that can be converted to LCOV for GitAuto compatibility.

Maven Configuration

pom.xml
<project>
  <!-- ... other configuration ... -->

  <build>
    <plugins>
      <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.8.15</version>
        <executions>
          <execution>
            <goals>
              <goal>prepare-agent</goal>
            </goals>
          </execution>
          <execution>
            <id>report</id>
            <phase>test</phase>
            <goals>
              <goal>report</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

Gradle Configuration

build.gradle
plugins {
    id 'java'
    id 'jacoco'
}

jacoco {
    toolVersion = "0.8.15"
}

test {
    finalizedBy jacocoTestReport
}

jacocoTestReport {
    dependsOn test
    reports {
        xml.required = true
        html.required = true
        csv.required = false
    }
}

// Configure JaCoCo to generate reports in the correct location
jacocoTestReport {
    reports {
        xml.enabled true
        xml.destination file("${buildDir}/reports/jacoco/test/jacoco.xml")
    }
}

Setting Up GitHub Actions

Create a workflow file in .github/workflows/ directory. The filename can be anything you prefer (e.g. java-coverage.yml). Add the following content to your workflow file:

java-coverage.yml
name: JaCoCo Coverage

# Run on target branch (probably default branch like main) to track coverage history
on:
  push:
    branches:
      - main
    # Optional: Only run when relevant files change (customize as needed)
    paths:
      - '**/*.java'
      - pom.xml
      - build.gradle
  pull_request:
    branches:
      - main
    paths:
      - '**/*.java'
      - pom.xml
      - build.gradle
      - '!.github/workflows/**'
  workflow_dispatch:

# Auto-cancel outdated runs on the same branch
concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
  cancel-in-progress: true

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - name: Set up JDK
        uses: actions/setup-java@v5
        with:
          java-version: '21'
          distribution: 'temurin'

      - name: Cache Maven packages
        uses: actions/cache@v5
        with:
          path: ~/.m2
          key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
          restore-keys: ${{ runner.os }}-m2

      # PR: tests only, Push: tests with coverage
      - name: Run tests
        if: github.event_name == 'pull_request'
        run: mvn clean test

      - name: Run tests with coverage
        if: github.event_name == 'push'
        run: mvn clean test jacoco:report

      - name: Convert JaCoCo XML to Cobertura format
        if: github.event_name == 'push'
        run: |
          curl -o cover2cover.py https://raw.githubusercontent.com/rix0rrr/cover2cover/master/cover2cover.py
          python3 cover2cover.py target/site/jacoco/jacoco.xml src/main/java/ > target/site/cobertura.xml

      - name: Convert Cobertura to LCOV format
        if: github.event_name == 'push'
        run: |
          pip install lcov_cobertura
          mkdir -p coverage
          python3 -m lcov_cobertura target/site/cobertura.xml --output coverage/lcov.info --demangle

      - name: Upload coverage reports
        if: github.event_name == 'push'
        uses: actions/upload-artifact@v6
        with:
          name: coverage-report
          path: coverage/lcov.info

Key Configuration Points

  • Configure JaCoCo plugin in Maven or Gradle
  • Generate XML coverage reports
  • Convert JaCoCo XML to LCOV format using a conversion tool
  • Upload the report as an artifact - name must be either coverage-report or end with lcov.info
  • Ensure the artifact contains coverage/lcov.info file

Why !.github/workflows/** on PRs Only?

On pull requests, we exclude workflow file changes to keep the setup PR minimal. When you're adding or editing a workflow file, pre-existing test failures in your codebase are irrelevant and shouldn't block the PR. On push(after merge to main), we don't exclude them so that the initial coverage report gets generated on your target branch.

Viewing Coverage Reports

After your workflow runs successfully, GitAuto automatically processes the coverage reports and displays them in the Coverage Dashboard. GitAuto only saves coverage data when the workflow runs on your target branch (configurable in your repository's Rules page, defaults to your repository's default branch, e.g., main or master). This typically happens when:

  • You merge a pull request to your target branch
  • You push directly to your target branch
  • You manually trigger the workflow

About LCOV:LCOV (Linux Code Coverage) is a standard format for code coverage data. It's pronounced "el-cov" and is widely supported by various tools and services.

Using multiple languages? If your repository has multiple programming languages (the docs use PHP + JavaScript as an example, but any combination works), see our Multi-Language Coverage guide for setting up coverage across all languages.

JaCoCo Giving You Trouble?

Java coverage can be complex with build tool configurations, multi-module projects, and classpath issues. Whether JaCoCo reports are missing, Maven is acting up, or CI is failing, we've got your back!

Contact us and let's sort out your Java coverage!

Coverage OverviewCoverage Charts

Getting Started

  • Installation
  • Setup

Triggers

  • Overview
  • Schedule Trigger
  • Test Failure Trigger
  • Review Comment Trigger
  • Dashboard Trigger

Coverage Dashboard

  • Overview
  • Python Testing
  • JavaScript Testing
  • Java Testing
  • Go Testing
  • PHP Testing
  • Ruby Testing
  • Flutter Testing
  • Multi-Language
  • Coverage Charts

Customization

  • Repository Rules
  • Output Language
  • GITAUTO.md

Integrations

  • CircleCI Integration
  • npm Integration

How It Works

Context Enrichment

  • Line Numbers
  • Full File Reads
  • Test File Preloading
  • Test Naming Detection
  • Error Baselines
  • CI Log Cleaning
  • Trigger-Specific Prompts
  • Coding Standards

Output Auto-Correction

  • Diff Hunk Repair
  • Diff Prefix Repair
  • Tool Name Correction
  • Tool Argument Correction
  • Import Sorting
  • Trailing Space Removal
  • Final Newline
  • Line Ending Preservation
  • Sanitize Tool Arguments
  • Lint Disable Headers

Quality Verification

  • Formatting
  • Linting
  • Type Checking
  • Test Execution
  • Coverage Enforcement
  • phpcs / phpstan Support
  • PHPUnit Support
  • pytest Support
  • Snapshot Auto-Update
  • Untestable Detection
  • Should-Skip Detection
  • Dead Code Removal
  • Quality Check Scoring
  • Quality Checklist

Safety Guardrails

  • File Edit Restrictions
  • Temperature Zero
  • PR/Branch Checks
  • Race Condition Prevention
  • Bot Loop Prevention
  • Webhook Deduplication
  • Duplicate Error Hashing
  • Infrastructure Failure Detection
  • Strict Tool Schemas
  • No-Change Detection

Token/Cost Management

  • Token Trimming
  • Outdated Diff Removal
  • Stale File Replacement
  • Skip CI Intermediate
  • CI Log Deduplication
  • Web Fetch Summarization
  • Context Forgetting
  • File Query Routing
  • On-Demand Diff

Resilience & Recovery

  • Model Fallback
  • Overload Retry
  • Forced Verification
  • Error Files Editable

Hallucination Prevention

  • Web Search
  • URL Fetching
  • Anti-Hallucination Prompts
  • GITAUTO.md Restrictions
  • Review Response Guardrails

Ready to improve your test coverage?

Go from 0% to 90% test coverage with GitAuto. Start for free, no credit card required.

Install FreeContact Sales

Product

  • Home
  • Why GitAuto
  • What GitAuto Does
  • How It Works
  • Use Cases
  • How to Get Started
  • Solution
  • Pricing
  • Pricing Details
  • ROI Calculator
  • ROI Methodology
  • FAQ
  • Blog
  • Contact

Dashboard

  • Dashboard
  • Coverage Trends
  • File Coverage
  • Credits
  • Open PRs
  • Usage
  • Triggers
  • Actions
  • References
  • Rules
  • CircleCI Integration
  • npm Integration

Documentation

  • Docs
  • Getting Started
  • Setup
  • Triggers
  • Coverage Setup
  • Customization
  • How It Works
  • Auto Merge
  • CircleCI
  • npm

Legal

  • Privacy Policy
  • Terms of Service

Connect

  • GitHub
  • LinkedIn
  • Twitter
  • YouTube
GitAuto Logo© 2026 GitAuto, Inc. All Rights Reserved