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
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:
- Definir KPIs – Alinhados com objetivos
- Automatizar coleta – CI/CD integration
- Visualizar – Dashboards claros
- Analisar tendências – Não só snapshots
- Agir – Métricas sem ação não valem nada
