🧼 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
/resetvia API é muito mais rápido e confiável para limpezas profundas. 🏁