Executando verificação de segurança...
1

✅ 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!

Carregando publicação patrocinada...
1

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