Skip to main content
HomeTools

Test Coverage Report Viewer

Free

Paste an lcov.info, a Cobertura or JaCoCo XML report, or an Istanbul coverage-summary.json, or open the file. The viewer shows each metric the report records, per file and in total, with its denominator: lines, branches, functions, plus statements for Istanbul and instructions for JaCoCo. Files are sorted by uncovered lines and flagged when the metric you choose is under your threshold. No weighted score: each number is the report's own. Everything runs in your browser.

#metrics#coverage#QA#reporting

Test Coverage Report Viewer

lcov · Cobertura · JaCoCo · Istanbul

Pick the threshold your team actually gates on. There is no standard number; the flag only sorts attention. You can also drop a report file here.

Parsed in this browser tab. Reports are read locally, XML without DTDs or entities. Nothing is uploaded.

Paste or choose a coverage report to see per-file line, branch and function coverage.

What this does and does not tell you. Coverage records which code ran while the tests ran. It cannot tell whether any test checked the result, so a covered line can still be untested. The uncovered list is the reliable part: code nothing executed.

Frequently Asked Questions(click to expand)

How do I get one of these files?

Jest and Vitest write lcov.info, Cobertura and coverage-summary.json with the lcov, cobertura and json-summary reporters. coverage.py writes Cobertura with coverage xml and lcov with coverage lcov. Gradle and Maven write JaCoCo XML from the jacocoTestReport task or the jacoco:report goal. gcc and llvm projects get lcov from lcov --capture.

Why is there no overall score?

Lines, branches and functions measure different things, and the formats do not even count lines the same way: JaCoCo marks a line covered when any one of its bytecode instructions ran. Blending them into one number hides the metric you would act on. Each one is shown with its denominator instead.

Why does a file show n/a where my report says 100%?

Istanbul writes a pct of 100 when there is nothing to count, and Cobertura writers put branch-rate="1" on files with no branches. A file with no branches has no branch coverage at all, so it shows n/a and is never flagged.

Why are my JaCoCo methods never 100%?

JaCoCo counts the default constructor the compiler adds to a class that declares none. A utility class with only static methods has one that no test calls, so its METHOD counter shows one missed.

Why do my lcov branches show as not recorded?

lcov leaves branch data out unless branch coverage is turned on (--rc branch_coverage=1), and coverage.py records branches only with --branch. Without them there are no BRF/BRH records, so there is nothing to show.