<?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; teste de software</title>
	<atom:link href="http://www.aniche.com.br/category/teste-de-software/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>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_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/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_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/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_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/01/um-pequeno-estudo-sobre-assercoes-em-testes/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Quando devo apagar testes?</title>
		<link>http://www.aniche.com.br/2010/12/ok-quando-devo-apagar-testes/</link>
		<comments>http://www.aniche.com.br/2010/12/ok-quando-devo-apagar-testes/#comments</comments>
		<pubDate>Sun, 19 Dec 2010 15:17:36 +0000</pubDate>
		<dc:creator>mauricioaniche</dc:creator>
				<category><![CDATA[tdd]]></category>
		<category><![CDATA[teste de software]]></category>
		<category><![CDATA[apagar código]]></category>
		<category><![CDATA[apagar teste]]></category>
		<category><![CDATA[classes de equivalência]]></category>
		<category><![CDATA[particionamento em classes de equivalência]]></category>
		<category><![CDATA[teste de unidade]]></category>
		<category><![CDATA[testes]]></category>

		<guid isPermaLink="false">http://www.aniche.com.br/?p=276</guid>
		<description><![CDATA[O código dos testes é tão importante quanto código de produção. E provavelmente você já ouviu aquela famosa frase: &#8220;melhor do que escrever código, é apagar código!&#8221;. Quando é então que eu apago código de teste? A primeira e mais óbvia resposta é: quando o teste deixar de fazer sentido! Se a funcionalidade foi removida, <a href='http://www.aniche.com.br/2010/12/ok-quando-devo-apagar-testes/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>O código dos testes é tão importante quanto código de produção. E provavelmente você já ouviu aquela famosa frase: <em>&#8220;melhor do que escrever código, é apagar código!&#8221;</em>. Quando é então que eu apago código de teste?</p>
<p>A primeira e mais óbvia resposta é: quando o teste deixar de fazer sentido! Se a funcionalidade foi removida, você deve atualizar sua bateria de testes e apagar todos os testes relacionados à ela. <strong>Bateria de testes desatualizada não serve pra nada!</strong> Se a funcionalidade evoluir, você deve evoluir seus testes juntos.</p>
<p>Até aí nada de novidade&#8230; Mas vamos lá.</p>
<p>A segunda resposta é: quando você tem testes repetidos! Em algumas situações, quando estamos em dúvida sobre como implementar determinada funcionalidade, optamos por escrever testes parecidos para, de alguma forma, triangularizar até chegar na implementação correta.</p>
<p>Voltando ao velho exemplo da calculadora. Suponha que implementar um algoritmo de soma fosse algo complicado. Você começou com testes simples, como (1+1), depois (1+2), depois (2+2). Nesse momento você encontrou uma maneira de resolver o problema para quaquer (m+n). Seus testes de unidade ficam parecidos com esses:</p>
<div id="gist-674641" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">CalculadoraTest</span> <span class="o">{</span></div><div class='line' id='LC2'>&nbsp;&nbsp;<span class="nd">@Test</span></div><div class='line' id='LC3'>&nbsp;&nbsp;<span class="kd">public</span> <span class="kt">void</span> <span class="nf">deveSomarUmMaisUm</span><span class="o">()</span> <span class="o">{</span></div><div class='line' id='LC4'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">assertEquals</span><span class="o">(</span><span class="mi">2</span><span class="o">,</span> <span class="k">new</span> <span class="n">Calculadora</span><span class="o">().</span><span class="na">soma</span><span class="o">(</span><span class="mi">1</span><span class="o">,</span><span class="mi">1</span><span class="o">));</span></div><div class='line' id='LC5'>&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC6'><br/></div><div class='line' id='LC7'>&nbsp;&nbsp;<span class="nd">@Test</span></div><div class='line' id='LC8'>&nbsp;&nbsp;<span class="kd">public</span> <span class="kt">void</span> <span class="nf">deveSomarUmMaisDois</span><span class="o">()</span> <span class="o">{</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">assertEquals</span><span class="o">(</span><span class="mi">3</span><span class="o">,</span> <span class="k">new</span> <span class="n">Calculadora</span><span class="o">().</span><span class="na">soma</span><span class="o">(</span><span class="mi">1</span><span class="o">,</span><span class="mi">2</span><span class="o">));</span></div><div class='line' id='LC10'>&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC11'><br/></div><div class='line' id='LC12'>&nbsp;&nbsp;<span class="nd">@Test</span></div><div class='line' id='LC13'>&nbsp;&nbsp;<span class="kd">public</span> <span class="kt">void</span> <span class="nf">deveSomarDoisMaisDois</span><span class="o">()</span> <span class="o">{</span></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">assertEquals</span><span class="o">(</span><span class="mi">4</span><span class="o">,</span> <span class="k">new</span> <span class="n">Calculadora</span><span class="o">().</span><span class="na">soma</span><span class="o">(</span><span class="mi">2</span><span class="o">,</span><span class="mi">2</span><span class="o">));</span></div><div class='line' id='LC15'>&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC16'><span class="o">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/674641/cdacb899ef3bb709594ba6b951f895687d8914f8/gistfile1.java" style="float:right;">view raw</a>
            <a href="https://gist.github.com/674641#file_gistfile1.java" style="float:right;margin-right:10px;color:#666">gistfile1.java</a>
            <a href="https://gist.github.com/674641">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Esses testes, muito úteis durante o tempo de desenvolvimento do algoritmo, agora se tornaram repetidos. <strong>Você, portanto, deve apagá-los!</strong> Eles, além de serem inúteis, ainda dificultam o trabalho do desenvolvedor. Se um dia o método testado mudar, você terá que mudar em 10, 20 testes diferentes (mas que testam a mesma coisa!). Lembre-se do acoplamento entre seu código de teste e seu código de produção (sim, ele existe!).</p>
<p>Mas poxa, um testezinho só não é pouco? <strong>Não!</strong> Você precisa de apenas um teste para garantir a funcionalidade. Não adianta testar a mesma coisa duas vezes.</p>
<p><strong>Você deve ter apenas um teste para cada conjunto de estados válidos e inválidos para uma condição de entrada.</strong> A ideia é que todos os elementos de uma classe se comportem de maneira similar. A esses conjuntos damos o nome de <em>classes de equivalência</em>. Escrever apenas um teste por classe de equivalência é uma prática muito comum em testes de caixa preta e é conhecida como <em>particionamento em classes de equivalência</em>. Apesar disso, acredito que ela faça sentido também para testes de caixa branca, como os testes de unidade.</p>
<p>No nosso exemplo da calculadora, poderíamos ter testes para, por exemplo:</p>
<ul>
<li>soma de dois números positivos;</li>
<li>soma de um número positivo com outro negativo;</li>
<li>soma de um número negativo com outro positivo;</li>
<li>soma de dois números negativos;</li>
<li>soma com um dos elementos sendo zero;</li>
</ul>
<div id="gist-674694" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">CalculadoraTest</span> <span class="o">{</span></div><div class='line' id='LC2'>&nbsp;&nbsp;<span class="nd">@Test</span></div><div class='line' id='LC3'>&nbsp;&nbsp;<span class="kd">public</span> <span class="kt">void</span> <span class="nf">deveSomarDoisNumerosPositivos</span><span class="o">()</span> <span class="o">{</span></div><div class='line' id='LC4'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">assertEquals</span><span class="o">(</span><span class="mi">4</span><span class="o">,</span> <span class="k">new</span> <span class="n">Calculadora</span><span class="o">().</span><span class="na">soma</span><span class="o">(</span><span class="mi">2</span><span class="o">,</span><span class="mi">2</span><span class="o">));</span></div><div class='line' id='LC5'>&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC6'><br/></div><div class='line' id='LC7'>&nbsp;&nbsp;<span class="nd">@Test</span></div><div class='line' id='LC8'>&nbsp;&nbsp;<span class="kd">public</span> <span class="kt">void</span> <span class="nf">deveSomarPositivoComNegativo</span><span class="o">()</span> <span class="o">{</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">assertEquals</span><span class="o">(</span><span class="mi">4</span><span class="o">,</span> <span class="k">new</span> <span class="n">Calculadora</span><span class="o">().</span><span class="na">soma</span><span class="o">(</span><span class="mi">6</span><span class="o">,-</span><span class="mi">2</span><span class="o">));</span></div><div class='line' id='LC10'>&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC11'><br/></div><div class='line' id='LC12'>&nbsp;&nbsp;<span class="nd">@Test</span></div><div class='line' id='LC13'>&nbsp;&nbsp;<span class="kd">public</span> <span class="kt">void</span> <span class="nf">deveSomarNegativoComPositivo</span><span class="o">()</span> <span class="o">{</span></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">assertEquals</span><span class="o">(-</span><span class="mi">4</span><span class="o">,</span> <span class="k">new</span> <span class="n">Calculadora</span><span class="o">().</span><span class="na">soma</span><span class="o">(-</span><span class="mi">6</span><span class="o">,</span><span class="mi">2</span><span class="o">));</span></div><div class='line' id='LC15'>&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC16'><br/></div><div class='line' id='LC17'>&nbsp;&nbsp;<span class="nd">@Test</span></div><div class='line' id='LC18'>&nbsp;&nbsp;<span class="kd">public</span> <span class="kt">void</span> <span class="nf">deveSomarDoisNumerosNegativos</span><span class="o">()</span> <span class="o">{</span></div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">assertEquals</span><span class="o">(-</span><span class="mi">4</span><span class="o">,</span> <span class="k">new</span> <span class="n">Calculadora</span><span class="o">().</span><span class="na">soma</span><span class="o">(-</span><span class="mi">2</span><span class="o">,-</span><span class="mi">2</span><span class="o">));</span></div><div class='line' id='LC20'>&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC21'><br/></div><div class='line' id='LC22'>&nbsp;&nbsp;<span class="nd">@Test</span></div><div class='line' id='LC23'>&nbsp;&nbsp;<span class="kd">public</span> <span class="kt">void</span> <span class="nf">deveSomarComZero</span><span class="o">()</span> <span class="o">{</span></div><div class='line' id='LC24'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">assertEquals</span><span class="o">(</span><span class="mi">4</span><span class="o">,</span> <span class="k">new</span> <span class="n">Calculadora</span><span class="o">().</span><span class="na">soma</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span><span class="mi">4</span><span class="o">));</span></div><div class='line' id='LC25'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">assertEquals</span><span class="o">(</span><span class="mi">4</span><span class="o">,</span> <span class="k">new</span> <span class="n">Calculadora</span><span class="o">().</span><span class="na">soma</span><span class="o">(</span><span class="mi">4</span><span class="o">,</span><span class="mi">0</span><span class="o">));</span></div><div class='line' id='LC26'>&nbsp;&nbsp;<span class="o">}</span></div><div class='line' id='LC27'><span class="o">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/674694/a27286d5a9a971401e86aa50c888e3e772865e26/gistfile1.java" style="float:right;">view raw</a>
            <a href="https://gist.github.com/674694#file_gistfile1.java" style="float:right;margin-right:10px;color:#666">gistfile1.java</a>
            <a href="https://gist.github.com/674694">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Obviamente, encontrar todas as classes de equivalência não é um trabalho fácil, e por isso temos a gigante área de testes de software. Mas não é repetindo testes que você garante que seu código funciona.</p>
<p><strong>Referências</strong></p>
<p>Maldonado, Jino, Delamaro. <em>Introdução ao teste de software</em>. Editora Campus, 2007.</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%2Fok-quando-devo-apagar-testes%2F&amp;title=Quando%20devo%20apagar%20testes%3F" 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/2010/12/ok-quando-devo-apagar-testes/feed/</wfw:commentRss>
		<slash:comments>5</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_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/06/eu-faco-tdd-preciso-testar/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Como gerenciar a dependência entre entidades e repositórios?</title>
		<link>http://www.aniche.com.br/2009/09/como-gerenciar-a-dependencia-entre-entidades-e-repositorios/</link>
		<comments>http://www.aniche.com.br/2009/09/como-gerenciar-a-dependencia-entre-entidades-e-repositorios/#comments</comments>
		<pubDate>Sat, 26 Sep 2009 15:26:00 +0000</pubDate>
		<dc:creator>mauricioaniche</dc:creator>
				<category><![CDATA[teste de software]]></category>
		<category><![CDATA[ddd]]></category>

		<guid isPermaLink="false">/post/2009/09/26/Como-gerenciar-a-dependencia-entre-entidades-e-repositorios.aspx</guid>
		<description><![CDATA[Engraçado que esse é um assunto onde há sempre mais um &#8220;ponto&#8221; a acrescentar. Motivados pelo excelente post da Caelum e discussão do GUJ (onde ambos não são tão recentes assim), eu e o Eduardo Amuri discutimos mais alguns pontos&#8230; Alguns deles podem já ter sido abordados nos links anteriores, mas vale a revisão. Eu <a href='http://www.aniche.com.br/2009/09/como-gerenciar-a-dependencia-entre-entidades-e-repositorios/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Engraçado que esse é um assunto onde há sempre mais um &#8220;ponto&#8221; a acrescentar. Motivados pelo excelente <a id="xyw7" title="post da Caelum" href="http://blog.caelum.com.br/2007/06/09/repository-seu-modelo-mais-orientado-a-objeto/">post da Caelum</a> e <a id="wcnf" title="discussão do GUJ" href="http://www.guj.com.br/posts/list/60916.java">discussão do GUJ</a> (onde ambos não são tão recentes assim), eu e o <a id="lnsm" title="Eduardo Amuri" href="http://www.linkedin.com/pub/eduardo-amuri-antunes/12/8a6/828">Eduardo Amuri</a> discutimos mais alguns pontos&#8230; Alguns deles podem já ter sido abordados nos links anteriores, mas vale a revisão.</p>
<p>Eu ia pular a questão inicial, mas vou revisar para que facilite o entendimento do resto do post para quem não leu os links acima. <em>Uma entidade pode conhecer/utilizar um repositório? </em>Acho que a resposta é óbvia: Sim. Repositórios são conceitos de negócios, fazem parte do domínio, e por isso não há nada de errado em uma entidade conhecer um repositório. Não vou entrar no mérito de como o repositório deve ser implementado, não é o meu interesse no momento. Mas vamos lá&#8230; Ok, podemos ter entidades que <strong>dependem </strong>de um repositório, e o problema é: como gerenciar essa dependência?</p>
<p>A seguir, discutimos algumas abordagens para resolver esse problema e chegamos em algumas conclusões, das quais gostaria de compartilhar.</p>
<p><strong>Sugestão I: </strong><em>Receber o repositório pelo construtor</em><br />
A entidade deve possuir um construtor que receba a dependência.</p>
<p><strong>Vantagens:</strong></p>
<ul>
<li>A dependência fica explícita, ou seja, não há como criar uma entidade sem entregar a dependência já resolvida.</li>
</ul>
<p><strong>Problemas:</strong></p>
<ul>
<li>Torna o código menos legível, afinal sempre que for instanciar uma entidade, deve-se injetar seu repositório.<br />
Ex: <em>Pessoa mauricio = new Pessoa ( repositorioDePessoas );</em></li>
<li>Imagine uma entidade que depende de mais de um repositório (por quê não?). Imagine passar os diversos repositórios no construtor. Menos legível ainda&#8230;<br />
Ex: <em>Pessoa mauricio = new Pessoa ( repositorioDePessoas, repositorioDeXPTO, repositorioDeXYZ );</em></li>
<li>Isso fica pior ainda quando definimos um construtor que receba algum atributo, por exemplo.</li>
<li>Ex: <em>Pessoa mauricio = new Pessoa ( &#8220;mauricio&#8221;, &#8220;aniche&#8221;, repositorioDePessoas, repositorioDeXPTO );</em></li>
</ul>
<p><strong>Testabilidade:</strong></p>
<ul>
<li>É fácil injetar um mock no lugar da dependência, para facilitar o teste unitário da entidade.</li>
</ul>
<p><strong>Sugestão II:</strong> <em>Definir um setter para a dependência</em><br />
A entidade deve ter um método setDependencia() que receba a dependência.</p>
<p><strong>Vantagens:</strong></p>
<ul>
<li>Elimina o problema de resolver a dependência no momento da criação do objeto.</li>
</ul>
<p><strong>Problemas:</strong></p>
<ul>
<li>Você precisa setar a dependência sempre que for utilizar, e isso pode ser um problema. Você precisará fazer todo o tempo algum tipo de validação no código da entidade para saber se a dependência já foi injetada ou não.<br />
Ex: <em>public List&lt;XPTO&gt; pegaXpto(int abc) { if(repositorio!=null) repositorio.pegaX(abc); }</em></li>
</ul>
<p><strong>Testabilidade:</strong></p>
<ul>
<li>Também é fácil injetar um mock no lugar da dependência.</li>
</ul>
<p><strong>Sugestão III:</strong> <em>Utilizar o próprio repositório para injetar repositórios nas entidades<br />
</em>Conforme sugerido pelo Paulo Silveira e pelo Fabio Kung no post, sempre que um objeto for recuperado pelo seu repositório, o mesmo deve se &#8220;auto-injetar&#8221; antes de devolver o objeto.</p>
<p><strong>Vantagens:</strong></p>
<ul>
<li>A complexidade do gerenciamento desse dependência fica escondida no código do repositório.</li>
<li>O código a ser implementado, de maneira geral, é simples.</li>
</ul>
<p><strong>Problemas:<br />
</strong></p>
<ul>
<li>Apesar de ser simples, deve ser replicado em todos os métodos do repositório. Se o método do repositório retornar uma lista, por exemplo, deve-se repetir o processo em todos os elementos dessa lista.</li>
<li>Apenas as entidades que são recuperadas pelo repositório recebem a dependência. Entidades criadas em qualquer outro ponto do projeto não recebem essa dependência de forma automática. Isso pode causar o problema levantado na sugestão II.</li>
<li>Caso a entidade mude e venha a depender de um outro repositório, você terá muito código para alterar.</li>
</ul>
<p><strong>Testabilidade:</strong></p>
<ul>
<li>Da mesma maneira que o repositório injeta a dependência (através de um <em>setter</em>), pode-se injetar um mock.</li>
</ul>
<p><strong>Sugestão IV:</strong> <em>Injetar o repositório por AOP<br />
</em>Uma idéia bastante interessante seria injetar a dependência por AOP. Dessa maneira não importaria como o bean é instanciado, seja ele feito pelo JPA<em>, </em>Hibernate, etc, ou pelo programador. Essa foi uma sugestão levantada pelo Alessandro Lazarotti, <a id="rg1g" title="nesse post do GUJ" href="http://www.guj.com.br/posts/list/70275.java">nesse post do GUJ</a>.</p>
<p><strong>Vantagens:</strong></p>
<ul>
<li>O código fica bastante claro.</li>
</ul>
<p><strong>Problemas:</strong></p>
<ul>
<li>A implementação de um aspecto geralmente não é trivial.</li>
</ul>
<p><strong>Testabilidade:</strong></p>
<ul>
<li>Dependendo do modo que o aspecto for implementado, talvez não seja tão trivial injetar a dependência. Para facilitar, pode-se criar um <em>setter</em> exclusivamente para isso, mas não é muito elegante.</li>
</ul>
<p><strong>Sugestão V: </strong><em>Resolver a dependência dentro da própria entidade</em><br />
A idéia seria a própria entidade resolver a sua dependência. No caso, ela mesma invocaria o framework de DI, e recuperaria a instância da dependência. Pode-se até pensar em uma Factory para que a entidade não dependesse diretamente de uma implementação de framework de DI.</p>
<p><strong>Vantagens:</strong></p>
<ul>
<li>Solução bastante simples.</li>
<li>Acaba com o problema da necessidade da entidade validar se a dependência foi injetada ou não, já que ela mesma vai resolver.</li>
</ul>
<p><strong>Problemas:<br />
</strong></p>
<ul>
<li>Não é muito elegante fazer com que a própria classe resolva suas dependências.</li>
</ul>
<p><strong>Testabilidade:</strong></p>
<ul>
<li>Como é a própria classe que resolve a dependência, você precisará de um setter para conseguir injetar um mock. Como dito acima, não é muito legal.</li>
</ul>
<p>(*) Além do que foi citado acima, existe um outro problema, ortogonal ao das dependências, e diz respeito diretamente à implementação desse projeto em particular. Por estarmos discutindo uma aplicação web, o contexto do Spring está guardado dentro do contexto web. Para que um POJO qualquer recupere esse contexto, ele precisaria conhecer o <em>servletContext</em>. Ainda não encontrei uma maneira muito clara para resolver isso, mas minha sugestão é criar uma classe <em>singleton </em>que conteria um atributo com uma instância de contexto do Spring, e essa instância seria injetada por um <em>filter </em>ou um <em>listener</em> qualquer, que subiria logo após ao listener do Spring. A partir daí, todas as classes de domínio fariam acesso à esse <em>singleton</em> para capturar o contexto.</p>
<p>Portanto, é possível gerenciar essa dependência de diversas formas, todas elas com suas vantagens e desvantagens. E você, como faz?</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%2F2009%2F09%2Fcomo-gerenciar-a-dependencia-entre-entidades-e-repositorios%2F&amp;title=Como%20gerenciar%20a%20depend%C3%AAncia%20entre%20entidades%20e%20reposit%C3%B3rios%3F" 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/2009/09/como-gerenciar-a-dependencia-entre-entidades-e-repositorios/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

