Apesar de já existir durante os anos 60/70, foi a partir dos anos 90 que houve a popularização do tema de testes. Automatização e Integração Contínua se estabeleceram nos anos 2000 com o amadurecimento do tema. Atualmente, é muito difundido e comum, porém algumas questões ainda são debatidas.

Por que um teste pode não ser efetivo?

Nem sempre um teste é efetivo, apesar de oferecer uma boa cobertura de código.

Isso gera uma falsa sensação de segurança na suíte de testes, já que nem sempre os cenários mais importantes são exercitados. Ou seja, não é apenas uma questão de cobrir linhas de código, mas sim de cobri-las com contexto e significado. Dessa forma, exercitar o código com fluxos bem definidos gera muitos benefícios.

Caminhos felizes

O termo happy path (ou caminho feliz) indica o fluxo onde o código é executado sem erros, com a saída esperada. É importante que haja um ou mais cenários de teste para o happy path, porém ele em si não é suficiente. Para ter testes completos, devemos cobrir também os caminhos alternativos.

Fora do caminho

Caminhos alternativos representam erros ou falhas. É cobrir cenários como quando um usuário não envia a senha preenchida ou quando os dados fogem do padrão esperado. Estes fluxos são tão importantes quanto o happy path, pois são cenários funcionais reais da aplicação.

Ou seja, devemos nos focar em diferentes casos de uso efetivos e compreender que o happy path é apenas mais um deles. Existem alguns cenários que devem ser considerados:

  • Validação de entrada: Dados inválidos ou malformados
  • Casos limite (boundary testing): Valores nos extremos dos intervalos válidos
  • Erros de rede/conexão: Falhas de comunicação
  • Dados corrompidos: Informações inconsistentes ou danificadas
  • Timeouts: Operações que excedem o tempo limite

Sobre limites

Os testes de limite (boundary testing) têm como objetivo verificar como a aplicação se comporta com valores nos extremos dos dados válidos. O motivo é que são cenários onde erros são comuns, dessa forma os testes se tornam essenciais.

Considere: se valores entre 1 e 100 são válidos, então verificar entradas ao redor dessa faixa deve ser feito.

Exemplo: Comprimento de senha

Suponha que o sistema exija uma senha de 8 a 12 caracteres. Testes de limite seriam:

  • Senha de 8 caracteres (limite inferior, válido)
  • Senha de 12 caracteres (limite superior, válido)
  • Senha de 7 caracteres (inválido, abaixo do limite)
  • Senha de 13 caracteres (inválido, acima do limite)

Múltiplos cenários

Os cenários são essenciais: a forma como os dados são fornecidos à aplicação é importante. Eles representam os usos reais da aplicação, onde o código é executado em situações práticas. Dessa forma, conseguimos cobrir o que é essencial, criando cobertura a partir de casos de uso efetivos.

Benefícios de testes efetivos

  1. Confiança: Saber que o código funciona como esperado
  2. Refatoração segura: Poder mudar o código sem quebrar funcionalidades
  3. Documentação: Os testes servem como documentação viva do comportamento
  4. Detecção precoce de bugs: Encontrar problemas antes que cheguem à produção
  5. Melhor design: Forçar a pensar na API e na usabilidade do código

Concluindo

Testes efetivos vão além da cobertura de código - são sobre qualidade e confiança. Um teste efetivo é aquele que verifica se o comportamento está correto, não apenas se o código foi executado.

Teste o comportamento, não a implementação. Foque nos cenários que realmente importam para o usuário final e para a robustez da sua aplicação.