Testes não são para testar

Um teste é uma verificação feita sobre um programa para garantir que uma determinada entrada produza uma saída esperada. Testes são, de acordo com esta definição (propositalmente vaga), finitos e pontuais. Portanto não podem ser utilizados para verificar completamente a saída de um programa com entradas infinitas. A não ser que se disponha de tempo infinito.

Mas alguém tem tempo infinito?

Como a maioria dos programas úteis têm conjuntos de entrada extremamente grandes (e os infinitos nem são tão raros assim) e tempo não é um recurso muito abundante, testes só podem ser executados para um subconjunto necessariamente pequeno das entradas. Isso limita bastante a efetividade deles como recursos de validação. Não há como verificar se um programa está completamente correto com testes apenas, mas há várias técnicas que podem ser usadas para aproveitar melhor o pouco de certeza que eles podem oferecer. Testes não são perfeitos para validação, mas ainda são a melhor opção disponível.

Para que os testes sejam minimamente úteis, o programa precisa ser escrito com testabilidade em mente. A explosão combinatória pode derrubar os melhores programadores num piscar de olhos. Testar uma função de três parâmetros não costuma ser tão fácil quanto testar duas de dois. Quem quiser escrever testes um pouco menos complicados vai precisar tomar cuidado para não fazer tanta coisa dentro de uma função só. Do mesmo modo é mais fácil testar uma rotina que recebe um parâmetro de um sistema externo como entrada do que uma que faz a chamada internamente.

Estes são exemplos simples de separação de responsabilidades. Talvez sejam até óbvios, mas os defeitos ficam ainda mais destacados quando se está escrevendo o código dos testes junto com o código do programa em si. O maior valor dos testes está aí. Testabilidade é sinônimo de baixo acoplamento, que por sua vez é característica essencial do software bem escrito. Claro que testes servem para verificar corretude, mas somente de código bem feito. Atentar para os testes é mais do que validar saídas para entradas, é garantir que não está escrevendo uma grande bola de código entrelaçada de todos os lados.

4 Responses to “Testes não são para testar”


  1. 1 Márcio 24/nov/2007 às 14\0249

    Olá Thiago. Gostei do título provocativo. Realmente, testes são ferramentas do amplo processo de controle de qualidade de software.

    Ao planejar um conjunto de testes, validamos também a clareza dos objetivos do software. Para construir um teste e sua interação com o software, acabamos por revisar a organização do próprio software. E ao executar o teste, conseguimos inclusive testar o software.

  2. 2 Raony Araújo 27/nov/2007 às 12\1252

    Boa reflexão. Para mim testes sempre foram um mecanismo de aprendizado, primeiramente. Eu uso testes para aprender sobre o que eu faço, e isso serve para tudo na vida.

    abraços.

  3. 3 franktrindade 18/jan/2008 às 12\1213

    Thiago,

    excelent post! Escrevi tambem um pouco sobre isso no meu blog :-)
    http://franktrindade.wordpress.com/2008/01/16/a-fantastica-fabrica-de-testes-nao-seria-melhor-a-de-chocolate/

    Um abraco
    Francisco


  1. 1 Desenvolvedores odeiam testar « Motor Curiosidade Trackback em 27/nov/2007 às 12\1212
Comments are currently closed.




%d blogueiros gostam disto: