<?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>AgileZ &#187; xUnit</title>
	<atom:link href="http://www.brasiltech.net/agilez/tag/xunit/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.brasiltech.net/agilez</link>
	<description>Metodologias e técnicas aplicadas a desenvolvimento e gerenciamento</description>
	<lastBuildDate>Wed, 29 Dec 2010 23:40:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>A import&#226;ncia do desenvolvimento orientado a teste ou TDD</title>
		<link>http://www.brasiltech.net/agilez/2009/11/08/a-importancia-do-desenvolvimento-orientado-a-teste-tdd-teste-driven-development/</link>
		<comments>http://www.brasiltech.net/agilez/2009/11/08/a-importancia-do-desenvolvimento-orientado-a-teste-tdd-teste-driven-development/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 01:47:23 +0000</pubDate>
		<dc:creator>Douglas Cunha</dc:creator>
				<category><![CDATA[Metodologias]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Testes]]></category>
		<category><![CDATA[xUnit]]></category>

		<guid isPermaLink="false">http://www.brasiltech.net/agilez/2009/11/08/a-importancia-do-desenvolvimento-orientado-a-teste-tdd-teste-driven-development/</guid>
		<description><![CDATA[Se você e sua equipe são adeptos do scrum ou outra metodologia ágil provavelmente devem conhecer ou utilizar testes unitários, mas não necessariamente o desenvolvimento orientado a testes (TDD). O teste unitário consiste basicamente em validar dados válidos e inválidos via entrada e saída, já o TDD utiliza teste unitário como parte de sua metodologia [...]]]></description>
			<content:encoded><![CDATA[<p><img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="Grafo" src="http://www.brasiltech.net/agilez/wp-content/uploads/2009/11/Grafo.png" border="0" alt="Grafo" width="240" height="204" align="left" /></p>
<p>Se você e sua equipe são adeptos do scrum ou outra metodologia ágil provavelmente devem conhecer ou utilizar testes unitários, mas não necessariamente o desenvolvimento orientado a testes (TDD). O teste unitário consiste basicamente em validar dados válidos e inválidos via entrada e saída, já o TDD utiliza teste unitário como parte de sua metodologia cujo principal objetivo não é testar as unidades (é um dos objetivos, mas não o único).</p>
<p>Em um cenário de desenvolvimento ágil, sem uso de TDD, o programador geralmente não conta com um modelo de classes em forma de diagramas &#8211; como outras metodologias pesadas. Por isso é comum a modelagem ser feita apenas mentalmente, em algum outro formato (rascunho em papel de pão?) ou até mesmo diretamente no código. As classes, operações e atributos vão surgindo conforme a necessidade, e são constantemente alterados e implementados até a conclusão da tarefa associada. Eventualmente, alguns testes de unidade são implementados baseando-se nas classes já prontas.<span id="more-100"></span></p>
<p>Este tipo de abordagem implica em alguns problemas, entre eles:</p>
<ul>
<li>o programador não tem segurança em saber quando uma implementação acabou;</li>
<li>o programador não precisa implementar a classe de forma que ela fique desacoplada das demais;</li>
<li>o programador tende a não desenvolver para a interface e sim para a implementação;</li>
<li>métodos não coesos (fazem mais ou menos do que deveriam fazer);</li>
<li>nomes de atributos e operações não representam adequadamente a funcionalidade.</li>
</ul>
<p>O TDD pretende resolver todas as deficiências citadas acima e várias outras. Mas, o que é o TDD? TDD ou Test Driven Development pode ser considerada uma metodologia de design de software, onde escrevemos primeiro um teste e depois o código necessário para o teste passar. A idéia é que o desenho das classes seja guiado pelos testes. O TDD força o desenvolvedor a pensar primeiro em o que ele precisa, e em como fazer, via teste unitário, para testar se a implementação a ser feita fará o que deve, nada mais e nada menos. Com isso, se ganha em vários aspectos:</p>
<ul>
<li>as classes devem ser desacopladas, senão o teste não pode ser executado;</li>
<li>os métodos são bem coesos, ou seja, fazem somente o necessário para o teste passar;</li>
<li>o programador sabe exatamente quando concluiu uma implementação, pois o teste passou;</li>
<li>o programador consegue validar rapidamente uma alteração que pode ter causado um impacto em outras unidades, apenas rodando um conjunto de testes;</li>
<li>operações e atributos possuem nomes claros e representam exatamente o que fazem.</li>
</ul>
<p>O workflow do TDD pode ser descrito basicamente em cinco passos básicos:</p>
<ol>
<li>Crie a classe de teste e o primeiro teste
<ol>
<li>Nesse ponto o programador deve pensar em como será a assinatura do método testado. O fato de ter que escrever um teste para o método, faz com que, tanto o nome quanto os parâmetros de entrada e saída sejam bem claros e coesos.</li>
</ol>
</li>
<li>Compile o teste
<ol>
<li>O teste não vai compilar. Neste momento, crie a classe e a declaração do método. Recompile e rode o teste. O teste deve falhar, pois o método testado ainda não está implementado.</li>
</ol>
</li>
<li>Implemente o código testado de modo que o teste falhe
<ol>
<li>O objetivo do teste é detectar defeitos, e essa fase é importante para averiguar se o teste está cumprindo seu papel. Geralmente codificar para que o método testado retorne um valor errado é o suficiente. Rode o teste e veja o teste falhar.</li>
</ol>
</li>
<li>Agora corrija o código, de forma que o teste passe
<ol>
<li>Implemente o suficiente para o teste passar. Você deve garantir que o teste exija o suficiente. Se precisar implementar mais do que o necessário para o teste passar, provavelmente seu teste não está bom o suficiente, ou seu método não está coeso. Neste caso, refaça o teste ou corrija a implementação do código testado.</li>
</ol>
</li>
<li>Faça alguma refatoração necessária e reexecute os testes
<ol>
<li>Na fase anterior nos preocupamos apenas em fazer o teste passar. Nessa etapa, faça uma revisão no código e veja se precisa de alguma refatoração. Em seguida rode todos os testes construídos até agora para certificar-se de que a refatoração não quebrou algum outro código.</li>
</ol>
</li>
<p>Antes que me perguntem: TDD não é burocrático e demorado?.  Não. Usar TDD não implica em aumentar o tempo de desenvolvimento. Desconsiderando o tempo de adaptação de sua equipe, a tendência é que o desenvolvimento com TDD aumente consideravelmente a produtividade, e, consequentemente, a segurança e qualidade dos produtos desenvolvidos. Essa é a experiência de quase toda equipe de aderiu ao TDD, e provavelmente sua equipe só vai se sentir confortável com a idéia quando efetivamente aplicar os conceitos da metodologia.</ol>
<p>Neste artigo não abordei as ferramentas de teste unitário, pois não é o foco do TDD, porém praticamente todos os ambientes de desenvolvimento moderno possuem algum framework de testes unitários. Posso citar alguns: NUnit (C#), DUnit (Delphi) e JUnit (Java). Escolha o que melhor se adequar a sua realidade.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brasiltech.net/agilez/2009/11/08/a-importancia-do-desenvolvimento-orientado-a-teste-tdd-teste-driven-development/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

