# Metrics de QA: KPIs e Dashboards para Equipes de Qualidade

**Meta Description:** Aprenda a definir e acompanhar métricas de QA: cobertura, defeitos, velocity, DORA metrics, como criar dashboards efetivos.

---

## Por Que Métricas?

- **Visibilidade** - Entender estado do projeto
- **Tendências** - Evolução ao longo do tempo
- **Decisões** - Base para ações
- **Accountability** - Responsabilidade clara

---

## Métricas de Teste

### Cobertura

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

### Execution Metrics

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

---

## Métricas de Defeitos

```python
class DefectMetrics:
    def __init__(self, data):
        self.data = data
    
    def defect_leakage(self):
        """% 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):
        """% 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

```python
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

```python
def lead_time(days=30):
    """
    Elite: < 1 hora
    High: 1 dia - 1 semana
    Medium: 1-6 semanas
    Low: > 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

```yaml
# 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 %"

  - 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
