stackademic

The leading education platform for anyone with an interest in software development.

Code Coverage

Measuring how much of your code is exercised by your tests

Overview

Code coverage measures how much of your source code runs while your tests execute, usually as a percentage of lines, branches, or functions. It highlights untested areas you may have forgotten. Coverage is a useful guide, not a goal in itself: 100% coverage does not prove the tests are meaningful, only that every line was reached.

Syntax / Usage

Most runners collect coverage with a single flag. Jest reports a table of covered lines, branches, and functions per file.

// discount.js
function applyDiscount(price, isMember) {
  if (isMember) {
    return price * 0.9;
  }
  return price;
}
module.exports = { applyDiscount };
# Run tests and print a coverage report
npx jest --coverage

To fail the build below a threshold, configure it in jest.config.js with coverageThreshold.

Examples

The test below only covers the member branch, so coverage will flag the other path:

const { applyDiscount } = require("./discount");

test("applies 10% discount for members", () => {
  expect(applyDiscount(100, true)).toBe(90);
});

Adding a test for the missing branch raises branch coverage to 100%:

test("charges full price for non-members", () => {
  expect(applyDiscount(100, false)).toBe(100);
});

Common Mistakes

  • Treating a high coverage number as proof the code is correct
  • Writing tests that run code but assert nothing, inflating coverage
  • Chasing 100% by testing trivial getters instead of real logic
  • Ignoring branch coverage and only watching line coverage
  • Excluding hard-to-test files just to make the number look better

See Also

testing-unit-tests testing-fundamentals testing-end-to-end