<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Getting Sharper</title>
	<atom:link href="http://gettingsharper.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://gettingsharper.wordpress.com</link>
	<description>Just another WordPress.com weblog</description>
	<lastBuildDate>Fri, 28 Oct 2011 12:14:33 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='gettingsharper.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Getting Sharper</title>
		<link>http://gettingsharper.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://gettingsharper.wordpress.com/osd.xml" title="Getting Sharper" />
	<atom:link rel='hub' href='http://gettingsharper.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Rich Data Transport Object Anti Pattern</title>
		<link>http://gettingsharper.wordpress.com/2011/10/27/rich-data-transport-object-anti-pattern/</link>
		<comments>http://gettingsharper.wordpress.com/2011/10/27/rich-data-transport-object-anti-pattern/#comments</comments>
		<pubDate>Thu, 27 Oct 2011 17:11:19 +0000</pubDate>
		<dc:creator>moreirayokoyama</dc:creator>
		
		<guid isPermaLink="false">http://gettingsharper.wordpress.com/?p=99</guid>
		<description><![CDATA[É um anti pattern transportar domínio rico.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gettingsharper.wordpress.com&amp;blog=13290179&amp;post=99&amp;subd=gettingsharper&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>É um anti pattern transportar domínio rico.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gettingsharper.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gettingsharper.wordpress.com/99/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gettingsharper.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gettingsharper.wordpress.com/99/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gettingsharper.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gettingsharper.wordpress.com/99/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gettingsharper.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gettingsharper.wordpress.com/99/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gettingsharper.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gettingsharper.wordpress.com/99/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gettingsharper.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gettingsharper.wordpress.com/99/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gettingsharper.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gettingsharper.wordpress.com/99/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gettingsharper.wordpress.com&amp;blog=13290179&amp;post=99&amp;subd=gettingsharper&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gettingsharper.wordpress.com/2011/10/27/rich-data-transport-object-anti-pattern/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c188c321d553a2ac5efb5e4c05df9354?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">moreirayokoyama</media:title>
		</media:content>
	</item>
		<item>
		<title>O que é Arquitetura de Software (segundo o Application Architecture Guide da Microsoft)</title>
		<link>http://gettingsharper.wordpress.com/2010/06/19/o-que-e-arquitetura-de-software-segundo-o-application-architecture-guide-da-microsoft/</link>
		<comments>http://gettingsharper.wordpress.com/2010/06/19/o-que-e-arquitetura-de-software-segundo-o-application-architecture-guide-da-microsoft/#comments</comments>
		<pubDate>Sun, 20 Jun 2010 02:27:16 +0000</pubDate>
		<dc:creator>moreirayokoyama</dc:creator>
				<category><![CDATA[Arquitetura de Software]]></category>

		<guid isPermaLink="false">http://gettingsharper.wordpress.com/?p=90</guid>
		<description><![CDATA[Olá. Existe um grande equívoco pairando no mercado a respeito de Arquitetura de Software e o Papel do Arquiteto de Software em uma equipe de desenvolvimento. Alguns destes equívocos são baseados no mal-entendimento de alguns conceitos, outros baseados em mal-conceitos (ou má-padronização) de alguns entendimentos (se é que é certo falar assim). Mesmo entre os grandes arquitetos da [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gettingsharper.wordpress.com&amp;blog=13290179&amp;post=90&amp;subd=gettingsharper&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá.</p>
<p>Existe um grande equívoco pairando no mercado a respeito de Arquitetura de Software e o Papel do Arquiteto de Software em uma equipe de desenvolvimento.</p>
<p>Alguns destes equívocos são baseados no mal-entendimento de alguns conceitos, outros baseados em mal-conceitos (ou má-padronização) de alguns entendimentos (se é que é certo falar assim). Mesmo entre os grandes arquitetos da comunidade, existem algumas divergências de opiniões sobre a definição da arquitetura e do papel do arquiteto, mas é certo dizer que, no geral, existe um consenso a respeito do essencial.</p>
<p>O Application Architecture Guide da Microsoft faz uma enumeração das definições mais coerentes e tenta relacioná-las.</p>
<p>O trecho a seguir é tradução do livro.</p>
<p><span id="more-90"></span></p>
<h3>O que é Arquitetura de Software?</h3>
<p>Arquitetura de Software é frequentemente definida como a estrutura ou estruturas de um sistema. Diversos experts conhecidos da indústria tem expandido esta definição com as informações baseadas nas decisões que precisam ser tomadas relacionadas à arquitetura. Aqui nós vemos um pouco de algumas definições formais de arquitetura, e então teremos uma visão mais informal.</p>
<h3>Arquitetura segundo Kruchten, Booch, Bittner e Reitman</h3>
<p>Philippe Kruchten, Grady Booch, Kurt Bittner e Rich Reitman derivaram e redefiniram a definição de arquitetura baseada na obra de Mary Shaw e David Garlan (Shaw and Garlan 1996). A definição deles é:</p>
<blockquote><p>Arquitetura de Software engloba todas as decisões significantes sobre a organização de um sistema de software, inclusive:</p>
<ul>
<li>Escolha dos elementos estruturais e suas interfaces pelos quais o sistema será formado.</li>
<li>Comportamento como especificado na colaboração entre estes elementos.</li>
<li>Composição dos elementos estruturias e comportamentais em subsistemas maiores.</li>
<li>Estilo arquitetônico que orienta esta organização.</li>
</ul>
<p>Arquitetura de software também envolve  questões de funcionalidade, usabilidade, resiliência (escalabilidade), performance, reusabilidade, compreensividade, constraints tecnológicas e econômicas (esta nós conhecemos bem), trade-offs (problemas causados pela resolução de outros problemas) e estética.</p></blockquote>
<h3>Arquitetura segundo Fowler</h3>
<p>Em seu livro, Patterns of Enterprise Application Architecture (Padrões de Arquitetura para Aplicações Empresariais), Martin Fowler destaca alguns temas comumente recorrentes quando explica arquitetura:</p>
<ul>
<li> 
<ul>
<li>O mais alto nível de quebra do sistema em suas partes.</li>
<li>As decisões que são difíceis de mudar.</li>
<li>Existem muitas arquiteturas em um sistema.</li>
<li>O que for arquitetonicamente significante pode mudar durante o tempo de vida de um sistema</li>
<li>No fim, arquitetura se resume ao que quer que seja importante.</li>
</ul>
</li>
</ul>
<h3>Arquitetura segundo Bass, Clements e Kazman</h3>
<p>Em Software Architecture in Practice (Arquitetura de Software na Prática) &#8211; Segunda Edição, Bass, Clements e Kazman definem arquitetura da seguinte forma:</p>
<blockquote><p>A arquitetura de um software de um programa ou sistema computacional é a estrutura ou estruturas de um sistema, que inclui os elementos de software, as propriedades externamente visíveis destes elementos, e os relacionamentos entre eles. Arquitetura é responsável pelas interfaces públicas dos elementos. Seus detalhes privados (detalhes que tenham a ver somente com a implementação interna) não fazem parte da arquitetura.</p></blockquote>
<h3>Por que precisamos de Arquitetura?</h3>
<p>Como em qualquer outra estrutura complexa, o software precisa ser construído sobre uma fundação sólida. Falhar em considerar cenários-chave, falhar no design de prolemas comuns ou falhar na consideração das consequências em longo-prazo de decisões-chave pode colcoar toda a aplicação em risco. Ferramentas e plataformas modernas ajudam a simplificar as tarefas de construção de aplicações, mas elas não substituem a necessidade do haver um design da sua aplicação baseado nos seus cenários específicos. Os riscos expostos por uma arquitetura pobre podem levar a um software instável, incapaz de suportar requisições de negócio, ou poderiam ainda impedir a aplicação de funcionar quando publicada no ambiente de produção.</p>
<p>Considere as seguintes questões de auto-nível quando estiver pensando sobre a arquitetura de software:</p>
<ul>
<li>Como a aplicação será publicada em produção?</li>
<li>Como os usuários usarão a aplicação?</li>
<li>Quais são os atributos de qualidade exigidos, tais como segurança, performance, concorrência, internacionalização e configuração?</li>
<li>Quais são as tendências arquitetonicas que podem impactar na sua aplicação agora ou depois dela ser publicada?</li>
</ul>
<h3>Arquitetura x Design</h3>
<p>De acordo com Martin Fowler em &#8220;Quem precisa de um arquiteto?&#8221;:</p>
<blockquote><p>&#8230;Os desenvolvedores que estão trabalhando em um projeto tem um entendimento compartilhado do design do sistema. Este entendimento compartilhado é chamado de &#8220;Arquitetura&#8221;. Este entendimento inclui como o sistema é dividido em componentes e como os componentes interagem através de interfaces. Estes componentes são normalmente compostos de componentes menores, mas a arquitetura inclui somente os componentes e interfaces que são entendidos por todos os desenvolvedores.</p></blockquote>
<p>Portanto, a arquitetura foca em como os componentes e as interfaces são usadas ou interagem com outros componentes. Escolher estruturas de dados ou algoritmos a serem implementados dentro do componente não é uma questão de arquitetura. Invés de usar regras rápidas e difíceis para distinguir arquitetura de design, faz mais sentido combinar estas duas áreas. Em alguns casos, as decisões são claramente mais arquitetônicas por natureza. Em outros casos, as decisões são mais sobre o design, e como elas te ajudam a visualizar esta arquitetura.</p>
<h3>Objetivos do Usuário, do Negócio e do sistema</h3>
<p>Os sistemas deveriam ser arquitetados considerando os objetivos do Usuário, do sistema e do negócio. Para cada uma destas áreas se destacam cenários-chave, atributos de qualidade importantes (por exemplo, manutenabilidade), satisfatores-chave e dissatisfatores-chave. Quando possível, desenvolva e considere medidas que te ajudam a medir o sucesso de cada uma destas áreas.</p>
<div id="attachment_91" class="wp-caption aligncenter" style="width: 295px"><a href="http://gettingsharper.files.wordpress.com/2010/06/userbusinesssystemgoas.gif"><img class="size-full wp-image-91" title="UserBusinessSystemGoas" src="http://gettingsharper.files.wordpress.com/2010/06/userbusinesssystemgoas.gif?w=655" alt=""   /></a><p class="wp-caption-text">Figura 1 - Objetivos do Usuário, do Negócio e do Sistema</p></div>
<p>Trade-offs são semelhantes entre cada área, e um ponto de equilíbrio precisa ser encontrado. Por exemplo, responsividade pode ser o maior objetivo do usuário, mas o admnistrador do sistema não vai investir no hardware exigido para atender a demanda o 100 porcento do tempo de execução. Um ponto de equilíbrio precisa existir para atender o objetivo em somente 80 porcento do tempo.</p>
<h3>Os objetivos da Arquitetura</h3>
<p>A Arquitetura da aplicação procura construir uma ponte entre os requisitos de negócio e os requisitos técnicos, entendendo os casos de uso, e então encontrando maneiras de implementar estes casos de uso no software. O objetivo da arquitetura é identificar os requisitos que impactam na estrutura da aplicação. Uma boa arquitetura reduz os riscos de negócio com a construção de uma solução técnica. Um bom design é flexível o suficiente para ser capaz de lidar com as mudanças naturais que podem surgir com o passar do tempo em tecnologia de Hardware e Software, bem como em cenários e requisitos de usuário. Um arquiteto deve considerar o impacto global das decisões de design, os trade-offs herdados entre atributos de qualidade (tais como performance e segurança), o os trade-offs necessários para atender requisitos de Usuário, de Negócio e de Sistema.</p>
<p>Tenha em mente que a arquitetura deveria:</p>
<ul>
<li>Expôr a estrutura do sistema mas esconder os detalhes de implementação.</li>
<li>Compreender todos os cenários de Casos de uso.</li>
<li>Tentar identificar as preocupações de vários stakeholders.</li>
<li>Lidar com ambos os requisitos: funcionais e de qualidade.</li>
</ul>
<p>&#8211;</p>
<p>Para quem quiser ler mais, o Application Architecture Guide da Microsoft está disponível para Download gratuito no site do Patterns and Practices.</p>
<p>Aqui no blog eu irei postar mais a respeito de Arquitetura de Software e o Papel do Arquiteto.</p>
<p>Até logo.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gettingsharper.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gettingsharper.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gettingsharper.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gettingsharper.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gettingsharper.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gettingsharper.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gettingsharper.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gettingsharper.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gettingsharper.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gettingsharper.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gettingsharper.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gettingsharper.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gettingsharper.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gettingsharper.wordpress.com/90/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gettingsharper.wordpress.com&amp;blog=13290179&amp;post=90&amp;subd=gettingsharper&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gettingsharper.wordpress.com/2010/06/19/o-que-e-arquitetura-de-software-segundo-o-application-architecture-guide-da-microsoft/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c188c321d553a2ac5efb5e4c05df9354?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">moreirayokoyama</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/06/userbusinesssystemgoas.gif" medium="image">
			<media:title type="html">UserBusinessSystemGoas</media:title>
		</media:content>
	</item>
		<item>
		<title>TDD &#8211; Parte 04: Explorando os Mocks</title>
		<link>http://gettingsharper.wordpress.com/2010/05/05/tdd-04/</link>
		<comments>http://gettingsharper.wordpress.com/2010/05/05/tdd-04/#comments</comments>
		<pubDate>Wed, 05 May 2010 23:42:27 +0000</pubDate>
		<dc:creator>moreirayokoyama</dc:creator>
				<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">https://gettingsharper.wordpress.com/?p=76</guid>
		<description><![CDATA[No último post apresentei o uso de Mocks para conseguir testar as classes que ainda estão sendo desenvolvidas usando objetos das quais elas dependem sem ter que implementar tais objetos. Neste post, como era de se esperar, eu vou explorar melhor o uso do Rhino Mocks, mostrando as principais opções que ele dispõe no uso [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gettingsharper.wordpress.com&amp;blog=13290179&amp;post=76&amp;subd=gettingsharper&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>No último post apresentei o uso de Mocks para conseguir testar as classes que ainda estão sendo desenvolvidas usando objetos das quais elas dependem sem ter que implementar tais objetos. Neste post, como era de se esperar, eu vou explorar melhor o uso do Rhino Mocks, mostrando as principais opções que ele dispõe no uso de Mocks.</p>
<p><span id="more-76"></span></p>
<p>Mas, antes de continuar, eu me esqueci de instruir o básico a respeito do Rhino.</p>
<p>O Rhino é um framework que pode ser baixado em <a title="http://www.ayende.com/projects/rhino-mocks.aspx" href="http://www.ayende.com/projects/rhino-mocks.aspx">http://www.ayende.com/projects/rhino-mocks.aspx</a>.</p>
<p>Neste site, você tem, também, toda a documentação disponível.</p>
<p>Até mesmo eu preciso rever o Rhino para descobrir se tem algo dele que deixei de explorar. O fato é que o pouco que sei já me torna capaz de fazer um uso excelente dele. Para usá-lo é simples, basta colocar no seu projeto uma referência a Rhino.Mocks.Dll.</p>
<p>As principais classes do Rhino se encontram no Namespace Rhino.Mocks.</p>
<p>A principal classe que você vai usar é a Rhino.Mocks.MockRepository.</p>
<p>Uma instância de MockRepository irá servir para criar seus Mocks e monitorá-los.</p>
<p>Vamos rever o exemplo do último post:</p>
<p><pre class="brush: csharp; first-line: 16; highlight: [19,21];">
//setup
var mocks = new Rhino.Mocks.MockRepository();
ICustomerBusiness objBusCustomer =
	mocks.StrictMock&lt;ICustomerBusiness&gt;(null);
ILogger objLogger =
 	mocks.StrictMock&lt;ILogger&gt;(null);
</pre></p>
<p>Observe que é da instancia de MockRepository (mocks) que executamos o método StrictMock&lt;T&gt;, que gera para nós o mock baseado baseado no tipo passado.</p>
<p><pre class="brush: csharp; first-line: 28; highlight: [28,32,37];">
mocks.Record();
objBusCustomer.InsertCustomer(Customer);
objLogger.WriteLog(&quot;Cliente Inserido&quot;);

mocks.ReplayAll();
//exercise
Controller.InsertCustomer(Customer);

//verify
mocks.VerifyAll();
</pre></p>
<p>O método Record() faz com que o MockRepository (mocks) passe a monitorar tudo o que acontece com os mocks criados. Assim, quando invocamos o método InsertCustomer do mock de ICustomerBusiness, a instância de MockRepository compreende esta chamada e deixa guardada, bem como a chamada ao método WriteLog do mock de ILogger.</p>
<p>Quando invocamos o método ReplayAll(), a instância de MockRepository começa passa a monitorar os mocks esperando que tudo o que aconteceu durante a gravação (Record()) aconteça novamente. A forma como administramos o MockRepository para se comportar de acordo com o que acontece durante o ReplayAll() vai depender do tipo de mocks que criamos. No caso do StrictMock&lt;T&gt;, que foi o que usamos para criar os mocks que estão sendo usados, o MockRepository espera que aconteça exatamente tudo o que aconteceu durante a gravação, nada mais, e nada menos. Se no meio do caminho acontecer algo que ele não tinha gravado, ele lança uma exception.</p>
<p>Quando finalmente chegamos no VerifyAll, a instância de MockRepository verifica se tudo que de fato deveria acontecer, aconteceu. Ou seja, ele garante em que ponto que tudo o que deveria acontecer no ReplayAll() já deveria ter acontecido. Se algum método tiver sido deixado de ser chamado, uma exception será lançada.</p>
<p>O que garante o sucesso dos testes é que o método InsertCustomer do Controller faz exatamente o que orientamos o objeto Mocks a gravar. Ou seja, usamos o Record para definir o comportamento esperado, e então usamos o ReplayAll() para iniciar a verficação de que este comportamento realmente está sendo obedecido pelo objeto que estamos testando.</p>
<p>Se você entrar no método InsertCustomer do Controller e inserir um novo log, ao rodar o teste, ele dará uma falha (vermelho) pois o mocks só gravou uma única chamada ao WriteLog. Se o parâmetro do WriteLog for diferente do que foi gravado, também ocorrerá uma falha.</p>
<p>Desta forma, o código do último post fica mais claro e você pode entender melhor o que está acontecendo aqui.</p>
<p>Mas, como mockar um objeto que possui um método cujo os parâmetros da chamada eu sou incapaz prever? E como entender se um método funciona se o seu bom funcionamento depende do retorno da chamada de um método de um objeto mockado?</p>
<p>Isso tudo está na pauta para o nosso próximo post, que espero ter condições de redigir logo e publicar em breve.</p>
<p>Stay Sharp!</p>
<p><span style="font-family:Consolas;font-size:x-small;"> </span></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gettingsharper.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gettingsharper.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gettingsharper.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gettingsharper.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gettingsharper.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gettingsharper.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gettingsharper.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gettingsharper.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gettingsharper.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gettingsharper.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gettingsharper.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gettingsharper.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gettingsharper.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gettingsharper.wordpress.com/76/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gettingsharper.wordpress.com&amp;blog=13290179&amp;post=76&amp;subd=gettingsharper&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gettingsharper.wordpress.com/2010/05/05/tdd-04/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c188c321d553a2ac5efb5e4c05df9354?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">moreirayokoyama</media:title>
		</media:content>
	</item>
		<item>
		<title>TDD &#8211; Parte 03: Saiba como seu código se comporta</title>
		<link>http://gettingsharper.wordpress.com/2010/05/04/tdd-03/</link>
		<comments>http://gettingsharper.wordpress.com/2010/05/04/tdd-03/#comments</comments>
		<pubDate>Tue, 04 May 2010 04:00:11 +0000</pubDate>
		<dc:creator>moreirayokoyama</dc:creator>
				<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://gettingsharper.wordpress.com/?p=55</guid>
		<description><![CDATA[Você está efetuando os testes sobre sua camada de negócios, e alguns deles farão alterações no banco de dados, como a inclusão de um novo cliente, como mostrado no primeiro exemplo desta série, embora ele tenha sido muito tosco, conforme já admiti no post anterior. O que te incomoda são todos os vermelhos que irão [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gettingsharper.wordpress.com&amp;blog=13290179&amp;post=55&amp;subd=gettingsharper&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Você está efetuando os testes sobre sua camada de negócios, e alguns deles farão alterações no banco de dados, como a inclusão de um novo cliente, como mostrado no primeiro exemplo desta série, embora ele tenha sido muito tosco, conforme já admiti no post anterior. O que te incomoda são todos os vermelhos que irão surgir quando os testes tentarem fazer a inclusão de um cliente que já existe, e aí você vai lembrar que tem que limpar a base de testes sempre antes de executá-los.</p>
<p>E quando executar todos os testes, precisará verificar se os arquivos de Log foram devidamente criados no disco. Se os e-mails que o sistema deveria enviar foram devidamente enviados. E tantas outras evidências a colher em tantos lugares que não fazem parte do escopo de seus testes.</p>
<p>No fim das contas, tudo o que você precisa saber é se o seu software está se comportando como deveria. E você pode fazer isso executando um select na tabela de customers pra saber se o teste realmente inseriu alguém lá, ou pode simplesmente procurar algum meio de garantir que seu código faz isso sem que isso realmente ocorra.</p>
<p>Conheça o uso de Mocks.</p>
<p><span id="more-55"></span></p>
<p>Mocks são objetos criados para fingir que são objetos que serão usados pelo seu teste, afim de fazer com que o objeto que você está testando funcione de forma transparente usando os Mocks no lugar dos objetos que esperaria usar. Ou seja, invés da minha classe de negócio criar uma instancia de uma classe de repositório, ela cria uma instancia de um Mock que se finge de repositório.</p>
<p>Mais do que isso, o Mock não somente se finge de repositório, como ainda monitora todas as interações com ele. Por exemplo, dizemos ao Mock que ele precisa ficar atento para receber o chamado ao método Add, e ele observa se este método é de fato chamado. Se não for chamado, ele lança uma exceção e o teste dá vermelho.</p>
<p>Entenderam?</p>
<p>Não?</p>
<p>Vamos supor que você esteja fazendo um teste no seu controller. Ele tem um método InsertCustomer que recebe um objeto Customer. Você sabe que ele tem que criar uma instancia do objeto de negócio, executar o método Insert do objeto e fazer um log em um arquivo texto.</p>
<p>Ora, acabamos de falar exatamente o que seu controller tem que fazer quando o método InsertCustomer for invocado, não? Então, ao término do teste, precisamos ter um registro inserido no banco de dados e um arquivo de texto com as informações de Log, certo?</p>
<p>Não! Não necessariamente!</p>
<p>Tudo o que você precisa é se preocupar se o controller se comportou como deveria, e para ter certeza de que o comportamento do controller está sendo o esperado, você não é forçado a realmente inserir uma linha no banco de dados e criar um arquivo texto. Você só precisa abstrair este comportamento em objetos separados, criar um mock que simulará estes objetos e monitorar o mock para certificar-se de que o seu controller está se comportando como deve.</p>
<p>No exemplo a seguir usarei o Rhino Mocks, mas, assim como no caso do MsTests, existem diversas ferramentas Mock para serem usadas. Provavelmente escreverei um Post mais tarde para comparar os principais frameworks disponíveis.</p>
<p>É assim que queremos testar nosso controller:</p>
<p><a href="http://gettingsharper.files.wordpress.com/2010/05/teste01.gif"><img class="alignnone size-full wp-image-61" title="Teste01" src="http://gettingsharper.files.wordpress.com/2010/05/teste01.gif?w=655" alt=""   /></a></p>
<p>Mas para este teste dar certo, nós teremos que implementar a camada de Negócio, o que significaria iniciar um novo ciclo antes de testar o controller. Se seguirmos este percurso, veremos que teríamos que implementar também a camada de acesso a dados para testar a camada de Negócio para, só então, finalmente, testar o controller. Não é bem isto que queremos com o TDD. Com o TDD queremos começar de cima para baixo. Queremos começar testando o controller para programá-lo, quando ele estiver pronto, testaremos a camada de negócio e a programamos, quando ela estiver pronta, testaremos o controller de novo pra saber se nada afetou seu funcionamento&#8230; e assim por diante. De cima pra baixo.</p>
<p>Como testar o controller sem precisar ter a camada de negócio pronta? E como ter certeza de que o controller também está criando as entradas no Log?</p>
<p>É aí que entram os Mocks. Para garantir que o controller possa ser testado sem ter que implementar a camada de negócios e o Logger, mockaremos os objetos que farão o papel dos dois.</p>
<p>Mas o mock precisa conhecer algo a respeito do que estará simulando, para isso construiremos interfaces que representarão os nossos objetos de negócio e de Logger. Este é um aspecto interessante do uso de Mocks, ele nos induz a abstrair alguns objetos que causam dependência em outros. Como o bom funcionamento do controller depende do bom funcionamento do objeto de negócio e do logger, temos uma dependência. E o uso do Mock para suprir esta dependência exige uma interface, e esta interface abstrai a dependência em um tipo não concreto, ou seja, usando interface, temos a idéia de uma classe sem ter nenhuma noção de como ela será realmente implementada.</p>
<p><a href="http://gettingsharper.files.wordpress.com/2010/05/interfaces.gif"><img class="alignnone size-full wp-image-62" title="interfaces" src="http://gettingsharper.files.wordpress.com/2010/05/interfaces.gif?w=655" alt=""   /></a></p>
<p>Pronto, temos as duas interfaces prontas. Não precisamos implementar nenhuma delas no momento, já que nosso foco está no controller. Então, vamos criar os mocks.</p>
<p><a href="http://gettingsharper.files.wordpress.com/2010/05/criandomocks1.gif"><img class="alignnone size-full wp-image-64" title="CriandoMocks" src="http://gettingsharper.files.wordpress.com/2010/05/criandomocks1.gif?w=655" alt=""   /></a><a href="http://gettingsharper.files.wordpress.com/2010/05/criandomocks.gif"></a></p>
<p>Observe que para criarmos os Mocks usamos o método GenerateStrictMock. No próximo Post explicarei os tipos de Mocks que podem ser criados com o Rhino.</p>
<p>Agora, precisamos ensinar aos Mocks o que eles devem monitorar.</p>
<p><a href="http://gettingsharper.files.wordpress.com/2010/05/monitorandomock.gif"><img class="alignnone size-full wp-image-65" title="MonitorandoMock" src="http://gettingsharper.files.wordpress.com/2010/05/monitorandomock.gif?w=655" alt=""   /></a></p>
<p>O método Record() no MockRepository faz com que ele comece a gravar tudo o que você faz nos Mocks criados pelo Repositório em questão. O método ReplayAll() faz com que o repositório espere que tudo o que ele gravou seja devidamente reproduzido. O método VerifyAll() (no fim do código) faz o repositório verificar se tudo o que devia ser reproduzido aconteceu como esperado.</p>
<p>No caso, se rodarmos o teste agora temos um vermelho. Por que? Por que nada do que esperamos que seja reproduzido está sendo. Se copiarmos o código que é executado logo após o Record() após o ReplayAll(), o método VerifyAll() irá dizer que tudo aconteceu como esperado. Experimente.</p>
<p><a href="http://gettingsharper.files.wordpress.com/2010/05/forcandosucesso.gif"><img class="alignnone size-full wp-image-66" title="ForcandoSucesso" src="http://gettingsharper.files.wordpress.com/2010/05/forcandosucesso.gif?w=655" alt=""   /></a></p>
<p>Mas não é isso que queremos, é? Não. Queremos testar o comportamento do controller. Então agora é hora de implementarmos o código no controller. Para isto, precisaremos que o controller acesse os mocks, e aqui entra um ponto importante. Nós criamos os mocks que simulam objetos dos quais o controller tem dependência mas não estão implementados ainda (Logger e CustomerBusiness), para isso criamos duas interfaces (ILogger e ICustomerBusiness). Até aqui tudo bem.</p>
<p>O problema é que precisamos que o controller tenha a referencia aos mocks que criamos. Para isto existe uma técnica chamada Injeção de Dependência (Dependency Injection) mas esta técnica está fora do escopo desta série de TDD e falaremos disso em outra ocasião. No momento faremos a injeção da dependência no código mesmo através do construtor.</p>
<p><a href="http://gettingsharper.files.wordpress.com/2010/05/controller.gif"><img class="alignnone size-full wp-image-67" title="Controller" src="http://gettingsharper.files.wordpress.com/2010/05/controller.gif?w=655" alt=""   /></a></p>
<p>Remova o código que você duplicou no ReplayAll() e rode os testes novamente.</p>
<p>Deu verde? Não? Isso é por que a evidência que colhíamos era baseada no Id do Customer ser diferente de zero. Não precisamos desta evidência, remova a linha que faz o Assert. O Mock garante que o Controller invoca os métodos esperados e esta é a melhor evidência que temos, a evidência de que, independente do resultado, seu Controller funciona como você espera. Deu verde agora?</p>
<p>No próximo Post exploraremos mais o uso de Mocks, este foi só pra dar uma introdução. Até lá.</p>
<p>Stay sharp.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gettingsharper.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gettingsharper.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gettingsharper.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gettingsharper.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gettingsharper.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gettingsharper.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gettingsharper.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gettingsharper.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gettingsharper.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gettingsharper.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gettingsharper.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gettingsharper.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gettingsharper.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gettingsharper.wordpress.com/55/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gettingsharper.wordpress.com&amp;blog=13290179&amp;post=55&amp;subd=gettingsharper&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gettingsharper.wordpress.com/2010/05/04/tdd-03/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c188c321d553a2ac5efb5e4c05df9354?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">moreirayokoyama</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/05/teste01.gif" medium="image">
			<media:title type="html">Teste01</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/05/interfaces.gif" medium="image">
			<media:title type="html">interfaces</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/05/criandomocks1.gif" medium="image">
			<media:title type="html">CriandoMocks</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/05/monitorandomock.gif" medium="image">
			<media:title type="html">MonitorandoMock</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/05/forcandosucesso.gif" medium="image">
			<media:title type="html">ForcandoSucesso</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/05/controller.gif" medium="image">
			<media:title type="html">Controller</media:title>
		</media:content>
	</item>
		<item>
		<title>Leitura Recomendada &#8211; Conteúdo MSDN para Desenvolvedores</title>
		<link>http://gettingsharper.wordpress.com/2010/05/03/leitura-recomendada-conteudo-msdn-para-desenvolvedores/</link>
		<comments>http://gettingsharper.wordpress.com/2010/05/03/leitura-recomendada-conteudo-msdn-para-desenvolvedores/#comments</comments>
		<pubDate>Mon, 03 May 2010 10:33:46 +0000</pubDate>
		<dc:creator>moreirayokoyama</dc:creator>
				<category><![CDATA[Material para leitura]]></category>

		<guid isPermaLink="false">http://gettingsharper.wordpress.com/?p=57</guid>
		<description><![CDATA[Olá, Pessoal. Nesta semana eu retomo os posts sobre TDD. Ainda tem algumas coisas bacanas pra explorar e provavelmente sairão uns dois posts sobre o assunto ainda esta semana. Mas enquanto estes posts não ficam prontos, eu vou postar aqui uma recomendação de download. Este post não é meu, e sim do Waldemir Cambiucci. Estou [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gettingsharper.wordpress.com&amp;blog=13290179&amp;post=57&amp;subd=gettingsharper&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá, Pessoal.</p>
<p>Nesta semana eu retomo os posts sobre TDD. Ainda tem algumas coisas bacanas pra explorar e provavelmente sairão uns dois posts sobre o assunto ainda esta semana. Mas enquanto estes posts não ficam prontos, eu vou postar aqui uma recomendação de download.</p>
<p>Este post não é meu, e sim do <a href="http://blogs.msdn.com/wcamb/default.aspx" target="_blank">Waldemir Cambiucci</a>. Estou apenas repassando:</p>
<p>Você que é arquiteto ou líder de desenvolvimento, que possui um time de desenvolvedores e pessoal técnico, não deixe de indicar esse material para seu pessoal:</p>
<p><a href="http://blogs.msdn.com/blogfiles/wcamb/WindowsLiveWriter/ContedoMSDNparaDesenvolvedores_1282E/image_2.png"></a><strong>Download de conteúdo técnico gratuito do MSDN para desenvolvedores<br />
</strong><a title="http://blogs.msdn.com/jpclementi/archive/2010/04/29/download-de-conte-do-t-cnico-gratuito-do-msdn-para-desenvolvedores.aspx" rel="nofollow" href="http://blogs.msdn.com/jpclementi/archive/2010/04/29/download-de-conte-do-t-cnico-gratuito-do-msdn-para-desenvolvedores.aspx" target="_blank">http://blogs.msdn.com/jpclementi/archive/2010/04/29/download-de-conte-do-t-cnico-gratuito-do-msdn-para-desenvolvedores.aspx</a></p>
<p>Entre os principais links, muito material sobre:</p>
<p>Azure, ASP.NET, .NET Framework 3.5, .NET Framework 4.0, Migração de Tecnologias, Silverlight 3.0 + Expression, Silverlight 4, Segurança no Desenvolvimento<br />
SQL e Acesso a Dados, Visual Studio 2010 e .Net Framework 4.0, WCF, WF, WPF  e  Windows Server 2008.</p>
<p>Stay Sharp.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gettingsharper.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gettingsharper.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gettingsharper.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gettingsharper.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gettingsharper.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gettingsharper.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gettingsharper.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gettingsharper.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gettingsharper.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gettingsharper.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gettingsharper.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gettingsharper.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gettingsharper.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gettingsharper.wordpress.com/57/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gettingsharper.wordpress.com&amp;blog=13290179&amp;post=57&amp;subd=gettingsharper&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gettingsharper.wordpress.com/2010/05/03/leitura-recomendada-conteudo-msdn-para-desenvolvedores/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c188c321d553a2ac5efb5e4c05df9354?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">moreirayokoyama</media:title>
		</media:content>
	</item>
		<item>
		<title>Certificação: Não perca seu tempo!</title>
		<link>http://gettingsharper.wordpress.com/2010/04/28/certificacao-nao-perca-seu-tempo/</link>
		<comments>http://gettingsharper.wordpress.com/2010/04/28/certificacao-nao-perca-seu-tempo/#comments</comments>
		<pubDate>Wed, 28 Apr 2010 00:48:50 +0000</pubDate>
		<dc:creator>moreirayokoyama</dc:creator>
				<category><![CDATA[Certificação]]></category>

		<guid isPermaLink="false">http://gettingsharper.wordpress.com/?p=51</guid>
		<description><![CDATA[Este post é uma tradução de um post que li no blog do UncleBob. Como eu já disse antes, não há nada particularmente errado com a atual mania por certificação. Se você quer ser certificado pelo custo de um curso de 2 dias, dê tudo para se certificar. Se você quer certificar pessoas por assistirem [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gettingsharper.wordpress.com&amp;blog=13290179&amp;post=51&amp;subd=gettingsharper&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Este post é uma tradução de um <a href="http://blog.objectmentor.com/articles/2010/04/27/certification-dont-waste-your-time" target="_blank">post que li no blog do UncleBob</a>.</p>
<blockquote><p>Como eu já disse antes, não há nada particularmente errado com a atual mania por certificação. Se você quer ser certificado pelo custo de um curso de 2 dias, dê tudo para se certificar. Se você quer certificar pessoas por assistirem seu curso de 2 dias, dê tudo para dar o curso e entregar os certificados. É tudo muito bom. Faça dinheiro. Seja frutífero e faça multiplicar.</p>
<p><span id="more-51"></span></p>
<p>Mas seja cuidadoso para não perder seu tempo.</p>
<p>Como a certificação pode ser uma perda de tempo? Isso depende do seu motivo.</p>
<ul>
<li>Se você está se certificando para impressionar alguém, como um gerente que está contratando, ou um recrutador, ou seus companheiros, <em>você está perdendo seu tempo</em>. Ninguém que valha a pena impressionar ficará impressionado com esta certificação. De fato, as pessoas que você realmente quer impressionar irão achá-la um tanto mundana.</li>
<li>Se você está se certificando para ser contratado, <em>você está perdendo seu tempo</em>. Ninguém vai contratar você só por causa deste &#8220;C&#8221;, e ninguém para quem valha a pena trabalhar está solicitando este &#8220;C&#8221;.</li>
<li>Se você decidiu contratar somente pessoas certificadas, <em>você está perdendo seu tempo</em>. A população de pessoas certificadas não é mais rica em talento, capacidade ou conhecimento. De fato, ela pode até ser mais pobre. Lembre-se, aqueles que tem talento não <em>precisam</em> de certificação da mesma forma quanto os que não tem.</li>
</ul>
<p>Que parte da certificação <em>não</em> é uma perda de tempo?</p>
<ul>
<li>O primeiro benefício que você tem é receber instrução; mas tome cuidado: Há muitos instrutores medíocres por aí. Alguns instrutores ensinam muito bem os cursos, mas outros estão apenas torcendo que você esteja preocupado apenas com a certificação.</li>
<li>Então faça uma pequena pesquisa e encontre bons instrutores. Você pode, de fato, descobrir que alguns dos melhores instrutores e cursos não oferecem certificação. Isso não deveria te impedir de considerar ter aulas com eles.</li>
</ul>
<p>Mas espere, os instrutores não são certificados como Treinadores (trainers)?</p>
<ul>
<li>Claro. Eles pagam o valor e tomam aulas para se tornarem treinadores certificados.</li>
<li>Mas isso não significa necessariamente que eles:
<ul>
<li>São bons instrutores.</li>
<li>Sabem o que ensinam.</li>
<li>Fazem o que ensinam.</li>
<li>São qualificados para ensinarem você.</li>
</ul>
</li>
</ul>
<p>Ok, mas não há <em>algum</em> benefício pela própria certificação?</p>
<ul>
<li>Claro. Um belo pedaço de papel.</li>
</ul>
</blockquote>
<p>Stay Sharp.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gettingsharper.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gettingsharper.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gettingsharper.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gettingsharper.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gettingsharper.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gettingsharper.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gettingsharper.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gettingsharper.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gettingsharper.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gettingsharper.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gettingsharper.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gettingsharper.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gettingsharper.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gettingsharper.wordpress.com/51/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gettingsharper.wordpress.com&amp;blog=13290179&amp;post=51&amp;subd=gettingsharper&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gettingsharper.wordpress.com/2010/04/28/certificacao-nao-perca-seu-tempo/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c188c321d553a2ac5efb5e4c05df9354?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">moreirayokoyama</media:title>
		</media:content>
	</item>
		<item>
		<title>TDD &#8211; Parte 2: 1, 2, 3&#8230; Testando</title>
		<link>http://gettingsharper.wordpress.com/2010/04/27/tdd-02/</link>
		<comments>http://gettingsharper.wordpress.com/2010/04/27/tdd-02/#comments</comments>
		<pubDate>Tue, 27 Apr 2010 02:10:53 +0000</pubDate>
		<dc:creator>moreirayokoyama</dc:creator>
				<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://gettingsharper.wordpress.com/?p=32</guid>
		<description><![CDATA[No último post eu dei uma breve introdução ao TDD. Muito breve, por sinal. Que só serviu mesmo para entendermos que é, acima de tudo, uma prática de design. Além de dar uma breve olhada em como fazer um teste. Neste post, minha intenção é dar um pouco mais de sentido à prática do TDD [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gettingsharper.wordpress.com&amp;blog=13290179&amp;post=32&amp;subd=gettingsharper&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>No último post eu dei uma breve introdução ao TDD. Muito breve, por sinal. Que só serviu mesmo para entendermos que é, acima de tudo, uma prática de design. Além de dar uma breve olhada em como fazer um teste.</p>
<p>Neste post, minha intenção é dar um pouco mais de sentido à prática do TDD fazendo alguns testes em cima de uma cesta de compras. Com isto, pretendo deixar um pouco mais claro a idéia de &#8220;Especificação Executável&#8221;.</p>
<p><span id="more-32"></span></p>
<p><span style="color:#993300;">Antes de começar, preciso ressaltar que muito do que será escrito aqui se baseia nas conclusões que eu mesmo cheguei a respeito do uso do TDD, e que podem ser equivocadas. Exatamente por isto, todo o feedback é bem-vindo. Minha vida é um constante processo de aprendizado.</span></p>
<p>Ok. Admito. O exeplo do último post foi muito tosco. Mas não é fácil bolar exemplos para posts. Ou você pensa em algo muito tosco ou acaba se envolvendo em algum exemplo que levaria 40 horas para desenvolver. E ninguém tem esse tempo hoje em dia. Talvez, você goste mais dos exemplos no blog do <a href="http://viniciusquaiato.com/blog/index.php/tdd-test-driven-development-c/" target="_blank">Vinícius Quaiato</a>. Tem gente com mais talento que eu pra pensar em exemplos rápidos.</p>
<p>Neste post, eu tentei reformular um outro caso para colocar o TDD em prática. Se trata de uma cesta de compras simples. Então, vamos lá.</p>
<p>Comecei o projeto, como esperado, pela classe de testes:</p>
<p><a href="http://gettingsharper.files.wordpress.com/2010/04/tdd02_01_writingthetest.gif"><img class="alignnone size-full wp-image-33" title="tdd02_01_WritingTheTest" src="http://gettingsharper.files.wordpress.com/2010/04/tdd02_01_writingthetest.gif?w=655" alt=""   /></a></p>
<p>Para executar os testes, precisa-se antes implementar as classes:</p>
<p><a href="http://gettingsharper.files.wordpress.com/2010/04/tdd02_02_implementingclasses.gif"><img class="alignnone size-full wp-image-34" title="tdd02_02_ImplementingClasses" src="http://gettingsharper.files.wordpress.com/2010/04/tdd02_02_implementingclasses.gif?w=655" alt=""   /></a></p>
<p>E aí rodamos os testes para conferir os vermelhos.</p>
<p><a href="http://gettingsharper.files.wordpress.com/2010/04/tdd02_03_red.gif"><img class="alignnone size-full wp-image-35" title="tdd02_03_red" src="http://gettingsharper.files.wordpress.com/2010/04/tdd02_03_red.gif?w=655" alt=""   /></a></p>
<p>E, agora, vamos atrás das correções para conseguir o verde.</p>
<p><a href="http://gettingsharper.files.wordpress.com/2010/04/tdd02_04_implementation.gif"><img class="alignnone size-full wp-image-36" title="tdd02_04_Implementation" src="http://gettingsharper.files.wordpress.com/2010/04/tdd02_04_implementation.gif?w=655" alt=""   /></a></p>
<p><a href="http://gettingsharper.files.wordpress.com/2010/04/tdd02_05_green.gif"><img class="alignnone size-full wp-image-37" title="tdd02_05_green" src="http://gettingsharper.files.wordpress.com/2010/04/tdd02_05_green.gif?w=655" alt=""   /></a></p>
<p>Talvez você esteja pensando em por que eu não fiz com que o Get do TotalAmount já não fizesse a soma dos itens. É necessário entender, ou, pelo menos, foi assim que eu entendi, que o vermelho é um passo importante no seu teste. Você precisa fazer com que ele nasça falhando. E um dos meios de fazer isso é não corrigir erros que você ainda vai testar.</p>
<p>Pode parecer bobeira para um exemplo desse. Mas nós nos damos com situações de softwares cujo os requisitos mudam o tempo todo, e seus testes precisam indicar o impacto exato de cada mudança no requisito.</p>
<p>Assim, podemos seguir adiante para o próximo teste:</p>
<p><a href="http://gettingsharper.files.wordpress.com/2010/04/tdd02_06_newtest.gif"><img class="alignnone size-full wp-image-38" title="tdd02_06_NewTest" src="http://gettingsharper.files.wordpress.com/2010/04/tdd02_06_newtest.gif?w=655" alt=""   /></a></p>
<p>Aqui ficou claro a forma do por que fiz o &#8220;Get&#8221; do TotalAmount ser falho.</p>
<p><a href="http://gettingsharper.files.wordpress.com/2010/04/tdd02_05_green1.gif"><img class="alignnone size-full wp-image-39" title="tdd02_05_green" src="http://gettingsharper.files.wordpress.com/2010/04/tdd02_05_green1.gif?w=655" alt=""   /></a></p>
<p>Agora temos o verde. Mas o que acontece se rodarmos todos os testes? O teste anterior falha devido a um erro na implementação do código. Aqui temos uma chance de aplicar um refactoring.</p>
<p><a href="http://gettingsharper.files.wordpress.com/2010/04/tdd02_08_refactoring.gif"><img class="alignnone size-full wp-image-40" title="tdd02_08_Refactoring" src="http://gettingsharper.files.wordpress.com/2010/04/tdd02_08_refactoring.gif?w=655" alt=""   /></a></p>
<p>TDD ganha ainda mais firmeza no sentido especificação executável, quando colocamos em mente de que realmente não estamos testando, estamos especificando. Veja este próximo teste:</p>
<p><a href="http://gettingsharper.files.wordpress.com/2010/04/tdd02_09_newtest.gif"><img class="alignnone size-full wp-image-41" title="tdd02_09_NewTest" src="http://gettingsharper.files.wordpress.com/2010/04/tdd02_09_newtest.gif?w=655" alt=""   /></a></p>
<p>Você notou que agora o item possui 2 unidades na propriedade Quantity?</p>
<p>Ele pega o programador no pulo. Pois um programador desavisado iria facilmente cair em uma situação simples dessa, um erro inesperado. Quando fazemos dos testes especificações, colocamos neles todas as variações possíveis. É claro que eu não preciso refazer o teste com mais ítems, já que este já foi feito.</p>
<p>Outro teste que casa com a definição de especificação executável:</p>
<p><a href="http://gettingsharper.files.wordpress.com/2010/04/tdd02_10_expectedexceptiontest.gif"><img class="alignnone size-full wp-image-42" title="tdd02_10_expectedExceptionTest" src="http://gettingsharper.files.wordpress.com/2010/04/tdd02_10_expectedexceptiontest.gif?w=655" alt=""   /></a></p>
<p>O atributo ExpectedException na declaração do método de teste faz o teste significar algo como &#8220;Quero testar se uma exceção é lançada em tal situação.&#8221; Se a exceção não for lançada, então há um problema. Isto é muito bacana. Pois até mesmo as exceções fazem parte da especificação.</p>
<p>Para não parecer uma especificação tão incompleta, podemos acrescentar mais um testezinho&#8230;</p>
<p><a href="http://gettingsharper.files.wordpress.com/2010/04/tdd02_11_onelasttest.gif"><img class="alignnone size-full wp-image-43" title="tdd02_11_OneLastTest" src="http://gettingsharper.files.wordpress.com/2010/04/tdd02_11_onelasttest.gif?w=655" alt=""   /></a></p>
<p>Experimente especificar mais testes para esta solução, ou invente uma e pratique. Chega a ficar divertido depois que nos acostumamos.</p>
<h3>Conclusão</h3>
<p>Quanto mais incremento minha especificação, mais aumento a testabilidade do meu software. Com a ajuda do TDD, fica fácil saber se o software obedece a especificação: basta rodar os testes e esperar tudo verde.</p>
<p>No próximo post falaremos de uma abordagem do TDD que visualiza sua aplicação sob outra perspectiva: o Comportamento (BDD).</p>
<p>Stay Sharp.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gettingsharper.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gettingsharper.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gettingsharper.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gettingsharper.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gettingsharper.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gettingsharper.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gettingsharper.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gettingsharper.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gettingsharper.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gettingsharper.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gettingsharper.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gettingsharper.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gettingsharper.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gettingsharper.wordpress.com/32/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gettingsharper.wordpress.com&amp;blog=13290179&amp;post=32&amp;subd=gettingsharper&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gettingsharper.wordpress.com/2010/04/27/tdd-02/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c188c321d553a2ac5efb5e4c05df9354?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">moreirayokoyama</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/04/tdd02_01_writingthetest.gif" medium="image">
			<media:title type="html">tdd02_01_WritingTheTest</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/04/tdd02_02_implementingclasses.gif" medium="image">
			<media:title type="html">tdd02_02_ImplementingClasses</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/04/tdd02_03_red.gif" medium="image">
			<media:title type="html">tdd02_03_red</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/04/tdd02_04_implementation.gif" medium="image">
			<media:title type="html">tdd02_04_Implementation</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/04/tdd02_05_green.gif" medium="image">
			<media:title type="html">tdd02_05_green</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/04/tdd02_06_newtest.gif" medium="image">
			<media:title type="html">tdd02_06_NewTest</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/04/tdd02_05_green1.gif" medium="image">
			<media:title type="html">tdd02_05_green</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/04/tdd02_08_refactoring.gif" medium="image">
			<media:title type="html">tdd02_08_Refactoring</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/04/tdd02_09_newtest.gif" medium="image">
			<media:title type="html">tdd02_09_NewTest</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/04/tdd02_10_expectedexceptiontest.gif" medium="image">
			<media:title type="html">tdd02_10_expectedExceptionTest</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/04/tdd02_11_onelasttest.gif" medium="image">
			<media:title type="html">tdd02_11_OneLastTest</media:title>
		</media:content>
	</item>
		<item>
		<title>TDD &#8211; Parte 1: É sobre Design.</title>
		<link>http://gettingsharper.wordpress.com/2010/04/26/tdd-01/</link>
		<comments>http://gettingsharper.wordpress.com/2010/04/26/tdd-01/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 14:35:06 +0000</pubDate>
		<dc:creator>moreirayokoyama</dc:creator>
				<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://gettingsharper.wordpress.com/?p=7</guid>
		<description><![CDATA[TDD já não é exatamente uma modinha faz um bom tempo. Não se trata mais de 3 letrinhas pra colocar na sopa do currículo. Se trata de uma prática aprovada pela comunidade e seu uso já é bastante expressivo no mercado. De fato, o TDD já não precisa mais convencer quase ninguém a respeito da [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gettingsharper.wordpress.com&amp;blog=13290179&amp;post=7&amp;subd=gettingsharper&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>TDD já não é exatamente uma modinha faz um bom tempo. Não se trata mais de 3 letrinhas pra colocar na sopa do currículo. Se trata de uma prática aprovada pela comunidade e seu uso já é bastante expressivo no mercado. De fato, o TDD já não precisa mais convencer quase ninguém a respeito da sua eficiência quando bem utilizado, e o problema está somente aí: fazer bom uso dele.</p>
<p>E para saber fazer bom uso dele é necessário entendermos uma coisa simples: TDD é de Test-Driven Design. Mas o que muita gente faz é focar no T de Test e esquecer do D de Design. Não se iludam: o T é o aspecto menos importante da sigla. O que realmente importa para nós aqui é o segundo D do TDD.</p>
<p><span id="more-7"></span><br />
<span style="color:#993300;">Antes de começar, preciso ressaltar que muito do que será escrito aqui se baseia nas conclusões que eu mesmo cheguei a respeito do uso do TDD, e que podem ser equivocadas. Exatamente por isto, todo o feedback é bem-vindo. Minha vida é um constante processo de aprendizado.</span></p>
<h3>Test First</h3>
<p>Testabilidade é a consequência. É o efeito do uso do TDD. Mas, embora seja Efeito ela também é a Causa. No TDD, para que o fim seja alcançado, o fim precisa ser o meio. A causa se torna efeito. Qual o fim? Obter um software testável. Qual o meio? Testar meu software antes de escrevê-lo.</p>
<p>Por que?</p>
<p>Por que à medida que escrevo meus testes, consumo meu software antes de escrevê-lo. E, a medida que faço isso, entendo como deverei escrevê-lo. Por isso que, no fim de tudo, TDD se trata de Design, pois o Design de meus objetos obedecem a forma como eu os consumo, e não o contrário. Ou seja, mudamos a perspectiva de codificação. Não fazemos a assinatura de um método baseando-se em como ele enxerga a si mesmo, mas baseando-se na perspectiva de quem irá usá-lo.</p>
<p>Quais os benefícios disso? Aumento na qualidade da entrega, Aumento na Coesão e redução do Acoplamento.</p>
<p>Para quem não sabe: Um método com alta coesão é um método que sabe resolver sua responsabilidade de forma bem resolvida e nada além disso. Um método com baixo acoplamento é um método que não está amarrado ao mundo externo a ele. Não tem conhecimento sobre aquilo que não controla.</p>
<p>Um exemplo da aplicação de coesão, é um método que precisa enviar um flyer por e-mail a um usuário. Falamos de 3 coisas: Flyer, E-mail e Usuário. Se fizermos um único método capaz de resolver as 3 coisas, ele resolverá o problema, mas terá uma coesão baixa, ou seja, ele faz mais do que um único método deveria fazer. Assim, deveríamos criar um método que saberia resolver o Flyer, um outro que saberia resolver o usuário, e um terceiro que saberia enviar um e-mail recebendo o endereço de e-mail do usuário destinatário e o código HTML do flyer para colocar no corpo do e-mail. Assim, teríamos 3 métodos que resolvessem os 3 problemas da situação proposta, cada um com sua própria responsabilidade e com alta coesão. O benefício da alta coesão é: E se eu quiser permitir que meu usuário possa acessar o flyer através de uma url impressa no e-mail, caso ele não consiga visualizar o e-mail corretamente, o mesmo método que resolve o HTML do Flyer para enviar o e-mail pode ser utilizado nesta url. E se eu quiser mandar um outro e-mail para meus usuários para um outro fim, o método que resolve o e-mail pode ser reaproveitado.</p>
<p>Um exemplo de aplicação do acoplamento (ou da redução dele) é fazer com que o método que envia e-mails alimente um Log da aplicação. Ora, de acordo com a coesão já vimos que não é saudável fazer com que este método resolva este problema. Está além da responsabilidade dele. Mas precisamos de um log, então deixamos a coesão de lado e implementamos um Log para o envio de e-mails e também para o caso de haver algum erro durante o procedimento. O log que aplicamos cria entrada em um arquivo Texto &#8220;LogEnvio.txt&#8221;. Quando fazemos isso, criamos um acoplamento no método. Ele fica dependente do acesso ao arquivo LogEnvio.txt. De fato, ele pode até ter êxito no envio de e-mail, mas algum problema na gravação do log pode prejudicar o bom funcionamento do método. Para reduzir este acoplamento, a boa prática nos fala que o melhor que podemos fazer é tornar o método que envia e-mail o mais ignorante possível a respeito do mecanismo de Log. Existem práticas para alcançar este objetivo, mas elas estão fora do escopo deste post. Eu só quis dar um resumo de coesão e acoplamento.</p>
<p>E o que isso tem a ver com testabilidade? Não poderia criar um design com alta coesão e baixo acoplamento sem o TDD?</p>
<p>Sim. Você poderia. Mas com o TDD, a alta coesão e o baixo acoplamento são atingidos naturalmente. você aumenta a coesão do seu método na hora de fazer com que seus testes avaliem somente o que ele é responsável por fazer. Você reduz o acoplamento na hora de fazer com que seus testes simulem situações que estão fora do controle do seu método. Como testar, por exemplo, o que acontecerá quando o banco de dados não funcionar? Se codificarmos o acesso aos dados antes dos testes, provavelmente não pensaríamos nisso. Mas quando fazemos os testes primeiro, entendemos que haverá esta situação para testar, e então permitimos o controle do acesso ao banco por fora do método, e assim conseguimos simular uma falha no acesso ao banco sem precisar mexer no banco propriamente dito.</p>
<p>Ao fazer testes antes, pensamos no uso do método em todas as situações possíveis, e assim ganhamos, além da testabilidade, a chance de aplicar alta coesão e baixo acoplamento durante o desenvolvimento como consequência do design elaborado de acordo com os mesmos testes.</p>
<p>E aí entra a letra T do TDD. Se você é capaz de elaborar os testes necessários para avaliar todo o funcionamento do seu objeto, então você é capaz de fazê-lo de acordo com a forma que estes testes o consome, e assim você terá um objeto totalmente testável (a ponto de te tornar capaz de dizer se ele realmente funciona ou não) e com um design totalmente dirigido ao consumo, a ponto de tornar seu uso realmente fácil na hora de implementar os métodos que o consumirão.</p>
<p>Tal prática torna seus testes o que a comunidade batizou de &#8220;Especificações Executáveis&#8221;. Ou seja, se eu sou capaz de entender todas as situações esperadas para determinar se meu código realmente funciona ou não, então sou capaz de transcrever estas situações na forma de testes, e se sou capaz de rodar estes testes sobre o meu código para saber se todos eles são bem-sucedidos, então significa que meus testes podem determinar se meu software realmente funciona ou não. Sendo assim, se meus testes dizem se o meu software funciona, então meus testes servem de especificação. Toda vez que executo meus testes, estou, na verdade, verificando se meu software obedece à especificação que os meus testes estabeleceram.</p>
<h3>Vamos ilustrar</h3>
<p>Preciso de um método que inclua um cliente no sistema. Assim, crio uma classe de repositório de clientes e defino um método Incluir, que recebe uma instancia de Cliente. Para saber se este método funciona eu preciso verificar se ele realmente incluiu o cliente no repositório. Mas, digamos que o cliente esteja lá. Isto significa que o método funciona?</p>
<p>Não, necessariamente. O que acontece se o banco estiver offline? Como esperamos que o método se comporte? E se o objeto estiver inválido? E se o Cliente que estamos tentando incluir já existe no Repositório? Todas estas perguntas determinam como o método deveria funcionar. Isto significa que a resposta para estas perguntas é a especificação do método. Se o resultado obtido após executar o método atende a todas as condições impostas pelas respostas, então o método está seguindo toda a especificação.</p>
<p>É por este motivo que o <a href="http://giovannibassi.com/" target="_blank">Giovanni Bassi</a>, em seu <a href="http://unplugged.giggio.net/unplugged/default.aspx" target="_blank">blog</a>, resolveu escrever um texto cujo o título é: <a href="http://unplugged.giggio.net/unplugged/post/TDD-nao-existe.aspx" target="_blank">TDD não existe</a>.</p>
<blockquote>
<p style="text-align:left;">(&#8230;) TDD não existe, porque não são testes que dirigem o desenvolvimento, mas sim especificações, e há uma grande diferença, porque nem sempre testes são especificações. Um nome mais adequado seria Specification Driven Development, ou Specification Driven Design (SDD). (&#8230;)</p>
</blockquote>
<p style="text-align:left;">De fato, existe uma outra abordagem  do TDD batizada de BDD (Behavior-Driven Design), e falarei a respeito disso durante esta série de posts sobre TDD. </p>
<h3 style="text-align:left;">Como aplico isso?</h3>
<p>Simples assim: antes de criar a classe que precisa, crie uma que executará os testes sobre ela.</p>
<p>Nos exemplos que mostrarei neste Post, irei fazer uso do MsTest, que já vem em algumas versões do VisualStudio. Mas prometo em breve colocar posts pra falar de outras ferramentas de teste para servirem de alternativa para quem não tem uma versão do VisualStudio com ferramenta de testes integrada.</p>
<p>A aplicação do TDD se resume em 3 partes de um ciclo: Primeiro faça um teste que falhe (vermelho), depois faça com que ele funcione (verde) e depois aplique possíveis melhorias ao código.</p>
<p>Vamos lá:</p>
<p>Neste exemplo mostrarei como fazer um teste. Mas isso ainda é longe de ser a real aplicação do TDD, que será evoluída no decorrer desta série de Posts.</p>
<p>1. Crie um novo projeto do tipo Class Library</p>
<p><a href="http://gettingsharper.files.wordpress.com/2010/04/tdd01-01-newsolution.gif"><img class="alignnone size-full wp-image-10" title="Nova Solution" src="http://gettingsharper.files.wordpress.com/2010/04/tdd01-01-newsolution.gif?w=655" alt=""   /></a></p>
<p>2. Adicione à solution um projeto de teste</p>
<p><a href="http://gettingsharper.files.wordpress.com/2010/04/tdd01-03-newtestproject.gif"><img class="alignnone size-full wp-image-12" title="New Test Project" src="http://gettingsharper.files.wordpress.com/2010/04/tdd01-03-newtestproject.gif?w=655" alt=""   /></a></p>
<p>3. Insira uma referência ao projeto Class Library no projeto de Testes</p>
<p>4. Renomeie o método de Teste para indicar o que está sendo testado</p>
<p><a href="http://gettingsharper.files.wordpress.com/2010/04/tdd01-07a-methodrenamed.gif"><img class="alignnone size-full wp-image-13" title="Method Renamed" src="http://gettingsharper.files.wordpress.com/2010/04/tdd01-07a-methodrenamed.gif?w=655" alt=""   /></a></p>
<p>5. Escreva o teste</p>
<p>Os testes normalmente são escritos em 4 etapas:</p>
<ul>
<li>Setup</li>
</ul>
<p style="padding-left:60px;">É onde todo o ambiente necessário para a execução do Teste é preparado. Conexão com o banco, ou classes de Log, enfim, tudo o que é necessário ter em mãos para executar o teste.</p>
<ul>
<li>Exercise</li>
</ul>
<p style="padding-left:60px;">É a execução do teste propriamente dito. Aqui invoca-se tudo o que se pretende invocar.</p>
<ul>
<li>Verify</li>
</ul>
<p style="padding-left:60px;">É onde são colhidas as evidências de que o teste realmente funcionou.</p>
<ul>
<li>Tear down</li>
</ul>
<p style="padding-left:60px;">Tudo o que foi inicializado no Setup e precisa ser derrubado, é feito aqui.</p>
<p><a href="http://gettingsharper.files.wordpress.com/2010/04/tdd01-08a-writingthetest.gif"><img class="alignnone size-full wp-image-14" title="Writing the Test" src="http://gettingsharper.files.wordpress.com/2010/04/tdd01-08a-writingthetest.gif?w=655" alt=""   /></a></p>
<p>Obviamente não adianta rodar o teste. Afinal, as classes ainda não existem. Mas pelo código do teste, você já sabe quais classes, propriedades e métodos precisa criar. Então, vamos criar as classes Customer e CustomersRepository no projeto ClassLibrary criado anteriormente.</p>
<p><a href="http://gettingsharper.files.wordpress.com/2010/04/tdd01-11a-writingclasses.gif"><img class="alignnone size-full wp-image-15" title="Writing the Classes" src="http://gettingsharper.files.wordpress.com/2010/04/tdd01-11a-writingclasses.gif?w=655" alt=""   /></a></p>
<p>Somente o suficiente para realizar o teste. Observe que os métodos Insert e SelectByName não foram implementados.</p>
<p>6. Vermelho</p>
<p>Execute o teste. Se você usa a ferramenta de Testes do VisualStudio, vá ao menu Test, aponte Run e clique em Tests in Current Context.</p>
<p><a href="http://gettingsharper.files.wordpress.com/2010/04/tdd01-13a-red.gif"><img class="alignnone size-full wp-image-16" title="Red" src="http://gettingsharper.files.wordpress.com/2010/04/tdd01-13a-red.gif?w=655" alt=""   /></a></p>
<p>Observe o aviso de Failed na janela Test Results, com um ícone vermelho. Você também pode verificar os detalhes da falha clicando com o botão direito no resultado do teste.</p>
<p>7. Implementar os métodos</p>
<p><a href="http://gettingsharper.files.wordpress.com/2010/04/tdd01-21-implementingmethods.gif"><img class="alignnone size-full wp-image-17" title="Implementing Methods" src="http://gettingsharper.files.wordpress.com/2010/04/tdd01-21-implementingmethods.gif?w=655" alt=""   /></a></p>
<p>Não se esqueça que também é necessário criar o banco e a tabela customers para que o teste funcione.</p>
<p>8. Green</p>
<p>Execute os testes novamente.</p>
<p><a href="http://gettingsharper.files.wordpress.com/2010/04/tdd01-22-green.gif"><img class="alignnone size-full wp-image-18" title="Green" src="http://gettingsharper.files.wordpress.com/2010/04/tdd01-22-green.gif?w=655" alt=""   /></a></p>
<p>Verifique agora na que o Resultado do teste é um ícone Verde. O código passou no teste.</p>
<p>9. Refactoring</p>
<p>Agora que o código passou no teste, podemos aplicar algum refactoring. Por exemplo, nos dois métodos usamos uma mesma conexão. Então podemos reaproveitar o objeto de conexão. E já que pensamos assim, o objeto de conexão pode ser injetado no construtor.</p>
<p><a href="http://gettingsharper.files.wordpress.com/2010/04/tdd01-23-refactoring.gif"><img class="alignnone size-full wp-image-19" title="Refactoring" src="http://gettingsharper.files.wordpress.com/2010/04/tdd01-23-refactoring.gif?w=655" alt=""   /></a></p>
<p>10. Alterando o teste para atender ao código refatorado.</p>
<p><a href="http://gettingsharper.files.wordpress.com/2010/04/tdd01-25-changingthetest.gif"><img class="alignnone size-full wp-image-20" title="Changing the Test" src="http://gettingsharper.files.wordpress.com/2010/04/tdd01-25-changingthetest.gif?w=655" alt=""   /></a></p>
<p>11. Verde de novo</p>
<p>Execute o teste novamente e, caso surja um novo vermelho, reveja suas alterações até que o seu código passe pelo teste.</p>
<h3>E agora?</h3>
<p>Apesar de termos visto um rápido exemplo de como fazer testes e executá-los, este não é um bom exemplo de aplicação de TDD. À medida que evoluimos na prática do TDD começamos a entender melhor o conceito de especificação executável a ponto de, por exemplo, já criar logo de cara o construtor do repositório recebendo o objeto de conexão.</p>
<p>No TDD, a idéia é fazer testes que não mudam, a menos que a especificação mude. Então é natural que com o tempo identifiquemos estas pequenas coisas antes mesmo de chegar ao refactoring. Em resumo, o teste tem que resultar vermelho em primeiro lugar, depois há de se fazer o estritamente necessário para torná-lo verde, e então se aplica o refactoring para melhorar o código.</p>
<p>O nosso verde neste exemplo não significa, ainda, que o nosso código realmente funcione. Não aplicamos o TDD corretamente, apenas fizemos um teste. Quer uma prova?</p>
<p>Abra a tabela customers e verifique:</p>
<p>Vai notar que para cada vez que você executou o teste com resultado verde, um novo registro foi inserido na tabela. Isso resulta na redundancia de registros, e isto não é bom. Além disso, nosso código não tem nenhuma tolerância a falhas. Se houver algum erro devido a conexão com o banco ou qualquer outra coisa, não há nada acontecendo e nosso teste é incapaz de avaliar isto.</p>
<p>Para reverter esta situação existem práticas que aprenderemos no decorrer desta série.</p>
<h3>Conclusão</h3>
<p>A forma como codificamos nossos testes determina a forma como codificaremos nossas classes, e isto nos ajuda a criar classes que nos provêm recursos que serão realmente utilizados da maneira como se espera ao consumí-las. A prática do TDD nos ajuda neste objetivo e ainda nos dá, como consequência, um código testável, alta coesão e baixo acoplamento.</p>
<p>Nos próximos posts, evoluiremos nestes objetivos.</p>
<p>Stay sharp!</p>
<h3>Links úteis</h3>
<p>TDD não existe (<a href="http://unplugged.giggio.net/unplugged/post/TDD-nao-existe.aspx">http://unplugged.giggio.net/unplugged/post/TDD-nao-existe.aspx</a>)<br />
Texto de Giovanni Bassi sobre TDD.</p>
<p>BubbleSort Kata (<a href="http://unplugged.giggio.net/unplugged/post/BubbleSort-Kata.aspx">http://unplugged.giggio.net/unplugged/post/BubbleSort-Kata.aspx</a>)<br />
Exemplo de BubbleSort aplicando TDD.</p>
<p>TDD (<a href="http://viniciusquaiato.com/blog/index.php/tdd-test-driven-development-c/">http://viniciusquaiato.com/blog/index.php/tdd-test-driven-development-c/</a>)<br />
Post de Vinícius Quaiato dando exemplos de aplicação do TDD.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gettingsharper.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gettingsharper.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gettingsharper.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gettingsharper.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gettingsharper.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gettingsharper.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gettingsharper.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gettingsharper.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gettingsharper.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gettingsharper.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gettingsharper.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gettingsharper.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gettingsharper.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gettingsharper.wordpress.com/7/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gettingsharper.wordpress.com&amp;blog=13290179&amp;post=7&amp;subd=gettingsharper&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gettingsharper.wordpress.com/2010/04/26/tdd-01/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c188c321d553a2ac5efb5e4c05df9354?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">moreirayokoyama</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/04/tdd01-01-newsolution.gif" medium="image">
			<media:title type="html">Nova Solution</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/04/tdd01-03-newtestproject.gif" medium="image">
			<media:title type="html">New Test Project</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/04/tdd01-07a-methodrenamed.gif" medium="image">
			<media:title type="html">Method Renamed</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/04/tdd01-08a-writingthetest.gif" medium="image">
			<media:title type="html">Writing the Test</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/04/tdd01-11a-writingclasses.gif" medium="image">
			<media:title type="html">Writing the Classes</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/04/tdd01-13a-red.gif" medium="image">
			<media:title type="html">Red</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/04/tdd01-21-implementingmethods.gif" medium="image">
			<media:title type="html">Implementing Methods</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/04/tdd01-22-green.gif" medium="image">
			<media:title type="html">Green</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/04/tdd01-23-refactoring.gif" medium="image">
			<media:title type="html">Refactoring</media:title>
		</media:content>

		<media:content url="http://gettingsharper.files.wordpress.com/2010/04/tdd01-25-changingthetest.gif" medium="image">
			<media:title type="html">Changing the Test</media:title>
		</media:content>
	</item>
	</channel>
</rss>
