🚀 Capítulo 08: Testes de Banco de Dados (Tema: Harry Potter / Gringotes)

NOTE

Este capítulo utiliza a temática de Harry Potter para explicar os Testes de Banco de Dados. Os cofres de Gringotes precisam ser invioláveis; testar o banco é garantir que nenhum galeão suma!


1. 🎯 Objetivo da Aula

Compreender como testar a persistência de dados e a integridade do banco de dados, garantindo que as operações de CRUD e as transações funcionem sem falhas.

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

Você foi contratado pelos Duendes de Gringotes para programar o sistema de controle dos cofres.

  • Quando o Harry deposita 10 galeões, o sistema precisa somar exatamente 10 ao saldo dele.
  • Se o sistema der erro no meio da transação, o dinheiro não pode sumir e nem aparecer duplicado (Princípio da Atomicidade).

Testar o banco de dados é garantir que as regras de negócio de armazenamento estejam funcionando. Você não quer irritar um duende ou um bruxo! Seu desafio é garantir a segurança dos cofres!

3. 🧠 Fundamentos: A Teoria Traduzida

Os Testes de Banco de Dados verificam se o esquema do banco, as tabelas, as triggers, as procedures e, principalmente, os dados salvos estão corretos.

🛡️ As Propriedades ACID (O que testar):

  1. Atomicidade: Ou a transação acontece inteira ou não acontece nada. (Ex: Se transferir dinheiro, tira de um e coloca no outro. Se falhar no meio, desfaz tudo).
  2. Consistência: O banco deve seguir as regras (Ex: Não permitir idade negativa).
  3. Isolamento: Uma transação não pode atrapalhar outra que está acontecendo ao mesmo tempo.
  4. Durabilidade: Uma vez salvo, o dado não some mesmo se faltar energia.

4. 📖 Exemplo Guiado: O Teste do Depósito (JS)

const banco = require("./gringotes_db");
 
function testDepositoGaleoes() {
    // 1. Arrange
    const saldoInicial = banco.buscarSaldo("Harry Potter"); // ex: 100
    const valorDeposito = 50;
    
    // 2. Act
    banco.depositar("Harry Potter", valorDeposito);
    
    // 3. Assert
    const saldoFinal = banco.buscarSaldo("Harry Potter");
    
    if (saldoFinal === saldoInicial + valorDeposito) {
        console.log("✅ Teste Passou! Cofre atualizado com sucesso.");
    } else {
        console.log("❌ Teste Falhou! Houve quebra de consistência.");
    }
}

5. 🛠️ Prática Obrigatória 1: Testando a Transferência

Imagine que você quer testar uma transferência de 20 galeões do cofre do Harry para o cofre do Rony.

  1. Quais são os 2 valores que você precisa verificar no banco de dados para garantir que o teste passou? (O que acontece com o saldo do Harry e com o do Rony?).

6. 🛠️ Prática Obrigatória 2: O Perigo dos Dados Reais

Por que NUNCA devemos rodar nossos testes de banco de dados usando o banco de dados de produção (o que os clientes reais estão usando)? O que aconteceria se o seu teste fizesse um DELETE para testar a função de exclusão?


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

  1. Faça o Commit: No GitHub Desktop, digite a mensagem (ex: Finaliza Capítulo 08 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_08_banco.md
│   └── codigos/
│       └── cap08/
│           └── gringotes_test.js

9. 💡 Checkpoint de Lógica

Para isolar os testes, usamos o conceito de Rollback: iniciamos uma transação, fazemos o teste (inserimos, alteramos) e no final damos um comando para desfazer tudo, deixando o banco limpo como estava antes!

10. 🔥 Desafio de Fixação

Pesquise o que significa o termo Massa de Dados (Seed) no contexto de testes de banco de dados.

🔑 Gabarito de Código/Fórmulas

Gabarito da Prática 1:

  1. Você precisa verificar se o saldo do Harry diminuiu 20 galeões E se o saldo do Rony aumentou 20 galeões. Os dois eventos precisam acontecer!

Capitulo Anterior | Proximo Capitulo