Guia de Correção de Bugs
Este guia cobre a abordagem sistemática para corrigir bugs usando o Claude-Craft, desde o diagnóstico até a validação.
Índice
- Fluxo de Correção de Bugs
- Fase 1: Reproduzir
- Fase 2: Diagnosticar
- Fase 3: Escrever Teste de Regressão
- Fase 4: Corrigir
- Fase 5: Validar
- Fase 6: Documentar
- Procedimentos de Hotfix
- Exemplo Completo
Fluxo de Correção de Bugs
A abordagem sistemática para corrigir bugs:
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 1. Reproduzir│ --> │2. Diagnosticar│ --> │ 3. Teste │
└─────────────┘ └─────────────┘ └─────────────┘
│
v
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 6. Documentar│ <-- │ 5. Validar │ <-- │ 4. Corrigir │
└─────────────┘ └─────────────┘ └─────────────┘Por Que Esta Abordagem?
- Reproduzir primeiro: Não é possível corrigir o que não se consegue ver
- Testar antes de corrigir: Prova que o bug existe e foi corrigido
- Validar completamente: Garante que não há regressão
- Documentar: Ajuda a prevenir bugs semelhantes no futuro
Fase 1: Reproduzir
Antes de corrigir, reproduza o bug de forma consistente.
Coletar Informações
Obtenha do relatório de bug:
- Passos para reproduzir
- Comportamento esperado
- Comportamento real
- Ambiente (versão, SO, etc.)
- Mensagens de erro/logs
- Capturas de tela, se aplicável
Criar Ambiente de Reprodução
bash
# Fazer checkout da versão problemática
git checkout <commit-ou-tag>
# Configurar ambiente idêntico
make docker-up
# Reproduzir com os passos exatosVerificar a Reprodução
Você consegue acionar o bug de forma consistente?
- [ ] Bug ocorre com os passos relatados
- [ ] Bug ocorre no mesmo ambiente
- [ ] Bug é determinístico (não aleatório)
Se Você Não Conseguir Reproduzir
markdown
@research-assistant Ajude-me a entender por que este bug pode ser específico do ambiente
Relatório de bug:
- Usuário vê erro X ao fazer Y
- Não consigo reproduzir localmente
- Usuário está no ambiente Z
Possíveis causas?Fase 2: Diagnosticar
Encontre a causa raiz do bug.
Usando o Comando de Análise
bash
/common:analyze-bug "Os usuários não conseguem fazer login com credenciais corretas após redefinição de senha"Este comando irá:
- Sugerir áreas para investigar
- Identificar causas potenciais
- Recomendar passos de depuração
- Listar áreas de código relacionadas
Usando o TDD Coach para Diagnóstico
markdown
@tdd-coach Ajude-me a diagnosticar este bug de autenticação
Sintomas:
- O usuário redefine a senha com sucesso
- A nova senha é salva (confirmado no banco de dados)
- O login falha com "credenciais inválidas"
- A senha antiga também não funciona
O que devo investigar?Técnicas de Depuração
Adicionar Logging
php
// Log de depuração temporário
$this->logger->debug('Password verification', [
'user_id' => $user->getId(),
'stored_hash' => substr($user->getPasswordHash(), 0, 20) . '...',
'verification_result' => $result,
]);Inspecionar o Estado do Banco de Dados
sql
-- Verificar estado do usuário após redefinição de senha
SELECT id, email, password_hash, updated_at
FROM users
WHERE email = 'user@example.com';Rastrear o Caminho de Execução
php
// Adicionar stack trace em pontos suspeitos
debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);Identificar a Causa Raiz
Categorias comuns:
- Erro de lógica: Condição ou cálculo incorreto
- Erro de estado: Estado de dados incorreto
- Condição de corrida: Comportamento dependente de temporização
- Erro de integração: Problema com serviço externo
- Erro de configuração: Configurações erradas
Checklist de Diagnóstico
- [ ] Bug reproduzido de forma consistente
- [ ] Localização do erro identificada
- [ ] Causa raiz compreendida
- [ ] Áreas de código relacionadas identificadas
- [ ] Abordagem de correção determinada
Fase 3: Escrever Teste de Regressão
Escreva um teste que FALHE ANTES da correção e PASSE DEPOIS.
Por Que Testar Primeiro?
- Prova que o bug existe: O teste falha com o código atual
- Prova que a correção funciona: O teste passa após a correção
- Previne regressão: O teste detecta quebras futuras
- Documenta o comportamento: O teste descreve o comportamento esperado
Usando o TDD Coach
markdown
@tdd-coach Ajude-me a escrever um teste de regressão para este bug
Bug: A redefinição de senha não atualiza o hash de senha corretamente
Comportamento esperado:
- O usuário solicita a redefinição de senha
- O usuário define uma nova senha
- O usuário consegue fazer login com a nova senha
Comportamento real:
- O login falha após a redefinição de senhaExemplo de Teste de Regressão
php
/**
* @test
* @see https://github.com/company/project/issues/123
*
* Bug: Os usuários não conseguiam fazer login após a redefinição de senha
* Causa raiz: O hash de senha não era persistido corretamente
*/
public function test_user_can_login_after_password_reset(): void
{
// Arrange: Criar usuário com senha conhecida
$user = $this->createUser('user@example.com', 'old-password');
// Act: Redefinir senha
$this->passwordResetService->resetPassword($user, 'new-password');
// Assert: Consegue fazer login com a nova senha
$result = $this->authService->authenticate('user@example.com', 'new-password');
$this->assertTrue($result->isSuccess());
$this->assertNotNull($result->getToken());
}
/**
* @test
* Relacionado: Garantir que a senha antiga não funciona mais
*/
public function test_old_password_fails_after_reset(): void
{
$user = $this->createUser('user@example.com', 'old-password');
$this->passwordResetService->resetPassword($user, 'new-password');
$result = $this->authService->authenticate('user@example.com', 'old-password');
$this->assertFalse($result->isSuccess());
}Checklist de Escrita de Testes
- [ ] O teste reproduz o bug (falha antes da correção)
- [ ] O teste tem nome descritivo
- [ ] O teste referencia o número do issue
- [ ] O teste documenta a causa raiz no comentário
- [ ] Casos extremos relacionados testados
Fase 4: Corrigir
Implemente a correção mínima para o bug.
Diretrizes de Correção
- Mudança mínima: Corrija apenas o bug, não refatore
- Intenção clara: O código deve mostrar o que estava errado
- Sem efeitos colaterais: Não altere comportamento não relacionado
- Manter estilo: Corresponder aos padrões do código existente
Exemplo de Correção
php
// ANTES (com bug)
public function resetPassword(User $user, string $newPassword): void
{
$hash = $this->hasher->hash($newPassword);
$user->setPasswordHash($hash);
// Bug: Falta persist/flush!
}
// DEPOIS (corrigido)
public function resetPassword(User $user, string $newPassword): void
{
$hash = $this->hasher->hash($newPassword);
$user->setPasswordHash($hash);
$this->entityManager->persist($user); // <-- Correção
$this->entityManager->flush(); // <-- Correção
}Executar o Teste de Regressão
bash
# O teste deve passar agora
make test-unit TEST=tests/Unit/PasswordResetTest.php
# Ou executar teste específico
./vendor/bin/phpunit --filter test_user_can_login_after_password_resetChecklist de Correção
- [ ] O teste de regressão agora passa
- [ ] A correção é mínima e focada
- [ ] Nenhuma alteração não relacionada incluída
- [ ] Estilo do código mantido
Fase 5: Validar
Certifique-se de que a correção não quebre nada mais.
Executar a Suite Completa de Testes
bash
# Todos os testes unitários
make test-unit
# Todos os testes de integração
make test-integration
# Suite completa de testes
make testVerificações de Qualidade
bash
# Qualidade do código (por tecnologia)
/symfony:check-code-quality
/flutter:check-code-quality
/python:check-code-quality
# Segurança (se a correção toca código sensível)
/common:security-audit
# Conformidade completa
/symfony:check-complianceTestes Manuais
Mesmo com testes automatizados, verifique manualmente:
- Seguir os passos originais de reprodução do bug
- Verificar que o bug não ocorre mais
- Testar funcionalidades relacionadas
- Verificar casos extremos
Usando o Agente Revisor
markdown
@symfony-reviewer Revise minha correção para o issue #123
Bug: Os usuários não conseguiam fazer login após a redefinição de senha
Correção: Adicionados persist/flush ausentes em resetPassword()
Arquivos alterados:
- src/Application/Service/PasswordResetService.php
- tests/Unit/PasswordResetTest.php
Por favor, verifique:
1. A correção está correta e completa
2. Ausência de efeitos colaterais
3. Cobertura de teste adequadaChecklist de Validação
- [ ] O teste de regressão passa
- [ ] Todos os testes existentes passam
- [ ] A análise estática passa
- [ ] Os testes manuais confirmam a correção
- [ ] Revisão de código concluída
Fase 6: Documentar
Documente a correção para referência futura.
Formato da Mensagem de Commit
fix(auth): resolver falha de login após redefinição de senha
Bug: Os usuários não conseguiam fazer login após redefinir a senha
Causa raiz: A alteração do hash de senha não era persistida no banco de dados
Correção: Adicionadas chamadas a persist() e flush() em PasswordResetService
Closes #123
Test: test_user_can_login_after_password_resetAtualizar o Rastreador de Issues
markdown
## Resolução
**Causa Raiz:**
O método `resetPassword()` em `PasswordResetService` estava atualizando o hash
de senha do usuário na memória, mas não persistia a alteração no banco de dados.
**Correção:**
Adicionadas chamadas a `persist()` e `flush()` após definir o novo hash de senha.
**Testes:**
- Teste de regressão adicionado: `test_user_can_login_after_password_reset`
- Teste de caso extremo adicionado: `test_old_password_fails_after_reset`
**Prevenção:**
Considere adicionar um item de verificação na lista de revisão de código para operações de persistência.Entrada na Base de Conhecimento (se for um padrão recorrente)
markdown
# Bug Comum: Alterações de Entidade Não Persistidas
## Sintomas
- As alterações de dados parecem funcionar (sem erros)
- As alterações não aparecem no banco de dados
- As alterações são perdidas após atualização da página
## Causa Raiz
Chamadas a `persist()` e/ou `flush()` ausentes no Doctrine.
## Padrão de Correção
```php
$entity->setSomething($value);
$this->entityManager->persist($entity); // Não esqueça!
$this->entityManager->flush();Prevenção
- Adicionar verificação de persistência ao checklist de revisão de código
- Considerar auto-flush na classe base do serviço
### Checklist de Documentação
- [ ] A mensagem de commit descreve o bug e a correção
- [ ] O rastreador de issues atualizado com a resolução
- [ ] Documentação relacionada atualizada
- [ ] Entrada na base de conhecimento se for um padrão
---
## Procedimentos de Hotfix
Para bugs críticos em produção.
### Fluxo de Hotfix- Criar branch de hotfix a partir de produção
- Aplicar correção mínima
- Testar completamente
- Implantar em produção
- Mesclar de volta em main
### Passo a Passo
```bash
# 1. Criar branch de hotfix
git checkout production
git checkout -b hotfix/issue-123-login-failure
# 2. Aplicar correção
# ... fazer as alterações ...
# 3. Escrever teste de regressão
# ... adicionar teste ...
# 4. Verificar
make test
/symfony:check-compliance
# 5. Commitar com mensagem clara
git commit -m "fix(auth): resolver falha crítica de login após redefinição de senha
HOTFIX para issue de produção.
Causa raiz: Hash de senha não persistido após redefinição.
Closes #123"
# 6. Criar PR para revisão
gh pr create --base production --title "HOTFIX: Falha de login após redefinição de senha"
# 7. Após merge, implantar
# ... processo de implantação ...
# 8. Mesclar de volta em main
git checkout main
git merge hotfix/issue-123-login-failure
git push origin mainChecklist de Hotfix
- [ ] Branch de hotfix criada a partir de produção
- [ ] Correção mínima e focada apenas
- [ ] Teste de regressão adicionado
- [ ] Todos os testes passando
- [ ] PR revisado e aprovado
- [ ] Implantado em produção
- [ ] Verificado em produção
- [ ] Mesclado de volta em main
Exemplo Completo
Vamos percorrer a correção de um bug real.
Relatório de Bug
Issue #456: Total do pedido calculado incorretamente
Passos para reproduzir:
1. Adicionar item com preço $10.00, quantidade 3
2. Adicionar item com preço $5.50, quantidade 2
3. Visualizar o carrinho
Esperado: Total = $41.00 (30 + 11)
Real: Total = $36.00
Ambiente: Produção v2.3.1
Reportado por: Suporte ao cliente
Prioridade: AltaPasso 1: Reproduzir
php
// Teste local rápido
$order = new Order();
$order->addItem(new Item('A', 10.00), 3); // $30
$order->addItem(new Item('B', 5.50), 2); // $11
echo $order->getTotal(); // Mostra 36.00 - confirmado!Passo 2: Diagnosticar
markdown
@tdd-coach Ajude-me a encontrar o bug no cálculo do total do pedido
O total deveria ser 41.00, mas mostra 36.00
A diferença é 5.00, que é exatamente o preço de um item B
Hipótese: a quantidade do segundo item não está sendo contada?A investigação revela:
php
// Bug encontrado em Order::calculateTotal()
public function calculateTotal(): Money
{
$total = Money::zero();
foreach ($this->items as $item) {
// BUG: Usando 1 em vez da quantidade do item!
$total = $total->add($item->getPrice()->multiply(1));
}
return $total;
}Passo 3: Escrever Teste de Regressão
php
/**
* @test
* @see https://github.com/company/shop/issues/456
*
* Bug: O total do pedido ignorava as quantidades dos itens
*/
public function test_order_total_includes_all_quantities(): void
{
$order = new Order();
$order->addItem($this->createItem(10.00), 3); // $30
$order->addItem($this->createItem(5.50), 2); // $11
$total = $order->calculateTotal();
$this->assertEquals(41.00, $total->getAmount());
}
/**
* @test
* Caso extremo: item único com quantidade > 1
*/
public function test_single_item_quantity_multiplied(): void
{
$order = new Order();
$order->addItem($this->createItem(10.00), 5);
$this->assertEquals(50.00, $order->calculateTotal()->getAmount());
}Executar o teste — confirma que falha.
Passo 4: Corrigir
php
public function calculateTotal(): Money
{
$total = Money::zero();
foreach ($this->items as $item) {
// Corrigido: Usar a quantidade real do item do pedido
$total = $total->add(
$item->getPrice()->multiply($item->getQuantity())
);
}
return $total;
}Passo 5: Validar
bash
# Teste de regressão passa
./vendor/bin/phpunit --filter test_order_total
# Todos os testes passam
make test
# Verificação de qualidade
/symfony:check-compliance
# Pontuação: 94/100 ✓Passo 6: Documentar
bash
git commit -m "fix(order): corrigir cálculo do total para incluir as quantidades
Bug: O total do pedido ignorava as quantidades dos itens, sempre usando 1
Causa raiz: multiply(1) codificado em vez de multiply(quantity)
Correção: Usar getQuantity() do item do pedido no cálculo
Closes #456
Testes de regressão adicionados:
- test_order_total_includes_all_quantities
- test_single_item_quantity_multiplied"Dicas de Prevenção de Bugs
- Escreva os testes primeiro: TDD previne muitos bugs
- Revisão de código: Outros olhos detectam problemas
- Análise estática: Ferramentas encontram erros comuns
- Testes de integração: Capturam bugs de interação
- Monitorar produção: Detectar problemas mais cedo
- Use
/loop: Configure verificações de qualidade recorrentes (ex.:/loop 5m /common:pre-commit-check) - Salve aprendizados: Use
/memorypara persistir padrões de bugs entre sessões