Capítulo 1. Automatizar testes

Mesmo bons programadores cometem erros. A diferença entre um bom programador e um programador ruim é que o bom programador utiliza testes para detectar seus erros o mais rapidamente possível. Quanto mais cedo você testar maior a sua chance de encontrar um erro e menos custará para e corrigir. Isso explica por que deixar para tester até pouco antes de lançar o software é tão problemático. A maioria dos erros nem são pegos, e o custo de corrigir os que você captura é tão grande que você tem que realizar uma triagem, porque você simplesmente não pode se dar ao luxo de corrigir todos eles.

Teste com PHPUnit não é uma atividade totalmente diferente do que você já deve estar fazendo, é apenas uma maneira diferente de fazê-lo. A diferença está entre o "testar", ou seja, verificar se o seu programa se comporta como esperado, e realizar uma "bateria de testes", fragmentos executáveis de código que automaticamente testam a veracidade das partes, estes fragmentos de código executável são chamados de testes de unidade.

Neste capítulo, iremos partir de simples "print em tela" para um teste completamente automatizado. Imagine que fomos chamados para fezer testes com o array embutido do PHP. Uma funcionalidade para testar é a função count(). Para um array recém-criado, esperamos que a função count() retorne 0 (zero). Depois que adicionar um elemento, count() deve retornar 1 (um). Exemplo 1.1 mostra o que queremos testar.


Exemplo 1.1: operações com matrizes de teste
$fixture = array ( ) ;
// $fixture is expected to be empty.

$fixture [ ] = 'element' ;
// $fixture is expected to contain one element.
?>


Uma maneira simples de verificar se realmente estamos obtendo os resultados que esperamos é imprimir o resultado de count() antes e após a adição do elemento (ver Exemplo 1.2 ). Se conseguirmos 0 e 1 , array e count() se comportam como esperado.


Exemplo 1.2: imprimir usando para testar as operações de matriz
$fixture = array ( ) ;
print count ( $fixture ) . "\n" ;

$fixture [ ] = 'element' ;
print count ( $fixture ) . "\n" ;
?>


Agora, gostaríamos de avançar a partir de testes que exigem interpretação técnica de testes que podem ser executadas automaticamente. No Exemplo 1.3 , nós escrevemos a comparação dos valores reais e esperados que o código de teste imprimo "ok" se os valores são iguais. Se algum dia vier um "não ok" como mensagem, sabemos que algo está errado.


Exemplo 1.3: Comparando os valores previstos e reais para testar as operações de matriz
$fixture = array ( ) ;
print count ( $fixture ) == 0 ? "ok\n" : "não ok\n" ;

$fixture [ ] = 'element' ;
print count ( $fixture ) == 1 ? "ok\n" : "não ok\n" ;
?>


Abaixo temos agora o fator de comparação de reais e os valores esperados para uma função que gera uma exceção quando há uma discrepância ( Exemplo 1,4 ). Isso nos dá duas vantagens: a escrita de testes se torna mais fácil e nós só temos saída quando algo está errado.


Exemplo 1.4: Usando uma função para testar a afirmação de operações com matrizes
$fixture = array ( ) ;
assertTrue ( count ( $fixture ) == 0 ) ;

$fixture [ ] = 'element' ;
assertTrue ( count ( $fixture ) == 1 ) ;

function assertTrue ( $condition )
{
   if ( ! $condition ) {
      throw new Exception ( 'Assertion failed.' ) ;
   }
}
?>


O teste agora é totalmente automatizada. Ao invés de apenas testar como fizemos com a nossa primeira versão, com esta versão, temos um teste automatizado.

O objetivo do uso de testes automatizados é cometer menos erros. Embora seu código ainda não será perfeito, mesmo com testes excelentes, você provavelmente vai ver uma redução drástica nos defeitos asssim que você começar a automatizar seus testes. Os testes automáticos lhe dão justificativa de confiança em seu código. Você pode usar essa confiança para dar mais saltos ousados no design (Refactoring), se dar melhor com seus colegas (Cross-Team Tests), melhorar as relações com seus clientes, e ir para casa todas as noites com a prova de que o sistema está melhor agora do que Foi esta manhã por causa de seus esforços.

Um comentário:

Ricardo disse...

Você sabia que o phpUnit faz parte de um modelo de específico framework de teste denominado xUnit?

“xUnit é o nome genérico para qualquer estrutura de testes automáticos unitários. O teste unitário ou de unidade é um processo que consiste na verificação da menor unidade do projecto de software.”

Fonte: http://pt.wikipedia.org/wiki/XUnit

Veja também: http://en.wikipedia.org/wiki/XUnit