🚀 Capítulo 11: Qualidade e Testes de Software (Tema: Matrix)
NOTE
Este capítulo utiliza a temática de Matrix para explicar os Testes de Software. Teste a realidade em todos os níveis para garantir que os humanos não percebam nenhuma falha na simulação!
1. 🎯 Objetivo da Aula
Compreender a importância dos Testes de Software, conhecendo a Pirâmide de Testes e os diferentes níveis: Testes Unitários, de Integração e de Ponta a Ponta (E2E).
2. 🏢 O Cenário Prático (Seu Desafio)
O Arquiteto da Matrix não pode simplesmente ligar o sistema e esperar que tudo funcione. Se houver um bug na simulação e a maçã cair para cima em vez de cair para baixo, os humanos vão perceber que estão em um mundo falso e a Matrix entrará em colapso! Para garantir a perfeição, o Arquiteto precisa testar o sistema em vários níveis de detalhe.
No desenvolvimento de software, nós fazemos exatamente a mesma coisa. Não confiamos na sorte! Criamos programas que testam os nossos próprios programas. Seu desafio é garantir que a Matrix não tenha falhas!
🧠 Fundamentos: A Teoria Traduzida
Para organizar os testes, usamos o conceito da Pirâmide de Testes. Ela nos diz a quantidade ideal de cada tipo de teste que devemos ter:
📐 A Pirâmide de Testes:
1. Testes Unitários (A Base da Pirâmide):
Testam a menor parte possível do código isoladamente (geralmente uma única função ou método).
- Exemplo na Matrix: Testar se a função matemática que calcula a gravidade funciona corretamente.
- Características: São super rápidos de rodar e muito baratos de criar. Devemos ter muitos desses!
2. Testes de Integração (O Meio da Pirâmide):
Testam se duas ou mais partes do sistema funcionam bem quando juntas.
- Exemplo na Matrix: Testar se a maçã (objeto) reage corretamente à gravidade (sistema de física).
- Características: Um pouco mais lentos e complexos. Devemos ter uma quantidade moderada.
3. Testes de Ponta a Ponta / E2E (O Topo da Pirâmide):
Testam o sistema inteiro simulando o comportamento de um usuário real do início ao fim.
- Exemplo na Matrix: Um robô simulando um humano entra na Matrix, compra um pão na padaria, come e vê se tudo pareceu real.
- Características: São muito lentos e caros de manter. Devemos ter poucos desses, apenas para os caminhos mais importantes do sistema.
4. 📖 Exemplo Guiado: O Teste Automatizado
Imagine que você escreveu uma função em C++ que soma dois números:
int somar(int a, int b) { return a + b; }Um Teste Unitário para essa função seria outro arquivo de código que faz isso:
if (somar(2, 3) == 5) {
cout << "Teste Passou! (Verde)";
} else {
cout << "Teste Falhou! (Vermelho)";
}Se amanhã você mudar a função de soma e estragar o cálculo, o teste vai gritar “Vermelho” e você saberá na hora que errou!
5. 🛠️ Prática Obrigatória 1: Qual o tipo de teste?
Identifique se a situação descreve um teste Unitário, de Integração ou de Ponta a Ponta (E2E):
- Um robô de testes abre o navegador, entra no site do banco, digita o usuário e senha, clica em “Entrar” e verifica se a tela de saldo apareceu.
- Um teste verifica se a função
calcular_desconto()dá o resultado correto de para uma compra de com cupom de . - Um teste verifica se o sistema consegue salvar um novo usuário no banco de dados real e depois buscá-lo de volta.
6. 🛠️ Prática Obrigatória 2: Por que não testar tudo no final?
Por que devemos ter MUITOS testes unitários e POUCOS testes de ponta a ponta (E2E) na nossa pirâmide? O que acontece com o tempo de espera da equipe se tivermos 10.000 testes E2E?
7. 📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)
- Faça o Commit: No GitHub Desktop, digite a mensagem (ex:
Finaliza Capítulo 11 EngSoftware) e clique em Commit to main. - Envie para a Nuvem (Push): Clique em Push origin.
8. 📂 Estrutura de Pastas
extra_engenharia_de_software/
├── capitulos/
│ ├── capitulo_11_testes.md
│ └── codigos/
│ └── cap11/
│ └── teste_gravidade.cpp💡 Checkpoint de Lógica
Testes não servem para provar que o código não tem erros. Servem para provar que o código faz o que deveria fazer nas situações que nós imaginamos!
10. 🔥 Desafio de Fixação
Pesquise o que significa o termo Bug e qual a origem histórica dessa palavra na computação.
🔑 Gabarito de Código/Fórmulas
Gabarito da Prática 1:
- Ponta a Ponta (E2E) (Simula o usuário real no navegador).
- Unitário (Testa apenas uma função isolada).
- Integração (Testa a comunicação entre o código e o banco de dados). Gabarito da Prática 2:
- Porque os testes E2E são muito lentos (abrem navegador, clicam, esperam carregar). Se tivéssemos 10.000 testes E2E, a equipe teria que esperar horas ou dias para saber se uma pequena alteração no código estragou o sistema. Os testes unitários rodam milhares em poucos segundos!