<?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"
	>

<channel>
	<title>MouseOver Studio &#187; bdd</title>
	<atom:link href="http://www.mouseoverstudio.com/blog/category/bdd/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.mouseoverstudio.com/blog</link>
	<description></description>
	<pubDate>Wed, 25 Aug 2010 02:03:38 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5</generator>
	<language>en</language>
			<item>
		<title>Testando Sinatra com RSpec</title>
		<link>http://www.mouseoverstudio.com/blog/2010/06/16/testando-sinatra-com-rspec/</link>
		<comments>http://www.mouseoverstudio.com/blog/2010/06/16/testando-sinatra-com-rspec/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 00:28:01 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[Sinatra]]></category>

		<category><![CDATA[bdd]]></category>

		<category><![CDATA[gonow]]></category>

		<category><![CDATA[rspec]]></category>

		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=200</guid>
		<description><![CDATA[Recentemente a Gonow foi contratada para trabalhar num projeto que já tinha passado por outras duas consultorias com desenvolvedores bastante reconhecidos no mercado nacional. A aplicação foi construída sobre Sinatra e algo que me chamou muito a atenção é que a aplicação não tinha uma linha de teste. Mesmo não sendo uma justificativa, aparentemente não [...]]]></description>
			<content:encoded><![CDATA[<p>Recentemente a <a href="http://www.gonow.com.br/">Gonow</a> foi contratada para trabalhar num projeto que já tinha passado por outras duas consultorias com desenvolvedores bastante reconhecidos no mercado nacional. A aplicação foi construída sobre <a href="http://www.sinatrarb.com/">Sinatra</a> e algo que me chamou muito a atenção é que a aplicação não tinha uma linha de teste. Mesmo não sendo uma justificativa, aparentemente não existe nada em português falando sobre como integrar o <a href="http://www.sinatrarb.com/">Sinatra</a> com o <a href="http://rspec.info/">RSpec</a> e por isso vou aproveitar para dar uma receita de bolo, de modo que o processo fique mais simples ainda:</p>
<p>* <strong>spec/spec_helper.rb:</strong><br />
<code>
<pre class="prettyprint">require File.join(File.dirname(__FILE__), '..', 'main.rb')

require 'spec'
require 'rack/test'

Spec::Runner.configure do |conf|
  conf.include Rack::Test::Methods
end

def app
  Sinatra::Application
end</pre>
<p></code></p>
<p><strong>* spec/main_spec.rb:</strong><br />
<code>
<pre class="prettyprint">require 'spec_helper'

describe Sinatra::Application do
  context "responding to GET /" do
    it "should return status code 200"
      get '/'
      last_response.code.should == 200
    end
  end
end</pre>
<p></code></p>
<p><strong>* Rakefile:</strong><br />
<code>
<pre class="prettyprint">...
require 'spec/rake/spectask'

desc "Run all specs"
Spec::Rake::SpecTask.new do |t|
  t.spec_opts = %w(--format specdoc --color)
end</pre>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2010/06/16/testando-sinatra-com-rspec/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Controlando o servidor de Rails dentro dos testes do Selenium</title>
		<link>http://www.mouseoverstudio.com/blog/2009/05/20/controlando-o-servidor-de-rails-dentro-dos-testes-do-selenium/</link>
		<comments>http://www.mouseoverstudio.com/blog/2009/05/20/controlando-o-servidor-de-rails-dentro-dos-testes-do-selenium/#comments</comments>
		<pubDate>Wed, 20 May 2009 22:42:09 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[bdd]]></category>

		<category><![CDATA[cucumber]]></category>

		<category><![CDATA[mongrel]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[selenium]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=169</guid>
		<description><![CDATA[Para não esquecer disso uma segunda vez aqui vá:
Se estiverem trabalhando com Rails e Selenium e desejam subir e derrubar o servidor automaticamente antes e despois dos testes então podem utilizar o Mongrel:
mongrel_rails start -e test -d
mongrel_rails stop
Por exemplo, eu que estou utilizando Selenium com Cucumber, tenho meu env.rb assim:
require 'spec/expectations'
require 'selenium'

# "before all"
`mongrel_rails start [...]]]></description>
			<content:encoded><![CDATA[<p>Para não esquecer disso uma segunda vez aqui vá:</p>
<p>Se estiverem trabalhando com Rails e Selenium e desejam subir e derrubar o servidor automaticamente antes e despois dos testes então podem utilizar o <a href="http://mongrel.rubyforge.org/">Mongrel</a>:</p>
<pre class="prettyprint">mongrel_rails start -e test -d
mongrel_rails stop</pre>
<p>Por exemplo, eu que estou utilizando Selenium com Cucumber, tenho meu env.rb assim:</p>
<pre class="prettyprint">require 'spec/expectations'
require 'selenium'

# "before all"
`mongrel_rails start -e test -d`
`rake db:populate RAILS_ENV=test`
browser = Selenium::SeleniumDriver.new("localhost", 4444, "*chrome", "http://localhost", 15000)

Before do
  @browser = browser
  @browser.start
end

After do
  @browser.stop
end

# "after all"
at_exit do
  browser.close rescue nil
  `mongrel_rails stop`
end</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2009/05/20/controlando-o-servidor-de-rails-dentro-dos-testes-do-selenium/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Testando Authlogic com RSpec, the Remarkable way</title>
		<link>http://www.mouseoverstudio.com/blog/2009/05/14/testando-authlogic-com-rspec-the-remarkable-way/</link>
		<comments>http://www.mouseoverstudio.com/blog/2009/05/14/testando-authlogic-com-rspec-the-remarkable-way/#comments</comments>
		<pubDate>Thu, 14 May 2009 18:00:58 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[Authlogic]]></category>

		<category><![CDATA[Remarkable]]></category>

		<category><![CDATA[bdd]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[rspec]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=167</guid>
		<description><![CDATA[Davis Cabral criou um plugin para o Remarkable para poder testar facilmente o Authlogic chamado de authlogic_plugin.  Com ele podemos escrever código como o seguinte:
describe User do
  should_be_authentic
end
Conversando com o Davis ele me comentou que demorou quatro minutos em criar o plugin, utilizando como base o Remarkable::Paperclip, deve ser muito fácil né?
Se você [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://daviscabral.com.br/">Davis Cabral</a> criou um plugin para o <a href="http://github.com/carlosbrando/remarkable/tree/master">Remarkable</a> para poder testar facilmente o <a href="http://github.com/binarylogic/authlogic/tree/master">Authlogic</a> chamado de <a href="http://github.com/daviscabral/remarkable_authlogic/tree/master">authlogic_plugin</a>.  Com ele podemos escrever código como o seguinte:</p>
<pre class="prettyprint">describe User do
  should_be_authentic
end</pre>
<p>Conversando com o Davis ele me comentou que demorou quatro minutos em criar o plugin, utilizando como base o <a href="http://github.com/dcrec1/remarkable_paperclip/tree/master">Remarkable::Paperclip</a>, deve ser muito fácil né?</p>
<p><em>Se você gostou do plugin, considera <a href="http://www.workingwithrails.com/recommendation/new/person/6680-davis-zanetti-cabral">recomendar o Davis</a> no <a href="http://www.workingwithrails.com/recommendation/new/person/6680-davis-zanetti-cabral">Working With Rails</a>, ai você aproveita e <a href="http://www.workingwithrails.com/recommendation/new/person/13580-diego-carrion">me recomenda</a> também <img src='http://www.mouseoverstudio.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2009/05/14/testando-authlogic-com-rspec-the-remarkable-way/feed/</wfw:commentRss>
		</item>
		<item>
		<title>RSpec::VRaptor agora com novos matchers e compatível com VRaptor Nice URLs</title>
		<link>http://www.mouseoverstudio.com/blog/2009/03/30/rspecvraptor-agora-com-novos-matchers-e-compativel-com-vraptor-nice-urls/</link>
		<comments>http://www.mouseoverstudio.com/blog/2009/03/30/rspecvraptor-agora-com-novos-matchers-e-compativel-com-vraptor-nice-urls/#comments</comments>
		<pubDate>Mon, 30 Mar 2009 23:37:18 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[bdd]]></category>

		<category><![CDATA[rspec]]></category>

		<category><![CDATA[tdd]]></category>

		<category><![CDATA[vraptor]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=162</guid>
		<description><![CDATA[Ja passaram uns dias desde que anuncie no meu Twitter a noticia, mas somente agora peguei um tempo para escrever aqui no blog então aí vai: 
o RSpec::VRaptor é totalmente compatível com o novo VRaptor 2.6 Nice URLs!
O VRaptor 2.6 vem com um plugin chamado Nice URLs que permite definir rotas para à aplicação num [...]]]></description>
			<content:encoded><![CDATA[<p>Ja passaram uns dias desde que anuncie no meu <a href="http://twitter.com/dcrec1">Twitter</a> a noticia, mas somente agora peguei um tempo para escrever aqui no blog então aí vai: </p>
<p><strong>o <a href="http://github.com/dcrec1/rspec-vraptor/tree/master">RSpec::VRaptor</a> é totalmente compatível com o novo <a href="http://www.vraptor.org/release-notes.html">VRaptor 2.6</a> Nice URLs!</strong></p>
<p>O VRaptor 2.6 vem com um <a href="http://www.vraptor.org/niceurls-plugin.html">plugin</a> chamado Nice URLs que permite definir rotas para à aplicação num arquivo, estilo <a href="http://rubyonrails.org/">Rails</a>.</p>
<p>Mas não só isso, a ultima versão do RSpec::VRaptor adicionou uns matchers muito legais, segue um exemplo do que é possível realizar agora:</p>
<pre class="prettyprint">describe CarController do

  context "na action action1" do

    before :all do
      get "/car/action1", :cookies => {'key' => 'value'}
    end

    it "deve ter um header com a data da resposta" do
      @response.headers['Date'].should_not be_nil
    end

    it "não deve ter uma view de resposta" do
      @request.should be_viewless
    end

  end

  context "na action action2" do

    it "deve renderizar o arquivo action2.erb" do
      get "/car/action2"
      @request.should render("car/action2.erb")
    end

    it "deve redirecionar para a home se o usuário estiver logado" do
      get "/car/action2", :session => {'logged' => true}
      @response.should redirect_to("user/home")
    end

  end

end</pre>
<p>Como podem ver, agora não só podemos injetar cookies no nossos requests, também podemos verificar os headers de resposta, validar se a requisição é viewless (método com anotação @Viewless), se vai ser renderizado um arquivo x ou se a resposta redireciona para algum outro recurso.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2009/03/30/rspecvraptor-agora-com-novos-matchers-e-compativel-com-vraptor-nice-urls/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Testes legais com RSpec na plataforma Java/Maven agora possível com rspec-maven-plugin</title>
		<link>http://www.mouseoverstudio.com/blog/2008/12/20/testes-legais-com-rspec-na-plataforma-javamaven-agora-possivel-com-rspec-maven-plugin/</link>
		<comments>http://www.mouseoverstudio.com/blog/2008/12/20/testes-legais-com-rspec-na-plataforma-javamaven-agora-possivel-com-rspec-maven-plugin/#comments</comments>
		<pubDate>Sun, 21 Dec 2008 00:02:06 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[Maven]]></category>

		<category><![CDATA[bdd]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[rspec]]></category>

		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=158</guid>
		<description><![CDATA[Um pouco de historia
Os que me seguem no Twitter devem estar sabendo que nos últimos dias esteve trabalhando num projeto em Java porém utilizando RSpec para testar ele. Se você ainda testa código feito em Java utilizando Java, te recomendo sair dessa vida, gasta um dia ou o tempo que for necessário para poder criar [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Um pouco de historia</strong></p>
<p>Os que me seguem no <a href="http://twitter.com/dcrec1">Twitter</a> devem estar sabendo que nos últimos dias esteve trabalhando num projeto em Java porém utilizando <a href="http://rspec.info/">RSpec</a> para testar ele. Se você ainda testa código feito em Java utilizando Java, te recomendo sair dessa vida, gasta um dia ou o tempo que for necessário para poder criar testes utilizando RSpec e se feliz criando testes de qualidade.</p>
<p>No projeto mencionado, a maioria dos desenvolvedores se sentia confortável utilizando Maven pelo que teve que me adequar a essa ferramenta que eu tanto gosto (ironia mode on) e averiguar se existia algo que vinculasse ela ao RSpec.</p>
<p>Foi assim que achei esse <a href="http://www.fnokd.com/2008/09/18/maven-java-and-rspec/">post</a> onde Bob apresenta o plugin <a href="http://svn.codehaus.org/mojo/trunk/sandbox/rspec-maven-plugin/">rspec-maven-plugin</a> que permite executar os testes criados en RSpec ao executar o target <em>test</em> do Maven, todo o que eu queria.</p>
<p>Configurei o plugin no meu pom.xml, executei a target <em>test</em> e&#8230; não funcionou. Como todo problema é também algo bom porque oferece a oportunidade de fazer algo legal, decidi realizar um <a href="http://github.com/dcrec1/rspec-maven-plugin/tree/master">fork</a> do projeto e corrigir ele.</p>
<p><strong>O plugin</strong></p>
<p>Como o plugin não esta no repositório oficial, para instalar o plugin <a href="http://github.com/dcrec1/rspec-maven-plugin/tree/master">rspec-maven-plugin</a> deve ser executado:</p>
<pre class="prettyprint">git clone git://github.com/dcrec1/rspec-maven-plugin.git
cd rspec-maven-plugin
mvn install</pre>
<p>Caso não tenham o Git instalado, podem baixar as fontes de <a href="http://github.com/dcrec1/rspec-maven-plugin/tarball/master">aqui</a>.</p>
<p>Uma vez no repositório local, podem configurar o plugin adicionando o seguinte ao pom.xml:</p>
<pre><code class="prettyprint">&lt;plugin&gt;
    &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
    &lt;artifactId&gt;rspec-maven-plugin&lt;/artifactId&gt;
    &lt;executions&gt;
        &lt;execution&gt;
            &lt;id&gt;test&lt;/id&gt;
            &lt;phase&gt;test&lt;/phase&gt;
            &lt;goals&gt;
                &lt;goal&gt;spec&lt;/goal&gt;
            &lt;/goals&gt;
        &lt;/execution&gt;
    &lt;/executions&gt;
&lt;/plugin&gt;</code></pre>
<p>Depois disto, o único pre-requisito para executar o plugin é setar a variável de ambiente JRUBY_HOME.</p>
<p>Ao executar o target <em>test</em>, o Maven ira executar os testes dentro da pasta <em>spec</em>. </p>
<p>Obrigado <a href="http://jruby.codehaus.org/">JRuby</a>, happy testing!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2008/12/20/testes-legais-com-rspec-na-plataforma-javamaven-agora-possivel-com-rspec-maven-plugin/feed/</wfw:commentRss>
		</item>
		<item>
		<title>3 dicas para melhorar tuas estorias</title>
		<link>http://www.mouseoverstudio.com/blog/2008/11/24/3-dicas-para-melhorar-tuas-estorias/</link>
		<comments>http://www.mouseoverstudio.com/blog/2008/11/24/3-dicas-para-melhorar-tuas-estorias/#comments</comments>
		<pubDate>Mon, 24 Nov 2008 03:48:03 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[bdd]]></category>

		<category><![CDATA[user-stories]]></category>

		<category><![CDATA[dicas]]></category>

		<category><![CDATA[estorias]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=155</guid>
		<description><![CDATA[Um tempo atras quando conheci o Cucumber comecei a levar os testes a partir de estorias bem mais a serio. Na época eu olhava para minhas estorias e não me sentia contente com elas, sentia que não estavam legais. Foi por tal motivo que decidi pesquisar um pouco e obter dicas que me ajudassem a [...]]]></description>
			<content:encoded><![CDATA[<p>Um tempo atras quando conheci o <a href="http://github.com/aslakhellesoy/cucumber/tree/master">Cucumber</a> comecei a levar os testes a partir de estorias bem mais a serio. Na época eu olhava para minhas estorias e não me sentia contente com elas, sentia que não estavam legais. Foi por tal motivo que decidi pesquisar um pouco e obter dicas que me ajudassem a melhorar elas. Agora que tenho ganho mais experiencia, frequentemente vejo algumas estorias com os mesmos erros que eu já cometi, pelo que nesse post vou dar algumas dicas e recomendações para criar estorias melhores, me baseando no que li e aprendi no caminho.</p>
<p><strong>Definir uma atividade especifica no título</strong></p>
<p>Numa estoria descrevemos como uma funcionalidade gera algum tipo de valor para o cliente. No título definimos essa funcionalidade brevemente e ate a estoria não estar finalizada quer dizer que a funcionalidade não poderá ser realizada. Dado que diversas funcionalidades geram diferente valor para o cliente, não e legal juntar mais de uma funcionalidade numa estoria porque a finalização de uma funcionalidade estaria dependendo da finalização de outra.</p>
<p>Muitas estorias tem títulos como &#8220;Gerenciar artigos&#8221; onde nos cenários definem se a funcionalidade é uma adição, remoção e edição, por exemplo. Seguindo a teoria, ate não termos finalizado as trés funcionalidades, o usuário não iria poder gerenciar artigos. Acontece que nesse exemplo o usuário se importa mais com a adição de artigos, a única funcionalidade que já foi implementada. Se ela estivesse numa estoria separada, teríamos uma nova estoria finalizada e um nova funcionalidade já poderia ser entregue para o cliente.</p>
<p>E importante mencionar também que estorias mais simples e pequenas são mais fáceis de estimar, pelo que estorias muito grandes com muitas funcionalidades vão adicionar uma dificuldade nesse aspecto.</p>
<p><strong>Definir estados nos cenários</strong></p>
<p>Se nos títulos colocamos atividades, nos cenários colocamos estados. Supondo que as pessoas que acostumavam descrever as funcionalidades nos cenários vão seguir a primeira sugestão do artigo, vão poder ficar na duvida sobre o que por aqui.  Nos cenários devemos descrever como o sistema devera se comportar quando exercer a função (título da estoria) num estado definido (título do cenário). Normalmente os cenários respondem à pergunta &#8220;Que acontece se &#8230;?&#8221;. </p>
<p>Imaginemos que temos a funcionalidade <em>Efetuar pagamentos com cartão de debito</em>. Temos entendido bem o que ira gerar valor para o cliente, mas como o sistema deve se comportar? Que acontece se a conta não tem mais dinheiro disponível? Que acontece se o cartão esta bloqueado? Que acontece se a conta tem dinheiro? </p>
<p>Essas trés ultimas perguntas tem definido trés cenários: </p>
<ul>
<li>a conta tem dinheiro</li>
<li>a conta não tem dinheiro</li>
<li>o cartão esta bloqueado</li>
</ul>
<p><strong>Não definir implementações</strong></p>
<p>Ao não definirmos implementações nas nossas estorias vai ser muito mais fácil manter o foco no negocio ao invés da ferramenta. Tomemos como exemplo o seguinte cenário, onde a funcionalidade é registrar produtos:</p>
<pre>Dado que visito a pagina de novos produtos
Quando preencho o formulário de novos produtos
E faço um click no botão 'registrar'
Então o numero de produtos existentes deve ser acrescentado por um</pre>
<p>Esse cenário esta descrevendo mais o comportamento da ferramenta que do negocio em si. O que gera valor para o cliente não é preencher um formulário e poder clicar num botão, o que gera realmente valor e o que o cliente quer é registrar um produto. Sobre a página de novos produtos, ela não e parte do negocio, é parte da implementação.</p>
<p>Uma coisa que acabei de perceber agora é que muitos cenários acostumam descrever a primeira ação do cliente no passo <em>Given</em> ou <em>Dado</em>. Acho que isso ocorre porque esse passo é encarregado de definir um estado inicial ou contexto e como se esta pensando na implementação, o estado inicial poderia ser considerado a primeira interação do usuário com a ferramenta.</p>
<p>Mas como não devemos pensar na ferramenta e sim no negocio, no passo Given devemos indicar como estão as coisas antes das atividades do negocio. O passo Given tem relação direta com o título do cenário.</p>
<p>Acho que o cenário de exemplo ficaria melhor assim:</p>
<pre>Dado que o numero de produtos é 2
Quando registro um novo produto
Então o número de produtos deve ser 3</pre>
<p>O cenário fica simples porque o que gera valor é simples: registrar um produto. Os passos Given e Then (Então) podem ficar meio óbvios e desnecessários mas eles servem para preparar o teste (Given) e verificar se o teste deu certo ou não (Then). É bom manter esses dois passos também simples porque assim nossos testes ficam do mesmo jeito.</p>
<p><strong>Mais informacão</strong></p>
<p>Um post que me ajudou bastante no processo de melhorar minhas estorias foi <a href="http://dannorth.net/whats-in-a-story">este</a> do Dan North, pai do BDD, muito recomendado. Nesse mês também saiu na revista <a href="http://www.mundojava.com.br/">Mundo Java</a> um artigo muito legal do Rodrigo Yoshima falando sobre estorias, mais informação <a href="http://blog.aspercom.com.br/2008/11/14/entendendo-user-stories/">aqui</a>.</p>
<p>Qualquer duvida ou discordância comigo por favor escreve-la nos comentários, acho muito legal conhecer os diferentes pontos de vista das pessoas.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2008/11/24/3-dicas-para-melhorar-tuas-estorias/feed/</wfw:commentRss>
		</item>
		<item>
		<title>É um assert por teste um &#8220;falso ídolo&#8221;?</title>
		<link>http://www.mouseoverstudio.com/blog/2008/11/13/e-um-assert-por-teste-um-falso-idolo/</link>
		<comments>http://www.mouseoverstudio.com/blog/2008/11/13/e-um-assert-por-teste-um-falso-idolo/#comments</comments>
		<pubDate>Thu, 13 Nov 2008 22:57:23 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[bdd]]></category>

		<category><![CDATA[tdd]]></category>

		<category><![CDATA[padrao]]></category>

		<category><![CDATA[pattern]]></category>

		<category><![CDATA[testes]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=152</guid>
		<description><![CDATA[No meu último post argumentei tentando demostrar que seguir o padrão de um assert por testes melhora nossos testes porque nos obriga a criar especificações. 
Num dos comentários foi indicado este post do blog dos caras da thoughtbot onde entre outras práticas, criticam a que acabei de mencionar no paragrafo anterior.
Uma boa crítica vem sempre [...]]]></description>
			<content:encoded><![CDATA[<p>No meu último <a href="http://www.mouseoverstudio.com/blog/2008/11/11/melhora-consideravelmente-teus-testes-seguindo-um-simples-padrao-um-assert-por-teste/">post</a> argumentei tentando demostrar que seguir o padrão de um assert por testes melhora nossos testes porque nos obriga a criar especificações. </p>
<p>Num dos comentários foi indicado este <a href="http://giantrobots.thoughtbot.com/2008/11/7/a-critical-look-at-the-current-state-of-ruby-testing">post</a> do blog dos caras da <a href="http://www.thoughtbot.com/">thoughtbot</a> onde entre outras práticas, criticam a que acabei de mencionar no paragrafo anterior.</p>
<p>Uma boa crítica vem sempre com argumentos e nesse casso achei os argumentos fracos, vamos ver por que.</p>
<p><strong>6 registros criados</strong></p>
<p>O autor do post mostra um código feito em Shoulda onde antes de cada teste cria um registro na base de dados é menciona que o padrão é ruim porque para seguir ele teve que criar seis registros na base. Quem mandou criar um registro antes de cada teste? Se analisam meu post anterior, vão poder apreciar que no exemplo dado eu escrevi:</p>
<pre class="prettyprint">antes :todos do
  envio_mail = EnvioEmail.new("morena@opensource.com")
end</pre>
<p>e não:</p>
<pre class="prettyprint">antes :cada_um do
  envio_mail = EnvioEmail.new("morena@opensource.com")
end</pre>
<p>Shoulda não tem como definir um bloco que vai ser executado antes de tudo? Caso seja assim, problema do Shoulda, não é problema do padrão. Independente de escolher o padrão o não, os testes tem que ser inteligentes.</p>
<p><strong>TDD deve ter ritmo</strong></p>
<p>O autor, no mesmo código, mostra uns testes que são realizados numa linha (macros) e outros que são realizados em trés linhas e argumenta que o padrão é ruim porque o código não tem ritmo é TDD deve ter ritmo. Alguém acha que isto tem algum sentido? O padrão não exige que você tenha testes de uma linha e outros de três. Isso não tem nada a ver com o padrão, eu poderia ter o mesmo comportamento sem seguir o padrão, por exemplo:</p>
<pre class="prettyprint">should_respond_with_xml_for 'user'

should 'include the user id and user name' do
  assert_select 'id', @user.id.to_s
  assert_select 'name', @user.name
end</pre>
<p>E agora, vai dizer que o Shoulda é ruim porque criei um código que considero que não tem ritmo? São então os macros ruins porque eles tiram o ritmo do código?</p>
<p><strong>Os nomes dos testes ficam ruins</strong></p>
<p>Não sei se entendi direito esse argumento mas me parece que o autor esta reclamando de que com mas testes ele é obrigado a criar nomes muito específicos. Supondo que estou certo no meu entendimento, a intenção do padrão é justamente essa, criar testes que especifiquem o que estão testando e o que o código deve fazer. Quando executamos os testes acho melhor receber:</p>
<pre class="prettyprint">a GET to /users/:id.xml should respond with success
a GET to /users/:id.xml should render template show
a GET to /users/:id.xml should find the correct User
a GET to /users/:id.xml should respond with xml for user
a GET to /users/:id.xml should include the user id
a GET to /users/:id.xml should include the user name</pre>
<p>que </p>
<pre class="prettyprint">user show xml</pre>
<p>Utilizei &#8220;user show xml&#8221; porque o segundo código que o autor mostra é um único teste com nome &#8220;test_user_show_xml&#8221;. &#8220;user show xml&#8221; não nos diz nada sobre o sistema. Se eu leio esse teste eu vou entender que o usuário deve mostrar um xml. O primeiro caso nos diz bastante sobre o sistema, é uma especificação executável.</p>
<p><strong>WTF</strong></p>
<p>Também não se se entendi direito essa de aqui mas me parece que o argumento diz que se queremos realizar testes curtos por que não utilizamos então o Test::Unit e não RSpec e Shoulda com seus <em>describe, it, should</em> e <em>context</em> que nos obrigam a utilizar trés linhas no mínimo. Que tem a ver isso com o padrão, ele em nenhum momento fala de deixar o código menor. Alias, acho que esse argumento é ate à favor do padrão. Tem gente que diz que não segue o padrão porque gosta de escrever menos código. Beleza, vamos utilizar Test:Unit então. <img src='http://www.mouseoverstudio.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Finalmente o autor do post mostra um código realizado encima do Test::Unit com todos os assert dentro de um teste, utilizando o nome mencionado anteriormente. Eu acho esse teste ruim porque não especifica nada e para entender o que ele testa é necessário ler o código.</p>
<p>Para terminar, no post é mencionado que o padrão um assert por teste é uma solução a um problema que não existe, mas o problema existe sim, e ele é o seguinte:</p>
<p>Escrever documentação não executável de um código é muito custoso porque a cada mudança no código deve ser mudada também a documentação e isso gera trabalho em dobro. Além do trabalho em dobro, a documentação não executável não garante que o código faz o que esta escrito no papel. A solução a isto é criar documentação executável e documentação executável quer dizer testes que especificam e para criar testes que especificam a solução mais fácil é criar um assert por teste.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2008/11/13/e-um-assert-por-teste-um-falso-idolo/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Melhora consideravelmente teus testes seguindo um simples padrão: um assert por teste</title>
		<link>http://www.mouseoverstudio.com/blog/2008/11/11/melhora-consideravelmente-teus-testes-seguindo-um-simples-padrao-um-assert-por-teste/</link>
		<comments>http://www.mouseoverstudio.com/blog/2008/11/11/melhora-consideravelmente-teus-testes-seguindo-um-simples-padrao-um-assert-por-teste/#comments</comments>
		<pubDate>Tue, 11 Nov 2008 16:48:23 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[bdd]]></category>

		<category><![CDATA[tdd]]></category>

		<category><![CDATA[pattern]]></category>

		<category><![CDATA[spec]]></category>

		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=151</guid>
		<description><![CDATA[Já faz um tempo que sou apaixonado por especificações executáveis vulgo testes. Constantemente tento melhorar minhas especificações e testes lendo ao respeito e vendo os testes de outras pessoas. Nessa rutina me encontro frequentemente com testes que me deixam muito a desejar e que podem melhorar muito simplesmente seguindo o padrão um assert/expectativa por teste.
Antes [...]]]></description>
			<content:encoded><![CDATA[<p>Já faz um tempo que sou apaixonado por especificações executáveis vulgo testes. Constantemente tento melhorar minhas especificações e testes lendo ao respeito e vendo os testes de outras pessoas. Nessa rutina me encontro frequentemente com testes que me deixam muito a desejar e que podem melhorar muito simplesmente seguindo o padrão <strong>um assert/expectativa por teste</strong>.</p>
<p>Antes de justificar por que eu acho que o padrão deve ser seguido, vou dizer que especificação e teste são para mim duas coisas diferentes, mas são duas coisas que se complementam. Nada melhor para me explicar que com exemplos:</p>
<pre class="prettyprint">it "should find customers by a given name" do
  ...
end

test "customers are found by a given name" do
  ...
end</pre>
<pre class="prettyprint">public void testCustomersAreFoundByAGivenName() {
  ...
}</pre>
<p>Nos três blocos acima, em todos os casos temos um requisito ou especificação do nosso sistema (&#8221;os clientes devem ser encontrados dado um nome&#8221;) e um código ou teste (&#8221;&#8230;&#8221;) que verifica que esse requisito/especificação esta sendo satisfeito. Podemos chamar o conjunto inteiro de <strong>teste</strong> mesmo, mas é importante não esquecer de que nele devemos ter uma <strong>especificação</strong>.</p>
<p>Somente como anedota, tem muitas vezes que baixei o código fonte de algum framework ou api somante para ver os testes e poder saber o que o código pode e não pode fazer. Os <strong>testes</strong> podem e <strong>devem ser muito informativos</strong>.</p>
<p>Mas por que estou falando isso? Estou falando isso porque esse comportamento desejado é muito fácil de se alcançar se você seguir o padrão <strong>um assert/expectativa por teste</strong>. Seguindo esse padrão você vai ter mais blocos de testes, então você vai ter que nomear mais vezes o que o teste ira validar e para não repetir nomes automaticamente você terá que ser mais específico, o que ira criar uma especificação mais detalhada.</p>
<p>Do meu lado esta a ultima Java Magazine, vou pegar o primeiro teste que encontrar na revista como exemplo:</p>
<pre class="prettyprint">test "enviar relatorio" do
  envio_mail = EnvioEmail.new("morena@opensource.com")
  assert_true envio_email.enviar
  assert_equals envio_mail.texto_mensagem, "Testes executados com sucesso"
  assert_equals envio_mail.get_titulo, "Resultado testes"

  esperado = Arquivo.new("xpto.zip")
  enviado = envio_email.arquivo_mensagem
  assert_equals esperado, enviado
end</pre>
<p>Antes de aplicar o padrão, qual é o problema com o teste anterior? Imaginemos que estamos executando nosso teste y no terminal aparece que o teste &#8220;enviar relatório&#8221; falhou. Se eu vejo isso vou pensar que o relatório não foi enviado, mas ele foi! O teste pode ter falhado porque no título se esperava &#8220;Resultado testes&#8221; e se obteve &#8220;Resultado testes.&#8221;, com um ponto a mais. O teste não esta somente testando se o relatório foi enviado, esta também testando se ele foi enviado com o título certo, só que o nome não diz isso. Se vendo os testes, nenhum diz que o relatório deve ser enviado com o título certo, posso considera lo como um requisito? Se é um requisito, onde esta escrito? Tenho que ficar analisando dentro dos testes para saber o que o sistema deve ou não fazer? Se não é um requisito, porque esta invalidando o teste?</p>
<p>Aplicando o padrão mencionado no exemplo ele ficaria mais ou menos assim:</p>
<pre class="prettyprint">antes :todos do
  envio_mail = EnvioEmail.new("morena@opensource.com")
end

test "relatório é enviado" do
  assert_true envio_email.enviar
end

test "relatório é enviado com o texto certo" do
  assert_equals envio_mail.texto_mensagem, "Testes executados com sucesso"
end

test "relatório é enviado com o título certo" do
  assert_equals envio_mail.get_titulo, "Resultado testes"
end

test "relatório é enviado com o arquivo certo" do
  esperado = Arquivo.new("xpto.zip")
  enviado = envio_email.arquivo_mensagem
  assert_equals esperado, enviado
end</pre>
<p>Não ficou bem melhor?</p>
<p>Agora, supondo que o problema não foi corregido, ao executar os testes vamos receber que o requisito &#8220;relatório é enviado com o título certo&#8221; não esta sendo satisfeito, mas ao menos sabemos que isso é um requisito e rapidamente podemos identificar que parte do processo &#8220;enviar relatório&#8221; não esta correto.</p>
<p>Pensando agilmente, esse requisito que não passou pode não representar muito valor para o cliente. O maior valor para o cliente pode estar em enviar o email mesmo e o teste diz que o email esta sendo enviado, pelo que o cliente poderia aceitar o software e não esperar ate que os outros requisitos que não geram tanto valor sejam satisfeitos.</p>
<p>Mais informação sobre o padrão pode ser encontrado <a href="http://blog.jayfields.com/2007/06/testing-one-assertion-per-test.html">aqui</a> nesse post do Jay Fields. Foi o post que me convenceu de seguir esse padrão e desde ai o venho utilizando.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2008/11/11/melhora-consideravelmente-teus-testes-seguindo-um-simples-padrao-um-assert-por-teste/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
