🧼 5.7 Limpando o Estado em Testes de Sistema

Diferente dos testes de integração, nos testes de sistema não temos acesso direto ao EntityManager ou Session do Hibernate para dar um rollback. O teste interage com a URL, e o banco de dados é um efeito colateral oculto. Mas a independência de estado ainda é obrigatória.

🏗️ O Desafio da Base de Dados

Se um teste cadastra “Maurício” e o banco não é limpo, o próximo teste que tentar cadastrar “Maurício” pode falhar devido a uma UniqueConstraint.

🛡️ Estratégia de Elite: O Endpoint de Reset

A maneira mais performática de limpar o banco em testes de sistema é a aplicação expor uma URL de Infraestrutura (protegida) que executa o comando de limpeza.

📄 Exemplo de Implementação no Backend

@Controller
public class TestController {
    @Autowired private DatabaseCleaner cleaner;
 
    @RequestMapping("/test/reset")
    public void reset() {
        // ✅ Executa TRUNCATE em todas as tabelas (Apenas em ambiente de Teste!)
        cleaner.clean();
    }
}

🧪 Integrando o Reset no Cycle do Teste

No seu SystemTest.java, basta garantir que o reset seja chamado antes de cada cenário.

@BeforeEach
void resetDatabase() {
    driver.get("http://localhost:8080/test/reset");
}

📊 Fluxo de Higienização de Dados

flowchart TD
    A["🏁 Início Teste"] --> B["Navegar para /test/reset"]
    B --> C["Backend limpa o DB"]
    C --> D["Navegar para Página Inicial"]
    D --> E["Executar Fluxo do Teste ✨"]
    style B fill:#fdf2f2,stroke:#c0392b
    style C fill:#e3f2fd,stroke:#1e88e5

Segurança em Primeiro Lugar ⚡

Nunca exponha o endpoint de reset em ambiente de produção. Utilize perfis do Spring (@Profile("test")) para garantir que esse recurso só exista em ambientes controlados.


Dica de Ouro ⚡

Outra alternativa é usar o Selenium para navegar até uma página de “Exclusão” e deletar os itens criados. No entanto, o endpoint de /reset via API é muito mais rápido e confiável para limpezas profundas. 🏁


⬅️ Capítulo Anterior | Próximo Capítulo ➡️