<?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; tdd</title>
	<atom:link href="http://www.mouseoverstudio.com/blog/category/tdd/?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>Testa hoje teu código JavaScript numa aplicação Rails 3 com Blue Ridge</title>
		<link>http://www.mouseoverstudio.com/blog/2010/06/27/testa-hoje-teu-codigo-javascript-numa-aplicacao-rails-3-com-blue-ridge/</link>
		<comments>http://www.mouseoverstudio.com/blog/2010/06/27/testa-hoje-teu-codigo-javascript-numa-aplicacao-rails-3-com-blue-ridge/#comments</comments>
		<pubDate>Sun, 27 Jun 2010 20:32:09 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[Blue Ridge]]></category>

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

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

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

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

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

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=202</guid>
		<description><![CDATA[Caso queiram testar hoje seu código JavaScript numa aplicação Rails 3 de jeito bem simples, o Kristian Mandrup criou um fork do Blue-Ridge onde adaptou os geradores para a nova interface. Os commits dele ainda não foram adicionados ao repositorio oficial e o branch tem uns bugs leves, pelo que criei outro fork e corrigi [...]]]></description>
			<content:encoded><![CDATA[<p>Caso queiram testar hoje seu código JavaScript numa aplicação <a href="http://rubyonrails.org/">Rails</a> 3 de jeito bem simples, o <a href="http://twitter.com/kmandrup">Kristian Mandrup</a> criou um fork do <a href="http://github.com/relevance/blue-ridge">Blue-Ridge</a> onde adaptou os geradores para a nova interface. Os commits dele ainda não foram adicionados ao repositorio oficial e o branch tem uns bugs leves, pelo que criei outro <a href="http://github.com/dcrec1/blue-ridge/tree/rails3">fork</a> e corrigi eles.</p>
<p>Ate que todos os commits sejam aceitos no repositorio oficial, o que podem executar para ter o ambiente configurado é o seguinte:</p>
<pre class="prettyprint">git submodule add -b rails3 git://github.com/dcrec1/blue-ridge.git ./vendor/plugins/blue-ridge
rails g blue_ridge:skeleton
rails g blue_ridge:javascript_spec core
rake spec:javascripts</pre>
<p>Caso não conheçam o <a href="http://github.com/relevance/blue-ridge">Blue-Ridge</a>, o <a href="http://twitter.com/drnic">Dr. Nic</a> publicou faz um tempo um <a href="http://drnicwilliams.com/2009/11/12/dead-simple-javascript-unit-testing-in-rails/">post</a> onde explica a ferramenta e onde também publicou o video de uma palestra que ele deu no <a href="http://skillsmatter.com/event/ajax-ria/rails-underground-2009">Rails Underground 2009</a>.</p>
<p><em>Considera me <a href="http://www.workingwithrails.com/recommendation/new/person/13580-diego-carrion">recomendar</a> no <a href="http://workingwithrails.com/">Working With Rails</a>. Para ficar mais perto das novidades, não deixa de me <a href="http://twitter.com/dcrec1">seguir</a> no Twitter.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2010/06/27/testa-hoje-teu-codigo-javascript-numa-aplicacao-rails-3-com-blue-ridge/feed/</wfw:commentRss>
		</item>
		<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>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>É 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>
