# Coverage Trending Guide **Last Updated:** March 7, 2026 **Purpose:** Track coverage changes over time, detect regressions, visualize trends **Data Retention:** 30-day rolling history, 90-day regression log --- ## Overview The Coverage Trending Infrastructure provides automated tracking of test coverage across all platforms (Backend, Frontend, Mobile, Desktop) with weighted overall coverage calculation. This system enables: - **Historical Tracking:** Per-commit coverage data with platform breakdown - **Regression Detection:** Automatic identification of coverage drops >1% threshold - **Visual Dashboard:** Self-contained HTML dashboard with matplotlib charts - **CI/CD Integration:** Automated trending on every push/PR to main/develop - **External Analysis:** Export trending data to CSV/JSON/Excel formats ### Components | Component | Purpose | Location | |-----------|---------|----------| | **Trend Analyzer** | Detect regressions, validate data integrity | `backend/tests/scripts/coverage_trend_analyzer.py` | | **Dashboard Generator** | Create HTML visualization with matplotlib charts | `backend/tests/scripts/generate_coverage_dashboard.py` | | **CI/CD Workflow** | Automated trending on every build | `.github/workflows/coverage-trending.yml` | | **Export Utility** | Export data for external analysis | `backend/tests/scripts/coverage_trend_export.py` | ### Platform Coverage Weights | Platform | Weight | Rationale | |----------|--------|-----------| | Backend | 40% | Core business logic, API contracts, data layer | | Frontend | 30% | User interface, client-side validation | | Mobile | 20% | React Native app, device integration | | Desktop | 10% | Tauri desktop app, platform-specific features | **Overall Coverage Formula:** ``` overall = (backend * 0.40) + (frontend * 0.30) + (mobile * 0.20) + (desktop * 0.10) ``` ### Data Retention Policy - **Trending History:** 30-day rolling window (auto-pruned via `--prune` flag) - **Regression Log:** 90-day retention (persistent log for audit trails) - **CI/CD Artifacts:** 30-day retention (GitHub Actions default) - **Dashboard HTML:** Self-contained, no external dependencies, permanent storage --- ## Quick Start ### Local Development Setup **1. Install Dependencies** ```bash # Core dependencies (required) pip install matplotlib pandas jsonschema # Optional: Excel export support pip install openpyxl ``` **2. Run Trend Analyzer** ```bash # Basic regression detection cd backend python tests/scripts/coverage_trend_analyzer.py \ --trending-file tests/coverage_reports/metrics/cross_platform_trend.json # Custom regression threshold python tests/scripts/coverage_trend_analyzer.py \ --regression-threshold 2.0 \ --format markdown # JSON output for CI/CD integration python tests/scripts/coverage_trend_analyzer.py \ --format json \ --output tests/coverage_reports/metrics/coverage_regressions.json ``` **3. Generate Dashboard** ```bash # Generate 30-day trend dashboard python tests/scripts/generate_coverage_dashboard.py \ --trending-file tests/coverage_reports/metrics/cross_platform_trend.json \ --output tests/coverage_reports/dashboards/coverage_trend_30d.html \ --days 30 # Custom dimensions (larger charts) python tests/scripts/generate_coverage_dashboard.py \ --trending-file tests/coverage_reports/metrics/cross_platform_trend.json \ --output tests/coverage_reports/dashboards/coverage_trend_30d.html \ --days 30 \ --width 1600 \ --height 900 ``` **4. Export Historical Data** ```bash # Export last 30 days to CSV python tests/scripts/coverage_trend_export.py \ --format csv \ --days 30 \ --output coverage_export.csv # Export all history to JSON python tests/scripts/coverage_trend_export.py \ --format json \ --days 0 \ --output coverage_export_all.json # Export to Excel (requires openpyxl) python tests/scripts/coverage_trend_export.py \ --format excel \ --days 90 \ --output coverage_export_quarterly.xlsx ``` ### CI/CD Setup **Workflow Triggers:** - Push to `main` or `develop` branches - Pull requests to `main` or `develop` branches - Manual dispatch via GitHub Actions UI **Artifacts Available:** - `coverage-trend-dashboard` (HTML) - 30-day retention - `coverage-trending-data` (JSON files) - 30-day retention **Job Summaries:** - Automatic posting to GitHub Actions UI - Trend report with +/- indicators per platform - Regression alerts with severity levels (warning/critical) **No Configuration Required:** - Uses existing coverage files from `unified-tests-parallel.yml` - Downloads artifacts automatically from 4 platform jobs - Generates dashboard and uploads artifacts - Posts trend report as job summary --- ## Script Reference ### coverage_trend_analyzer.py **Purpose:** Detect significant coverage regressions and validate historical data integrity. **Usage:** ```bash python coverage_trend_analyzer.py [options] ``` **Options:** | Option | Type | Default | Description | |--------|------|---------|-------------| | `--trending-file PATH` | string | `tests/coverage_reports/metrics/cross_platform_trend.json` | Path to trending data file | | `--regression-threshold FLOAT` | float | `1.0` | Regression threshold in percentage points | | `--output PATH` | string | `tests/coverage_reports/metrics/coverage_regressions.json` | Path to regression output file | | `--periods INT` | int | `7` | Number of periods to compare for trend | | `--format FORMAT` | string | `text` | Output format: `text`, `json`, `markdown` | **Exit Codes:** - `0` - Success (no critical regressions) - `1` - Critical regressions detected (threshold >5%) **Examples:** ```bash # Text output (human-readable) python coverage_trend_analyzer.py --format text # JSON output (CI/CD integration) python coverage_trend_analyzer.py --format json --output regressions.json # Markdown output (PR comments) python coverage_trend_analyzer.py --format markdown --regression-threshold 2.0 # Custom trending file python coverage_trend_analyzer.py --trending-file /path/to/custom_trend.json ``` **Output Format (Text):** ``` Coverage Trend Analysis ======================== Current Coverage: 72.3% (overall) Historical Average (7 periods): 71.8% Trend: +0.5% (improving) Platform Breakdown: - Backend: 85.2% (+1.2%) - Frontend: 68.4% (-0.8%) - Mobile: 52.1% (+0.3%) - Desktop: 78.9% (+0.5%) Regressions Detected: 2 ⚠️ WARNING: Frontend coverage dropped 0.8% (threshold: 1.0%) ⚠️ WARNING: Mobile coverage dropped 1.5% (threshold: 1.0%) ``` **Output Format (JSON):** ```json { "current_coverage": 72.3, "historical_average": 71.8, "trend_delta": 0.5, "platforms": { "backend": {"current": 85.2, "delta": 1.2}, "frontend": {"current": 68.4, "delta": -0.8}, "mobile": {"current": 52.1, "delta": -1.5}, "desktop": {"current": 78.9, "delta": 0.5} }, "regressions": [ { "platform": "mobile", "current_coverage": 52.1, "previous_coverage": 53.6, "delta": -1.5, "severity": "warning", "detected_at": "2026-03-07T19:30:00Z" } ] } ``` --- ### generate_coverage_dashboard.py **Purpose:** Generate self-contained HTML dashboard with matplotlib charts for coverage visualization. **Usage:** ```bash python generate_coverage_dashboard.py [options] ``` **Options:** | Option | Type | Default | Description | |--------|------|---------|-------------| | `--trending-file PATH` | string | `tests/coverage_reports/metrics/cross_platform_trend.json` | Path to trending data file | | `--output PATH` | string | `coverage_trend_30d.html` | Path to output HTML file | | `--days INT` | int | `30` | Number of days to include in dashboard | | `--width INT` | int | `1200` | Chart width in pixels | | `--height INT` | int | `600` | Chart height in pixels | **Output:** - Self-contained HTML file with embedded CSS/JavaScript - Matplotlib charts encoded as base64 images - No external dependencies (works offline) - Responsive design for desktop/tablet/mobile viewing **Examples:** ```bash # Generate 30-day dashboard (default) python generate_coverage_dashboard.py # Generate 90-day dashboard python generate_coverage_dashboard.py --days 90 --output coverage_trend_90d.html # High-resolution dashboard (4K displays) python generate_coverage_dashboard.py --width 2560 --height 1440 # Custom trending file python generate_coverage_dashboard.py --trending-file /path/to/custom_trend.json ``` **Dashboard Sections:** 1. **Overall Coverage Trend** - Line chart showing weighted overall coverage over time 2. **Platform Breakdown** - Stacked area chart with per-platform coverage 3. **Regression Events** - Scatter plot highlighting regression points 4. **Summary Statistics** - Table with min/max/avg/current coverage per platform 5. **Commit History** - Timeline of coverage changes with commit SHAs --- ### coverage_trend_export.py **Purpose:** Export trending data for external analysis (Excel, BI tools, custom scripts). **Usage:** ```bash python coverage_trend_export.py [options] ``` **Options:** | Option | Type | Default | Description | |--------|------|---------|-------------| | `--trending-file PATH` | string | `tests/coverage_reports/metrics/cross_platform_trend.json` | Path to trending data file | | `--output PATH` | string | `coverage_export.csv` | Path to output file | | `--format FORMAT` | string | `csv` | Export format: `csv`, `json`, `excel` | | `--days INT` | int | `30` | Number of days to export (0 for all history) | **Export Formats:** **CSV Format:** ```csv timestamp,overall_coverage,backend,frontend,mobile,desktop,commit_sha,branch 2026-03-07T19:30:00Z,72.3,85.2,68.4,52.1,78.9,abc123,main 2026-03-06T14:15:00Z,71.8,84.0,69.2,51.8,78.4,def456,develop ... ``` **JSON Format:** ```json { "export_time": "2026-03-07T19:30:00Z", "total_entries": 30, "filtered_entries": 30, "date_range": { "start": "2026-02-06T00:00:00Z", "end": "2026-03-07T19:30:00Z" }, "history": [ { "timestamp": "2026-03-07T19:30:00Z", "overall_coverage": 72.3, "platforms": { "backend": 85.2, "frontend": 68.4, "mobile": 52.1, "desktop": 78.9 }, "commit_sha": "abc123", "branch": "main" } ] } ``` **Excel Format:** - **Sheet 1: Summary** - Overall stats, platform breakdown, min/max/avg/current - **Sheet 2: History** - Time series data with all columns - Formatted with headers, column widths, number formats - Requires `openpyxl` dependency (`pip install openpyxl`) **Examples:** ```bash # Export last 30 days to CSV python coverage_trend_export.py --format csv --days 30 # Export all history to JSON python coverage_trend_export.py --format json --days 0 # Export last 90 days to Excel python coverage_trend_export.py --format excel --days 90 --output quarterly_report.xlsx # Custom output path python coverage_trend_export.py --output /tmp/coverage_data.csv ``` --- ## CI/CD Integration ### Workflow: coverage-trending.yml **Location:** `.github/workflows/coverage-trending.yml` **Triggers:** - `push` to `main` or `develop` branches - `pull_request` to `main` or `develop` branches - `workflow_dispatch` (manual trigger via GitHub Actions UI) **Dependencies:** - `unified-tests-parallel.yml` (test-platform job) - Waits for all 4 platform tests to complete (backend, frontend, mobile, desktop) **Workflow Steps:** 1. **Download Artifacts** - Downloads coverage artifacts from all 4 platform jobs 2. **Run Cross-Platform Coverage Gate** - Computes weighted overall coverage 3. **Update Trending Data** - Appends new entry with commit SHA and branch tracking 4. **Detect Regressions** - Analyzes trends for significant drops (>1% threshold) 5. **Generate Dashboard** - Creates 30-day trend HTML dashboard 6. **Upload Artifacts** - Uploads dashboard and trending data (30-day retention) 7. **Post Job Summary** - Creates GitHub Actions job summary with trend report 8. **Post Regression Alerts** - Comments on PR with regression details 9. **Fail Build** - Exits with error if critical regressions detected (>5% threshold) **Artifacts:** | Artifact | Contents | Retention | |----------|----------|-----------| | `coverage-trend-dashboard` | HTML dashboard (30-day trend) | 30 days | | `coverage-trending-data` | `cross_platform_trend.json`, `coverage_regressions.json` | 30 days | **Job Summaries:** - Automatic posting to GitHub Actions UI - Includes overall coverage trend, platform breakdown, regression events - Accessible via "Summary" button in workflow run page **PR Comments:** - Automatic posting on pull_request events - Includes coverage trend with +/- indicators per platform - Links to dashboard artifact for detailed visualization - Regression alerts with severity levels **Regression Alerts:** - **Warning:** Coverage drop >1% threshold (logged, doesn't fail build) - **Critical:** Coverage drop >5% threshold (fails build on main branch) - Includes platform name, current/previous coverage, delta percentage --- ## Data Schema ### cross_platform_trend.json **Structure:** ```json { "history": [ { "timestamp": "2026-03-07T19:30:00Z", "overall_coverage": 72.3, "platforms": { "backend": 85.2, "frontend": 68.4, "mobile": 52.1, "desktop": 78.9 }, "thresholds": { "backend": 80.0, "frontend": 80.0, "mobile": 60.0, "desktop": 70.0 }, "commit_sha": "abc123def456", "branch": "main" } ], "latest": { "timestamp": "2026-03-07T19:30:00Z", "overall_coverage": 72.3, "platforms": { "backend": 85.2, "frontend": 68.4, "mobile": 52.1, "desktop": 78.9 } }, "platform_trends": { "backend": { "current": 85.2, "average": 84.5, "min": 82.1, "max": 86.0 } }, "computed_weights": { "backend": 0.4, "frontend": 0.3, "mobile": 0.2, "desktop": 0.1 } } ``` **Entry Structure:** | Field | Type | Required | Description | |-------|------|----------|-------------| | `timestamp` | string | Yes | ISO 8601 timestamp with Z suffix (UTC) | | `overall_coverage` | float | Yes | Weighted overall coverage percentage (0-100) | | `platforms` | object | Yes | Per-platform coverage dict (backend, frontend, mobile, desktop) | | `thresholds` | object | Yes | Platform thresholds at time of recording | | `commit_sha` | string | No | Git commit SHA (optional, for CI/CD tracking) | | `branch` | string | No | Git branch name (optional, for CI/CD tracking) | --- ### coverage_regressions.json **Structure:** ```json { "regressions": [ { "platform": "mobile", "current_coverage": 52.1, "previous_coverage": 53.6, "delta": -1.5, "severity": "warning", "detected_at": "2026-03-07T19:30:00Z", "commit_sha": "abc123def456" } ], "metadata": { "regression_threshold": 1.0, "critical_threshold": 5.0, "retention_days": 90, "last_updated": "2026-03-07T19:30:00Z" } } ``` **Regression Entry Structure:** | Field | Type | Required | Description | |-------|------|----------|-------------| | `platform` | string | Yes | Affected platform name (backend, frontend, mobile, desktop) | | `current_coverage` | float | Yes | Coverage after regression (percentage) | | `previous_coverage` | float | Yes | Coverage before regression (percentage) | | `delta` | float | Yes | Percentage change (negative for regression) | | `severity` | string | Yes | Severity level: `warning` (>1%), `critical` (>5%) | | `detected_at` | string | Yes | ISO 8601 timestamp when regression detected | | `commit_sha` | string | No | Associated commit SHA (optional) | --- ## Troubleshooting ### Missing Coverage Files **Symptoms:** - Trend analyzer reports "No trending data found" - Dashboard shows empty charts - CI/CD workflow fails to download artifacts **Solutions:** 1. **Check unified-tests-parallel.yml artifact uploads:** ```bash # Verify workflow uploaded artifacts gh run list --workflow=unified-tests-parallel.yml --limit 5 gh run view --log ``` 2. **Verify platform test jobs completed successfully:** - Check GitHub Actions UI for platform job status - Look for "backend-coverage", "frontend-coverage", "mobile-coverage", "desktop-coverage" artifacts - Re-run failed jobs if needed 3. **Check artifact retention policy:** - GitHub Actions artifacts have 7-day default retention - coverage-trending.yml extends retention to 30 days - Artifacts >30 days old are automatically deleted 4. **Manual artifact download (debug):** ```bash # Download artifact via GitHub CLI gh run download -n backend-coverage # Verify coverage file exists ls -la coverage/backend/coverage.json ``` --- ### Dashboard Not Rendering **Symptoms:** - HTML file opens but shows blank page - Charts display as broken images - JavaScript errors in browser console **Solutions:** 1. **Verify matplotlib installed:** ```bash pip show matplotlib # If not installed: pip install matplotlib ``` 2. **Check HTML file size:** ```bash # HTML should be >50KB (contains base64-encoded charts) ls -lh coverage_trend_30d.html # If <10KB, charts may not have been generated ``` 3. **Open browser console for JavaScript errors:** - Chrome/Edge: F12 → Console tab - Firefox: F12 → Console tab - Look for errors like "Uncaught ReferenceError" or "Failed to load resource" 4. **Regenerate dashboard with verbose output:** ```bash python generate_coverage_dashboard.py --days 30 --output test.html # Check console output for matplotlib errors ``` --- ### False Positive Regressions **Symptoms:** - Regression alerts for normal coverage fluctuations - Threshold too sensitive for platform with high variance - Regression detected immediately after adding new tests **Solutions:** 1. **Adjust regression threshold:** ```bash # Increase threshold from 1.0% to 2.0% python coverage_trend_analyzer.py --regression-threshold 2.0 ``` 2. **Check for flaky test coverage:** - Some tests have non-deterministic coverage (random data, time-based logic) - Exclude flaky tests from coverage measurement using `.coveragerc` - Stabilize tests with mocking/fixed data 3. **Verify 30-day pruning not removing valid data:** ```bash # Check trending data file size ls -lh cross_platform_trend.json # Should have 30+ entries (one per day) # If only 1-2 entries, pruning may be too aggressive ``` 4. **Use moving average for smoothing:** - Trend analyzer uses 7-period moving average by default - Increase `--periods` to 14 or 30 for smoother trends ```bash python coverage_trend_analyzer.py --periods 14 ``` --- ### CI/CD Workflow Not Triggering **Symptoms:** - Workflow doesn't run on push/PR - Manual dispatch option not available - Workflow fails immediately with "Workflow not found" **Solutions:** 1. **Check branch name:** - Workflow only triggers on `main` and `develop` branches - Feature branches (e.g., `feature/new-ui`) won't trigger trending - Update workflow triggers if needed: ```yaml on: push: branches: [main, develop, feature/*] ``` 2. **Verify workflow file syntax:** ```bash # Validate YAML syntax yamllint .github/workflows/coverage-trending.yml # Or use GitHub CLI: gh workflow view coverage-trending.yml --yaml ``` 3. **Check GitHub Actions permissions:** - Repository settings → Actions → General → Workflow permissions - Ensure "Read and write permissions" is enabled - Check "Allow GitHub Actions to create and approve pull requests" 4. **Manual workflow trigger (debug):** ```bash # Trigger workflow manually gh workflow run coverage-trending.yml # View workflow run logs gh run list --workflow=coverage-trending.yml --limit 1 gh run view --log ``` --- ## Best Practices ### Running Trending Analysis - **Run after every significant code change** - Catch regressions early - **Review dashboard weekly** - Look for trend patterns (gradual decline, plateau) - **Investigate regressions >2% immediately** - Small drops compound over time - **Archive historical data monthly** - Download full export for long-term analysis ### Adjusting Platform Weights - **Review quarterly** - Business priorities change (new platforms, deprecation) - **Update in `cross_platform_coverage_gate.py`** - Modify `PLATFORM_WEIGHTS` dict - **Document rationale** - Add comment explaining weight change - **Communicate to team** - Update team on new overall coverage calculation ### Regression Thresholds - **Keep at 1% for early warning** - Catches small drops before they compound - **Use 5% for critical failures** - Fails main branch builds on significant regressions - **Adjust per-platform if needed** - Some platforms have higher variance (mobile, desktop) - **Document threshold changes** - Track in ROADMAP.md or project wiki ### Data Retention - **30-day trending history** - Sufficient for short-term trend analysis - **90-day regression log** - Audit trail for quality metrics - **Monthly archives** - Export full history to JSON for permanent storage - **CI/CD artifacts** - 30-day GitHub Actions retention (extendable to 90 days) --- ## Reference ### Platform-Specific Testing Guides - **[Frontend Testing Guide](../../docs/FRONTEND_TESTING_GUIDE.md)** - Jest coverage targets and per-module thresholds - **[Mobile Testing Guide](../../docs/MOBILE_TESTING_GUIDE.md)** - jest-expo coverage for React Native - **[Desktop Testing Guide](../../docs/DESKTOP_TESTING_GUIDE.md)** - tarpaulin coverage for Rust/Tauri ### Related Documentation - **PARALLEL_EXECUTION_GUIDE.md** - Test execution strategy and CI/CD workflow - **CROSS_PLATFORM_COVERAGE.md** - Coverage thresholds and weighted calculation - **ROADMAP.md** - Phase 150 quality infrastructure details ### Related Scripts - **cross_platform_coverage_gate.py** - Coverage threshold enforcement - **update_cross_platform_trending.py** - Data tracking and commit history - **ci_status_aggregator.py** - Test results aggregation ### File Locations | Type | Location | |------|----------| | **Scripts** | `backend/tests/scripts/` | | **Data** | `backend/tests/coverage_reports/metrics/` | | **Dashboards** | `backend/tests/coverage_reports/dashboards/` | | **Docs** | `backend/tests/docs/` | | **Workflows** | `.github/workflows/` | ### Quick Command Reference ```bash # Run trend analyzer python backend/tests/scripts/coverage_trend_analyzer.py # Generate dashboard python backend/tests/scripts/generate_coverage_dashboard.py --days 30 # Export data python backend/tests/scripts/coverage_trend_export.py --format csv --days 30 # CI/CD workflow trigger gh workflow run coverage-trending.yml # View latest workflow run gh run list --workflow=coverage-trending.yml --limit 1 gh run view $(gh run list --workflow=coverage-trending.yml --limit 1 --json databaseId --jq '.[0].databaseId') --log ``` --- **Last Updated:** March 7, 2026 **Maintained By:** Atom Quality Infrastructure Team **Questions?** See ROADMAP.md Phase 150 or open GitHub issue