annator-command-center / tests /docs /COVERAGE_TRENDING_GUIDE.md
techprotrade's picture
Deploy ATOM FastAPI command center runtime (part 7)
cc036ff verified
|
Raw
History Blame Contribute Delete
24 kB
# 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 <run-id> --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 <run-id> -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 <run-id> --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