Quality Dashboards
Turning Raw Data into Decisions
A quality dashboard is not a decoration. It is a decision-support tool. A well-designed dashboard answers the question "What should we do?" within seconds of glancing at it. A poorly designed dashboard generates a second question: "What does this mean?" -- and then gets ignored.
This section covers how to build dashboards for different audiences, choose the right tools and visualizations, and automate data collection so the dashboard stays current without manual effort.
Building Dashboards for Different Audiences
Different audiences need different information at different levels of detail.
Audience Matrix
| Audience | What They Need | Update Frequency | Detail Level |
|---|---|---|---|
| QA Team | Test results, flaky tests, automation progress, blocked tests | Real-time | High (individual test results) |
| Development Team | Build status, test failures in their code, coverage for their PRs | Real-time | Medium (per-PR, per-module) |
| Engineering Manager | Sprint quality summary, defect trends, release readiness | Daily / per sprint | Medium (per-feature, per-sprint) |
| Product Manager | Feature quality status, risk areas, estimated release dates | Per sprint | Low-medium (per-feature) |
| VP / CTO | Overall quality posture, trends, major risks | Weekly / monthly | Low (traffic light, trends) |
Dashboard Design per Audience
QA Team Dashboard -- "The War Room"
┌──────────────────────────────────────────────────────────────┐
│ PIPELINE STATUS Last run: 2 min ago │
│ ✅ Unit Tests (412/412) 18s │
│ ✅ Integration (87/89) 3m 12s [2 failures → details] │
│ ✅ E2E (101/104) 24m 8s [3 failures → details] │
│ ⚠️ Flaky quarantine (8 tests) [trend: ↓ from 12] │
├──────────────────────────────────────────────────────────────┤
│ OPEN BUGS BY SEVERITY │ AUTOMATION PROGRESS │
│ Critical: 1 [→ details] │ Sprint target: 70% │
│ Major: 4 │ Current: 67% ████░░ │
│ Minor: 7 │ New this sprint: +12 tests │
│ Total: 12 (↓ from 15) │ │
├──────────────────────────────────────────────────────────────┤
│ ENVIRONMENT HEALTH │
│ Staging: 🟢 Healthy │ Pre-prod: 🟢 Healthy │
│ CI Runners: 🟢 4/4 online │ Test data: 🟡 Last refresh 3d │
└──────────────────────────────────────────────────────────────┘
Executive Dashboard -- "The Traffic Light"
┌──────────────────────────────────────────────────────────────┐
│ QUALITY POSTURE -- Q1 2026 │
│ │
│ Overall: 🟡 YELLOW (1 critical bug in partner API) │
│ │
│ ┌─────────────┬──────────┬──────────┬──────────┐ │
│ │ Payment │ Search │ User Mgmt│ Admin │ │
│ │ 🟢 │ 🟢 │ 🟢 │ 🟡 │ │
│ └─────────────┴──────────┴──────────┴──────────┘ │
│ │
│ Trend (last 6 sprints): │
│ Escaped defects: 12% → 8% → 6% → 5% → 4% → 4% ✅ │
│ Release cadence: Bi-weekly → Weekly ✅ │
│ Customer complaints: 8 → 6 → 5 → 3 → 2 → 2 ✅ │
│ │
│ ACTION NEEDED: Partner API timeout handling (ETA: Sprint 48)│
└──────────────────────────────────────────────────────────────┘
Tools for Quality Dashboards
Tool Comparison
| Tool | Best For | Pros | Cons | Cost |
|---|---|---|---|---|
| Grafana | Real-time metrics, CI/CD data | Powerful queries, many data sources, alerting | Steep learning curve for non-technical users | Free (open source) |
| Datadog | Full-stack observability + testing | Integrates with CI/CD, APM, logs | Expensive at scale | Paid |
| Allure | Test result reporting | Beautiful reports, framework integrations | Not a general dashboard tool | Free (open source) |
| ReportPortal | Test result aggregation | ML-based flaky test detection, trend analysis | Requires hosting and maintenance | Free (open source) |
| Google Sheets | Quick, shareable dashboards | Everyone can access, no infrastructure | Manual data entry or scripted import, limited visualization | Free |
| Looker / Metabase | Data warehouse dashboards | SQL-based, powerful for cross-source analysis | Requires data pipeline setup | Paid / Free (Metabase) |
| Custom (React/Vue) | Highly specific needs | Exact fit for your workflow | Development and maintenance cost | Free (but time-expensive) |
Choosing the Right Tool
| If Your Situation Is... | Start With |
|---|---|
| Small team, limited budget, need something today | Google Sheets with scripted data import |
| CI/CD-centric team, already using Prometheus/InfluxDB | Grafana |
| Already paying for Datadog for APM | Datadog (add test dashboards to existing setup) |
| Need detailed test reports with history | Allure or ReportPortal |
| Data-heavy organization with a data warehouse | Looker or Metabase |
| Very specific needs that no tool covers | Custom dashboard (last resort) |
Key Visualizations
Trend Lines
Use for: Metrics that change over time (defect escape rate, automation coverage, flaky test rate)
Escaped Defect Rate (%)
12 │ ●
10 │ ●
8 │ ●
6 │ ●
4 │ ● ─ ─ ● ─ ─ ●
2 │ Target: 3%
0 │─────────────────────────
S42 S43 S44 S45 S46 S47 S48
Design principles:
- Always show the target line
- Include at least 6 data points for meaningful trends
- Annotate significant events ("Introduced shift-left practices" at Sprint 44)
Heat Maps
Use for: Risk visualization, test coverage by area, defect distribution
Defect Distribution by Module (Last 6 Sprints)
S42 S43 S44 S45 S46 S47
Payment ░░ ░░ ██ ░░ ░░ ░░
Search ██ ██ ██ ░░ ░░ ░░
User Mgmt ░░ ░░ ░░ ░░ ░░ ░░
Cart ░░ ██ ░░ ░░ ░░ ░░
Partner API ██ ██ ██ ██ ██ ██
Admin ░░ ░░ ░░ ██ ██ ░░
█ = High defect count ░ = Low/zero defects
This immediately shows that Partner API has persistent quality issues requiring structural attention.
Distribution Charts
Use for: Defect severity breakdown, test type distribution, coverage by module
Defect Severity Distribution -- Sprint 47
Critical ██ (2) 5%
Major ████████ (8) 20%
Minor ████████████████████ (20) 50%
Trivial ██████████ (10) 25%
─────────────────────────────────
0 5 10 15 20 25
Bar/Column Charts
Use for: Comparisons between sprints, modules, or teams
| Sprint | Bugs Opened | Bugs Closed | Bug Backlog |
|---|---|---|---|
| S44 | 15 | 12 | 23 |
| S45 | 11 | 14 | 20 |
| S46 | 9 | 13 | 16 |
| S47 | 7 | 11 | 12 |
The backlog is trending down. Opened is trending down faster than closed, which means the team is both fixing more and producing fewer bugs.
Real-Time vs Periodic Reporting
| Characteristic | Real-Time Dashboard | Periodic Report |
|---|---|---|
| Update frequency | Seconds to minutes | Daily, weekly, or per-sprint |
| Best for | Pipeline status, environment health, active sprint testing | Quality trends, release readiness, executive summaries |
| Tool | Grafana, Datadog, custom | Email, Slack bot, PDF |
| Audience | QA team, development team | Managers, executives, stakeholders |
| Risk of overuse | Alert fatigue, micromanagement | Stale data, delayed decisions |
When to Use Each
- Real-time: Active testing phases, release windows, incident response
- Periodic: Sprint reviews, release planning, quarterly reviews, board presentations
Dashboard Design Principles
1. Simplicity
If the viewer needs more than 10 seconds to understand the dashboard's message, it is too complex. Remove anything that does not directly support a decision.
2. Actionability
Every element on the dashboard should answer: "What should I do about this?" If the answer is "nothing," the element should not be on the dashboard.
| Actionable Element | Non-Actionable Element |
|---|---|
| "3 critical bugs open -- fix before release" | "Total tests: 605" |
| "Flaky rate increased to 7% -- investigate" | "Tests run today: 1,814" |
| "Partner API coverage: 40% -- below 60% target" | "Average test execution time: 42ms" |
3. Context
Numbers without context are meaningless. Always include:
- Targets (what good looks like)
- Trends (is it getting better or worse?)
- Comparisons (vs last sprint, vs team average, vs industry benchmark)
4. Progressive Disclosure
Show the summary first. Let the viewer drill down into details if they choose.
Level 1: 🟢 Payment 🟢 Search 🟡 Admin 🔴 Partner API
Level 2 (click on Partner API):
- 3 open bugs (1 critical, 2 major)
- Coverage: 40% (target: 80%)
- Last tested: 3 days ago
Level 3 (click on critical bug):
- BUG-1234: API timeout not handled for batch requests
- Impact: 500 partner transactions/day
- Fix ETA: Sprint 48
Example Dashboard Layouts
Sprint Dashboard
SPRINT 47 QUALITY DASHBOARD
━━━━━━━━━━━━━━━━━━━━━━━━━━
Stories Tested: 18/23 (78%) │ Days Remaining: 3
Bugs Found: 7 │ Bugs Fixed: 5
Bugs Remaining: 2 (0 critical)│ Release Risk: LOW
Test Automation: │ Coverage:
New tests: +12 │ Payment: 95% ✅
Total: 342 │ Search: 72% ⚠️
Pass rate: 98.4% │ User Mgmt: 88% ✅
Flaky: 2.1% │ Admin: 45% ⚠️
Release Dashboard
RELEASE v3.2.0 READINESS
━━━━━━━━━━━━━━━━━━━━━━━━
Overall Status: 🟡 CONDITIONAL GO
Feature Readiness:
Payment flow: [READY] Full test coverage, 0 bugs
User registration: [READY] Full test coverage, 0 bugs
Search: [READY] 2 minor bugs (non-blocking)
Partner API: [BLOCKED] 1 critical bug (ETA: 2 days)
Admin dashboard: [RISK] Not load-tested
Release Conditions:
1. Partner API critical bug fixed and verified
2. Admin load test completed (can be post-release)
Rollback Plan: Feature flag for Partner API, full rollback < 15 min
Automating Dashboard Data Collection
Data Sources and Integration
| Data Source | What It Provides | Integration Method |
|---|---|---|
| CI/CD pipeline (GitHub Actions, GitLab CI, Jenkins) | Test results, build status, deployment events | Webhook / API push to dashboard data store |
| Test frameworks (JUnit, pytest, Playwright) | Pass/fail results, execution time, screenshots | JUnit XML / JSON export, parsed by pipeline |
| Bug tracker (JIRA, Linear, GitHub Issues) | Bug counts, severity, status, cycle time | API polling or webhook on status change |
| Code coverage tools (Istanbul, JaCoCo) | Line/branch/function coverage | Coverage report in CI, parsed and stored |
| APM / monitoring (Datadog, New Relic) | Production error rates, latency, availability | Direct dashboard integration |
| Custom scripts | Flaky test detection, test categorization | Scheduled jobs that push data to the dashboard |
Example: Automated Pipeline to Grafana
# GitHub Actions step that pushes test metrics to Grafana
- name: Push test metrics
run: |
TOTAL=$(cat test-results.json | jq '.total')
PASSED=$(cat test-results.json | jq '.passed')
FAILED=$(cat test-results.json | jq '.failed')
DURATION=$(cat test-results.json | jq '.duration')
curl -X POST "$GRAFANA_PUSH_URL" \
-H "Content-Type: application/json" \
-d "{
\"test_total\": $TOTAL,
\"test_passed\": $PASSED,
\"test_failed\": $FAILED,
\"test_duration_seconds\": $DURATION,
\"branch\": \"$GITHUB_REF\",
\"commit\": \"$GITHUB_SHA\",
\"timestamp\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\"
}"
Keeping Dashboards Current Without Manual Effort
- Automate data collection at every pipeline run (test results, coverage, build status)
- Schedule periodic data pulls for metrics that change less frequently (bug backlog, customer-reported defects)
- Set up alerts for metrics that cross thresholds (flaky rate > 5%, coverage drops below 70%)
- Review dashboard relevance quarterly -- remove metrics nobody looks at, add metrics people are asking for
Hands-On Exercise
- Build a sprint dashboard for your current project using any tool (even a spreadsheet). Include the 5 most important metrics from the Essential QA Metrics section.
- Create an executive traffic light report for your product's top 5 feature areas.
- Identify 3 metrics on your current dashboard (if you have one) that are not actionable. Propose replacements.
- Set up one automated data feed from your CI/CD pipeline to a dashboard tool.
- Design a release readiness dashboard for your next release and share it with your team for feedback.