🚀 Capítulo 12: Testes de Regressão (Tema: De Volta para o Futuro)
NOTE
Este capítulo utiliza a temática de De Volta para o Futuro para explicar os Testes de Regressão. Mudar uma linha de código no passado pode quebrar todo o futuro do seu sistema!
1. 🎯 Objetivo da Aula
Compreender o conceito de Testes de Regressão e entender como garantir que novas alterações ou correções no código não quebrem funcionalidades que já estavam funcionando perfeitamente.
2. 🏢 O Cenário Prático (Seu Desafio)
Marty McFly viajou para 1955 no DeLorean e, sem querer, impediu que seus pais se conhecessem. Quando ele olha para a foto da família, seus irmãos começam a desaparecer!
- Ele alterou algo pequeno no passado.
- Isso quebrou o futuro!
No desenvolvimento de software, isso acontece todo dia. Você mexe em uma linha de código para consertar o botão de “Comprar” e, sem querer, quebra a página de “Login”. Isso se chama Regressão. Os Testes de Regressão são os testes que rodamos de novo (repetimos) para garantir que o passado do sistema continue funcionando após uma mudança! Seu desafio é não deixar os recursos do sistema desaparecerem!
3. 🧠 Fundamentos: A Teoria Traduzida
Regressão significa “voltar a um estado anterior”. No software, significa que um bug que não existia ou que já tinha sido corrigido voltou a aparecer.
🚗 O que são Testes de Regressão?
São os mesmos testes que você já escreveu antes (Unitários, Integração, E2E). A diferença é o momento em que você os roda. Você os roda inteiros toda vez que:
- Adiciona uma nova funcionalidade.
- Corrige um bug existente.
- Atualiza uma biblioteca ou versão da linguagem.
🤖 A Automação como Aliada
Se você tiver 1.000 testes manuais, fazer testes de regressão toda semana será impossível. É por isso que os Testes de Regressão PRECISAM ser automatizados! O robô roda todos os 1.000 testes em minutos para garantir que o “futuro” está seguro.
4. 📖 Exemplo Guiado: O Efeito Borboleta (JS)
Você tem um sistema que calcula o preço com imposto:
function calcularPreco(valor) {
return valor + 10; // Imposto fixo de 10
}Um belo dia, você decide mudar para imposto de 10%:
function calcularPreco(valor) {
return valor * 1.10; // Mudança feita!
}Essa mudança parece boa. Mas se você tiver um teste de regressão antigo que esperava que calcularPreco(100) retornasse 110, ele vai passar. Mas e se o valor fosse 10?
- Antes:
10 + 10 = 20. - Agora:
10 * 1.10 = 11. O teste de regressão vai falhar e te avisar: “Ei, você quebrou o cálculo para valores pequenos!“.
5. 🛠️ Prática Obrigatória 1: Identificando a Regressão
Imagine que você trabalha no sistema do Spotify.
- Você adicionou a função de “Letras de Música”.
- No dia seguinte, os usuários reclamam que o botão de “Pausar” parou de funcionar.
- Isso é uma regressão? Qual teste falhou em pegar esse erro antes de ir para produção?
6. 🛠️ Prática Obrigatória 2: Seleção de Testes
Se o seu sistema tiver 50.000 testes e demorar 5 horas para rodar tudo, e você só alterou a cor de um texto na tela de ajuda, você precisa rodar os 50.000 testes de novo? Como você escolheria quais testes rodar nesse caso de regressão?
7. 📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)
- Faça o Commit: No GitHub Desktop, digite a mensagem (ex:
Finaliza Capítulo 12 Qualidade) e clique em Commit to main. - Envie para a Nuvem (Push): Clique em Push origin.
8. 📂 Estrutura de Pastas
mod_11_qualidade_e_testes_de_software/
├── capitulos/
│ ├── capitulo_12_regressao.md
│ └── codigos/
│ └── cap12/
│ └── efeito_borboleta.js9. 💡 Checkpoint de Lógica
Os testes de regressão servem como uma rede de proteção. Eles dão coragem ao programador para alterar o código sabendo que, se ele quebrar algo antigo, o teste vai avisar na hora!
10. 🔥 Desafio de Fixação
Pesquise sobre ferramentas de IC (Integração Contínua) como GitHub Actions ou Jenkins, que rodam os testes de regressão automaticamente toda vez que você faz um commit.
🔑 Gabarito de Código/Fórmulas
Gabarito da Prática 1: 3. Sim, é uma regressão! O botão de pausar já funcionava e quebrou por causa da nova função. Os testes de regressão (provavelmente E2E ou de Integração que testavam o player) falharam em ser executados ou não existiam.