Uma suíte pode começar rápida e, sem perceber, virar o principal motivo para ninguém querer mexer no código. Cenários duplicados, fixtures compartilhadas e E2E para cada detalhe aumentam duração e flakiness até o feedback chegar tarde demais.
Testes também precisam de arquitetura. Responsabilidade, fronteira e custo de mudança importam tanto neles quanto no código de produção.
Organize pelo que o produto faz
Mantenho testes de unidade e módulo perto do código. Jornadas transversais ficam em uma área própria, agrupadas por capacidade — pagamento, agendamento, autenticação — e não apenas pela ferramenta usada.
Helpers devem remover ruído, não esconder ação e asserção. Um framework interno sofisticado demais faz a equipe depurar duas aplicações.
Cada nível assume uma responsabilidade
Uma regra deveria ser comprovada no nível mais baixo que oferece confiança. Domínio cobre combinações; integração valida tecnologia real; E2E confirma que as partes se conectam.
- Domínio: regras e transições sem infraestrutura.
- Contrato: expectativas entre módulos ou sistemas.
- Integração: banco, fila e adaptadores em ambiente controlado.
- Jornada: um objetivo crítico visto pelo usuário.
Dados de teste merecem projeto
Factories geram objetos válidos e deixam explícita apenas a diferença relevante. No banco, isolamento por transação, schema ou limpeza determinística evita que a ordem de execução mude o resultado.
Relógio e identificadores precisam ser controláveis. Aleatoriedade só ajuda quando a seed da falha fica registrada e reproduzível.
Playwright focado no que importa
Uso Playwright para um conjunto intencional de jornadas. Locators por role aproximam o teste da experiência real; esperas observam a UI ou a resposta relevante, nunca um cronômetro arbitrário.
Na experiência com Sinaxys e Entrega Contínua, fluxos envolvendo Stripe, N8N e WhatsApp reforçaram a necessidade de controlar fronteiras. Stubs respondem à maioria das perguntas; poucos testes de contrato validam a tradução com o provedor.
Uma suíte escala quando adicionar confiança custa menos do que manter testes que ninguém entende.
CI precisa ajudar no diagnóstico
Checks rápidos vêm primeiro, integração depois e E2E seletivo por último. Sharding reduz tempo apenas quando os dados estão isolados. Em uma falha, trace, screenshot, logs e rede precisam estar disponíveis.
Duração, flakiness e testes desabilitados são métricas práticas. Quarentena sem responsável e prazo costuma virar cemitério.
Refatore a suíte junto
Quando um contrato muda, removo cenários redundantes e reviso builders. Se uma refatoração interna quebra dezenas de testes, a suíte provavelmente conhece implementação demais.
Na ANIMAPS e na KasbHealth, módulos em Nest.js favorecem limites de teste equivalentes. A aplicação completa fica reservada para o que realmente precisa atravessar fronteiras.
Conclusão
Testes acompanham a evolução quando cada garantia tem lugar, dados isolados e um motivo claro. A meta não é acumular casos. É manter um feedback rápido e confiável mesmo quando produto, equipe e arquitetura já não têm o tamanho do primeiro release.