<?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>marcuscavalcanti.net &#187; Tecnologia, Software &amp; Desenvolvimento</title>
	<atom:link href="http://www.marcuscavalcanti.net/blog/category/tecnologia-software-e-desenvolvimento/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.marcuscavalcanti.net/blog</link>
	<description>Software, tecnologia e etc.</description>
	<lastBuildDate>Wed, 21 Jul 2010 03:52:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>BDD com JBehave</title>
		<link>http://www.marcuscavalcanti.net/blog/2010/01/08/bdd-com-jbehave/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2010/01/08/bdd-com-jbehave/#comments</comments>
		<pubDate>Fri, 08 Jan 2010 19:39:55 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Tecnologia, Software & Desenvolvimento]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Testes]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=1304</guid>
		<description><![CDATA[Conforme prometido no tópico anterior, irei mostrar o conceito de BDD através da utilização do framework JBehave, que é o framework de BDD mais famoso para Java e que foi desenvolvido pelo Dan North, o idealizador deste conceito.
Antes de mais nada, vamos citar alguns conceitos importantes de BDD.
Estórias e Cenários
BDD é baseado em estórias e [...]]]></description>
			<content:encoded><![CDATA[<p>Conforme prometido no <a href="http://www.marcuscavalcanti.net/blog/2010/01/07/algumas-observacoes-sobre-bdd/" style="text-decoration: underline" target="_blank">tópico anterior</a>, irei mostrar o conceito de <a href="http://dannorth.net/introducing-bdd" style="text-decoration: underline" target="_blank">BDD</a> através da utilização do <em>framework</em> <a href="http://jbehave.org/" style="text-decoration: underline" target="_blank">JBehave</a>, que é o <em>framework</em> de BDD mais famoso para Java e que foi desenvolvido pelo <a href="http://dannorth.net/" style="text-decoration: underline" target="_blank">Dan North</a>, o idealizador deste conceito.</p>
<p>Antes de mais nada, vamos citar alguns conceitos importantes de BDD.</p>
<h3>Estórias e Cenários</h3>
<p>BDD é baseado em estórias e cenários, e para criarmos ambos, vamos seguir alguns padrões pré-definidos por autores de BDD. Uma vez que BDD é focado em comportamento e sequência, as estórias e cenários devem ter um formato rígido para que as ferramentas consigam entendê-los e interpretá-los.</p>
<p>As estórias, possuem o seguinte formato:<br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li></li><li>As I [X]</li><li>I want [Y]</li><li>so that [Z]</li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>E os cenários possuem o seguinte formato:<br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li></li><li>Given some initial context (the givens),</li><li>When an event occurs,</li><li>then ensure some outcomes.</li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Ou seja, isso quer dizer que devemos pensar em nossos requisitos de maneira que possam ser escritos baseados nessa convenção.</p>
<p>O JBehave é originalmente escrito para entender estórias em inglês, entretanto como BDD é focado em pessoas (<em>stakeholders</em>) e na descrição de situações reais, faz muito mais sentido semanticamente que as estórias e cenários sejam escritos em português e para resolver isso, usei uma <a href="http://codificando.com/2009/04/15/jbehave-brasil-bdd-em-java-no-nosso-idioma/" target="_blank" style="text-decoration: underline">contribuição</a> do <a href="http://codificando.com/" target="_blank" style="text-decoration: underline">Emerson Macedo</a> para que os cenários possam ser escritos e entendidos em português pelo JBehave.</p>
<h3>Começando com o JBehave</h3>
<p>O primeiro passo para utilização do JBehave, é fazer <em><a href="http://jbehave.org/software/download/" target="_blank" style="text-decoration: underline">download</em> do JAR</a> do projeto e incluí-lo no <em>classpath</em> do seu projeto.</p>
<p>O próximo passo é escrever a estória juntamente com o cenário e para tal resolvi criar um exemplo simples para que o entendimento do conceito possa ser casado através do código a ser desenvolvido. </p>
<p>O exemplo escolhido é baseado no requisito: <strong>Compra de produtos em promoção com aviso por email</strong>. E é isso que nosso cenário BDD deve descrever.</p>
<p>Por questão de organização, resolvi quebrar a estória em 3 cenários diferentes, onde a primeira parte representa a verificação de produtos em promoção, a segunda representa a compra desses produtos e o terceiro é a finalização da compra e o envio de email. Então, a estória e os cenários ficaram assim:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li></li><li>Compra de produtos em promoção com aviso por email</li><li>&nbsp;</li><li>Narrativa:</li><li>Como um usuário</li><li>Eu quero comprar produtos em promoção</li><li>E então receber um email de confirmação</li><li>&nbsp;</li><li>Cenário: Verificar produtos em promoção</li><li>Dado Que uma loja possui 10 produtos</li><li>E Que 5 estão em promoção</li><li>Quando Eu verifico quais estão em promoção</li><li>Então Preencho minha sacola apenas com produtos em promoção</li><li>&nbsp;</li><li>Cenário: Comprar produtos em promoção</li><li>Dado Que minha sacola de compras está preenchida com 5 produtos em promoção</li><li>Quando Eu verifico o somatório de produtos</li><li>Então Devo ter somente um total de 500 reais em produtos</li><li>&nbsp;</li><li>Cenário: Enviar email</li><li>Dado Que minha sacola está preenchida de produtos</li><li>Quando Enviar um email de confirmação</li><li>Então Devo receber o status do envio &quot;true&quot;</li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>A primeira linha do arquivo texto representa o título da nossa estória, o requisito de fato. A narrativa é um resumo do que essa estória deve cumprir e a seguir vem os três cenários, que no caso são as três etapas da estória.</p>
<p>É importante notar, que as palavras chaves em inglês (<em>Given</em>, <em>When</em>, <em>Then</em>, <em>And</em>) foram substituídas  por palavras em português (Dado, Quando, Então, E).</p>
<p>Esse arquivo texto deve ser salvo com a extensão <em>*.cenario</em> e o seu nome está diretamente ligado a classe que irei criar no passo a seguir, que no caso é a classe que representa a estória e a associação com os cenários.</p>
<h3>Criando a classe que irá comportar os cenários</h3>
<p>Nesse passo irei criar a classe que irá apontar os cenários que compõe a estória e essa classe deve extender a classe <a href="http://jbehave.org/javadoc/latest/core/org/jbehave/scenario/Scenario.html" class="broken_link"  target="_blank" style="text-decoration: underline"><em>Scenario</em></a> do JBehave. Dessa forma, a classe ficaria assim:</p>
<p><strong>PrecoPromocaoTeste.java</strong><br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Java"><div class="devcodeoverflow"><ol><li></li><li><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">scenario1</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">scenario1.steps.CompraSteps</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">scenario1.steps.EmailSteps</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">scenario1.steps.PromocaoSteps</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">scenario1.util.PtBRScenario</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> PrecoPromocaoTeste <span style="color: #000000; font-weight: bold;">extends</span> PtBRScenario <span style="color: #009900;">&#123;</span></li><li>	<span style="color: #000000; font-weight: bold;">public</span> PrecoPromocaoTeste<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addSteps<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> PromocaoSteps<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addSteps<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> CompraSteps<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addSteps<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> EmailSteps<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>	<span style="color: #009900;">&#125;</span></li><li><span style="color: #009900;">&#125;</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>No exemplo acima, estou extendo a classe <em>PtBRScenario</em> só para que a estória e o cenário sejam escritos em português, mas essa classa herda a classe <em>Scenario</em> como descrito anteriormente.</p>
<p>No construtor da classe, inclui os passos que a estória deve seguir para ser satisfeita e como quebrei a estória em três pedaços, precisei incluir três passos sequenciados.</p>
<h3>Criando os passos da estória</h3>
<p>Como a estória foi quebrada em três partes, se faz por necessário a criação de 3 classes que irão representar os passos da estória e todas essas classes devem herdar a classe <em><a href="http://jbehave.org/javadoc/latest/core/org/jbehave/scenario/steps/Steps.html" class="broken_link"  target="_blank" style="text-decoration: underline">Steps</a></em> do JBehave.</p>
<p>Pela ordem definida na nossa classe de cenário, vamos aos passos:</p>
<p><strong>PromocaoSteps.java</strong><br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Java"><div class="devcodeoverflow"><ol><li><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">scenario1.steps</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.List</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">junit.framework.Assert</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.jbehave.scenario.annotations.Given</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.jbehave.scenario.annotations.Then</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.jbehave.scenario.annotations.When</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">scenario1.entity.Loja</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">scenario1.entity.Produto</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">scenario1.util.PtBRSteps</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">scenario1.vo.Sacola</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> PromocaoSteps <span style="color: #000000; font-weight: bold;">extends</span> PtBRSteps <span style="color: #009900;">&#123;</span>	</li><li>	Loja loja 		<span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Loja<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>	Sacola sacola 	<span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Sacola<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>	List<span style="color: #339933;">&lt;</span>Produto<span style="color: #339933;">&gt;</span> listaProdutoPromocao<span style="color: #339933;">;</span></li><li>	<span style="color: #000066; font-weight: bold;">int</span> quantidadeProdutoPromocao<span style="color: #339933;">;</span></li><li>&nbsp;</li><li>	@Given<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Que uma loja possui $quant produtos&quot;</span><span style="color: #009900;">&#41;</span></li><li>	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> populaLoja<span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Integer</span></a> quantidade<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>		loja.<span style="color: #006633;">inicializaProdutos</span><span style="color: #009900;">&#40;</span>quantidade<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>	<span style="color: #009900;">&#125;</span>	</li><li>&nbsp;</li><li>	@Given<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Que $quant estão em promoção&quot;</span><span style="color: #009900;">&#41;</span></li><li>	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> informaProdutosPromocao<span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Integer</span></a> quantidade<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>		loja.<span style="color: #006633;">colocaProdutosPromocao</span><span style="color: #009900;">&#40;</span>quantidade<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>		quantidadeProdutoPromocao <span style="color: #339933;">=</span> quantidade<span style="color: #339933;">;</span></li><li>	<span style="color: #009900;">&#125;</span>	</li><li>&nbsp;</li><li>	@When<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Eu verifico quais estão em promoção&quot;</span><span style="color: #009900;">&#41;</span></li><li>	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> verificaProdutosPromocao<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>		</li><li>		listaProdutoPromocao <span style="color: #339933;">=</span> loja.<span style="color: #006633;">retornaProdutosPromocao</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>	<span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li>	@Then<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Preencho minha sacola apenas com produtos em promoção&quot;</span><span style="color: #009900;">&#41;</span></li><li>	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> populaSacola<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>		sacola.<span style="color: #006633;">populaSacola</span><span style="color: #009900;">&#40;</span>listaProdutoPromocao<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>		<span style="color: #000000; font-weight: bold;">Assert</span>.<span style="color: #006633;">assertEquals</span><span style="color: #009900;">&#40;</span>listaProdutoPromocao.<span style="color: #006633;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, quantidadeProdutoPromocao<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>	<span style="color: #009900;">&#125;</span></li><li><span style="color: #009900;">&#125;</span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p><strong>CompraSteps.java</strong><br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Java"><div class="devcodeoverflow"><ol><li><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">scenario1.steps</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.ArrayList</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.List</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">junit.framework.Assert</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.jbehave.scenario.annotations.Given</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.jbehave.scenario.annotations.Then</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.jbehave.scenario.annotations.When</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">scenario1.entity.Produto</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">scenario1.util.PtBRSteps</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">scenario1.vo.Sacola</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CompraSteps <span style="color: #000000; font-weight: bold;">extends</span> PtBRSteps <span style="color: #009900;">&#123;</span></li><li>	Sacola sacola 				<span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Sacola<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>	<span style="color: #000066; font-weight: bold;">double</span> somatorioProdutos 	<span style="color: #339933;">=</span> 0d<span style="color: #339933;">;</span></li><li>&nbsp;</li><li>	@Given<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Que minha sacola de compras está preenchida com $quant produtos em promoção&quot;</span><span style="color: #009900;">&#41;</span></li><li>	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> verificaSacola<span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Integer</span></a> quantidade<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>		List<span style="color: #339933;">&lt;</span>Produto<span style="color: #339933;">&gt;</span> listaProduto <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ArrayList<span style="color: #339933;">&lt;</span>Produto<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>		<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i<span style="color: #339933;">=</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> i<span style="color: #339933;">&lt;=</span>quantidade<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>			Produto produto 	<span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Produto<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>			produto.<span style="color: #006633;">preco</span> 		<span style="color: #339933;">=</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Amath+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Math</span></a>.<span style="color: #006633;">round</span><span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Amath+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Math</span></a>.<span style="color: #006633;">random</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span>100<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>			produto.<span style="color: #006633;">emPromocao</span> 	<span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>			listaProduto.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>produto<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>		<span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li>		sacola.<span style="color: #006633;">populaSacola</span><span style="color: #009900;">&#40;</span>listaProduto<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>	<span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li>	@When<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Eu verifico o somatório de produtos&quot;</span><span style="color: #009900;">&#41;</span></li><li>	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> verificaTotalProdutosSacola<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>		<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span> Produto produto <span style="color: #339933;">:</span> sacola.<span style="color: #006633;">retornaProdutos</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>			somatorioProdutos <span style="color: #339933;">=</span> produto.<span style="color: #006633;">preco</span> <span style="color: #339933;">+</span> somatorioProdutos<span style="color: #339933;">;</span></li><li>		<span style="color: #009900;">&#125;</span></li><li>	<span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li>	@Then<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Devo ter somente um total de R$ $total reais em produtos&quot;</span><span style="color: #009900;">&#41;</span></li><li>	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> validaSacola<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">double</span> totalProduto<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>		</li><li>		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> somatorioProdutos <span style="color: #339933;">&gt;</span> totalProduto <span style="color: #009900;">&#41;</span></li><li>			<span style="color: #000000; font-weight: bold;">Assert</span>.<span style="color: #006633;">fail</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Total de produtos é acima de R$ 500&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>	<span style="color: #009900;">&#125;</span></li><li><span style="color: #009900;">&#125;</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p><strong>EmailSteps.java</strong><br />
<!--DEVFMTCODE--><pre class="devcodeblock" title="Java"><div class="devcodeoverflow"><ol><li><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">scenario1.steps</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">static</span> org.<span style="color: #006633;">jbehave</span>.<span style="color: #006633;">Ensure</span>.<span style="color: #006633;">ensureThat</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.jbehave.scenario.annotations.Given</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.jbehave.scenario.annotations.Then</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.jbehave.scenario.annotations.When</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">scenario1.util.PtBRSteps</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">scenario1.vo.Sacola</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">com.guilhermechapiewski.fluentmail.email.EmailMessage</span><span style="color: #339933;">;</span></li><li><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">com.guilhermechapiewski.fluentmail.transport.EmailTransportConfiguration</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> EmailSteps <span style="color: #000000; font-weight: bold;">extends</span> PtBRSteps <span style="color: #009900;">&#123;</span></li><li>	Sacola sacola 		<span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Sacola<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>	<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aboolean+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Boolean</span></a> statusEnvio <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>	@Given<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Que minha sacola está preenchida de produtos&quot;</span><span style="color: #009900;">&#41;</span></li><li>	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> verificaSacola<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">System</span></a>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Lista cheia..&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>	<span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li>	@When<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Enviar um email de confirmação&quot;</span><span style="color: #009900;">&#41;</span></li><li>	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> enviaEmail<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>		EmailTransportConfiguration.<span style="color: #006633;">configure</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;localhost&quot;</span>, <span style="color: #000066; font-weight: bold;">false</span>, <span style="color: #000066; font-weight: bold;">false</span>, <span style="color: #0000ff;">&quot;&quot;</span>, <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>		<span style="color: #000000; font-weight: bold;">new</span> EmailMessage<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span></li><li>	&nbsp;&nbsp;&nbsp;&nbsp;	.<span style="color: #006633;">from</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;eusou@marcuscavalcanti.net&quot;</span><span style="color: #009900;">&#41;</span></li><li>	&nbsp;&nbsp;&nbsp;&nbsp;	.<span style="color: #006633;">to</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;eusou@marcuscavalcanti.net&quot;</span><span style="color: #009900;">&#41;</span></li><li>	&nbsp;&nbsp;&nbsp;&nbsp;	.<span style="color: #006633;">withSubject</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Testando BDD&quot;</span><span style="color: #009900;">&#41;</span></li><li>	&nbsp;&nbsp;&nbsp;&nbsp;	.<span style="color: #006633;">withBody</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Testando terceiro cenário e o final da estória.&quot;</span><span style="color: #009900;">&#41;</span></li><li>	&nbsp;&nbsp;&nbsp;&nbsp;	.<span style="color: #006633;">send</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>		statusEnvio <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span></li><li>	<span style="color: #009900;">&#125;</span></li><li>&nbsp;</li><li>	@Then<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Devo receber o status do envio <span style="color: #000099; font-weight: bold;">\&quot;</span>$retorno<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span><span style="color: #009900;">&#41;</span></li><li>	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> recebeStatusEnvio<span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> retorno<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>	</li><li>		ensureThat<span style="color: #009900;">&#40;</span>statusEnvio.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span>retorno<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>	<span style="color: #009900;">&#125;</span></li><li><span style="color: #009900;">&#125;</span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Nos exemplos acima, que representam os passos de um cenário, é importante notar que os métodos seguem a ordem definida no arquivo texto, assim como todos são anotados com as palavras chaves correspondentes, no caso <em>Given</em>, <em>When</em>, <em>And</em>, <em>Then</em>. As anotações recebem como parâmetro as frases descritas no arquivo texto, excluindo apenas as palavras chaves no começo da frase, que estão devidamente representadas pelas anotações.</p>
<p>Os parâmetros são identificados com o formato <em>$variavel</em>, e uma vez que usamos esses parâmetros, devemos também colocá-los na assinatura dos métodos. Esses parâmetros são automaticamente capturados pelo JBehave através do uso de <a href="http://guia-er.sourceforge.net/" target="_blank" style="text-decoration: underline">expressões regulares</a>. </p>
<h3>Executando o exemplo</h3>
<p>Para executar o exemplo deve-se executar a classe que extende a classe <em>Scenario</em> do JBehave, nesse caso seria a classe <em>PrecoPromocaoTeste.java</em>, e para acompanhar os resultados, eu utilizo a integração do <a href="http://www.eclipse.org/" target="_blank" style="text-decoration: underline">Eclipse</a> com o <a href="http://www.junit.org/" target="_blank" style="text-decoration: underline">JUnit</a>, através de uma <em><a href="http://www.eclipse.org/articles/viewArticle/ViewArticle2.html" target="_blank" style="text-decoration: underline">view</a></em> própria da <a href="http://pt.wikipedia.org/wiki/IDE" target="_blank" style="text-decoration: underline">IDE</a>.</p>
<p>No exemplo, usei ainda algumas classes auxiliares criadas especificamente para o exemplo, mas que não irei mostrar aqui os seus códigos para não tornar o tópico extenso demais. De qualquer forma, ao final desse tópico botarei um <em>link</em> para <em>download</em> do projeto no Eclipse que contém todos os códigos.</p>
<h3>Observações finais</h3>
<p>Um dos problemas que eu notei no JBehave é em relação a parametrização de alguns valores no arquivo texto para o código Java, em alguns casos isso pode se tornar um trabalho sacal e pouco produtivo, mas acredito que com a evolução do <em>framework</em> esse problema será resolvido.</p>
<p>Algumas pessoas utilizam alternativas variadas para resolver esse problema, como  por exemplo criar o valor dos parâmetros diretamente como atributos nas classes que representam os passos. Eu particularmente não gosto dessa abordagem, pois acredito que isso faz com que os arquivos que descrevem os cenários percam seu valor e esses arquivos são essencial para utilização e sentido do BDD.</p>
<p>No exemplo citado, usei ainda algumas bibliotecas como <a href="http://code.google.com/p/fluentmailapi/" target="_blank" style="text-decoration: underline">FluentMailApi</a>, Mail e Activation da <a href="http://java.sun.com/products/javamail/" target="_blank" style="text-decoration: underline">JavaMail</a> e <a href="http://code.google.com/p/hamcrest/" target="_blank" style="text-decoration: underline">Hamcrest</a>. Essas bibliotecas servem basicamente para o envio de email e uso mais aperfeiçoado de expressões regulares por parte do JBehave.</p>
<p>Para finalizar, é importante citar que as classes do meu negócio (Sacola, Usuario, Loja, etc) foram construídas baseadas no meu requesito, no meu cenário, que foi a primeira etapa a ser elaborada na construção do exemplo.</p>
<h3>Download</h3>
<p>Para <em>download</em> do projeto completo no Eclipse, basta <a href="http://www.marcuscavalcanti.net/blog/wp-content/uploads/JBehave/JBehaveLab.rar" style="text-decoration: underline" target="_blank">clicar aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2010/01/08/bdd-com-jbehave/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Algumas observações sobre BDD</title>
		<link>http://www.marcuscavalcanti.net/blog/2010/01/07/algumas-observacoes-sobre-bdd/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2010/01/07/algumas-observacoes-sobre-bdd/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 22:35:13 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Tecnologia, Software & Desenvolvimento]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Testes]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=1271</guid>
		<description><![CDATA[Ultimamente estive pesquisando sobre o assunto BDD (Behaviour-Driven Development) e também praticado com alguns exemplos reais, através disso devo dizer que consegui tirar algumas conclusões bem interessantes sobre o assunto, nas quais gostaria de expor aqui. Vamos a elas:
BDD ajuda você, BDD ajuda seu cliente
Um ponto que pude observar, é que usando BDD a possibilidade [...]]]></description>
			<content:encoded><![CDATA[<p>Ultimamente estive pesquisando sobre o assunto BDD (<a href="http://dannorth.net/introducing-bdd" target="_blank" style="text-decoration: underline">Behaviour-Driven Development</a>) e também praticado com alguns exemplos reais, através disso devo dizer que consegui tirar algumas conclusões bem interessantes sobre o assunto, nas quais gostaria de expor aqui. Vamos a elas:</p>
<h3>BDD ajuda você, BDD ajuda seu cliente</h3>
<p>Um ponto que pude observar, é que usando BDD a possibilidade de um cliente participar de um projeto é imensa, mesmo que você não use alguma metodologia ágil (falarei sobre isso a seguir). E por que ele pode participar? É simples, pois é ele quem pode escrever os testes. Se ainda assim não for o seu cliente o responsável por escrever os testes, será ele quem irá validá-los, ou seja, você pode escrever os testes e pedir para que ele aprove ou não. Isso é muito importante, pois nesse caso os testes em BDD seriam o contrato entre você o seu cliente, entre o que você está entregando e o que ele está esperando.</p>
<h3>BDD favorece o sucesso do uso de metodologias ágeis</h3>
<p>Sem dúvida nenhuma um dos pontos fortes do uso de BDD é que suas características se encaixam muito bem em equipes que fazem o uso de <a href="http://en.wikipedia.org/wiki/Agile_software_development"  target="_blank" style="text-decoration: underline">metodologia ágil</a>. E são vários pontos que favorecem.</p>
<p>Uma delas é a já citada participação do cliente, pois um dos requisitos para o sucesso do uso de metodologias ágeis é a participação e contribuição efetiva do cliente e no caso do uso de BDD ele pode participar diretamente, uma vez que é ele quem é o responsável (<a href="http://improveit.com.br/scrum/product_owner" target="_blank" style="text-decoration: underline">PO</a>) por criar as estórias (ítens do <a href="http://improveit.com.br/scrum/product_backlog"  target="_blank" style="text-decoration: underline">backlog</a>) e criar os <a href="http://en.wikipedia.org/wiki/Acceptance_testing" target="_blank" style="text-decoration: underline">testes de aceitação</a> para as mesmas, onde tudo isso é usado no BDD.</p>
<p>Os artefatos que constituem BDD são muito, mais muito semelhantes aos artefatos presentes em ágil.</p>
<p> Em BDD se usa estórias e testes de aceitação, além de BDD favorecer a construção de aplicativos de forma evolutiva (<a href="http://scrummethodology.com/scrum-sprint/" target="_blank" style="text-decoration: underline"><em>sprints</em></a>) e tudo isso casa perfeitamente com os requisitos das metodologias ágeis.</p>
<h3>Favorece a escrita de testes antes da implementação</h3>
<p>Uma boa prática na criação de testes, independente se você usa BDD ou TDD, é que os <a href="http://stackoverflow.com/questions/319513/when-not-to-write-tests-before-implementation" target="_blank" style="text-decoration: underline">testes sejam criados antes de tudo</a>. Ok, eu concordo, mas devo dizer que com TDD isso não é muito nítido, pois na maioria dos casos, principalmente no começo, as pessoas tendem a implementar os códigos e depois escreverem os testes para validá-los. Já com BDD, a primeira coisa que você precisa ter em mãos antes de implementar os testes são as estórias e os cenários, não tem como fugir disso, o que torna muito mais nítido que em primeiro lugar vem os testes  e depois as implementações.</p>
<h3>Torna mais nítido o que sua aplicação deve fazer</h3>
<p>Com BDD é muito mais fácil isolar as funcionalidade da sua aplicação, já que o que é testado é exatamente isso, dessa forma fica fácil identificar os componentes que envolvem determinada funcionalidade, torna mais nítido qual é o papel daquela funcionalidade, além do que consegue dar um sentido melhor para a sua aplicação de maneira geral.</p>
<p>Com BDD, você consegue ainda uma visão de <em><a href="http://en.wikipedia.org/wiki/Workflow" target="_blank" style="text-decoration: underline">workflow</a></em> da sua aplicação, ou seja, uma visão macro, o que favorece dar manutenção a mesma. Percebo também, que BDD favorece um bom design de código, evitando assim problemas de desenvolvimento como códigos com <a href="http://jcspl.net/2007/12/17/acoplamento-e-coesao/" target="_blank" style="text-decoration: underline">alto-acoplamento</a>.</p>
<h3>Torna os testes mais humanos</h3>
<p>A essência do BDD são os cenários e não parte isoladas da aplicação e essa maneira de lidar com testes favorece o entendimento por parte de nós, humanos.</p>
<p>Testes de interface com o <a href="http://seleniumhq.org/" target="_blank" style="text-decoration: underline">Selenium</a>,  tornam-se mais compreensíveis num contexto que envolva BDD, como em um teste de login, por exemplo.</p>
<h3>Conclusão</h3>
<p>Na minha opinião, está mais do que clara a vantagem no uso de BDD, entretanto ele não substitui o uso de TDD, pois a abordagem de ambas são diferentes e complementares.</p>
<p>No próximo tópico, irei mostrar um cenário de testes com o <em>framework</em> <a href="http://jbehave.org/reference/latest/index.html" target="_blank" style="text-decoration: underline">JBehave</a>, um <em>framework</em> BDD para Java.</p>
<h3>Mais sobre o assunto</h3>
<p><a href="http://blog.objectmentor.com/articles/2008/11/27/the-truth-about-bdd" target="_blank" style="text-decoration: underline">The truth about DDD</a></p>
<p><a href="http://inter-sections.net/2007/10/03/the-difference-between-tdd-and-bdd" target="_blank" style="text-decoration: underline">The difference between TDD and BDD</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2010/01/07/algumas-observacoes-sobre-bdd/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ponto para o Rails!</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/03/17/ponto-para-o-rails/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/03/17/ponto-para-o-rails/#comments</comments>
		<pubDate>Tue, 17 Mar 2009 03:34:08 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Tecnologia, Software & Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[RoR]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=671</guid>
		<description><![CDATA[É muito curioso ver todo o frenesi e o burburinho que o Rails (RoR) vem causando entre os desenvolvedores mundo a fora, pelo menos aos que estão próximos a mim isso é nítido, as pessoas ficam maravilhadas, quase em êxtase! Acho isso fantástico, pois de certa forma o RoR tem feito com que uma série [...]]]></description>
			<content:encoded><![CDATA[<p>É muito curioso ver todo o frenesi e o burburinho que o <a href="http://rubyonrails.org/" target="_blank" style="text-decoration: underline">Rails (RoR)</a> vem causando entre os desenvolvedores mundo a fora, pelo menos aos que estão próximos a mim isso é nítido, as pessoas ficam maravilhadas, quase em êxtase! Acho isso fantástico, pois de certa forma o RoR tem feito com que uma série de preconceitos sejam quebrados e esquecidos. E qual o principal motivo para tudo isso? A simplicidade e a praticidade.</p>
<p>Linguagens de programação tendem a ser parecidas com religião ou com times de futebol, a pessoa simplesmente escolhe uma e defende aquilo com todas as forças, geralmente de forma cega. Eu particularmente acredito que, para defender ou criticar algo, se faz por necessário conhecer profundamente aquilo que você defende ou critica, pois só assim você terá argumentos para apontar falhas ou reconhecer méritos. Sou, ainda, a favor da filosofia &#8220;cabeça aberta&#8221;, que em poucas palavras quer dizer: não tenha medo, muito menos preconceito, de conhecer algo novo, conheça para a partir disso você ter uma opinião formada se aquilo te agrada, ou não.</p>
<p>É comum acontecer em fóruns e em listas de discussão debates sobre <a href="http://www.google.com.br/search?hl=pt-BR&#038;client=firefox-a&#038;rls=com.ubuntu%3Aen-US%3Aunofficial&#038;hs=dBQ&#038;q=qual+linguagem+de+programa%C3%A7%C3%A3o+%C3%A9+melhor&#038;btnG=Pesquisar&#038;meta=" target="_blank" style="text-decoration: underline">&#8220;qual linguagem é melhor&#8221;</a>, na maioria das vezes as pessoas atacam uma linguagem, ou defendem outra, simplesmente baseadas em sua opinião pessoal, ou melhor, baseados na falta de conhecimento. As pessoas não conseguem enxergar que todas têm seus prós e contras, como tudo na vida, e que a partir de uma situação real que é possível avaliar a melhor opção.</p>
<p>Eu comecei a programar através do PHP e hoje em dia trabalho basicamente só com Java. Programadores Java tendem a achar PHP um lixo, na maioria das vezes com embasamentos e teorias totalmente furadas, que demonstram tremenda falta de conhecimento. Eu concordo que o PHP tem uma má fama devido a linguagem ter demorado a amadurecer, como também concordo que o nível dos programadores em PHP no geral é baixo, é duro admitir, mas no geral é assim, provavelmente pela facilidade que a linguagem proporciona e também por sua curva de aprendizado ser bem mais baixa que a do Java, por exemplo. Mas isso quer dizer que o PHP é ruim? Eu poderia enumerar uma série de vantagens que o PHP tem em relação ao Java, da mesma forma que o Java tem uma série de outras vantagens em relação ao PHP, mas esse não é o foco do tópico, o foco é justamente o contrário.</p>
<h3>Uma &#8220;nova&#8221; era</h3>
<p>E para acabar, ou pelo menos ajudar bastante, surge o famoso <em>framework</em> Ruby on Rails, o <em>hype</em> do momento tratando-se de linguagem de programação! Ruby on Rails é um <em>framework</em> de desenvolvimento web que prega o conceito de que algo deve ser simples, prático e prazeroso de fazer, dessa forma inúmeros benefícios são alcançados, como: códigos com mais qualidade, tempo de desenvolvimento mais curto e comunidade participativa. Ruby on Rails não é uma <a href="http://pt.wikipedia.org/wiki/Linguagem_de_programa%C3%A7%C3%A3o"  target="_blank" style="text-decoration: underline">linguagem de programação</a>, é um <a href="http://pt.wikipedia.org/wiki/Framework" target="_blank" style="text-decoration: underline"><em>framework</em></a>, que foi desenvolvido em cima da linguagem <a href="http://www.ruby-lang.org/pt/"  target="_blank" style="text-decoration: underline">Ruby</a>, que é uma linguagem de programação criada por um <a href="http://pt.wikipedia.org/wiki/Yukihiro_Matsumoto" target="_blank" style="text-decoration: underline">japonês</a> em 1995 baseada nos pontos fortes de várias linguagens da época. Reparou no trecho <strong>&#8220;&#8230;que havia de melhor em outras linguagens&#8230;&#8221;?</strong> Ou seja, o próprio criador da linguagem era (ou é) totalmente desprovido de preconceitos, e com isso conseguiu identificar os pontos fortes e fracos de várias linguagens com o intuito de criar uma, que no seu modo de ver, seria mais eficiente.</p>
<h3>Complexidade não é sinal de qualidade</h3>
<p>Uma linguagem de programação, um <em>framework</em> ou uma <a href="http://pt.wikipedia.org/wiki/API"  target="_blank" style="text-decoration: underline">API</a>, tem como principal objetivo (pelo menos deveria) fornecer uma maior praticidade aos desenvolvedores em solucionar problemas. Essa deveria ser a premissa básica para que uma determinada linguagem ou plataforma fosse adotada em um projeto, entretanto nada impede que N linguagens ou plataformas trabalhem de forma conjunta, desde que proporcionem alternativas para descomplicar o problema.</p>
<p>Só para esclarecer: simplicidade, praticidade, produtividade e facilidade nesse caso são sinônimos!</p>
<p>Outro ponto a ser observado é que a <a href="http://pt.wikipedia.org/wiki/Engenharia_de_software"  target="_blank" style="text-decoration: underline">engenharia de software</a> é um assunto relativamente novo, principalmente se formos comparar as outras engenharias, como a civil, e por isso é tão comum observarmos novas metodologias, padrões e linguagens surgindo a todo momento. Mas o que elas tem em comum é que todas tem como objetivo resolver os problemas da maneira &#8220;menos complexa&#8221; que for possível, é claro que outros fatores são levados em consideração, entretanto se paramos para pensar a simplicidade é sempre a prioridade.</p>
<p>E é por isso que o RoR está na crista da onda, pois talvez nenhum <em>framework</em> descomplique tanto as coisas como ele, e o melhor é que isso é contagioso, pois a todo momento surgem mais e mais <em>frameworks</em> &#8220;<a href="http://mail-archives.apache.org/mod_mbox/struts-dev/200509.mbox/%3C43186873.7080309@twdata.org%3E"   target="_blank" style="text-decoration: underline">RoR <em>like</em></a>&#8220;, em PHP existe uma penca deles, como: Akelos, Code Igniter, Cake, Kohana. Até o sempre conservador Java se rendeu ao RoR e lançou o <a href="http://groovy.codehaus.org/"   target="_blank" style="text-decoration: underline">Groovy</a> (<a href="http://jcp.org/en/jsr/detail?id=241"   target="_blank" style="text-decoration: underline">JSR 241</a>) e consequentemente o <a href="http://www.grails.org/""   target="_blank" style="text-decoration: underline">Grails</a>, que é um <em>framework</em> web baseado em quem? No Rails!</p>
<h3>Maçãs são maçãs e bananas são bananas!</h3>
<p>O título acima parece estranho, mas ele serve para deixar claro o seguinte: comparar linguagens não é algo inteligente, ao invés disso, procure conhecê-las e tirar proveito do melhor de cada uma. PHP é PHP, Java é Java, Python é Python! Assim como maçãs são maçãs e bananas são bananas, portanto não cabem comparações. Parece óbvio, e na verdade é, mas mesmo assim existem pessoas que ainda insistem em levar essa discussão adiante, onde dificilmente é tirado algum proveito.</p>
<p>Só para deixar claro, eu nunca desenvolvi uma aplicação sequer usando o RoR, já usei alguns <em>frameworks</em> &#8220;RoR <em>like</em>&#8221; e tive ótimas experiências, entretanto não acho que o RoR substitui o Java, o PHP, ou até mesmo o .NET, como eu já disse, cada um tem o seu propósito e por isso deve haver um equilíbrio na tomada de decisões sobre &#8220;o que escolher?&#8221;, fatores como: experiência com determinada linguagem, documentação, maturidade, infra-estrutura, segurança não podem ser esquecidos de forma alguma, pois no final é a sinergia entre vários fatores que determina as opções a serem escolhidas.</p>
<p>É normal, e de certa forma até compreensível, nos deixarmos levar pela emoção de conhecer um novo mundo e com isso embarcamos no erro de que a partir daquele momento tudo será feito &#8220;daquela forma&#8221;, com &#8220;aquela nova linguagem&#8221;, e isso é um erro, dos graves! Nesse ponto, a experiência, o conhecimento e o equilíbrio fazem toda a diferença na tomada de decisão mais acertada.</p>
<p>Só para finalizar, gostaria de ressaltar que nada impede que existam linguagens e <em>frameworks</em> ruins, é claro que eles existem, mas mais uma vez, para termos essa certeza é preciso conhecer. Da mesma forma que, não é só porque devemos abrir a nossa cabeça e olharmos para os lados, ao invés de olharmos só para frente, que devemos deixar de considerar nossas preferências e aquilo com que temos mais facilidade. Preferência e preconceito não são sinônimos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/03/17/ponto-para-o-rails/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>O paradoxo de(a) TI</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/02/25/o-paradoxo-de-ti/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/02/25/o-paradoxo-de-ti/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 18:30:35 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Tecnologia, Software & Desenvolvimento]]></category>
		<category><![CDATA[BPM]]></category>
		<category><![CDATA[mercado ti]]></category>
		<category><![CDATA[Ondas de TI]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[TI]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=399</guid>
		<description><![CDATA[Semana passada rolou uma apresentação sobre TDD muito interessante na empresa que eu trabalho, onde foram apresentados desde os conceitos básicos de TDD, até os tipos de testes existentes e finalizando com uma aplicação exemplo.
No final rolou uma rodada de perguntas, onde foram questionados assuntos como BDD, programação defensiva, contract by domain, dentre outras metodologias [...]]]></description>
			<content:encoded><![CDATA[<p>Semana passada rolou uma apresentação sobre <a href="http://en.wikipedia.org/wiki/Test-driven_development" target="_blank" style="text-decoration: underline">TDD</a> muito interessante na empresa que eu trabalho, onde foram apresentados desde os conceitos básicos de TDD, até os tipos de testes existentes e finalizando com uma aplicação exemplo.</p>
<p>No final rolou uma rodada de perguntas, onde foram questionados assuntos como <a href="http://behaviour-driven.org/" target="_blank" style="text-decoration: underline">BDD</a>, <a href="http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_defensiva" target="_blank" style="text-decoration: underline">programação defensiva</a>, contract by domain, dentre outras metodologias e padrões. Nesse ponto da apresentação, a maioria das pessoas que estavam presentes ficaram meio perdidas com as milhares de <a href="http://en.wikipedia.org/wiki/Buzzword"  target="_blank" style="text-decoration: underline"><em>buzzwords</em></a> associadas com as perguntas que foram feitas. O pessoal mais antigo ficou mais perdido ainda e até brincaram sobre a questão do &#8220;estamos ficando velho&#8221;.</p>
<p>Paralelamente a isso, começei a ler essa semana um livro do <a href="http://www.trcr.com.br" target="_blank" style="text-decoration: underline">Tadeu Cruz</a> sobre <a href="http://www.trcr.com.br/index.php/biblioteca/" target="_blank" style="text-decoration: underline">BPM e BPMS</a>, onde no primeiro capítulo ele fala sobre a questão da desorganização informacional, muitas vezes causadas pelo excesso de informação e as novas ondas de TI que surgem a todo momento. Outra coisa que o autor do livro cita e crítica é que existem muitos casos de determinadas organizações, que forçam o uso de determinado software sem obter o real benenfício que esse software deveria oferecer, na maioria dos casos, por questões comerciais ou de interesse próprio dessas organizações. Questões como: para que determinada tecnologia foi criada, como deveria ser corretamente usada, como efetivamente está sendo usada, quais deveriam ser os resultados esperados do seu uso e quais são os resultados que estão sendo obtidos com sua utilização, orientariam de forma efetiva o profissional ou a organização com o intuito de medir se a adoção de determinada tecnologia está realmente sendo benéfica. Esse tipo de situação tem ocorrido muito com BPM, que é o novo <a href="http://en.wikipedia.org/wiki/Hype_cycle" target="_blank" style="text-decoration: underline"><em>hype</em></a> do momento tratando-se de TI.</p>
<p>O que as duas histórias tem em comum e onde estou querendo chegar?</p>
<p>O que eu quero dizer é o seguinte: até onde vale apena conhecer N conceitos diferentes e até onde não vale a pena? Nos casos citados acima tem um pouco das duas coisas, bem como suas respostas. No caso específico do TDD, deveríamos considerar que o melhor a ser feito seria debater sobre as <em>buzzwords</em> que o assunto levantou, ou o melhor seria não conhecer muitos desses novos padrões e metodologias? Eu fico com a primeira opção, mas a segunda opção pode contradizer a primeira. Explico logo abaixo.</p>
<p>Vale a pena usar TDD e BDD em um projeto sem conhecer seus benefícios, o resultado a ser esperado e os possíveis obstáculos a serem vencidos? Não. Pois nesse caso tudo de positivo que TDD traria sendo usada da forma correta, traria inversamente em dobro no caso do seu mal uso, pois nesse caso o projeto acabaria tendo novos percalços (além dos já conhecidos), como: prazos atrasados, código mal estruturado, equipe perdida e etc. E isso acontece em larga escala em TI, não apenas no caso específico do TDD, já que o mais se vê são empresas gastando milhões em &#8220;soluções&#8221; de TI (CRM, ERP, BI, etc) &#8211; muitas vezes empurradas pelos ótimos vendedores dos grandes players do mercado &#8211; sem obter benefício algum sobre aquilo (ou até mesmo desconhecendo o porquê do seu uso). Na verdade muito pelo contrário, pois como muito desses processos são feitos sem estruturação alguma e demoram meses, anos&#8230; no final das contas a dor de cabeça e o custo envolvido não atingem nem de perto o <a href="http://www.artigonal.com/gestao-artigos/a-famosa-relacao-custo-x-beneficio-602803.html" target="_blank" style="text-decoration: underline">custo x benefício</a> esperado sobre aquele investimento.</p>
<p>Outro fênomeno interessante a ser observado e que de certa maneira ligam as duas histórias é a infobia. Infobia é uma palavra que o Tadeu Cruz usa para definir o medo por informação, ou seja, em determinado momento, com a enxurrada de tantas <em>buzzwords</em>, as pessoas acabam ficando reativas em absorver novas tecnologias e entender o seu significado,  com isso de certa forma ficam estagnadas, pois deixam de absorver novos conhecimentos. Mas em compensação não adianta em nada conhecer várias palavrinhas mágicas superficialmente só para dizer que &#8220;domina&#8221; aquela tecnologia do momento. Por isso, acredito que dependendo do contexto, é válido ou não conhecer uma nova tecnologia. Esta aí mais um caso do <strong>paradoxo de TI</strong>. De certa forma, mas sem generalizar, a infobia consegue explicar a frase &#8220;estamos ficando velho&#8221;.</p>
<p>Devemos considerar que TI não irá salvar o mundo, TI pode ajudar de forma efetiva qualquer negócio de qualquer natureza, desde que seja aplicada da forma correta, e aplicar de forma correta envolve antes de mais nada: estruturação, disciplina, educação, mudança e planejamento. Ao mesmo tempo que sabemos de diversos casos onde TI trouxe um real benefício as organizações, sabemos de tantos outros onde TI acabou com negócios, projetos e sonhos. A <a href="http://www1.folha.uol.com.br/folha/informatica/ult124u19223.shtml" target="_blank" style="text-decoration: underline">bolha da internet</a> talvez seja o melhor exemplo que ilustra essa situação das ondas de TI.</p>
<p>Muitas vezes as ondas de TI trazem a tona novas tecnologias que surgem apenas com o objetivo de remediar uma tecnologia já existente. O que as vezes é considerado como inovação, nada mais é que uma evolução de algo que tenha tido insucesso no passado, dessa forma uma tecnologia X surge apenas com o intuito de servir como &#8220;curativo&#8221; da tecnologia Y, que prometeu maravilhas e na verdade devido ao seu mal uso (ou não) só trouxe dores de cabeça.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/02/25/o-paradoxo-de-ti/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
