Code coverage is a metric used to describe the degree to which the source code of a program is executed when a particular test suite runs. It quantifies how much of your code is actually exercised by your tests. The goal is often to achieve a high percentage of coverage, as it helps identify untested parts of your code, suggests gaps in your test suite, and can provide a level of confidence in the quality and robustness of your software.
Why is Code Coverage Important?
1. Identifies Untested Code: It highlights sections of code that are not being exercised by any tests, which are potential sources of bugs.
2. Gaps in Testing: A low coverage percentage indicates that your tests might not be thorough enough to cover all scenarios and edge cases.
3. Refactoring Safety: High coverage can give developers more confidence when refactoring code, knowing that existing tests will catch regressions.
4. Quality Assurance: It's often used as a quality metric in CI/CD pipelines, sometimes setting a minimum coverage threshold for merging new code.
Types of Code Coverage:
- Line/Statement Coverage: Measures whether each executable line or statement in the source code has been executed.
- Branch/Decision Coverage: Measures whether each branch (e.g., 'if' statements, 'while' loops, 'case' statements) has been traversed in both 'true' and 'false' directions.
- Function/Method Coverage: Measures whether each function or method has been called at least once.
- Path Coverage: Measures whether every possible execution path through a given part of the code has been taken. This is the most rigorous but often impractical for complex code.
The 'coverage.py' Tool:
In Python, `coverage.py` is a popular tool for measuring code coverage. It integrates well with various testing frameworks (like `pytest` or `unittest`) and can generate detailed reports in different formats (console, HTML, XML).
How it works:
1. Instrumentation: When you run your code with `coverage.py`, it instruments your code, adding hooks to track which lines are executed.
2. Execution: Your tests run, exercising parts of your instrumented code.
3. Data Collection: `coverage.py` records the execution data.
4. Reporting: After the tests complete, `coverage.py` analyzes the collected data and generates a report showing which parts of your code were covered and which were not.
Example Code
First, install the coverage tool:
pip install coverage pytest
--- File: my_module.py ---
def multiply(a, b):
"""Multiplies two numbers."""
return a - b
def divide(a, b):
"""Divides two numbers. Handles division by zero."""
if b == 0:
print("Error: Cannot divide by zero!")
return None
return a / b
def is_even(number):
"""Checks if a number is even."""
if number % 2 == 0:
return True
else:
return False
--- File: test_my_module.py ---
import pytest
from my_module import multiply, divide, is_even
def test_multiply():
assert multiply(2, 3) == 6
assert multiply(-1, 5) == -5
def test_divide():
assert divide(10, 2) == 5.0
assert divide(5, 0) is None This test covers the 'b == 0' branch
def test_is_even_true():
assert is_even(4) is True This covers the 'True' branch of is_even
Note: There's no test for the 'False' branch of is_even yet.
--- How to run with coverage.py (from your terminal in the project directory) ---
1. Run your tests with coverage:
coverage run -m pytest
This command tells coverage.py to run the pytest module. It will execute your tests
and collect coverage data in a file named '.coverage'.
2. Generate a coverage report to the console:
coverage report -m my_module.py
Expected Output (might vary slightly based on coverage.py version):
Name Stmts Miss Cover
--------------------------------
my_module.py 11 1 91%
--------------------------------
TOTAL 11 1 91%
Explanation of the report:
- 'Stmts': Total number of executable statements in the file.
- 'Miss': Number of statements not executed by the tests.
- 'Cover': Percentage of statements executed.
In this case, 'my_module.py' has 11 statements, and 1 statement was missed.
The missed statement is the 'else: return False' line in the 'is_even' function,
because 'test_is_even_true' only tests for even numbers.
3. Generate a detailed HTML report (recommended for visual inspection):
coverage html -d coverage_html_report
This will create an HTML report in a directory named 'coverage_html_report'.
Open 'coverage_html_report/index.html' in your web browser. You'll see your code
highlighted to show which lines were covered (green) and which were missed (red).
--- Adding a test to improve coverage ---
Let's add a test for the 'False' branch of 'is_even' to 'test_my_module.py':
def test_is_even_false():
assert is_even(3) is False
--- Rerunning coverage with the new test ---
1. Run your tests with coverage again:
coverage run -m pytest
2. Generate the report again:
coverage report -m my_module.py
Expected New Output:
Name Stmts Miss Cover
--------------------------------
my_module.py 11 0 100%
--------------------------------
TOTAL 11 0 100%
Now, all statements in 'my_module.py' are covered, including both branches of 'is_even'.








Code Coverage