<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mauricio Aniche &#187; tdd</title>
	<atom:link href="http://www.aniche.com.br/tag/tdd/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.aniche.com.br</link>
	<description>Pensamentos sobre desenvolvimento de software</description>
	<lastBuildDate>Mon, 17 Oct 2011 00:59:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Agile Tour 2011 em Poços de Caldas</title>
		<link>http://www.aniche.com.br/2011/10/agile-tour-2011-em-pocos-de-caldas/</link>
		<comments>http://www.aniche.com.br/2011/10/agile-tour-2011-em-pocos-de-caldas/#comments</comments>
		<pubDate>Mon, 17 Oct 2011 00:54:00 +0000</pubDate>
		<dc:creator>mauricioaniche</dc:creator>
				<category><![CDATA[tdd]]></category>
		<category><![CDATA[agile tour]]></category>

		<guid isPermaLink="false">http://www.aniche.com.br/?p=362</guid>
		<description><![CDATA[Esse mês tive o prazer de fazer a palestra de abertura do Agile Tour Poços de Caldas 2011. A palestra foi bem introdutória. Discuti sobre testes automatizados e TDD. Minha ideia maior foi motivar os participantes a escreverem testes automatizados, a conhecerem TDD, e a perceberem que dá pra fazer isso de maneira divertida! Seguem <a href='http://www.aniche.com.br/2011/10/agile-tour-2011-em-pocos-de-caldas/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Esse mês tive o prazer de fazer a palestra de abertura do Agile Tour Poços de Caldas 2011. </p>
<p>A palestra foi bem introdutória. Discuti sobre testes automatizados e TDD. Minha ideia maior foi motivar os participantes a escreverem testes automatizados, a conhecerem TDD, e a perceberem que dá pra fazer isso de maneira divertida! <img src='http://www.aniche.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Seguem meus slides!</p>
<div style="width:425px" id="__ss_9724393"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/mauricioaniche/voc-ainda-no-pratica-tdd" title="Você ainda não pratica TDD?" target="_blank">Você ainda não pratica TDD?</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/9724393" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/mauricioaniche" target="_blank">mauricioaniche</a> </div>
</p></div>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.aniche.com.br%2F2011%2F10%2Fagile-tour-2011-em-pocos-de-caldas%2F&amp;title=Agile%20Tour%202011%20em%20Po%C3%A7os%20de%20Caldas" id="wpa2a_2"><img src="http://www.aniche.com.br/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.aniche.com.br/2011/10/agile-tour-2011-em-pocos-de-caldas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Testando datas (e métodos estáticos)</title>
		<link>http://www.aniche.com.br/2011/09/testando-datas-e-metodos-estaticos/</link>
		<comments>http://www.aniche.com.br/2011/09/testando-datas-e-metodos-estaticos/#comments</comments>
		<pubDate>Wed, 21 Sep 2011 19:26:41 +0000</pubDate>
		<dc:creator>mauricioaniche</dc:creator>
				<category><![CDATA[oop]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[teste de software]]></category>
		<category><![CDATA[API de data]]></category>
		<category><![CDATA[métodos estáticos]]></category>
		<category><![CDATA[testabilidade]]></category>
		<category><![CDATA[teste de unidade]]></category>

		<guid isPermaLink="false">http://www.aniche.com.br/?p=274</guid>
		<description><![CDATA[Muitas pessoas me perguntam como escrever testes de unidade de classes que lidam com datas. E, geralmente o problema está em como testar classes que usam a data/hora atual. Esse problema acontece pois grande parte das APIs que lidam com datas, tanto no mundo .Net quanto no mundo Java, fazem uso de métodos estáticos. Por <a href='http://www.aniche.com.br/2011/09/testando-datas-e-metodos-estaticos/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Muitas pessoas me perguntam como escrever testes de unidade de classes que lidam com datas. E, geralmente o problema está em como testar classes que usam a data/hora atual.</p>
<p>Esse problema acontece pois grande parte das APIs que lidam com datas, tanto no mundo .Net quanto no mundo Java, fazem uso de métodos estáticos. Por exemplo:</p>
<pre lang="brush:csharp">
DateTime.Now // C#
Calendar.getInstance() // Java
</pre>
<p>Generalizando o problema, a dificuldade nao é testar datas, mas sim qualquer classe que faz uso de métodos estáticos. Por exemplo, como escrever um teste para o método abaixo?</p>
<pre lang="brush:csharp">
public int DiasEntreHjEAData(DateTime data) {
  return (DateTime.Now - data).TotalDays;
}
</pre>
<p>A propriedade <strong>Now</strong> sempre irá devolver a data corrente, dificultando assim a escrita do teste; como escrever um teste onde o cenário muda o tempo todo?</p>
<p>Não conseguir simular o comportamento do método <strong>Now</strong>, e esse eh um dos problemas de usar métodos estáticos: dificulta o teste das classes que os utilizam (além de não permitir o uso decente de polimorfismo, mas isso é uma outra discussão&#8230;)</p>
<p>Para resolver esse problema, precisamos deixar de usar métodos estáticos. Mas e como fazer com as APIs que já existem, e não podemos mudá-las, como é o caso da API de <em>DateTime</em>? </p>
<p>Isso não nos impede de criarmos uma abstração em cima disso! Veja o código abaixo:</p>
<pre lang="brush:csharp">
public interface Relogio {
  DateTime Hoje();
}

public class RelogioDoSistema : Relogio {
  public DateTime Hoje() {
    return DateTime.Now;
  }
}
</pre>
<p>Veja que criamos a interface <em>Relogio</em>, que abstrai o problema de calcular a hora atual. Nosso método acima agora, em vez de invocar o método estático, faz uso da nova abstração:</p>
<pre lang="brush:csharp">
public class Algoritmo {

  // recebido pelo construtor
  private Relogio relogio;

  public int DiasEntreHjEAData(DateTime data) {
    return (relogio.Hoje() - data).TotalDays;
  }
}
</pre>
<p>Pronto. Veja agora que testar essa classe é facil. Basta passarmos um mock e simular o comportamento esperado do <em>Relogio</em>.</p>
<p>Resumindo, métodos estáticos dificultam a escrita de testes de unidade. Para resolver isso podemos: evitar a escrita de métodos estáticos, ou criar abstrações que escondem esses métodos. Nao é feio criar abstrações como a <em>Relogio</em>; feio é não testar! <img src='http://www.aniche.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.aniche.com.br%2F2011%2F09%2Ftestando-datas-e-metodos-estaticos%2F&amp;title=Testando%20datas%20%28e%20m%C3%A9todos%20est%C3%A1ticos%29" id="wpa2a_4"><img src="http://www.aniche.com.br/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.aniche.com.br/2011/09/testando-datas-e-metodos-estaticos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eu preciso de 100% de cobertura de testes?</title>
		<link>http://www.aniche.com.br/2011/02/sera-que-eu-preciso-de-100-de-cobertura-de-testes/</link>
		<comments>http://www.aniche.com.br/2011/02/sera-que-eu-preciso-de-100-de-cobertura-de-testes/#comments</comments>
		<pubDate>Tue, 22 Feb 2011 19:40:44 +0000</pubDate>
		<dc:creator>mauricioaniche</dc:creator>
				<category><![CDATA[tdd]]></category>
		<category><![CDATA[teste de software]]></category>
		<category><![CDATA[cobertura de código]]></category>
		<category><![CDATA[teste de integração]]></category>
		<category><![CDATA[teste de unidade]]></category>

		<guid isPermaLink="false">http://www.aniche.com.br/?p=237</guid>
		<description><![CDATA[Mito: não ter 100% de cobertura é a mesma coisa que nada! Muitas pessoas discutem a necessidade de ter 100% de cobertura em um código. Mas não vejo problemas em códigos que não tenham 100% de cobertura de testes de unidade. Acredito que isso deve ser uma meta da equipe, buscar sempre a maior cobertura <a href='http://www.aniche.com.br/2011/02/sera-que-eu-preciso-de-100-de-cobertura-de-testes/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p><strong>Mito: não ter 100% de cobertura é a mesma coisa que nada!</strong></p>
<p>Muitas pessoas discutem a necessidade de ter 100% de cobertura em um código. Mas não vejo problemas em códigos que não tenham 100% de cobertura de testes de unidade. </p>
<p>Acredito que isso deve ser uma meta da equipe, buscar sempre a maior cobertura possível; mas essa é uma meta que você provavelmente <em>não vai alcançar</em>; alguns trechos de código simplesmente não valem a pena serem testados de maneira isolada!</p>
<p>Explico: Veja essa classe do <a href="http://www.github.com/mauricioaniche/restfulie.net/">Restfulie.NET</a>, por exemplo, chamada <a href="https://github.com/mauricioaniche/restfulie.net/blob/master/Restfulie.Server/Marshalling/UrlGenerators/AspNetMvcUrlGenerator.cs">AspNetMvcUrlGenerator</a>: ela serve para gerar URLs para Actions em Controllers, utilizando as rotas pré-definidas. Repare que ela faz uso intenso das APIs do Asp.Net MVC, utilizando inclusive alguns métodos estáticos (que sabemos que é difícil de testar) como no HttpContext. </p>
<pre lang="java">
public class AspNetMvcUrlGenerator : IUrlGenerator
    {
        public string For(string controller, string action, IDictionary<string, object> values)
        {
            var httpContextWrapper = new HttpContextWrapper(HttpContext.Current);
            var urlHelper = new UrlHelper(new RequestContext(httpContextWrapper,
              RouteTable.Routes.GetRouteData(httpContextWrapper)));

            return FullApplicationPath(httpContextWrapper.Request) +
              urlHelper.Action(action, controller, new RouteValueDictionary(values));
        }

        private string FullApplicationPath(HttpRequestBase request)
        {
            var url = request.Url.AbsoluteUri.Replace(request.Url.AbsolutePath,
               string.Empty) + request.ApplicationPath;
            return url.EndsWith("/") ? url.Substring(0, url.Length - 1) : url;
        }
    }
</pre>
<p>Eu até poderia ter feito alguma mágica e escrito um teste de unidade para esse código. Mas para quê? Apenas para aumentar o número? <strong>Não faz sentido!</strong> Esse trecho de código precisa de um teste de integração, e não de um teste de unidade!</p>
<p>Um outro exemplo é o teste de propriedades (Properties do C#). Preciso realmente deles? A própria linguagem implementou isso pra mim. O mesmo acontece no caso dos getters/setters do Java, onde o programador geralmente usa o Eclipse para gerá-los.</p>
<p>Você precisa cobrir seu código de testes, mas você pode usar testes de diferentes níveis para isso (testes de unidade, de integração, de sistema, etc)! <strong>Escrever testes de unidade inúteis, apenas para chegar nos 100% de cobertura, é desperdício</strong>.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.aniche.com.br%2F2011%2F02%2Fsera-que-eu-preciso-de-100-de-cobertura-de-testes%2F&amp;title=Eu%20preciso%20de%20100%25%20de%20cobertura%20de%20testes%3F" id="wpa2a_6"><img src="http://www.aniche.com.br/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.aniche.com.br/2011/02/sera-que-eu-preciso-de-100-de-cobertura-de-testes/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Um pequeno estudo sobre asserções em testes</title>
		<link>http://www.aniche.com.br/2011/01/um-pequeno-estudo-sobre-assercoes-em-testes/</link>
		<comments>http://www.aniche.com.br/2011/01/um-pequeno-estudo-sobre-assercoes-em-testes/#comments</comments>
		<pubDate>Wed, 19 Jan 2011 14:21:25 +0000</pubDate>
		<dc:creator>mauricioaniche</dc:creator>
				<category><![CDATA[tdd]]></category>
		<category><![CDATA[teste de software]]></category>
		<category><![CDATA[asserção]]></category>
		<category><![CDATA[enquete no twitter]]></category>
		<category><![CDATA[estudo]]></category>
		<category><![CDATA[one assert per test]]></category>
		<category><![CDATA[testes]]></category>
		<category><![CDATA[testes de unidade]]></category>
		<category><![CDATA[uma asserção por teste]]></category>

		<guid isPermaLink="false">http://www.aniche.com.br/?p=321</guid>
		<description><![CDATA[Muitas pessoas já ouviram falar da regra &#8220;apenas uma asserção por teste&#8221; (only one assertion per test), famosa no post do Dave Astels. A regra, como o próprio nome diz, afirma que o programador nunca deve escrever mais de uma asserção pois a necessidade de mais de uma asserção em um teste poderia indicar que <a href='http://www.aniche.com.br/2011/01/um-pequeno-estudo-sobre-assercoes-em-testes/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Muitas pessoas já ouviram falar da regra &#8220;apenas uma asserção por teste&#8221; (<em>only one assertion per test</em>), famosa no <a href="http://www.artima.com/weblogs/viewpost.jsp?thread=35578">post do Dave Astels</a>. A regra, como o próprio nome diz, afirma que o programador nunca deve escrever mais de uma asserção pois a necessidade de mais de uma asserção em um teste poderia indicar que o método está fazendo coisas demais.</p>
<p>Há um mês atrás comecei a escrever um post sobre isso, mas meu exemplo era muito fraco. Corri então para olhar testes de alguns dos últimos projetos que participei, e pasmém: na maioria deles só havia uma asserção!</p>
<p>Ao observar os testes que continham mais de uma asserção, percebi que eles aconteciam nos seguintes casos:</p>
<ol style="margin-bottom:10px;">
<li>Quando o método retorna uma lista, array ou uma classe responsável por armazenar uma coleção de determinado objeto;</li>
<li>Quando o método retorna um novo objeto;</li>
<li>Quando o método é parte de uma DSL;</li>
</ol>
<p>Nos testes do tipo (1), as asserções mais comuns são para verificar o tamanho da lista e se o elemento existente nela é o esperado. Além disso, se o teste espera mais de um elemento na lista, o teste faz algum tipo de loop para verificar; Nos testes do tipo (2), o método de teste realiza asserções sobre os atributos do objeto retornado; E, finalmente, nos testes do tipo (3), que geralmente testam a DSL, e nesse caso um teste realmente testa mais de um comportamento ao mesmo tempo, e por isso, verifica mais de um comportamento.</p>
<p>Resolvi portanto perguntar a opinião de outros desenvolvedores sobre a regra. Para isso, enviei a <a href="http://twitter.com/mauricioaniche/status/23113080959406080">pergunta no twitter</a> (de forma não enviesada, perguntando apenas a opinião e, para os que me responderam de volta, exemplos de código aonde isso fizesse sentido).</p>
<p>Algumas pessoas concordaram com a ideia de apenas uma asserção por teste, afirmando que a regra ajuda a manter o código mais simples e mais fácil de manter. Além disso, quando o teste quebra, é fácil perceber o problema.</p>
<p>Outros já discordaram da regra, e afirmaram que o programador deve tentar escrever sempre o menor número possível de asserções, mas que a regra não precisa ser seguida à risca. Discutindo um pouco melhor esse ponto de vista, muitos deles afirmaram que um teste deve testar apenas uma única funcionalidade, não importando o número de asserções necessárias para tal.</p>
<p>Infelizmente a quantidade de códigos enviada foi muito baixa. Mas, o interessante é que <a href="http://bit.ly/gK0hDU">um dos códigos enviados</a> se encaixa em (1). Já o <a href="https://gist.github.com/769839">outro código enviado</a>, retirado de um livro de Ruby, não se encaixa em nenhum dos exemplos acima, mas pode-se dizer que aquele teste está na verdade testando duas funcionalidades: string com espaços no começo e no fim e string sem espaços.</p>
<p>A ideia desse post é portanto, fomentar essa discussão. Alguém tem um outro exemplo aonde mais de uma asserção por teste faça sentido, mas que não se encaixa nos casos acima?</p>
<p><strong>Agradecimentos</strong></p>
<p>Obrigado ao <a href="http://www.twitter.com/elemarjr">@elemarjr</a>, <a href="http://www.twitter.com/viniciusquaiato">@viniciusquaiato</a>, <a href="http://www.twitter.com/fabiovazquez">@FabioVazquez</a>, <a href="http://www.twitter.com/pedroreys">@pedroreys</a>, <a href="http://www.twitter.com/pisketti">@pisketti</a>, <a href="http://www.twitter.com/danielsilvarj">@danielsilvarj</a>, <a href="http://www.twitter.com/carlosgaldino">@carlosgaldino</a>, <a href="http://www.twitter.com/rodbv">@rodbv</a>, <a href="http://www.twitter.com/cessor">@cessor</a>, <a href="http://www.twitter.com/alexandregazola">@alexandregazola</a>, que responderam no Twitter.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.aniche.com.br%2F2011%2F01%2Fum-pequeno-estudo-sobre-assercoes-em-testes%2F&amp;title=Um%20pequeno%20estudo%20sobre%20asser%C3%A7%C3%B5es%20em%20testes" id="wpa2a_8"><img src="http://www.aniche.com.br/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.aniche.com.br/2011/01/um-pequeno-estudo-sobre-assercoes-em-testes/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>É &#8220;Test-Driven Design&#8221; e não &#8220;Design Done by Tests&#8221;</title>
		<link>http://www.aniche.com.br/2010/12/eh-tdd-e-nao-ddt/</link>
		<comments>http://www.aniche.com.br/2010/12/eh-tdd-e-nao-ddt/#comments</comments>
		<pubDate>Sat, 25 Dec 2010 21:52:39 +0000</pubDate>
		<dc:creator>mauricioaniche</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[design ágil]]></category>
		<category><![CDATA[experiência do programador]]></category>
		<category><![CDATA[orientação à objetos]]></category>
		<category><![CDATA[SOLID]]></category>
		<category><![CDATA[tdd não faz milagre]]></category>

		<guid isPermaLink="false">http://www.aniche.com.br/?p=304</guid>
		<description><![CDATA[Muitos códigos legados possuem graves problemas de design. Classes gigantes que fazem tudo ou classes altamente acopladas são exemplos reais de código presentes no dia-a-dia de muitos desenvolvedores. E isso não é uma exceção: as leis da evolução do software mostram que o código de um software tende a degradar. O trabalho do programador é <a href='http://www.aniche.com.br/2010/12/eh-tdd-e-nao-ddt/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Muitos códigos legados possuem graves problemas de design. Classes gigantes que fazem tudo ou classes altamente acopladas são exemplos reais de código presentes no dia-a-dia de muitos desenvolvedores. E isso não é uma exceção: <a href="http://en.wikipedia.org/wiki/Software_evolution">as leis da evolução do software</a> mostram que o código de um software tende a degradar. O trabalho do programador é evitar que isso aconteça ou, no pior caso, diminuir a velocidade desse processo de apodrecimento do design.</p>
<p>A busca por um design perfeito, que esteja preparado para aceitar mudanças e evoluir de forma simples, é difícil. Por esse motivo, a prática de TDD tem sido muito comentada pois, segundo seus praticantes, ela ajuda o programador a criar um design melhor.</p>
<p>Mas, a mais famosa frase da área de engenharia de software já nos diz que <em>não existe bala de prata</em>. Nenhuma prática garante o sucesso de um projeto ou um código de qualidade. As práticas estão lá para tentar manter o programador nessa direção.</p>
<p>E é a mesma coisa com TDD: a prática não resolverá todos os problemas de design que um programador enfrentará. O programador, na verdade, utiliza os testes para guiar o design. É através dele que o programador sabe se está indo no caminho certo ou não. Isso não quer dizer que TDD faz o design sozinho para o programador. É óbvio que o programador precisa ter experiência e conhecimento necessários para que o design saia realmente com qualidade.</p>
<p>Mas um programador que tenha alto conhecimento e experiência em desenvolvimento também pode criar um design com a mesma qualidade. A diferença é que TDD (e os testes gerados) dão feedback muito mais rápido sobre a qualidade. O gráfico abaixo, feito pelo Gleen Vanderburg, mostra o <a href="http://portal.acm.org/citation.cfm?id=1103845.1094854">tempo de feedback de várias práticas ágeis</a>. Veja que TDD dá feedback em minutos, ou seja, em alguns minutos o programador tem informações sobre o seu design. Através dos testes ele pode obter informações como a coesão da classe, o acoplamento, a simplicidade, etc. Novamente, o programador usa sua experiência para receber e entender esse feedback.</p>
<p style="text-align: center;"><img class="alignnone" src="http://www.aniche.com.br/wp-content/uploads/2010/12/PráticaságeisefeedbackVanderburg.jpg" alt="" width="428" height="352" /></p>
<p style="text-align: center;"><strong>Figura 1. </strong>Práticas e tempo de feedback</p>
<p>Essa é na verdade a grande diferença para o design feito pelo arquiteto-astronauta, famoso no modelo Waterfall, para os designs ágeis. O arquiteto pode ter muita experiência, mas o design que ele faz leva tanto tempo para ser validado e receber feedback que, quando isso acontece, o custo de mudança é altíssimo.</p>
<p>Além disso, o programador ao usar TDD (e por consequência guiar seu design através dos testes) é &#8220;forçado&#8221; a utilizar bons princípios de orientação a objetos. Os tão falados <a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod">princípios SOLID</a> passam a fazer mais sentido no momento em que o programador precisa escrever um código que seja fácil de testar. Parafraseando Feathers, <a href="http://michaelfeathers.typepad.com/michael_feathers_blog/2007/09/the-deep-synerg.html">existe uma grande sinergia entre código fácil de testar e código bom</a>. Esses bons padrões facilitam o programador a escrever um código mais fácil de testar, <a href="http://blog.ploeh.dk/2010/12/22/TheTDDApostate.aspx">apesar do Mark Seemann discordar</a>.</p>
<p>Novamente, a experiência do programador conta. O programador experiente sabe que deve gerenciar as dependências entre classes (DIP), sabe que as classes devem ser coesas (SRP), sabe que elas devem evoluir sem a necessidade de reescrevê-la (OCP), e etc. Programadores que não usam TDD também podem fazer uso desses bons princípios. A diferença é que TDD dá feedback quase instantâneo: a necessidade da utilização dessas ideias aparece após alguns minutos programando, o que não é verdade quando o programador não faz TDD.</p>
<p>Enfim, TDD não faz milagre. Mas ele fica lembrando o programador constantemente sobre a necessidade de manter o código limpo. E a necessidade disso é evidente. Com certeza outros programadores irão encontrar outras práticas que também dão feedback sobre qualidade de design ao desenvolvedor. Mas, enquanto isso não acontece, eu recomendo a utilização de TDD.</p>
<p><em>Mas lembre-se: é <strong>design guiado pelos testes (Test-Driven Design)</strong> e não design feito pelos testes!</em></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.aniche.com.br%2F2010%2F12%2Feh-tdd-e-nao-ddt%2F&amp;title=%C3%89%20%26%238220%3BTest-Driven%20Design%26%238221%3B%20e%20n%C3%A3o%20%26%238220%3BDesign%20Done%20by%20Tests%26%238221%3B" id="wpa2a_10"><img src="http://www.aniche.com.br/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.aniche.com.br/2010/12/eh-tdd-e-nao-ddt/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Cuidado com seus baby steps!</title>
		<link>http://www.aniche.com.br/2010/11/cuidado-com-seus-baby-steps/</link>
		<comments>http://www.aniche.com.br/2010/11/cuidado-com-seus-baby-steps/#comments</comments>
		<pubDate>Fri, 19 Nov 2010 23:59:07 +0000</pubDate>
		<dc:creator>mauricioaniche</dc:creator>
				<category><![CDATA[tdd]]></category>
		<category><![CDATA[baby steps]]></category>
		<category><![CDATA[refatoração]]></category>
		<category><![CDATA[simplicidade]]></category>

		<guid isPermaLink="false">http://www.aniche.com.br/?p=292</guid>
		<description><![CDATA[TDD sugere que o programador ande sempre em passos de bebê (os famosos baby steps): ele deve escrever testes sempre para a menor funcionalidade possível, escrever o código mais simples que faça o teste passar e fazer sempre apenas uma refatoração por vez. Às vezes vejo pessoas interpretando errado o “escrever o código mais simples <a href='http://www.aniche.com.br/2010/11/cuidado-com-seus-baby-steps/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>TDD sugere que o programador ande sempre em passos de bebê (os famosos baby steps): ele deve escrever testes sempre para a menor funcionalidade possível, escrever o código mais simples que faça o teste passar e fazer sempre apenas uma refatoração por vez.</p>
<p>Às vezes vejo pessoas interpretando errado o “escrever o código mais simples que faça o teste passar”. Na opinião delas, um if a mais é o código mais simples que ela pode escrever. E de repente, você tem um código cheio de if, praticamente ilegível, e só a partir daí é que começam as refatorações.</p>
<p>A ideia de escrever o código mais simples é justamente fazer com que o programador evite criar complexidade desnecessária. E na minha opinião, evitar na verdade complexidade de design (sabe aquela história de você criar uma façade que chama uma factory que cria um strategy que invoca um command, e por aí vai? Ou criar uma classe acoplada com outras 10 porque você acha que ela vai precisar?).<br />
Se você for implementar uma soma (péssimo exemplo?), e escrever:</p>
<pre>
public class CalculadoraTest {
  @Test
  public void DoisMaisDoisEhQuatro() {
    assertEquals(4, new Calculadora().soma(2,2));
  }
}

public class Calculadora {
  public int soma(int a, int b) {
    return 2;
  }
}
</pre>
<p>E logo em seguida…</p>
<pre>
public class CalculadoraTest {
  ...

  @Test
  public void TresMaisDoisEhCinco() {
    assertEquals(5, new Calculadora().soma(3,2));
  }
}

public class Calculadora {
  public int soma(int a, int b) {
    if(a==3) return 5;
    return 2;
  }
}
</pre>
<p>E depois…</p>
<pre>
public class CalculadoraTest {
  ...

  @Test
  public void QuatroMaisDoisEhSeis() {
    assertEquals(6, new Calculadora().soma(4,2));
  }
}

public class Calculadora {
  public int soma(int a, int b) {
    if(a==3) return 5;
    if(a==4) return 6;
    return 2;
  }
}
</pre>
<p>para só então chegar no código:</p>
<pre>
public class Calculadora {
  public int soma(int a, int b) {
    return a + b;
  }
}
</pre>
<p>… você não entendeu muito bem o objetivo de escrever o código mais simples que faça o teste passar! </p>
<p>No livro do Kent Beck [1], ele mostra o exemplo da classe Money, e ele faz os passos mais simples que fazem o teste passar. Passos realmente simplórios, parecidos com os do exemplo acima, que qualquer programador poderia considerar desnecessários. Mas logo em seguida, ele faz a seguinte afirmação: “Se eu faço assim o tempo todo? Claro que não. Mas eu fico feliz em saber que poderia fazer!”.</p>
<p>Ou seja, TDD não é fazer baby steps o tempo todo, e sim poder fazer baby steps quando necessário! Se você está escrevendo algum trecho de código complicado, você pode andar mais devagar; agora, se está escrevendo algum trecho de código simples, e você está confiante sobre isso, você pode dar um passo maior!</p>
<p>Um exemplo que me agrada muito em um outro artigo do Beck [2] é o exemplo de uma classe que lida com tabelas de mortalidade, ou seja, ela deve calcular valores de acordo com a idade de uma pessoa. Uma classe que poderia ser escrita naturalmente da seguinte maneira:</p>
<pre>
public class MortalityTable {
  public MortalityTable(Person person) {
    // ...
  }

  public Table calculate() {
    // usa Person aqui para calcular a tabela
  }
}
</pre>
<p>E ele mostra que, ao usar TDD para gerar essa classe, ele percebeu que (i) gerar uma entidade Person era complicado e (ii) a classe MortalityTable só precisava realmente da idade da pessoa para fazer o cálculo. Então, ele refatorou:</p>
<pre>
public class MortalityTable {
  public MortalityTable(int age) {
    // ...
  }

  public Table calculate() {
    // usa apenas a idade para calcular a tabela
  }
}
</pre>
<p>Ou seja, passar a idade para a classe MortalityTable era o jeito mais simples que ele tinha para resolver o problema! Isso sim é escrever o código mais simples que faz o teste passar! Perceberam a diferença?</p>
<p>Para terminar o post, gostaria de parafrasear o Jason Gorman:<a href="http://twitter.com/jasongorman/status/29567110190"> If “doing the simplest thing” tends to lead to lots of IF’s or Switch statements, it’s possible you’ve misunderstood TDD</a>.</p>
<p><strong>Referências</strong></p>
<p>[1] Beck, K. <em>Test-Driven Development: By Example</em>. Addison-Wesley Professional, 2002.<br />
[2] Beck, K. <em>Aim, Fire</em>. IEEE Software Volume 18 Issue 5, September 2001.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.aniche.com.br%2F2010%2F11%2Fcuidado-com-seus-baby-steps%2F&amp;title=Cuidado%20com%20seus%20baby%20steps%21" id="wpa2a_12"><img src="http://www.aniche.com.br/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.aniche.com.br/2010/11/cuidado-com-seus-baby-steps/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Você quer testar métodos privados? Certeza?</title>
		<link>http://www.aniche.com.br/2010/11/voce-quer-testar-metodos-privados-certeza/</link>
		<comments>http://www.aniche.com.br/2010/11/voce-quer-testar-metodos-privados-certeza/#comments</comments>
		<pubDate>Mon, 01 Nov 2010 13:30:00 +0000</pubDate>
		<dc:creator>mauricioaniche</dc:creator>
				<category><![CDATA[oop]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[coesão]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[métodos privados]]></category>
		<category><![CDATA[srp]]></category>

		<guid isPermaLink="false">http://www.aniche.com.br/?p=205</guid>
		<description><![CDATA[Essa é uma discussão frequente, que inclusive apareceu recentemente no .NET Architects: devo ou não devo testar métodos privados? Minha opinião é que não, você nunca precisa testar métodos privados! Se você está escrevendo testes para uma classe, e sente a necessidade de testar um determinado método privado de maneira isolada, isso é bom: você está <a href='http://www.aniche.com.br/2010/11/voce-quer-testar-metodos-privados-certeza/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Essa é uma discussão frequente, que inclusive <a href="http://groups.google.com.br/group/dotnetarchitects/browse_thread/thread/f3753557a6d7827d/e1a4cbbf60a8a9ee?#e1a4cbbf60a8a9ee">apareceu recentemente</a> no .NET Architects: devo ou não devo testar métodos privados? Minha opinião é que <strong>não, você nunca precisa testar métodos privados</strong>!</p>
<p>Se você está escrevendo testes para uma classe, e sente a necessidade de testar um determinado método privado de maneira isolada, isso é bom: você está recebendo <em>feedback</em> do seu teste em relação ao seu design! Afinal, não é isso que todos dizem sobre TDD?</p>
<p>E o que o teste está dizendo? Ele está te dizendo que sua classe <strong>não está coesa</strong>. Quando uma classe não é coesa, ou seja, ela tem mais do que uma responsabilidade (ela faz coisas demais!), geralmente existem um conjunto de métodos nela que são responsáveis por uma das responsabilidades, e um outro conjunto de métodos responsáveis pela outra responsabilidade.</p>
<p><em>Uma situação real:</em> O programador criou uma classe para lidar com uma funcionalidade específica, e para isso criou um método público. A outra necessidade surgiu com o passar do tempo (às vezes nem tanto tempo assim; de repente ela apareceu 3 ou 4 testes depois!), e por ser algo que a funcionalidade inicial precisa, acabou virando um método privado dentro dessa classe. Esse método privado começa a crescer tanto que você quer testá-lo.</p>
<p>O que fazer? <strong>Extraia esse comportamento para uma nova classe</strong>. Essa nova classe será responsável somente por isso. Em seguida, faça a primeira classe depender dessa nova classe. Você conseguirá dar um nome bem significativo para essa nova classe, pois ela muito provavelmente representa um conceito de domínio, que até então estava escondido.</p>
<p>Extrair comportamentos para novas classes é algo muito comum ao se fazer TDD. Conforme o programador vai evoluindo a funcionalidade, novas responsabilidades aparecem e é muito tentador colocar todas elas no mesmo lugar. Que sorte a nossa termos o teste pra nos avisar! <img src='http://www.aniche.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Referências:</strong></p>
<p>Martin, Robert. <em>Principles of OOD</em>. <a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod">http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod</a></p>
<p>Feathers, Michael. <em>The Deep Synergy between Testability and Good Design</em>. <a href="http://michaelfeathers.typepad.com/michael_feathers_blog/2007/09/the-deep-synerg.html">http://michaelfeathers.typepad.com/michael_feathers_blog/2007/09/the-deep-synerg.html</a></p>
<p>Caroli, Paulo. <em>Testing Private Methods, TDD and Test-Driven Refactoring.</em> <a href="http://agiletips.blogspot.com/2008/11/testing-private-methods-tdd-and-test.html">http://agiletips.blogspot.com/2008/11/testing-private-methods-tdd-and-test.html</a>, 2008.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.aniche.com.br%2F2010%2F11%2Fvoce-quer-testar-metodos-privados-certeza%2F&amp;title=Voc%C3%AA%20quer%20testar%20m%C3%A9todos%20privados%3F%20Certeza%3F" id="wpa2a_14"><img src="http://www.aniche.com.br/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.aniche.com.br/2010/11/voce-quer-testar-metodos-privados-certeza/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>TDD diminui o acoplamento, mas só isso não resolve!</title>
		<link>http://www.aniche.com.br/2010/10/tdd-diminui-o-acoplamento-mas-so-isso-nao-resolve/</link>
		<comments>http://www.aniche.com.br/2010/10/tdd-diminui-o-acoplamento-mas-so-isso-nao-resolve/#comments</comments>
		<pubDate>Fri, 15 Oct 2010 15:41:23 +0000</pubDate>
		<dc:creator>mauricioaniche</dc:creator>
				<category><![CDATA[tdd]]></category>
		<category><![CDATA[xp]]></category>
		<category><![CDATA[acoplamento]]></category>
		<category><![CDATA[dependências]]></category>
		<category><![CDATA[design de classes]]></category>
		<category><![CDATA[estabilidade]]></category>

		<guid isPermaLink="false">http://www.aniche.com.br/?p=204</guid>
		<description><![CDATA[Uma das conhecidas vantagens do TDD é que ele &#8220;diminui o acoplamento&#8221;, ou &#8220;ajuda a diminuir o acoplamento&#8221;. Entretanto, alguns estudos (como os que comentei nesse post) mostram que, quando medidos, a diferença de acoplamento entre projetos feitos com TDD e projetos não feitos com TDD não é tão grande assim. Por que isso acontece? <a href='http://www.aniche.com.br/2010/10/tdd-diminui-o-acoplamento-mas-so-isso-nao-resolve/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Uma das conhecidas vantagens do TDD é que ele &#8220;diminui o acoplamento&#8221;, ou &#8220;ajuda a diminuir o acoplamento&#8221;. Entretanto, alguns estudos (como os que comentei nesse <a href="http://www.aniche.com.br/2010/04/tdd-realmente-ajuda/">post</a>) mostram que, quando medidos, a diferença de acoplamento entre projetos feitos com TDD e projetos não feitos com TDD não é tão grande assim. Por que isso acontece?</p>
<p>Suponha o seguinte código:</p>
<pre lang="java">public class Copiadora {
  public void copiar() {
    var leitor = new LeitorDeXML();
    var escritor = new EscritorPelaSerial();
    while (leitor.TemCaracteres()) {
      escritor.Escreve(leitor.LeCaracteres());
    }
  }
}</pre>
<p>Veja que essa classe é fortemente acoplada com duas classes: <em>LeitorDeXML</em> e <em>EscritorPelaSerial</em>. Se quantificarmos isso, podemos dizer que o acoplamento dessa classe é igual a &#8220;2&#8243; (já que ela está acoplada a 2 classes).</p>
<p>Mas, ao fazer TDD, você naturalmente criaria um código parecido com isso:</p>
<pre lang="java">public interface ILeitor {
  bool TemCaracteres();
  string LeCaracteres();
}
public interface IEscritor {
  void Escreve(string conteudo);
}
public class Copiadora {
  private ILeitor leitor;
  private IEscritor escritor;
  public Copiadora(ILeitor leitor, IEscritor escritor) {
    this.leitor = leitor;
    this.escritor = escritor;
  }
  public void Copiar() {
    while (leitor.TemCaracteres()) {
      escritor.Escreve(leitor.LeCaracteres());
    }
  }
}</pre>
<p>Veja que agora a classe é acoplada com as interfaces <em>ILeitor</em> e <em>IEscritor</em>. Ainda assim, a métrica de acoplamento nos informaria &#8220;2&#8243;.</p>
<p>Qual a diferença? <em>A diferença agora é que a classe está acoplada com módulos (classes, interfaces) mais </em><strong><em>estáveis</em></strong><em>. </em>A estabilidade, segundo Bob Martin [1], mede o quão difícil (ou improvável) é realizar uma mudança na classe.</p>
<p>As classes <em>LeitorDeXML</em> e <em>EscritorPelaSerial</em> muito provavelmente são acopladas com outras classes (a classe <em>EscritorPelaSerial</em>, por exemplo, deve ser acoplada com alguma outra classe que auxilia na troca de mensagens pela porta serial) e isso faz com que elas possam eventualmente sofrer alterações; são classes mais voláteis. Já as interfaces <em>ILeitor</em> e <em>IEscritor</em> não dependem de nada, são independentes. Além disso, essas interfaces serão implementadas por várias outras classes, e isso faz com que essas interfaces sejam ainda mais difíceis de mudar (afinal, se você mudar uma delas, você vai ter que mudar a implementação em N classes que as implementam), tornando-as assim altamente estáveis.</p>
<p>Podemos dizer então que uma <strong>boa dependência</strong> é uma dependência com um módulo (ou classe) estável, e uma <strong>má dependência</strong> é uma dependência com um módulo (ou classe) instável. <em>TDD faz com que o programador acople suas classes com módulos geralmente mais estáveis! </em>Por quê? Porque TDD obriga você a pensar apenas no que você espera das outras classes, sem pensar ainda em uma implementação concreta. Esses comportamentos esperados acabam geralmente se transformando em interfaces, que frequentemente se tornam estáveis.</p>
<p>Para garantir um design de qualidade não basta apenas reduzir o acoplamento, mas sim acoplar com <em>boas dependências</em>! E para medir qualidade de design, também não bastam apenas métricas de acoplamento! <img src='http://www.aniche.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><strong>Referências</strong></p>
<p>Esse post é fortemente baseado no trabalho do Bob Martin sobre princípios e métricas de qualidade em design de sistemas orientados à objetos.</p>
<p>[1] Martin, Robert C. <em>Stability</em> (<a href="http://www.objectmentor.com/resources/articles/stability.pdf">http://www.objectmentor.com/resources/articles/stability.pdf</a>)<br />
[2] Martin, Robert C. <em>Agile Principles, Patterns and Practices in C#</em></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.aniche.com.br%2F2010%2F10%2Ftdd-diminui-o-acoplamento-mas-so-isso-nao-resolve%2F&amp;title=TDD%20diminui%20o%20acoplamento%2C%20mas%20s%C3%B3%20isso%20n%C3%A3o%20resolve%21" id="wpa2a_16"><img src="http://www.aniche.com.br/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.aniche.com.br/2010/10/tdd-diminui-o-acoplamento-mas-so-isso-nao-resolve/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Minha apresentação na Agile Brazil 2010</title>
		<link>http://www.aniche.com.br/2010/06/minha-apresentacao-na-agile-brazil-2010/</link>
		<comments>http://www.aniche.com.br/2010/06/minha-apresentacao-na-agile-brazil-2010/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 21:33:46 +0000</pubDate>
		<dc:creator>mauricioaniche</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[Agile Brazil 2010]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[desvios]]></category>
		<category><![CDATA[engenharia de software empirica]]></category>

		<guid isPermaLink="false">http://www.aniche.com.br/?p=176</guid>
		<description><![CDATA[Olá pessoal, Obrigado a quem compareceu na apresentação! Os slides estão aqui! Desvios comuns em TDD View more presentations from mauricioaniche. Qualquer dúvida, sugestão, crítica, por favor me mandem!]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal,</p>
<p>Obrigado a quem compareceu na apresentação! Os slides estão aqui!</p>
<div id="__ss_4607459" style="width: 425px;"><strong><a title="Desvios comuns em TDD" href="http://www.slideshare.net/mauricioaniche/desvios-comuns-em-tdd">Desvios comuns em TDD</a></strong><object id="__sse4607459" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=agilebrazil2010-100624162444-phpapp02&amp;stripped_title=desvios-comuns-em-tdd" /><param name="name" value="__sse4607459" /><param name="allowfullscreen" value="true" /><embed id="__sse4607459" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=agilebrazil2010-100624162444-phpapp02&amp;stripped_title=desvios-comuns-em-tdd" name="__sse4607459" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="padding: 5px 0 12px;">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/mauricioaniche">mauricioaniche</a>.</div>
<div style="padding: 5px 0 12px;">Qualquer dúvida, sugestão, crítica, por favor me mandem! <img src='http://www.aniche.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </div>
</div>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.aniche.com.br%2F2010%2F06%2Fminha-apresentacao-na-agile-brazil-2010%2F&amp;title=Minha%20apresenta%C3%A7%C3%A3o%20na%20Agile%20Brazil%202010" id="wpa2a_18"><img src="http://www.aniche.com.br/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.aniche.com.br/2010/06/minha-apresentacao-na-agile-brazil-2010/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Eu faço TDD. Preciso testar?</title>
		<link>http://www.aniche.com.br/2010/06/eu-faco-tdd-preciso-testar/</link>
		<comments>http://www.aniche.com.br/2010/06/eu-faco-tdd-preciso-testar/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 15:00:35 +0000</pubDate>
		<dc:creator>mauricioaniche</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[teste de software]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[software design]]></category>

		<guid isPermaLink="false">http://www.aniche.com.br/?p=173</guid>
		<description><![CDATA[Claro que sim. TDD é uma atividade de design. O teste de unidade que você escreve serve basicamente para definir suas expectativas em relação ao código que você vai escrever. E, ao fazer isso, você pensa não só no nível da implementação do algoritmo, mas em um nível um pouco mais alto: no nível de <a href='http://www.aniche.com.br/2010/06/eu-faco-tdd-preciso-testar/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Claro que <strong>sim</strong>.</p>
<p>TDD é uma atividade de design. O teste de unidade que você escreve serve basicamente para definir suas expectativas em relação ao código que você vai escrever. E, ao fazer isso, você pensa não só no nível da implementação do algoritmo, mas em um nível um pouco mais alto: no nível de design. TDD permite que você brinque e experimente diferentes possíveis designs, dando feedback rápido sobre o resultado obtido, até que você encontre o design ideal para aquela situação.</p>
<p>Ou seja, quando você faz TDD, você pensa exclusivamente em design e não em testes. É uma prática de suporte para <strong>design</strong> de software.</p>
<p>Mas&#8230; É claro que você precisa testar! Você não apaga os testes que você produziu usando TDD, óbvio. Mas muito provavelmente eles não testam todas as possibilidades possíveis. E é aí que outras técnicas entram em cena, e você pode encontrar muita informação sobre elas em [1][2].</p>
<p>Resumindo, use TDD quando você precisa trabalhar no design de determinada classe ou módulo. Quando você estiver satisfeito com design, é hora de testar! Aí você pode fazer test-first, test-last, ou que você preferir, mas teste de verdade!</p>
<p>[1] The Art of Software Testing &#8211; Myers<br />
[2] Introdução ao Teste de Software &#8211; Maldonado, Delamaro, Jino</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.aniche.com.br%2F2010%2F06%2Feu-faco-tdd-preciso-testar%2F&amp;title=Eu%20fa%C3%A7o%20TDD.%20Preciso%20testar%3F" id="wpa2a_20"><img src="http://www.aniche.com.br/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.aniche.com.br/2010/06/eu-faco-tdd-preciso-testar/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

