✅ Como você testaria isso? 🧪
Estou desenvolvendo um sistema open source, voltado para o gerenciamento acadêmico de instituições de ensino (https://github.com/ZaqueuCavalcante/syki).
Ele suporta MFA (Multi-Factor Authentication) e quero criar testes automatizados para essa funcionalidade.
O fluxo normal acontece quando o usuário:
- 1️⃣ Cria uma conta no sistema
- 2️⃣ Realiza login usando email + senha
- 3️⃣ Faz o setup do MFA (lendo sua chave e gerando o TOTP a partir dela)
- 4️⃣ Realiza logout e tenta logar novamente, informando email + senha
- 5️⃣ Informa corretamente o TOTP atual
- 6️⃣ Recebe o seu JWT, finalmente logando no sistema
Para evitar que alguém consiga logar direto, somente informando o TOTP, a API gera um cookie (Identity.TwoFactorUserId) contendo o UserId e manda na resposta do passo 4 apenas.
Por último, se você informar email + senha corretos, mas TOTP errado, não deve conseguir logar.
💡O jeito mais efetivo que encontrei pra realizar esses testes: subir uma única vez o Postgres + API (com WebApplicationFactory) e rodar todos os testes batendo diretamente na API, usando o HttpClient.
Dessa forma consigo:
- Rodar todos os testes em paralelo
- Ter um ambiente de testes o mais próximo possível do de produção
- Testar facilmente a autenticação via cookie do passo 5 (o próprio HttpClient já pega o cookie recebido e envia na próxima request)
Abaixo mostro como ficou o teste do fluxo normal.
Você pode ver o código aqui (https://github.com/ZaqueuCavalcante/syki) e a aplicação rodando aqui (https://app.syki.com.br). Venho postando no LinkedIn todas as atualizações de desenvolvimento do projeto (https://www.linkedin.com/in/zaqueu-cavalcante).
Você conhece um jeito melhor de fazer esses testes? Me deixe saber nos comentários abaixo, valeu!
Ao meu ver, o seu teste está muito bom, e eu faria algo parecido.
Contudo, tenho uma ressalva: este teste é um End-to-End Test (E2E). Recomendo limitar a quantidade desse tipo de teste e focar mais em Unit Tests.
Focar em testes unitários é importante porque eles são mais rápidos, fáceis de escrever e de manter. Como testam unidades isoladas do código (funções, métodos, classes), ajudam a identificar erros de forma precisa, sem depender de outras partes do sistema.
Já os testes end-to-end são importantes, mas por envolverem o sistema inteiro (ou boa parte dele), são mais lentos, frágeis e portanto difíceis de manter. Por isso, o ideal é manter poucos E2E para cobrir os fluxos críticos, e ter uma boa base de testes unitários.
abrs