<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>TDD on Peczenyj's Blog</title><link>http://pacman.blog.br/categories/tdd/</link><description>Recent content in TDD on Peczenyj's Blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 08 Aug 2008 14:29:00 -0300</lastBuildDate><atom:link href="http://pacman.blog.br/categories/tdd/atom.xml" rel="self" type="application/rss+xml"/><item><title>Testable &amp; Untestable Code</title><link>http://pacman.blog.br/blog/2008/08/08/testable-untestable-code/</link><pubDate>Fri, 08 Aug 2008 14:29:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/08/08/testable-untestable-code/</guid><description>&lt;div class='post'>
Leitura recomendada:&lt;br />&lt;br />&lt;a href="http://misko.hevery.com/2008/07/24/how-to-write-3v1l-untestable-code/">http://misko.hevery.com/2008/07/24/how-to-write-3v1l-untestable-code/&lt;/a>&lt;br />&lt;a href="http://www.testingreflections.com/node/view/7221">http://www.testingreflections.com/node/view/7221&lt;/a>&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Guilherme Gall&lt;/div>
&lt;div class='content'>
Estou achando bem interessante a proposta do TDD. É algo que parece ser importante e que infelizmente não é visto na faculdade. Continue postando sobre isso sempre que é bem legal. Se puder, indique algum livro sobre o assunto.&lt;BR/>&lt;BR/>Saudações&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Voltas às Aulas e o Java - parte 2</title><link>http://pacman.blog.br/blog/2008/08/07/voltas-s-aulas-e-o-java-parte-2/</link><pubDate>Thu, 07 Aug 2008 17:43:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/08/07/voltas-s-aulas-e-o-java-parte-2/</guid><description>&lt;div class='post'>
Existe o clássico problema de determinar se um aluno passou ou não de ano quando são informados as notas e o número de faltas.&lt;br />&lt;br />Vejamos: &lt;br />1) O número de faltas é acima do permitido?. Aqui entra um &lt;span style="font-weight:bold;">if&lt;/span> dos bons com uma comparação numérica, quando um número é maior ou igual a outro.&lt;br />2) A média é basicamente somar as X notas e dividir por X (se for média aritmética). Somar e dividir são operações matemáticas básicas.&lt;br />&lt;br />Uma forma de fazer é:&lt;br />&lt;code> if( numero_de_faltas &amp;gt; maximo_de_faltas_toleradas) {&lt;br /> // reprovado por faltas&lt;br />} else if ( media_do_aluno &amp;lt; media_para_passar ){&lt;br /> // reprovado por nota&lt;br />} &lt;br />// se nem um nem outro, esta aprovado&lt;br />&lt;/code>&lt;br />&lt;br />O ruim dessa abordagem é que o aluno estar aprovado é uma condição "que sobra". Se passarmos a focar a aprovação do mesmo ficaria assim:&lt;br />&lt;br />&lt;code> if( media_do_aluno &amp;gt;= media_para_passar &amp;&amp; numero_de_faltas &amp;lt;= maximo_de_faltas_toleradas) {&lt;br /> // aprovado!&lt;br />} else {&lt;br /> // reprovado!&lt;br />}&lt;/code>&lt;br />&lt;br />É claro que eu posso que eu posso querer saber o motivo pelo qual o aluno foi reprovado:&lt;br />&lt;br />&lt;code> if( media_do_aluno &amp;gt;= media_para_passar &amp;&amp; numero_de_faltas &amp;lt;= maximo_de_faltas_toleradas) {&lt;br /> // aprovado!&lt;br />} else if(numero_de_faltas &amp;gt; maximo_de_faltas_toleradas){&lt;br /> // reprovado pelo número de faltas: ignoro a média.&lt;br />} else {&lt;br /> // aqui só sobra a reprovação por nota, &lt;br /> // basta fazer a tabela-verdade dessas expressões&lt;br />}&lt;/code>&lt;br />&lt;br />Se o foco do professor for o algoritmo, isso é o que deveria ser analisado. Quem implementa corretamente um método que recebe X notas e um número de faltas e consegue responder a essas perguntas consegue descrever facilmente os casos de teste para verificar se a implementação corresponde ao que se espera.&lt;br />&lt;br />Um programa que tenha algum tipo de interação (seja Swing ou console) ajuda a fazer um macarrão de código, mesclando o algoritmo com o controle de estado dos "menuzinhos". No fim vemos laços de repetição aonde não são necessários, calculo de média errado, etc.&lt;br />&lt;br />Ok, não acho que um marinheiro de primeira viagem devesse começar por JUnit, mas uma com boa noção dos fundamentos da linguagem e evitando a interação desnecessária com o usuario (poderia ser usado até os parâmetros do main), acredito num melhor desempenho. O risco é o aluno acreditar que java é dificil ou que tudo se resume a getters/setters e gigantescos try/catch's onde as exceptions são varridas pra debaixo do tapete. &lt;br />&lt;br />Eu colocaria TDD num segundo momento, mas ai sem perdão, ensinando o caboclo a fazer do jeito certo o quanto antes. O que é dificil se eles conseguem passar sem saber fazer aritmética básica.&lt;/div></description></item><item><title>Test Driven Development - parte 1.</title><link>http://pacman.blog.br/blog/2008/08/06/test-driven-development-parte-1/</link><pubDate>Wed, 06 Aug 2008 14:31:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/08/06/test-driven-development-parte-1/</guid><description>&lt;div class='post'>
Veja este código:&lt;br />&lt;br />&lt;pre>&lt;code> public void testEhPar() throws Exception{&lt;br /> assertTrue("2 deve ser par",algoritmo.ehPar(2));&lt;br /> assertTrue("4 deve ser par",algoritmo.ehPar(4));&lt;br /> assertTrue("6 deve ser par",algoritmo.ehPar(6));&lt;br /> &lt;br /> assertTrue("1 NAO deve ser par",!algoritmo.ehPar(1));&lt;br /> assertTrue("3 NAO deve ser par",!algoritmo.ehPar(3));&lt;br /> assertTrue("5 NAO deve ser par",!algoritmo.ehPar(5)); &lt;br /> }&lt;/code>&lt;/pre>&lt;br />&lt;br />Dentro de uma classe de teste, usando o framework &lt;a href="http://junit.sourceforge.net/#Getting">JUnit&lt;/a>, a leitura dessas linhas é a seguinte:&lt;br />&lt;br />Eu tenho um objeto chamado &lt;span style="font-style:italic;">algortimo&lt;/span>.&lt;br />A chamada algoritmo.ehPar(2) deve retornar &lt;span style="font-weight:bold;">true&lt;/span>, pois 2 é par, e este método informa se o parâmetro informado é, ou não, par.&lt;br />O método &lt;span style="font-weight:bold;">assertTrue&lt;/span> recebe dois parâmetros: uma mensagem informando o significado deste teste, e o resultado do mesmo.&lt;br />&lt;br />Se o método estivesse com algum problema e retornasse false, isso:&lt;br />&lt;br />assertTrue("2 deve ser par",algoritmo.ehPar(2));&lt;br />&lt;br />seria o mesmo que&lt;br />&lt;br />assertTrue("2 deve ser par",false);&lt;br />&lt;br />Logo, o teste falha, pois &lt;span style="font-weight:bold;">2 deve ser par&lt;/span>.&lt;br />&lt;br />Esta é uma forma &lt;span style="font-style:italic;">programática&lt;/span> de garantir o comportamento do código que eu desenvolvo: testando. Se o meu método só depende dos parâmetros informados, é muito simples verificar o seu funcionamento.&lt;br />&lt;br />Desenvolvendo os testes antes de implementar o código, tendo apenas as assinaturas dos métodos (por isso recorri a uma interface &lt;a href="http://pacman.blog.br/2008/08/voltas-s-aulas-e-o-java.html">aqui&lt;/a>, lembra?), eu posso pensar nos comportamentos esperados e, então, vou desenvolvendo até que todos os testes estejam passando.&lt;br />&lt;br />Não é nada fácil, funciona melhor quando o projeto que estás desenvolvendo está começando, porém os resultados são excelentes: veja o quanto de tempo estás economizando! Se tu pretendes determinar se um código teu está funcionando por programas que perguntam os valores, escrever &lt;br />&lt;br />&lt;pre>$ ant clean test&lt;/pre>&lt;br />&lt;br />é muito mais rápido! &lt;br />&lt;br />O problema surge quando queremos fazer algo complexo, pois a dificuldade de testar mostra problemas na arquitetura adotada, por exemplo. Quanto temos objetos que tem objetos, herança, polimorfismo, tecnicas mais avançadas podem ser usadas como usar Mocks de objetos (e prover os mecanismos para injetar estes Mocks).&lt;br />&lt;br />No caso desse exemplo, esta é uma solução:&lt;br />&lt;pre>&lt;code>public boolean ehPar(int numero){&lt;br /> return numero % 2 == 0;&lt;br />}&lt;/code>&lt;/pre>&lt;br />&lt;br />Muitos alunos desconhecem as operações de divisão e módulo entre inteiros. O 1, inteiro, dividido por 2, inteiro, não é 0.5, (em java), e sim 0, pois este é o resultado da divisão inteira. O resto da divisão, simbolizado por %, retorna 1. Dessa forma, o resto da divisão de um numero par por 2 é 0, caso contrario é um número inteiro. São operações básicas que precisam ser dominadas. Repare que eu fiz um código que funcione, não tentei nada mais maquiavélico que dê 0.0001 milissegundos mais rápido. &lt;a href="http://gc.blog.br/2008/01/08/a-falacia-da-otimizacao-prematura/">Evite a otimização precoce&lt;/a>.&lt;br />&lt;br />Programar profissionalmente é uma tarefa de &lt;span style="font-weight:bold;">muita&lt;/span> responsabilidade. Desenvolver testes para garantir a qualidade provê excelentes resultados a longo prazo.&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Sim sim, escrevi errado!&lt;/div>
&lt;/div>
&lt;div class='comment'>
&lt;div class='author'>OLP&lt;/div>
&lt;div class='content'>
"caso contrario é um número inteiro" não seria "caso contrario o numero é impar" ?&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>TDD com Perl</title><link>http://pacman.blog.br/blog/2008/05/02/tdd-com-perl/</link><pubDate>Fri, 02 May 2008 15:00:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2008/05/02/tdd-com-perl/</guid><description>&lt;div class='post'>
É possivel fazer Test Driven Development com Perl? Mas claro :)&lt;br />&lt;br />Artigo interessante sobre &lt;a href="http://perldoc.perl.org/Test/More.html">Test::More&lt;/a>:&lt;br />&lt;a href="http://www.testingreflections.com/node/view/5333">http://www.testingreflections.com/node/view/5333&lt;/a>&lt;br />&lt;br />Tutorial bem sucinto:&lt;br />&lt;a href="http://www.wgz.org/chromatic/perl/IntroTestMore.pdf">http://www.wgz.org/chromatic/perl/IntroTestMore.pdf&lt;/a>&lt;br />&lt;br />Excelente apresentação:&lt;br />&lt;a href="http://wellington.pm.org/archive/200606/tdd/">http://wellington.pm.org/archive/200606/tdd/&lt;/a>&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>Tiago Peczenyj&lt;/div>
&lt;div class='content'>
Trabalho que é coisa séria ninguem comenta... ;-)&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Testes Unitários com VBScript</title><link>http://pacman.blog.br/blog/2007/12/03/testes-unitrios-com-vbscript/</link><pubDate>Mon, 03 Dec 2007 12:49:00 -0300</pubDate><guid>http://pacman.blog.br/blog/2007/12/03/testes-unitrios-com-vbscript/</guid><description>&lt;div class='post'>
Nas ultimas semanas, tive que aprender VBScript por conta de alguns testes que estão por vir. A sintaxe é bem estranha, mas fazer o que...&lt;br />&lt;br />Entretanto é simples o suficiente para se desenvolver pequenas rotinas e, de quebra, aprender boas praticas de programação, como TDD, no exemplo abaixo:&lt;br />&lt;br />&lt;pre>&lt;code>' Função a ser testada&lt;br />' EhPrimo determina se um determinado número inteiro é primo ou não&lt;br />Function EhPrimo(numero)&lt;br /> '&lt;br /> 'coloque o codigo aqui :)&lt;br /> '&lt;br /> EhPrimo=false ' so pra retornar algo...&lt;br />End Function&lt;br />&lt;br />'Coloquei o nome Test para ficar mais facil :)&lt;br />Sub Test( objQuery, strMessage ) &lt;br /> If Not objQuery Then&lt;br /> WScript.Echo VbCrlf &amp; "ERRO: " &amp; strMessage&lt;br /> WScript.Quit 'no primeiro teste errado...&lt;br /> End If&lt;br />End Sub&lt;br />&lt;br />' Testando primos&lt;br />Primos = array(2,3,5,7,11)&lt;br />For Each Numero In Primos&lt;br /> Test EhPrimo(Numero),"Numero " &amp; Numero &amp; " deve ser primo!"&lt;br />Next&lt;br />&lt;br />' Testando _nao_ primos&lt;br />NaoPrimos = array(4,6,8,9,10)&lt;br />For Each Numero In NaoPrimos&lt;br /> Test (Not EhPrimo(Numero)),"Numero " &amp; Numero &amp; " NAO deve ser primo!"&lt;br />Next&lt;br />&lt;br />' Testando outras coisas&lt;br />Test (Not EhPrimo( 0)),"Numero 0 NAO deve ser primo!"&lt;br />Test (Not EhPrimo( 1)),"Numero 1 NAO deve ser primo!"&lt;br />Test (Not EhPrimo(-1)),"Numero -1 NAO deve ser primo!"&lt;br />&lt;br />&lt;br />WScript.Echo VbCrlf &amp; "Pronto, passou tudo!"&lt;/code>&lt;/pre>&lt;br />&lt;br />Pronto, agora &lt;br />&lt;br />Qual a vantagem dessa abordagem?&lt;br /> 1) vc se obriga a testar o seu código &lt;br /> 2) vc descobre quais parametros são uteis nas suas funções&lt;br /> 3) vc especifica o comportamento das suas funções ANTES de implementa-la:)&lt;/div>
&lt;h2>Comments&lt;/h2>
&lt;div class='comments'>
&lt;div class='comment'>
&lt;div class='author'>NetWalker&lt;/div>
&lt;div class='content'>
Paranóia minha, mas código VB sempre me pareceu como um texto que abriu com erros... :D&lt;/div>
&lt;/div>
&lt;/div></description></item></channel></rss>