🚀 Capítulo 03: Testes Unitários (Tema: Lego)

NOTE

Este capítulo utiliza a temática de Lego para explicar os Testes Unitários. Antes de montar a nave inteira, precisamos garantir que cada pecinha individual não esteja quebrada!


1. 🎯 Objetivo da Aula

Compreender o que são Testes Unitários, suas características principais e como aplicar o padrão AAA (Arrange, Act, Assert) para estruturar um teste de forma limpa.

2. 🏢 O Cenário Prático (Seu Desafio)

Você está construindo a Estrela da Morte usando blocos de Lego.

  • Antes de encaixar o superlaser na estação espacial, você pega a pecinha do laser e testa ela sozinha na mesa. “Ela acende? O encaixe está perfeito?“.
  • Isso é um Teste Unitário. Você isola a peça do resto do universo e garante que ela faz a única coisa que ela deveria fazer.

No código, a peça de Lego é uma Função. Seu desafio é escrever um teste que garanta que a função funciona perfeitamente sozinha!

3. 🧠 Fundamentos: A Teoria Traduzida

Um Teste Unitário verifica se uma pequena parte isolada do código (geralmente uma função) funciona exatamente como esperado.

🌟 As 4 Regras de Ouro (F.I.R.S.T.):

  • Fast (Rápido): Deve rodar em milissegundos.
  • Isolated (Isolado): Um teste não pode depender de outro teste ou de internet/banco de dados.
  • Repeatable (Repetível): Deve dar o mesmo resultado sempre.
  • Self-validating (Auto-verificável): O teste sabe dizer sozinho se passou ou falhou.
  • Timely (Oportuno): Deve ser escrito junto ou antes do código real.

📐 O Padrão AAA (Como estruturar o teste):

  1. Arrange (Organizar): Você prepara o cenário (Ex: Pega as pecinhas).
  2. Act (Agir): Você executa a ação (Ex: Tenta encaixar).
  3. Assert (Afirmar): Você verifica o resultado (Ex: “Ficou firme? Sim!“).

4. 📖 Exemplo Guiado: Testando uma Soma (JS)

A Função que queremos testar (A pecinha de Lego):

function somar(a, b) {
    return a + b;
}

O Teste Unitário (Usando o padrão AAA):

// 1. Arrange (Prepara os dados)
const numero1 = 5;
const numero2 = 10;
const resultadoEsperado = 15;
 
// 2. Act (Executa a função)
const resultadoReal = somar(numero1, numero2);
 
// 3. Assert (Verifica se deu certo)
if (resultadoReal === resultadoEsperado) {
    console.log("✅ Teste Passou! A pecinha de soma funciona.");
} else {
    console.log("❌ Teste Falhou! Esperava 15 mas veio " + resultadoReal);
}

5. 🛠️ Prática Obrigatória 1: Aplicando o AAA

Dada a função abaixo que calcula o dano de um ataque:

function calcularDano(forca, defesa) {
    return forca - defesa;
}

Escreva (em papel ou no código) o teste unitário para essa função seguindo os 3 passos do AAA:

  1. Arrange: Defina uma força de 50 e uma defesa de 30. Qual o resultado esperado?
  2. Act: Chame a função passando esses valores.
  3. Assert: Faça o if para comparar o resultado real com o esperado.

6. 🛠️ Prática Obrigatória 2: O Perigo do Banco de Dados

Se uma função de teste unitário precisar ler um arquivo de verdade no computador ou buscar um dado em um banco de dados na internet, ela ainda é considerada um teste unitário? Por quê? Qual regra do F.I.R.S.T. ela violou?


7. 📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)

  1. Faça o Commit: No GitHub Desktop, digite a mensagem (ex: Finaliza Capítulo 03 Qualidade) e clique em Commit to main.
  2. Envie para a Nuvem (Push): Clique em Push origin.

8. 📂 Estrutura de Pastas

mod_11_qualidade_e_testes_de_software/
├── capitulos/
│   ├── capitulo_03_unitarios.md
│   └── codigos/
│       └── cap03/
│           └── calculadora_teste.js

9. 💡 Checkpoint de Lógica

Os testes unitários servem como uma documentação viva do seu código. Se alguém quiser saber o que a função somar faz, basta ler o arquivo de teste!

10. 🔥 Desafio de Fixação

Pesquise quais são os frameworks de testes unitários mais famosos para a sua linguagem favorita (Ex: Jest para JavaScript, JUnit para Java, PyTest para Python).

🔑 Gabarito de Código/Fórmulas

Gabarito da Prática 1:

// 1. Arrange
const forca = 50;
const defesa = 30;
const esperado = 20;
 
// 2. Act
const real = calcularDano(forca, defesa);
 
// 3. Assert
if (real === esperado) { console.log("Passou!"); }
else { console.log("Falhou!"); }

Capitulo Anterior | Proximo Capitulo