Fala pessoal, olha eu reacendendo a serie sobre testes de software. No ultimo post falei sobre testes de requisito. Agora e hora de falar do segundo lugar onde mais se encontram e corrigem defeitos: inspecao de codigo e testes unitarios.A inspecao de codigoEste teste se caracteriza pelo fato de ser executado apenas por quem entende o codigo-fonte, quem vai testar precisa ser desenvolvedor tambem. Aqui cabem varias abordagens. Uma delas e quem fez o codigo e quem faz a inspecao, mas ao mesmo tempo que quem escreveu o codigo e a pessoa que mais o compreende, seus olhos tambem correm o risco de estar viciados naquilo, entao uma outra abordagem e um desenvolvedor que nao fez o codigo que o inspecione. Uma terceira e revisar em grupo. Acho esta ultima a mais segura.Note que a inspecao de codigo e uma revisao, um highlevel checkout, voce le e tenta achar erros obvios de logica ou gramatica/digitacao. Nao mais que isso. Existem outros metodos mais complexos e formais de verificacao. A inspecao e importante porque e rapida em detectar erros grosseiros (ou nem tanto).Testes unitariosTestes unitarios sao o teste de comportamento de uma funcao, de um metodo ou de um conjunto intimamente relacionado de funcoes ou metodos. Eles sao a base dos testes dinamicos (aqueles realizados executando de fato o programa), e por serem altamente especificos, aumentam a confiabilidade dos testes.Eles geralmente sao automatizados, ou seja, voce escreve um programa para executa-los.Vou me estender no assunto, porque a automacao de testes e algo valido para muitos outros tipos de teste (funcionais, cobertura de codigo, seguranca, performance...).Vamos supor que voce tenha um codigo como:<phpfunction soma($a, $b) { return ($a + $b);}?>VocE pode testar esse codigo com uma funcao similar a:<phpfunction testSoma() { $source = array( array(1,1,2), array(0,1,1), array(1,0,1), array(0,-1,-1), array(-1,1,0), array('non', 'sense', "??") ); $i = 1; foreach ($source as $unit) { if (soma($unit[0], $unit[1]) === $unit[2]) { echo "Test $i OK \n"; } else { echo "Test $i FAIL. Dataset: " . print_r($unit, TRUE) . "\n"; } $i++; }}testSoma();?>Nao se deixe enganar pela simplicidade dos exemplos. Automatizar testes traz uma serie de vantagens. Uma delas delas e livrar o codigo principal de echos e prints. Mantendo a integridade do codigo e separando os conceitos. Sempre que voce sentir a necessidade de checar de alguma forma qual o estado atual do programa, escreva um teste.Uma outra vantagem e a possibilidade de reuso. Se voce alterar algo no codigo, podera executar a mesma bateria de testes, sem precisar reescrever.E uma ultima vantagem com o exemplo que dei, e um conceito bastante poderoso e utilizado em automacao de testes: os datasources. Eles permitem que voce mude o conjunto de inputs, sem alterar a funcao verificadora.No exemplo utilizei um array, escrito a mao mesmo. Porem, em ambientes de producao, voce pode criar seus datasources em planilhas ou bancos de dados, o que facilita tanto a criacao como a manutencao.Existem varios frameworks disponiveis para realizar testes unitarios. Aqui esta um otimo tutorial sobre o uso de frameworks de teste unitario.OK, agora vamos dissecar um pouco mais o exemplo que