<?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; Testes</title>
	<atom:link href="http://www.marcuscavalcanti.net/blog/tag/testes/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>
	</channel>
</rss>
