Você sabe fazer testes E2E de verdade?
Olá pessoal, esse é meu primeiro post aqui, quero trazer um problema real que estou enfrentando no desenvolvimento de um projeto pessoal e gostaria da colaboração de todos entendidos no assunto, pois não achei nenhum conteúdo relevante sobre o tema.
No caso possuo uma aplicação cujo frontend é feito em ReactJS e o backend em NodeJS.
Independentemente das tecnologias utilizadas no frontend ou backend, imagine o seguinte cenário comum de criação de usuário em todas aplicações:
- Usuário entra no site (lado do frontend) http://localhost:3000;
- Clica no botão de "Cadastre-se";
- Digita seu nome, e-mail e CPF;
- É redirecionado para a tela de confirmação de cadastro;
- Recebe um código de verificação por e-mail;
- Digita o código de confirmação;
- É redirecionado para a tela de definição de senha;
- Digita sua senha;
- É redirecionado para o dashboard.
Fluxo bonito não é?
Se eu fizer um teste E2E no frontend, e botar pra rodar consigo validar todo o fluxo bonitinho. Mas e se eu rodar o mesmo teste pela segunda vez?
Como estou chamando a mesma api, ex: http://localhost:3333 como ela vai saber que essa requisição que ta vindo é de um teste E2E? Como já foi chamada na requisição anterior, vai falar que o usuário já existe no banco de dados não é verdade?
Uma das formas que eu imaginei de resolver isso seria, no momento que eu rodar o teste E2E no frontend, a minha variável NODE_ENV é definida para testing, a partir daí todas as requests que sairem do meu frontend irão para um backend de testes, ex: http://localhost:3334 e quando eu chegar na última etapa do meu teste, eu mando uma requisição http para o meu backend limpar o banco, ex: http://localhost:3334/clean-database
Acho que essa não seria a melhor das soluções, mas é a única forma que consigo pensar de prontidão.
Alguém aí já passou por esse problema, como resolveu?
PS: Lembrando que é um teste E2E que eu preciso fazer, mocks não são bem vindas.
Como estou chamando a mesma api, ex: http://localhost:3333 como ela vai saber que essa requisição que ta vindo é de um teste E2E? Como já foi chamada na requisição anterior, vai falar que o usuário já existe no banco de dados não é verdade?
Se essa for sua questão, você pode fazer "test environment" e rodar antes de todos os testes. Até porque, todos os testes deveriam ser agnósticos e não depender de resposta de requisições externas para poder prosseguir em algo. Você pode resetar seu banco de dados, executar comandos etc. como se em cada teste que você "rodasse", fosse um novo DB.
Nesse link tem um exemplo usando Jest e o Vitest. https://miniflare.dev/testing
A boa prática para isso que eu conheço é, realmente, fazer a variável NODE_ENV como você falou, mas não precisa fazer todo um back só para testes. Basta, no seu back normal, criar rotas de teste para as requisições, e aí, com um if/else, você determina se a request vai para a rota de teste ou de produção.
Exemplo:
if (process.env.NODE_ENV === 'prodution') {
server.post(lalala de produção...)
} else {
server.post(lalala de teste...)
}
Aí, na rota de teste, tu consegue fazer com que o BD sempre se limpe sempre que a request chegar. Foi o que eu aprendi, pelo menos
Eu entendo que os testes sempre devem rodar em um ambiente específico para testes, com uma database própria. E toda vez que um teste terminar de rodar, você dá um refresh na database (o ideal seria utilizar migrations e seeders que preparem a database para o próximo teste).