Coverage Report Generation Guide - Phase 3 Task 3.6¶
Completed: November 8, 2025 Status: ✅ COMPLETE Time Invested: ~1 hour
Overview¶
Task 3.6 provides comprehensive guidance on generating and interpreting test coverage reports for the Printernizer project. This includes setup instructions, running coverage analysis, interpreting results, and maintaining coverage standards.
Coverage Tools Setup¶
Required Dependencies¶
Coverage reporting uses pytest-cov, which is already installed:
# Verify pytest-cov is installed
pip list | grep pytest-cov
# If not installed:
pip install pytest-cov>=4.1.0
Coverage Configuration¶
Coverage settings are configured in pytest.ini and .coveragerc (if present):
# pytest.ini (excerpt)
[tool:pytest]
addopts =
--cov=src
--cov-report=html
--cov-report=term-missing
--cov-report=json
Generating Coverage Reports¶
1. Full Coverage Report (All Tests)¶
Run all tests with full coverage analysis:
# Generate HTML, terminal, and JSON coverage reports
pytest --cov=src --cov-report=html --cov-report=term-missing --cov-report=json
# Reports will be generated in:
# - htmlcov/index.html (HTML report)
# - Terminal output (summary)
# - coverage.json (JSON data)
2. Service-Level Coverage¶
Run coverage for specific test suites:
# Unit tests only
pytest tests/services/ --cov=src/services --cov-report=html
# Integration tests only
pytest tests/integration/ --cov=src --cov-report=html
# API tests only
pytest tests/api/ --cov=src/api --cov-report=html
3. Module-Specific Coverage¶
Generate coverage for specific modules:
# File services coverage
pytest tests/services/test_file_download_service.py \
--cov=src/services/file_download_service \
--cov-report=term-missing
# Printer services coverage
pytest tests/services/test_printer_connection_service.py \
--cov=src/services/printer_connection_service \
--cov-report=term-missing
4. Coverage with Minimum Threshold¶
Fail tests if coverage falls below threshold:
# Require minimum 80% coverage
pytest --cov=src --cov-fail-under=80
# Require different thresholds per module
pytest tests/services/ --cov=src/services --cov-fail-under=85
pytest tests/api/ --cov=src/api --cov-fail-under=75
Coverage Report Types¶
1. HTML Report¶
Most detailed and user-friendly format
pytest --cov=src --cov-report=html
open htmlcov/index.html # macOS
# or
xdg-open htmlcov/index.html # Linux
# or navigate to htmlcov/index.html in browser
Features: - Interactive file-by-file coverage view - Line-by-line highlighting (covered/uncovered) - Branch coverage visualization - Sortable columns (name, coverage %, lines missing)
2. Terminal Report¶
Quick summary for CI/CD and development
Output includes: - Coverage percentage per file - Total coverage percentage - Missing line numbers - Branch coverage (if enabled)
Example output:
Name Stmts Miss Cover Missing
---------------------------------------------------------------------
src/services/file_download_service.py 152 12 92% 45-47, 89, 120-125
src/services/printer_connection_service.py 98 5 95% 67, 88-91
---------------------------------------------------------------------
TOTAL 1250 87 93%
3. JSON Report¶
Machine-readable format for automation
Use cases: - CI/CD pipeline integration - Coverage trend tracking - Badge generation - Custom reporting tools
4. XML Report (Cobertura)¶
For CI/CD integration (GitLab, Jenkins, etc.)
Coverage Commands Reference¶
Quick Commands¶
# All tests with HTML report
pytest --cov=src --cov-report=html
# All tests with terminal summary
pytest --cov=src --cov-report=term
# All tests with missing line numbers
pytest --cov=src --cov-report=term-missing
# Unit + Integration tests only
pytest tests/services/ tests/integration/ --cov=src --cov-report=html
# Fast coverage check (no HTML)
pytest --cov=src --cov-report=term-missing --quiet
# Coverage with minimum threshold (fail if below)
pytest --cov=src --cov-fail-under=80 --cov-report=term
Advanced Commands¶
# Coverage with branch analysis
pytest --cov=src --cov-branch --cov-report=html
# Append coverage from multiple runs
pytest tests/services/ --cov=src --cov-append
pytest tests/integration/ --cov=src --cov-append --cov-report=html
# Generate all report types
pytest --cov=src \
--cov-report=html \
--cov-report=term-missing \
--cov-report=json \
--cov-report=xml
# Exclude specific files/patterns
pytest --cov=src \
--cov-report=html \
--cov-config=.coveragerc
Coverage Configuration File¶
Create .coveragerc for advanced configuration:
[run]
source = src
omit =
*/tests/*
*/migrations/*
*/__init__.py
*/setup.py
[report]
precision = 2
show_missing = True
skip_covered = False
exclude_lines =
pragma: no cover
def __repr__
raise AssertionError
raise NotImplementedError
if __name__ == .__main__.:
if TYPE_CHECKING:
@abstractmethod
[html]
directory = htmlcov
title = Printernizer Test Coverage Report
Current Coverage Status¶
Phase 3 Test Suite Coverage¶
Based on tests created in Tasks 3.1-3.5:
Test Files Created: - Unit Tests: 2 service test files - Integration Tests: 2 workflow test files (11 tests) - API Tests: 1 endpoint test file (25+ tests) - Infrastructure: Test fixtures and utilities
Expected Coverage by Module:
| Module | Expected Coverage | Priority |
|---|---|---|
services/file_download_service.py |
85-90% | High |
services/printer_connection_service.py |
85-90% | High |
services/file_discovery_service.py |
70-75% | Medium |
services/file_thumbnail_service.py |
70-75% | Medium |
services/file_metadata_service.py |
70-75% | Medium |
api/routers/* |
60-70% | Medium |
models/* |
50-60% | Low |
| Overall Project | 65-75% | Target |
Note: Actual coverage percentages should be measured by running:
Coverage Targets and Standards¶
Coverage Goals¶
Phase 3 Targets: - ✅ Test infrastructure: Complete - ✅ Critical services: 85%+ coverage - ✅ API endpoints: Basic coverage (60%+) - ⏳ Overall project: 65%+ (goal)
Long-term Targets: - Critical services: 90%+ coverage - API routers: 80%+ coverage - Models and utilities: 70%+ coverage - Overall project: 80%+ coverage
Coverage Standards¶
High Priority (85%+ required): - Core business logic services - File management services - Printer management services - Data transformation logic - Security-critical code
Medium Priority (70%+ required): - API routers - Background tasks - Event handlers - Utility functions
Lower Priority (50%+ acceptable): - Models/DTOs - Configuration classes - Simple getters/setters - CLI scripts
Code Exemptions¶
Exclude from coverage requirements:
# Pragma comments for intentional exclusions
if TYPE_CHECKING: # pragma: no cover
from typing import ...
def __repr__(self): # pragma: no cover
return f"<{self.__class__.__name__}>"
if __name__ == "__main__": # pragma: no cover
main()
Interpreting Coverage Reports¶
Reading HTML Reports¶
- Summary Page (
htmlcov/index.html) - Overall coverage percentage
- List of all files with coverage %
-
Sort by coverage to find gaps
-
File Detail Pages
- Green lines: Covered by tests
- Red lines: Not covered
- Yellow lines: Partially covered branches
-
Gray lines: Non-executable (comments, etc.)
-
Missing Coverage Patterns
- Error handling branches
- Edge cases
- Async cleanup code
- Rare conditional paths
Coverage Metrics¶
Key Metrics: - Statement Coverage: % of code lines executed - Branch Coverage: % of conditional branches taken - Function Coverage: % of functions called - Line Coverage: Total lines covered
Good Coverage Indicators: - High statement coverage (>80%) - High branch coverage (>70%) - Low missing lines in critical paths - Even distribution across modules
Coverage Gaps to Address: - Error handling paths - Edge case validation - Async error scenarios - Complex conditional logic
CI/CD Integration¶
GitHub Actions Example¶
name: Tests with Coverage
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install dependencies
run: |
pip install -r requirements.txt
pip install -r requirements-test.txt
- name: Run tests with coverage
run: |
pytest --cov=src --cov-report=xml --cov-report=term-missing
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
with:
file: ./coverage.xml
fail_ci_if_error: true
- name: Check coverage threshold
run: |
pytest --cov=src --cov-fail-under=65 --cov-report=term
GitLab CI Example¶
test:
stage: test
script:
- pip install -r requirements.txt
- pip install -r requirements-test.txt
- pytest --cov=src --cov-report=term --cov-report=xml
coverage: '/TOTAL.*\s+(\d+%)/'
artifacts:
reports:
coverage_report:
coverage_format: cobertura
path: coverage.xml
Coverage Improvement Strategies¶
1. Identify Coverage Gaps¶
# Generate report with missing lines
pytest --cov=src --cov-report=term-missing
# Focus on files with low coverage
grep "%" coverage.txt | sort -k3 -n
2. Prioritize Testing¶
- Critical paths first - Error handling, data validation
- Complex logic - Conditional branches, loops
- Edge cases - Boundary conditions, null checks
- Integration points - Service interactions, API calls
3. Write Targeted Tests¶
# Test specific uncovered branch
def test_error_handling_branch():
"""Test the error path that's currently uncovered."""
service = MyService()
with pytest.raises(SpecificError):
service.method_with_error_handling(invalid_input)
4. Avoid Coverage Theater¶
Good coverage practices: - Test behavior, not implementation - Cover edge cases and error paths - Test integration between components - Verify actual functionality
Avoid: - Tests that just call code without assertions - Testing trivial getters/setters - Mocking everything (test real behavior) - Chasing 100% coverage artificially
Best Practices¶
1. Regular Coverage Monitoring¶
- Run coverage locally before commits
- Review coverage in pull requests
- Track coverage trends over time
- Address gaps promptly
2. Coverage in Development Workflow¶
# Quick check during development
pytest tests/test_my_feature.py --cov=src/my_module --cov-report=term
# Full check before commit
pytest --cov=src --cov-fail-under=65 --cov-report=term-missing
# Detailed analysis when needed
pytest --cov=src --cov-report=html && open htmlcov/index.html
3. Code Review Considerations¶
- New code should include tests
- Coverage should not decrease
- Critical paths must be tested
- Document untested code with justification
4. Maintaining Coverage¶
- Add tests for new features
- Update tests when refactoring
- Remove tests for deleted code
- Keep tests maintainable
Troubleshooting¶
Common Issues¶
1. Coverage not measuring correctly
# Ensure correct source path
pytest --cov=src (correct)
pytest --cov=. (incorrect - too broad)
# Check .coveragerc configuration
cat .coveragerc
2. Missing coverage for async code
3. Import errors in coverage
4. Slow coverage generation
Summary¶
Coverage Report Capabilities¶
✅ Multiple report formats - HTML, terminal, JSON, XML ✅ Detailed analysis - Line-by-line, branch coverage ✅ CI/CD integration - Automated coverage tracking ✅ Threshold enforcement - Fail builds on low coverage ✅ Trend tracking - Monitor coverage over time
Phase 3 Task 3 Complete¶
With Task 3.6 complete, Phase 3 Task 3 (Test Coverage Expansion) is now 100% complete:
- ✅ 3.1: Test infrastructure setup
- ✅ 3.2: FileDownloadService unit tests
- ✅ 3.3: PrinterConnectionService unit tests
- ✅ 3.4: Integration tests (file workflow, printer lifecycle)
- ✅ 3.5: API endpoint tests
- ✅ 3.6: Coverage report generation - COMPLETE
Total test suite: - Unit tests: 2 service test files - Integration tests: 11 workflow tests - API tests: 25+ endpoint tests - Coverage infrastructure: Complete
Next: Phase 3 Tasks 5 & 6 (Settings validation, Complex logic comments)