Módulo 5: Relatar bug
A anatomia de um relatório que é corrigido, severidade × prioridade, e o ciclo de vida do defeito
Aquecimento: 2 perguntas do Módulo 4
1. O que uma carta de teste precisa ter?
Explorar (a área), com (dados, contas, ferramentas) e para
(que risco ou informação você busca), mais tempo marcado.
2. O que é um oráculo?
O que te permite afirmar que algo está errado: a especificação, a consistência
interna, o comportamento anterior, o propósito, e os dados no banco.
O relatório é o produto do seu trabalho
Um defeito que você encontrou mas ninguém conseguiu reproduzir não vai ser corrigido. Nesse caso o trabalho de achar foi desperdiçado, e, pior, você gastou o tempo de outra pessoa tentando entender.
Por isso: o relatório é a entrega. Ele tem um leitor específico, quem vai corrigir, e um objetivo único: fazer essa pessoa ver o problema na máquina dela, sozinha, em menos de dois minutos. Tudo que serve a isso entra; tudo que não serve, sai.
Anatomia
| Campo | Para que serve |
|---|---|
| Título | a pessoa decide em 3 segundos se é com ela. É o campo mais lido e o mais maltratado. |
| Ambiente e versão | dev / homolog / produção, versão do sistema, navegador e aparelho. Sem isso, "na minha máquina funciona" é inevitável. |
| Pré-condições | o estado necessário antes de começar: que tipo de usuário, que dado precisa existir. |
| Passos | numerados, do zero, sem pular nada que pareça óbvio. Quem lê não estava lá. |
| Resultado esperado | o que deveria acontecer, e por quê: a regra, a história, a tela de referência. |
| Resultado obtido | o que aconteceu de fato. Descreva, não interprete. |
| Evidência | print, vídeo curto, log, resposta da API, a linha do banco. Uma imagem economiza um parágrafo. |
| Severidade e prioridade | dois campos diferentes, a seção abaixo é inteira sobre isso. |
Título: a fórmula que funciona
[onde] o quê acontece [quando / em que condição]
| Ruim | Bom |
|---|---|
| Erro no checkout | [Checkout] Frete cobrado em pedido acima de R$ 300, que deveria ser grátis |
| Não funciona | [Login] Botão "Entrar" não responde no Safari iOS 17 |
| Bug no carrinho urgente!!! | [Carrinho] Cupom continua aplicado após remover itens e ficar abaixo do mínimo de R$ 50 |
Teste do título: se a pessoa ler só ele e conseguir dizer onde procurar no código, está bom.
Antes e depois
❌ Como chega (e volta)
Título: desconto errado
Descrição: testei o desconto e veio errado, acho que o
cálculo está trocado. Dá uma olhada aí.
Problemas: título não diz onde nem o quê; não dá pra reproduzir; não diz qual valor veio nem qual era o esperado; não diz o ambiente; e chuta o defeito em vez de relatar a falha (Módulo 1). O resultado previsível é a pergunta "como você fez?" e mais um dia perdido.
✅ Como deveria chegar
Título: [Checkout] Desconto de 25% aplicado para cliente VIP com cupom,
quando o esperado é 20%
Ambiente: homolog, v2.14.0 — Chrome 128, Windows 11
Pré-condições:
- cliente com perfil VIP (usei vip.teste@exemplo.com)
- cupom PROMO15 ativo e ainda não utilizado
Passos:
1. Entrar como vip.teste@exemplo.com
2. Adicionar "Monitor 24pol" (R$ 1.000,00) ao carrinho
3. Ir para o checkout
4. Aplicar o cupom PROMO15
5. Observar o resumo do pedido
Esperado: desconto de 20% (R$ 200,00), total R$ 800,00.
Regra da história QA-142: VIP + cupom = 20%, os descontos
não são somados.
Obtido: desconto de 25% (R$ 250,00), total R$ 750,00.
Parece que os 10% do VIP e os 15% do cupom foram somados.
Evidência: print do resumo (anexo), e a resposta da API:
POST /pedidos → {"desconto": 250.00, "total": 750.00}
Severidade: alta Prioridade: P1
Observação: acontece com qualquer cupom, não só o PROMO15.
Note três detalhes de quem tem experiência: o esperado cita a regra (QA-142) em vez de ser opinião; a hipótese sobre a causa aparece como "parece que", separada do fato; e a última linha diz que o problema é mais amplo do que o passo a passo sugere, informação que economiza uma rodada inteira de conversa.
Severidade × Prioridade
São duas perguntas diferentes, feitas por pessoas diferentes. Confundir as duas é o mal-entendido mais comum de quem está começando, e um dos poucos temas que cai em praticamente toda entrevista de QA.
- Severidade: o tamanho do estrago quando o defeito acontece. É uma avaliação técnica, e normalmente quem reporta é quem define.
- Prioridade: a urgência de corrigir. É uma decisão de negócio: depende de quanta gente é afetada, do impacto financeiro, de contrato, de imagem, do que mais está na fila.
Por serem independentes, existem os quatro cruzamentos, e os dois cruzamentos "estranhos" é que provam que os campos são mesmo diferentes:
| Prioridade alta (P1) | Prioridade baixa (P4) | |
|---|---|---|
| Severidade crítica |
Checkout derruba o sistema pra todo mundo. Óbvio: pare tudo. |
Sistema quebra ao gerar relatório num formato que dois clientes usam, uma vez por ano. Estrago enorme, mas quase ninguém é afetado: pode esperar. |
| Severidade baixa |
Nome da empresa escrito errado na página inicial, no dia do lançamento. Não quebra nada, mas é a primeira coisa que todo mundo vê: corrija agora. |
Texto desalinhado por 2 pixels numa tela interna. Óbvio: entra na fila. |
Guarde os dois exemplos do meio: o do relatório anual e o do nome errado na home. Eles são a resposta pronta pra pergunta "qual a diferença entre severidade e prioridade?".
Não infle a severidade pra ser atendido
É tentador marcar tudo como crítico pra o bug não morrer na fila. Funciona uma vez. Depois, o time aprende a descontar o que você diz, e aí o seu crítico de verdade vira só mais um. Severidade é escala técnica, não é o volume da sua voz. Se algo é severidade média mas precisa sair hoje, o campo certo pra isso é a prioridade, e o lugar certo é uma conversa explicando o porquê.
O ciclo de vida do defeito
O banco que você vai usar nas outras trilhas tem uma tabela defeitos
com exatamente os estados que um bug percorre na vida real:
aberto ──→ em_analise ──→ resolvido ──→ fechado
│ │
└──────────────┴──→ reaberto ──┐
▲ │
└──────┘
- aberto: você reportou, ninguém pegou ainda.
- em_analise: alguém está investigando ou corrigindo.
- resolvido: a correção foi feita. Ainda não acabou: falta você fazer o reteste (Módulo 2).
- fechado: você retestou e confirmou. Só QA fecha.
- reaberto: o reteste falhou, ou o problema voltou depois. É um sinal importante: muitos reabertos indicam correção apressada ou relatório incompleto.
Repare no gancho com o Módulo 3: isso é uma máquina de estados, e as
transições proibidas valem teste: dá pra fechar um defeito que nunca foi
resolvido? E há uma regra de dados fácil de verificar: todo defeito
fechado ou resolvido precisa ter
data_fechamento preenchida; todo aberto precisa ter
data_fechamento nula. Nas trilhas de SQL e de pytest você escreve
exatamente essas verificações, e elas encontram dado inconsistente de verdade.
Os campos da tabela defeitos, e por que cada um existe
| Coluna | Para que serve no dia a dia |
|---|---|
titulo | a triagem inteira acontece lendo só esta coluna |
modulo | permite ver onde os defeitos se agrupam (princípio 4 do Módulo 1) |
severidade | tamanho do estrago, técnico |
prioridade | urgência, negócio |
status | onde o defeito está no ciclo acima |
ambiente | dev / homolog / producao: defeito crítico que escapou pra produção é a métrica mais dolorida e mais útil de um time de QA |
data_abertura / data_fechamento | a diferença entre as duas é o tempo de correção; a segunda nula significa "ainda aberto" |
Quando você chegar na Trilha de SQL, vai reconhecer essa tabela, e as consultas vão fazer sentido de negócio, não só de sintaxe.
As três situações difíceis
"Não consegui reproduzir"
Antes de reportar, tente de novo do zero, em outra conta e, se der, em outra máquina. Se acontece só às vezes, diga isso e diga a frequência real ("3 vezes em 10 tentativas"). Junte tudo que possa ser a diferença: horário, dado usado, se havia outra aba aberta, o log do console. Bug intermitente é bug: o que não pode é você esconder que é intermitente.
"Isso é duplicado"
Procure antes de abrir. Se for o mesmo defeito, acrescente sua informação no relatório existente em vez de abrir outro: outro ambiente, outro caminho de reprodução, mais uma ocorrência. Isso aumenta a prioridade do que já existe, o que é melhor do que dividir a atenção em dois registros.
"Não é bug, é o comportamento esperado"
Acontece, e não tem problema. A resposta profissional não é insistir: é perguntar onde está escrito. Se estiver documentado, ótimo: você aprendeu algo e o relatório fecha. Se ninguém souber dizer, o defeito mudou de lugar: não está no código, está na especificação. Aí o registro certo é "comportamento indefinido: ninguém sabe qual deveria ser", e isso precisa ser decidido por alguém, não silenciado.
Olhar de QA
Escreva o relatório do lado de quem vai corrigir, não contra. Descreva o comportamento, nunca a pessoa; separe fato de hipótese; e entregue de bandeja tudo que economize tempo de investigação. A diferença entre "o checkout está um desastre" e "o checkout soma os dois descontos quando o cliente é VIP" não é só educação: é que a segunda frase pode ser corrigida.
Sua vez
Pegue um achado da sessão exploratória do Módulo 4, ou este aqui, se preferir:
"No app de delivery, se você adicionar um item ao carrinho, esperar 20 minutos sem mexer, e então finalizar o pedido, o preço cobrado é o antigo, mesmo que o restaurante tenha reajustado o cardápio nesse meio-tempo."
Escreva o relatório completo: título na fórmula, ambiente, pré-condições, passos numerados, esperado com a razão, obtido, evidência que você juntaria, severidade e prioridade, com uma frase justificando cada uma das duas. A prova traz essa mesma questão, com uma resposta modelo pra você comparar.