Coverage Analyzer Skill
Purpose
This skill provides comprehensive test coverage analysis, gap identification, threshold validation, and detailed reporting to ensure code quality and adequate test coverage across the codebase.
When to Use
- •Measuring test coverage for a module or project
- •Identifying untested code and coverage gaps
- •Validating coverage meets threshold (≥ 80%)
- •Generating coverage reports for review
- •Analyzing coverage trends over time
- •Finding missing branch coverage
Coverage Analysis Workflow
1. Basic Coverage Measurement
Run Tests with Coverage:
# Install pytest-cov if not installed pip install pytest-cov # Basic coverage measurement pytest --cov=src tests/ # Coverage with terminal report pytest --cov=src --cov-report=term tests/ # Coverage with missing lines pytest --cov=src --cov-report=term-missing tests/ # Coverage for specific module pytest --cov=src.tools.feature tests/
Quick Coverage Check:
# Show percentage only pytest --cov=src --cov-report=term tests/ | grep TOTAL # Check if coverage meets threshold pytest --cov=src --cov-fail-under=80 tests/ # Quiet mode with coverage pytest --cov=src --cov-report=term -q tests/
Deliverable: Basic coverage metrics
2. Detailed Coverage Analysis
Generate Detailed Reports:
# HTML coverage report (most detailed) pytest --cov=src --cov-report=html tests/ # Open htmlcov/index.html in browser # XML coverage report (for CI/CD) pytest --cov=src --cov-report=xml tests/ # JSON coverage report pytest --cov=src --cov-report=json tests/ # Multiple report formats pytest --cov=src \ --cov-report=html \ --cov-report=xml \ --cov-report=term-missing \ tests/
Analyze Coverage by Module:
# Show coverage for each file pytest --cov=src --cov-report=term tests/ # Coverage with line numbers pytest --cov=src --cov-report=term-missing tests/ # Annotated source files pytest --cov=src --cov-report=annotate tests/ # Creates .py,cover files with coverage annotations
Deliverable: Detailed coverage reports
3. Coverage Gap Identification
Find Untested Code:
# Show missing lines pytest --cov=src --cov-report=term-missing tests/ # Show missing branches pytest --cov=src --cov-branch --cov-report=term-missing tests/ # Generate HTML report to visualize gaps pytest --cov=src --cov-report=html tests/ # Open htmlcov/index.html to see line-by-line coverage
Identify Low Coverage Modules:
# Run coverage and parse output pytest --cov=src --cov-report=term tests/ | grep -v "100%" # Find files below 80% coverage pytest --cov=src --cov-report=term tests/ | awk '$NF ~ /%/ && $NF+0 < 80' # Sort by coverage percentage pytest --cov=src --cov-report=term tests/ | sort -k4 -n
Analyze Coverage by Test Type:
# Coverage from unit tests only pytest --cov=src --cov-report=term tests/unit/ # Coverage from integration tests only pytest --cov=src --cov-report=term tests/integration/ # Combined coverage pytest --cov=src --cov-report=term tests/unit/ tests/integration/ # Incremental coverage (append mode) pytest --cov=src --cov-append --cov-report=term tests/unit/ pytest --cov=src --cov-append --cov-report=term tests/integration/
Deliverable: Coverage gap analysis
4. Branch Coverage Analysis
Measure Branch Coverage:
# Enable branch coverage pytest --cov=src --cov-branch --cov-report=term-missing tests/ # Branch coverage with HTML report pytest --cov=src --cov-branch --cov-report=html tests/ # Show partial branches pytest --cov=src --cov-branch --cov-report=term-missing tests/ | grep "!->"
Analyze Conditional Coverage:
# Find untested conditionals pytest --cov=src --cov-branch --cov-report=term-missing tests/ | grep "if" # Check switch/case coverage pytest --cov=src --cov-branch --cov-report=term-missing tests/ | grep "case"
Deliverable: Branch coverage metrics
5. Coverage Threshold Validation
Validate Minimum Coverage:
# Fail if coverage below 80% pytest --cov=src --cov-fail-under=80 tests/ # Fail if coverage below 90% pytest --cov=src --cov-fail-under=90 tests/ # Check with specific threshold and report pytest --cov=src --cov-fail-under=80 --cov-report=term-missing tests/
Per-Module Thresholds:
# Core logic: 90% minimum pytest --cov=src.core --cov-fail-under=90 tests/ # Utilities: 85% minimum pytest --cov=src.utils --cov-fail-under=85 tests/ # Interfaces: 80% minimum pytest --cov=src.interfaces --cov-fail-under=80 tests/
Deliverable: Threshold validation report
6. Coverage Configuration
Configure .coveragerc:
# .coveragerc
[run]
source = src
omit =
tests/*
*/__init__.py
*/venv/*
*/.venv/*
*/migrations/*
branch = True
[report]
exclude_lines =
# Default pragmas
pragma: no cover
# Don't complain about missing debug-only code
def __repr__
def __str__
# Don't complain if tests don't hit defensive assertion code
raise AssertionError
raise NotImplementedError
# Don't complain if non-runnable code isn't run
if __name__ == .__main__.:
if TYPE_CHECKING:
# Don't complain about abstract methods
@abstractmethod
precision = 2
show_missing = True
[html]
directory = htmlcov
[xml]
output = coverage.xml
Configure pyproject.toml:
# pyproject.toml
[tool.coverage.run]
source = ["src"]
omit = [
"tests/*",
"*/__init__.py",
"*/venv/*",
"*/.venv/*",
]
branch = true
[tool.coverage.report]
exclude_lines = [
"pragma: no cover",
"def __repr__",
"raise AssertionError",
"raise NotImplementedError",
"if __name__ == .__main__.:",
"if TYPE_CHECKING:",
"@abstractmethod",
]
precision = 2
show_missing = true
fail_under = 80
[tool.coverage.html]
directory = "htmlcov"
[tool.coverage.xml]
output = "coverage.xml"
Deliverable: Coverage configuration
7. Coverage Reporting
Generate Coverage Reports:
# Terminal report pytest --cov=src --cov-report=term tests/ # Terminal report with missing lines pytest --cov=src --cov-report=term-missing tests/ # HTML report for detailed analysis pytest --cov=src --cov-report=html tests/ # XML report for CI/CD integration pytest --cov=src --cov-report=xml tests/ # JSON report for programmatic access pytest --cov=src --cov-report=json tests/ # All reports pytest --cov=src \ --cov-report=term-missing \ --cov-report=html \ --cov-report=xml \ --cov-report=json \ tests/
Coverage Summary Report:
# Coverage Report ## Overall Coverage: 87% ### By Module | Module | Coverage | Missing Lines | |--------|----------|---------------| | src.core | 95% | 45-47, 89 | | src.utils | 88% | 12-15, 67-70 | | src.interfaces | 82% | 23, 56-58 | | src.models | 100% | - | ### Critical Gaps 1. Error handling in `src.core.process()` (lines 45-47) 2. Edge case validation in `src.utils.validate()` (lines 67-70) 3. Exception paths in `src.interfaces.execute()` (lines 56-58) ### Recommendations - Add tests for error conditions in core module - Improve edge case coverage in utilities - Test exception handling in interfaces ### Status ✅ Overall coverage: 87% (target: 80%) ✅ Core business logic: 95% (target: 90%) ✅ Utilities: 88% (target: 85%) ✅ All thresholds met
Deliverable: Comprehensive coverage reports
8. Coverage Trend Analysis
Track Coverage Over Time:
# Generate coverage badge
pip install coverage-badge
coverage-badge -o coverage.svg
# Save coverage history
pytest --cov=src --cov-report=json tests/
mv coverage.json coverage-$(date +%Y%m%d).json
# Compare coverage between runs
coverage json
python -c "import json; print(json.load(open('coverage.json'))['totals']['percent_covered'])"
Coverage Diff:
# Coverage for current branch
pytest --cov=src --cov-report=json tests/
cp coverage.json coverage-current.json
# Coverage for main branch
git checkout main
pytest --cov=src --cov-report=json tests/
cp coverage.json coverage-main.json
# Compare
diff <(jq '.totals.percent_covered' coverage-main.json) \
<(jq '.totals.percent_covered' coverage-current.json)
Deliverable: Coverage trends and comparisons
Coverage Analysis Patterns
Quick Coverage Check
# Fast coverage check during development pytest --cov=src --cov-report=term-missing -q tests/unit/
Comprehensive Coverage Analysis
# Full coverage analysis with all reports pytest --cov=src \ --cov-branch \ --cov-report=html \ --cov-report=xml \ --cov-report=term-missing \ --cov-fail-under=80 \ tests/
CI/CD Coverage Check
# Coverage check for CI/CD pipeline pytest --cov=src \ --cov-report=xml \ --cov-report=term \ --cov-fail-under=80 \ tests/
Coverage Gap Investigation
# Find and analyze coverage gaps pytest --cov=src --cov-report=html tests/ # Open htmlcov/index.html # Click on files with low coverage # Review highlighted untested lines
Coverage Metrics and Thresholds
Coverage Targets
By Module Type:
- •Core Business Logic: ≥ 90%
- •Services/APIs: ≥ 85%
- •Utilities/Helpers: ≥ 85%
- •Models/DTOs: ≥ 90%
- •Interfaces/Contracts: ≥ 80%
- •CLI/Main: ≥ 70%
By Coverage Type:
- •Line Coverage: ≥ 80%
- •Branch Coverage: ≥ 75%
- •Function Coverage: ≥ 85%
Overall Project:
- •Minimum: 80%
- •Target: 85%
- •Excellent: 90%+
Acceptable Exclusions
# Acceptable to exclude from coverage
def __repr__(self): # pragma: no cover
return f"Object({self.id})"
if __name__ == "__main__": # pragma: no cover
main()
if TYPE_CHECKING: # pragma: no cover
from typing import Optional
@abstractmethod
def interface_method(self): # pragma: no cover
pass
def debug_helper(): # pragma: no cover
# Debug code not run in production
pass
Coverage Analysis Checklist
Pre-Analysis
- • Tests are running and passing
- • pytest-cov installed
- • Coverage configuration set (.coveragerc or pyproject.toml)
- • Exclusions configured properly
Analysis
- • Line coverage calculated
- • Branch coverage calculated
- • Coverage by module analyzed
- • Coverage gaps identified
- • Critical gaps prioritized
Threshold Validation
- • Overall coverage ≥ 80%
- • Core business logic ≥ 90%
- • Utilities ≥ 85%
- • No critical code untested
- • Branch coverage ≥ 75%
Reporting
- • Terminal report generated
- • HTML report generated (for detailed review)
- • XML report generated (for CI/CD)
- • Coverage summary documented
- • Gaps documented with recommendations
Common Coverage Commands
Quick Reference
# Basic coverage pytest --cov=src tests/ # Coverage with gaps pytest --cov=src --cov-report=term-missing tests/ # Coverage with threshold pytest --cov=src --cov-fail-under=80 tests/ # Branch coverage pytest --cov=src --cov-branch --cov-report=term-missing tests/ # HTML report pytest --cov=src --cov-report=html tests/ # Full analysis pytest --cov=src \ --cov-branch \ --cov-report=html \ --cov-report=term-missing \ --cov-fail-under=80 \ tests/
Coverage Analysis Troubleshooting
Coverage Tool Not Found
# Install pytest-cov pip install pytest-cov # Verify installation pytest --version pip show pytest-cov
Incorrect Coverage (Too Low/High)
# Check source configuration cat .coveragerc cat pyproject.toml # Verify source parameter pytest --cov=src tests/ # Correct pytest --cov tests/ # Wrong - testing test code # Clear coverage cache rm -rf .coverage htmlcov/ pytest --cov=src tests/
Missing Files in Coverage
# Check omit configuration grep -A5 "\[run\]" .coveragerc # Verify files are imported pytest --cov=src --cov-report=term tests/ | grep "filename" # Check test imports grep -r "^import\|^from" tests/
Branch Coverage Not Working
# Enable branch coverage pytest --cov=src --cov-branch tests/ # Check configuration grep "branch" .coveragerc # Verify branches exist grep -r "if\|else\|elif" src/
Integration with Test Runner Specialist
Input: Completed test execution with coverage enabled Process: Analyze coverage, identify gaps, validate thresholds Output: Coverage report with gap analysis and recommendations Next Step: Report to test-runner-specialist for decision
Coverage Analysis Best Practices
Development
- •Check coverage frequently during TDD
- •Aim for >90% coverage on new code
- •Review coverage reports locally
- •Fix coverage gaps before committing
Pre-Commit
- •Verify coverage meets threshold
- •Review coverage diff vs main branch
- •Ensure new code is well tested
- •Check branch coverage for complex logic
CI/CD
- •Generate coverage reports for every build
- •Fail build if coverage below threshold
- •Track coverage trends over time
- •Archive coverage reports
Review
- •Focus on critical paths first
- •Prioritize business logic coverage
- •Don't chase 100% coverage unnecessarily
- •Exclude unreachable code appropriately
Coverage Gap Prioritization
High Priority (Fix Immediately)
- •Core business logic uncovered
- •Error handling paths untested
- •Security-critical code uncovered
- •Data validation missing tests
- •API endpoints without tests
Medium Priority (Fix Soon)
- •Utilities with <80% coverage
- •Branch coverage gaps in logic
- •Edge cases not tested
- •Configuration parsing untested
Low Priority (Fix When Possible)
- •Representation methods (repr, str)
- •Debug/logging code
- •CLI help text
- •Non-critical utilities
Acceptable to Exclude
- •Abstract methods
- •TYPE_CHECKING blocks
- •if name == "main"
- •Platform-specific code not running in CI
- •Deprecated code scheduled for removal
Supporting Resources
- •pytest-cov documentation: https://pytest-cov.readthedocs.io
- •coverage.py documentation: https://coverage.readthedocs.io
- •Coverage best practices: https://testing.googleblog.com
- •Sample .coveragerc: In project root
Success Metrics
- • Coverage calculated accurately
- • Overall coverage ≥ 80%
- • Critical code coverage ≥ 90%
- • Coverage gaps identified
- • Reports generated successfully
- • Thresholds validated
- • Recommendations provided