Lidando com testes mentirosos - Estabilizando os ofensores

Em Lidando com testes mentirosos eu falei sobre a pirâmide alimentícia e a necessidade de ter mais testes unitários e menos testes de sistema. Porém mesmo com menos testes de sistema é necessário que eles sejam estáveis. Nesse post vamos falar de alguns princípios para conseguir isso.

Foco em uma funcionalidade específica

É importante que os testes foquem em uma funcionalidade específica. Por exemplo, se estou escrevendo um teste de pesquisa de clientes, é necessário ter um cliente cadastrado. Como não estou testando o cadastro de cliente, posso fazer com que o teste salve manualmente o cliente através de uma chamada ao banco.

O foco em uma funcionalidade específica torna o teste mais rápido e ajuda no isolamento de problemas. No caso acima se o teste falhar sei que o problema foi com a pesquisa e não com o cadastro.

Além disso, essa abordagem permite que testes sejam escritos mesmo que o sistema todo não esteja implementado, quebrando dependência entre histórias. Normalmente dependências entre histórias causam problemas de priorização e planejamento.

Testes independentes

Os testes devem ser independentes uns dos outros. Isto é, não deve ser obrigatório rodar o teste A antes do teste B e nada que o teste A fizer pode influenciar no resultado de B. Essa premissa tem duas conseqüências:

  • Cada teste deve preparar o ambiente necessário para sua execução. Ex. cadastrar clientes, pedidos, colocá-los em um status específico, etc.
  • Cada teste deve deixar o ambiente inalterado, ou seja, qualquer operação que altere o estado do sistema (ex. operações no banco, alterações em arquivo) devem ser desfeitas no final. Isso permite os testes sejam executados em qualquer ordem e podem ser executados várias vezes tendo o mesmo resultado.

Tecnologia certa

Existem várias tecnologias disponíveis para testes de sistema. As tecnologias programáveis em alguma linguagem conhecida são melhores. Elas ganham em custo de manutenção, flexibilidade e estabilidade.

Não recomendo as tecnologias das categorias abaixo:

  • Proprietárias: Elas não tem documentação e suporte da comunidade como as abertas. Pelo histórico, muitas deixaram de existir, deixando os seus usuários na mão, como o que ocorreu com alguns produtos da Mercury. Exemplos: QuickTest, Winrunner.
  • Baseadas em record/playback: O código gerado normalmente é ruim e favorece testes instáveis. Caso o código gerado não seja revisto manualmente, haverá muita duplicação entre os testes. Exemplo: Selenium IDE.

Base de testes limpa

Bagunça Confiança na base de teste é essencial para o sucesso de uma estratégia de automação.

É melhor ter poucos testes confiáveis do que muitos mentirosos. Se um teste está minando a confiança na sua base é melhor que ele não esteja lá, delete-o. É uma abordagem radical, mas que ajuda a manter uma base de testes limpa[1].


[1] Ver também Teoria das janelas quebrada