Testes A/B e Experimentação
Testes A/B medem se uma mudança melhora resultados - conversão, latência ou receita - com divisões de tráfego controladas. Backends Python atribuem variantes do lado do servidor, registram exposições e monitoram barreiras de segurança para que experimentos não se tornem interrupções.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
import hashlib
def variant(user_id: str, experiment: str) -> str:
bucket = int(hashlib.sha256(f"{experiment}:{user_id}".encode()).hexdigest()[:8], 16) % 100
return "B" if bucket < 50 else "A"log.info("experiment_exposure", experiment="checkout_cta", variant=variant(uid, "checkout_cta"))Quando usar isso:
- O produto pergunta "o novo fluxo converte melhor?"
- Mudança de algoritmo de precificação ou ranqueamento precisa de evidências
- Mudança de cópia de UX com etapa de funil mensurável
- Troca de modelo ou heurística com KPI de negócios
Exemplo de Trabalho
"""ab_experiment.py - atribuição, registro de exposição, barreiras de segurança."""
from __future__ import annotations
import hashlib
from dataclasses import dataclass
from enum import Enum
class Variant(str, Enum):
A = "A"
B =
O que isso demonstra:
- Atribuição fixa determinística por usuário e experimento
- Eventos de exposição registrados para denominadores de análise
- Métricas de guarda definidas antecipadamente (latência, erros)
- Lógica de variante permanece do lado do servidor em manipuladores Python
Mergulho Profundo
Como Funciona
- Hipótese - Escrita antes do código; a métrica de sucesso é um KPI primário.
- Proporção da amostra - 50/50 é comum; análise de poder define a duração quando possível.
- Barreiras de segurança - Aborta se a taxa de erro ou p95 degradar além do limite.
- Análise - Use denominadores corretos (usuários expostos), não todo o tráfego.
- Ética/conformidade - Documente PII em logs de experimentos; respeite regiões de opt-out.
Experimento vs. Feature Flag
| Aspecto | Ramp de Feature Flag | Teste A/B |
|---|---|---|
| Objetivo | Entrega segura | Medir resultado |
| Duração | Até estabilizar | Janela fixa |
| Análise | Opcional | Necessária |
| Ramp | 0→100% | Frequentemente divisão fixa |
Notas Python
# Armazena exposições em um esquema amigável para o data warehouse
EXPOSURE_SCHEMA = {
"experiment": str,
"variant": str,
"user_id": str,
"timestamp": str,
}Armadilhas
- Olhar os resultados diariamente e parar cedo - Infla falsos positivos. Correção: Pré-registrar duração ou usar métodos de teste sequencial.
- Atribuição não fixa - Usuários mudam de variante; dados inúteis. Correção: Hash de ID de usuário estável.
- Atribuição do lado do cliente - Enviesada e falsificável. Correção: Servidor atribui; cliente renderiza.
- Ignorar barreiras de segurança - Receita aumenta, interrupções aumentam. Correção: Pausar experimento automaticamente em caso de queima de SLO.
- Múltiplos experimentos colidindo - Efeitos de interação. Correção: Registro de experimentos; limitar sobreposição por superfície.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Bandit multi-braços | Otimização contínua | Necessita de relatório regulatório fixo |
| Replay offline | Ranking de ML | Cópia de UX voltada para o usuário |
| Entrevistas com usuários | Entendimento qualitativo do porquê | Prova de aumento estatístico |
| Modo sombra | Backend arriscado | Mudanças de UI que exigem engajamento |
FAQs
Por quanto tempo executar experimentos de checkout?
Até o tamanho da amostra atingir o alvo de poder ou no máximo 2-4 semanas com revisão semanal.
Podemos testar A/B mudanças de API assíncronas?
Sim - atribua no middleware; meça barreiras de latência por variante.
Quais ferramentas se integram?
PostHog, Optimizely do lado do servidor, ou data warehouse + scipy stats em um job em lote.
Como lidar com usuários da UE?
Respeite os banners de consentimento; exclua ou anonimize de acordo com as orientações legais.
Um experimento por endpoint?
Prefira um primário por etapa do funil; documente sobreposições no registro.
Experimento falhou - e depois?
Envie o controle; arquive os aprendizados; remova o código da variante em um PR de limpeza.
Bayesiano vs. frequentista?
Qualquer um funciona se a equipe concordar; a consistência é mais importante que o dogma.
Experimentar templates Django?
Atribua na view; passe a variante para o contexto do template; registre a exposição na renderização.
A/B de modelo de ML?
Modo sombra ou canário de baixo tráfego com métrica offline + barreiras de segurança online.
Quem é o dono dos experimentos?
O produto define a métrica; a engenharia implementa a atribuição e o registro.
Relacionados
- Feature Flags e Entrega Progressiva - entrega vs. medição
- Métricas DORA - velocidade de entrega de guarda
- Logging Estruturado - eventos de exposição
- Métricas - dashboards de barreiras de segurança
- Priorizando Plataforma e Débito Técnico - backlog de experimentos
Versões do Stack: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, e uv 0.6+.