Metrics de QA: KPIs e Dashboards para Equipes de Qualidade

Introdução a Qualidade de Software · 6 de julho de 2026

📖 3 min de leitura

Por Que Métricas?

  • Visibilidade – Entender estado do projeto
    1. Tendências – Evolução ao longo do tempo
    2. Decisões – Base para ações
    3. Accountability – Responsabilidade clara

Métricas de Teste

Cobertura

def test_coverage_metrics():
    return {
        "code_coverage": {
            "line": 85,  # {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}
            "branch": 78,
            "function": 90
        },
        "requirement_coverage": 95,  # {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}
        "risk_coverage": 80,  # {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}
        "test_efficiency": {
            "bugs_found": 15,
            "tests_executed": 500,
            "ratio": 0.03  # 3 bugs por 100 testes
        }
    }

Execution Metrics

def execution_metrics():
    return {
        "total_tests": 1000,
        "passed": 950,
        "failed": 30,
        "blocked": 10,
        "skipped": 10,
        "pass_rate": 95,  # {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}
        "flaky_rate": 2,  # {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}
        "execution_time": {
            "total_minutes": 45,
            "average_per_test_seconds": 2.7
        }
    }

Métricas de Defeitos

class DefectMetrics:
    def __init__(self, data):
        self.data = data

def defect_leakage(self):
"""{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de defeitos encontrados em produção"""
prod = self.data['bugs_in_prod']
total = self.data['total_bugs']
return (prod / total) * 100 if total else 0

def defect_density(self):
"""Defeitos por 1000 linhas"""
bugs = self.data['total_bugs']
loc = self.data['lines_of_code']
return (bugs / loc) * 1000

def escape_rate(self):
"""{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de defeitos escapados para prod"""
return self.defect_leakage()

def mtbf(self):
"""Mean Time Between Failures"""
return self.data['uptime_hours'] / self.data['incidents']

def mttr(self):
"""Mean Time To Repair"""
return sum(r['time_to_fix'] for r in self.data['incidents']) / len(self.data['incidents'])


DORA Metrics

Deployment Frequency

def deployment_frequency(days=30):
    """
    Elite: On-demand ou múltiplas vezes ao dia
    High: Entre diária e semanal
    Medium: Entre semanal e mensal
    Low: Mensal ou menos
    """
    deploys = get_deployments(days)
    return {
        "count": len(deploys),
        "frequency": len(deploys) / days,  # por dia
        "rating": "elite" if len(deploys) >= days * 2 else "high" if len(deploys) >= days else "medium"
    }

Lead Time for Changes

def lead_time(days=30):
    """
    Elite:  1 mês
    """
    changes = get_changes(days)
    avg_hours = sum(c['lead_time_hours'] for c in changes) / len(changes)
    return {
        "average_hours": avg_hours,
        "p95_hours": calculate_percentile(changes, 95),
        "rating": "elite" if avg_hours < 1 else "high" if avg_hours < 24 else "medium"
    }

Dashboard

# Grafana Dashboard - QA Metrics

panels:
- title: "Test Pass Rate"
type: gauge
targets:
- expr: "sum(test_passed) / sum(test_total) * 100"
thresholds:
- value: 90
color: yellow
- value: 95
color: green

- title: "Code Coverage Trend"
type: timeseries
targets:
- expr: "code_coverage_percent"
legendFormat: "Coverage {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}"

- title: "Defect Leakage"
type: stat
targets:
- expr: "defects_in_prod / total_defects * 100"
unit: percent

- title: "DORA Metrics"
type: table
targets:
- expr: "deployment_frequency"
- expr: "lead_time_hours"
- expr: "mttr_minutes"
- expr: "change_failure_rate"


Conclusão

Métricas guiam melhoria. As chaves são:

  1. Definir KPIs – Alinhados com objetivos
  2. Automatizar coleta – CI/CD integration
  3. Visualizar – Dashboards claros
  4. Analisar tendências – Não só snapshots
  5. Agir – Métricas sem ação não valem nada