<?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>Jefferson Girão :: Tech</title>
	<atom:link href="http://jefferson.eti.br/tech/feed/" rel="self" type="application/rss+xml" />
	<link>http://jefferson.eti.br/tech</link>
	<description>“When all other means of communication fail, try words”</description>
	<lastBuildDate>Mon, 29 Mar 2010 12:34:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Evitando timeout do Selenium em retornos via AJAX</title>
		<link>http://jefferson.eti.br/tech/2010/03/evitando-timeout-do-selenium-em-retornos-via-ajax/</link>
		<comments>http://jefferson.eti.br/tech/2010/03/evitando-timeout-do-selenium-em-retornos-via-ajax/#comments</comments>
		<pubDate>Sat, 27 Mar 2010 15:43:31 +0000</pubDate>
		<dc:creator>Jefferson Girão</dc:creator>
				<category><![CDATA[ATDD]]></category>
		<category><![CDATA[dojo]]></category>
		<category><![CDATA[extjs]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[selenium]]></category>

		<guid isPermaLink="false">http://jefferson.eti.br/tech/?p=106</guid>
		<description><![CDATA[No post onde abordei a configuração do Webrat em modo Selenium surgiu uma dúvida do Diego sobre timeout quando estamos testando algo que depende de retorno via AJAX. Como a dúvida é recorrente, decidi mostrar como resolver isso no seu framework JavaScript preferido.
A chave de tudo está no método waitForCondition do Selenium que como o [...]]]></description>
			<content:encoded><![CDATA[<p>No <a href="http://jefferson.eti.br/tech/2010/03/bdd-on-rails-com-cucumber-webrat-em-modo-selenium/" target="_self">post onde abordei a configuração do Webrat em modo Selenium</a> surgiu uma <a href="http://jefferson.eti.br/tech/2010/03/bdd-on-rails-com-cucumber-webrat-em-modo-selenium/#comment-2" target="_self">dúvida do Diego</a> sobre timeout quando estamos testando algo que depende de retorno via AJAX. Como a dúvida é recorrente, decidi mostrar como resolver isso no seu framework JavaScript preferido.</p>
<p>A chave de tudo está no método waitForCondition do Selenium que como o próprio nome  já diz, faz a execução aguardar até que determinada condição seja satisfeita. Utilizaremos o waitForCondition para aguardar até não existirem requisições AJAX pendentes, a forma de fazer isso depende do framework que você utiliza:</p>
<p><span id="more-106"></span></p>
<p><strong>JQuery</strong> : jQuery.active</p>
<p><strong>ExtJS:</strong> Ext.Ajax.isLoading()</p>
<p><strong>Dojo Toolkit:</strong> dojo.io.XMLHTTPTransport.inFlight.length</p>
<p><strong>Prototype:</strong> Ajax.activeRequestCount</p>
<p>O waitForCondition recebe dois parâmetros: a condição e o tempo em milissegundos de tolerância para a resposta (timeout). Note que como o comando roda por padrão na janela do test runner e não na da aplicação precisamos usar o snippet JavaScript &#8220;selenium.browserbot.getCurrentWindow()&#8221;. Na tabela Selenese abaixo armazenamos a implementação específica de framework na variável requisicoesAJAX:</p>
<table border="1" cellspacing="1" cellpadding="1">
<thead>
<tr>
<td colspan="3">Wait For Jquery Ajax</td>
</tr>
</thead>
<tbody>
<tr>
<td>store</td>
<td>jQuery.active</td>
<td>requisicoesAJAX</td>
</tr>
<tr>
<td>store</td>
<td>&#8217;selenium.browserbot.getCurrentWindow().${requisicoesAJAX}==0&#8242;</td>
<td>condicao</td>
</tr>
<tr>
<td>waitForCondition</td>
<td>${condicao}</td>
<td>5000</td>
</tr>
</tbody>
</table>
<p>Se você usa ruby, a gem <a href="http://selenium-client.rubyforge.org/" target="_blank">selenium-client</a> possui o método wait_for_ajax com implementações para Prototype (padrão) e jQuery. O framework é configurável na instanciação:</p>
<script src="http://gist.github.com/346105.js"></script>
<p>Outra opção é escrever seu próprio método (no meu caso deixo isso nas definições de passos do Cucumber):</p>
<script src="http://gist.github.com/346107.js"></script>
<p>Você conhece formas de fazer isso para outros frameworks JavaScript? Seja bem vindo a sugerir nos comentários  <img src='http://jefferson.eti.br/tech/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://jefferson.eti.br/tech/2010/03/evitando-timeout-do-selenium-em-retornos-via-ajax/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Atributos não padrões em tags (X)HTML</title>
		<link>http://jefferson.eti.br/tech/2010/03/atributos-nao-padroes-em-tags-xhtml/</link>
		<comments>http://jefferson.eti.br/tech/2010/03/atributos-nao-padroes-em-tags-xhtml/#comments</comments>
		<pubDate>Sat, 13 Mar 2010 22:52:35 +0000</pubDate>
		<dc:creator>Jefferson Girão</dc:creator>
				<category><![CDATA[Desenvolvimento Web]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[web standards]]></category>
		<category><![CDATA[xhml]]></category>

		<guid isPermaLink="false">http://jefferson.eti.br/tech/?p=81</guid>
		<description><![CDATA[Muitas vezes quando vamos manipular (X)HTML via Javascript é necessário prover metadados de alguma forma. O caso mais comum é utilizar atributos não padrões nas tags (X)HTML:
&#60;a href="#" class="popup" title="Veja o popup!"
  titulo_do_popup="Titulo para o popup"&#62;Clique-me&#60;/a&#62;
   

Um dos mitos do HTML é que ao utilizarmos atributos fora da especificação estamos tornando nosso código [...]]]></description>
			<content:encoded><![CDATA[<p>Muitas vezes quando vamos manipular (X)HTML via Javascript é necessário prover metadados de alguma forma. O caso mais comum é utilizar atributos não padrões nas tags (X)HTML:</p>
<pre>&lt;a href="#" class="popup" title="Veja o popup!"
  <strong>titulo_do_popup="Titulo para o popup"</strong>&gt;Clique-me&lt;/a&gt;
   
</pre>
<p>Um dos mitos do HTML é que ao utilizarmos atributos fora da especificação estamos tornando nosso código não padrão. Mito esse que inclusive precisou ser <a href="http://www.sitepen.com/blog/2008/10/27/debunking-dojo-toolkit-myths/" target="_blank">rebatido pelo pessoal do Dojo Toolkit</a> que usa esse recurso extensivamente.</p>
<blockquote><p>Custom attributes have always been   valid HTML [...] The   HTML specification states that any   attribute not recognized is to be   ignored by the HTML rendering engine   in user agents, and Dojo optionally   takes advantage of this to improve   ease of development.</p></blockquote>
<p><span id="more-81"></span></p>
<p>Como essa é uma necessidade recorrente, o HTML 5 propõe a utilização de atributos prefixados com &#8216;data-&#8217; conforme a sessão <a href="http://dev.w3.org/html5/spec/Overview.html#custom-data-attribute">Custom data attribute</a> da especificação</p>
<p>Já o XHTML (por ser XML) é bem chato no que diz respeito a isso: se um atributo não está nas especificações então seu código é considerado não padrão pois o mesmo é validado contra um DTD. Uma alternativa para quem não pode fugir do XHTML é definir o metadado através de JSON por convenção indexado por id:</p>
<pre>&lt;script type="text/javascript"&gt;
var titulos_de_popups = {link1: "Titulo 1", link2: "Titulo 2"};
&lt;/script&gt;
&lt;a href="#" title="Veja o popup!" id="link1"<strong></strong>&gt;Clique-me&lt;/a&gt;
</pre>
<p>Utilizar atributos não padrões para metadados é algo que vai da necessidade e possibilidade de cada um, contudo, muito cuidado: já cheguei a ver atributos não padrões armazenando instruções SQL inteiras, algo totalmente abominável (mesmo que os atributos fossem padrões <img src='http://jefferson.eti.br/tech/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ).<br />
Quando estiver precisando passar metadados demais dessa forma sinta o mal cheiro: algo está muito errado na sua aplicação.</p>
<p><strong>&#8212;&#8211; Atualização </strong><strong>&#8212;&#8211;</strong></p>
<p>Pra quem usa jQuery, <a href="http://plugins.jquery.com/project/metadata" target="_blank">esse plugin</a><a href="http://plugins.jquery.com/project/metadata" target="_blank"></a> facilita bastante a recuperação dos metadados.</p>
]]></content:encoded>
			<wfw:commentRss>http://jefferson.eti.br/tech/2010/03/atributos-nao-padroes-em-tags-xhtml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Antipadrões na construção de testes de aceitação</title>
		<link>http://jefferson.eti.br/tech/2010/03/antipadroes-na-construcao-de-testes-de-aceitacao/</link>
		<comments>http://jefferson.eti.br/tech/2010/03/antipadroes-na-construcao-de-testes-de-aceitacao/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 02:50:29 +0000</pubDate>
		<dc:creator>Jefferson Girão</dc:creator>
				<category><![CDATA[BDD]]></category>
		<category><![CDATA[ATDD]]></category>

		<guid isPermaLink="false">http://jefferson.eti.br/tech/?p=58</guid>
		<description><![CDATA[Pesquisando sobre Acceptance Test Driven Development esbarrei nessa apresentação compartilhada por Naresh Jain em meados de 2008 com foco no Fitnesse. Achei muito interessante o alerta que ele dá sobre como não se fazer testes de aceitação:
Desenvolvedores escrevendo testes de aceitação por eles mesmos, para eles mesmos
Testes de aceitação são para colaboração e comunicação. Usá-los [...]]]></description>
			<content:encoded><![CDATA[<p>Pesquisando sobre <a href="http://www.methodsandtools.com/archive/archive.php?id=72" target="_blank">Acceptance Test Driven Development</a> esbarrei <a href="http://www.slideshare.net/nashjain/acceptance-test-driven-development-350264" target="_blank">nessa apresentação</a> compartilhada por <a href="http://agilefaqs.com/nareshjain.html" target="_blank">Naresh Jain</a> em meados de 2008 com foco no <a href="http://fitnesse.org/" target="_blank">Fitnesse</a>. Achei muito interessante o alerta que ele dá sobre como não se fazer testes de aceitação:</p>
<p><strong>Desenvolvedores escrevendo testes de aceitação por eles mesmos, para eles mesmos</strong></p>
<p>Testes de aceitação são para colaboração e comunicação. Usá-los apenas para testes é subutilizar o potencial. Todos os interessados na funcionalidade devem estar envolvidos na construção dos testes de aceitação.</p>
<p><span id="more-58"></span></p>
<p><strong>Testes de aceitação escritos em nível unitário</strong></p>
<p>Testes unitários são específicos da implementação enquanto que testes de aceitação não são. Testes de aceitação expressam objetivos de negócios, enquanto que testes unitários expressam, tecnicamente, objetivos de dada implementação.</p>
<p><strong>Escrever os testes após o código estar pronto</strong></p>
<p>Escrever testes de aceitação após o código estar escrito não traz benefícios suficientes comparado a escrevê-los antes e deixá-los guiar o desenvolvimento.</p>
<p><strong>Esconder dados de testes em fixtures</strong></p>
<p>Esconder dados que afetam o comportamento testado é uma má idéia. Estamos falando sobre comunicação: certifique-se que seus testes comunicam o objetivo ( dados de teste fazem parte do teste ).</p>
<p><strong>Testes dependentes de detalhes de implementação e estruturas dos dados</strong></p>
<p>Testes de aceitação precisam ser independentes de plataforma, tecnologia e implementação. Se daqui a uns anos você decidir portar a aplicação para uma nova tecnologia ou arquitetura, com poucas alterações em fixtures deve ser possível rodar os testes de aceitação contra o novo sistema.</p>
]]></content:encoded>
			<wfw:commentRss>http://jefferson.eti.br/tech/2010/03/antipadroes-na-construcao-de-testes-de-aceitacao/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BDD On Rails com Cucumber: Webrat em modo Selenium</title>
		<link>http://jefferson.eti.br/tech/2010/03/bdd-on-rails-com-cucumber-webrat-em-modo-selenium/</link>
		<comments>http://jefferson.eti.br/tech/2010/03/bdd-on-rails-com-cucumber-webrat-em-modo-selenium/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 10:54:38 +0000</pubDate>
		<dc:creator>Jefferson Girão</dc:creator>
				<category><![CDATA[BDD]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[selenium]]></category>
		<category><![CDATA[webrat]]></category>

		<guid isPermaLink="false">http://jefferson.eti.br/tech/?p=4</guid>
		<description><![CDATA[O Webrat é uma ferramenta fantástica mas que possui uma limitação severa: não consegue dar conta sozinho de funcionalidades que dependam de Javascript. Como é difícil imaginar uma aplicação web hoje que não faça uso de AJAX e como infelizmente nem toda funcionalidade que envolva javascript é possível de ser degradada, precisamos então de uma [...]]]></description>
			<content:encoded><![CDATA[<p>O Webrat é uma ferramenta fantástica mas que possui uma limitação severa: não consegue dar conta sozinho de funcionalidades que dependam de Javascript. Como é difícil imaginar uma aplicação web hoje que não faça uso de AJAX e como infelizmente nem toda funcionalidade que envolva javascript é possível de ser degradada, precisamos então de uma alternativa.</p>
<p>O objetivo desse post é mostrar como configurar o Cucumber para utilizar Webrat em modo Selenium quando conveniente com reaproveitamento quase total das definições de passos e permitindo também o uso de Selenium nativo nos casos onde não existe paralelo na API do Webrat.</p>
<p><span id="more-4"></span></p>
<p>Esse tutorial foi testado especificamente no Ubuntu Linux 9.10 e é provável que funcione em ambientes diferentes com pouca ou nenhuma alteração. As gems utilizadas e suas respectivas versões foram:</p>
<p>rails = 2.3.5<br />
cucumber = 0.6.2<br />
cucumber-rails = 0.2.4<br />
database_cleaner = 0.4.3<br />
webrat = 0.6.0<br />
selenium-client = 1.2.17</p>
<p><strong>Estrutura de diretórios</strong></p>
<p>No projeto rails execute script/generate cucumber e altere a estrutura gerada para a seguinte:</p>
<pre>- features/  ( Aqui ficam as features que podem ser executadas com o Webrat )
  - js_dependent/ ( Aqui vão as features que exigem o Selenium )
  - support/
    - env.rb ( Configurações comuns à todos )
    - selenium.rb ( Configurações específicas para o Selenium )
    - webrat.rb ( Configurações específicas para o Webrat )
    - paths.rb
  - step_definitions/ ( Definições comuns a todos os modos )
    - webrat/ ( Definições de passos que só funcionam em modo Webrat )
    - selenium/ ( Definições de passos que só funcionam em modo Selenium )
 
</pre>
<p><strong>Configurações de ambiente</strong></p>
<p>Conforme a estrutura de diretórios definida, no arquivo <a href="http://gist.github.com/317978" target="_blank">features/support/env.rb</a> temos as configurações comuns a todos os perfis de execução, no meu caso aqui fica as configurações para factory_girl e matchers do rspec, se não usar nenhum dos dois remova as referências aos mesmos.</p>
<p>No arquivo <a href="http://gist.github.com/317981" target="_blank">features/support/selenium.rb</a> configuramos o webrat em modo selenium, desabilitamos o uso de transactional fixtures e definimos a estratégia de limpeza do banco.</p>
<p>No arquivo <a href="http://gist.github.com/317982" target="_blank">features/support/webrat.rb</a> apenas configuramos webrat em modo rails.</p>
<p><strong>Perfis de execução</strong></p>
<p>Criaremos 4 perfis de execução para o Cucumber a saber:</p>
<ul>
<li>default: Execução de todas as features não marcadas com a tag @wip utilizando o Webrat em modo rails</li>
<li>wip: Execução das features marcadas com a tag @wip utilizando o Webrat em modo Rails</li>
<li>selenium: Execução de todas as features não marcadas com a tag @wip utilizando o Webrat em modo Selenium</li>
<li>selenium_wip: Execução de features marcadas com a tag @wip utilizando o Webrat em modo Selenium</li>
</ul>
<p>A tag @wip(work in progress) serve para sinalizar cenários em que estamos trabalhando no momento.</p>
<p>Utilizaremos também um recurso interessante das últimas versões do Cucumber para sinalizar os cenários que estão falhando na execução de forma a executar somente estes da próxima vez.</p>
<p>Na execução do Cucumber utilizaremos o formato progress(mais limpo) por padrão, mas quando a execução falhar em algum cenário o formato será mudado para o pretty(mais informativo) de forma a facilitar a leitura.</p>
<p>Para definir os perfis do Cucumber crie o arquivo <a href="http://gist.github.com/317957" target="_blank">cucumber.yml</a> na raiz da aplicação.</p>
<p><strong>Tarefas Rake</strong></p>
<p>Como mudamos os perfis de execução padrões, as tarefas rake geradas pelo Cucumber (quando você digitou script/generate cucumber) não são mais compatíveis.  É necessário alterar o arquivo <a href="http://gist.github.com/317959" target="_blank">lib/tasks/cucumber.rake</a> para refletir os perfis atuais.</p>
<p>Para ver as tarefas agora disponíveis digite: rake -T cucumber</p>
<p>A vantagem da execução através das tarefas rake ao invés da execução direta (cucumber -p nome_do_perfil) é que a tarefa rake realiza a preparação do banco de teste (rake db:test:prepare) antes de cada execução.</p>
<p><strong>Conclusões</strong></p>
<p>Você pode me perguntar: por que não uso o Cucumber apenas em modo Selenium já que o Webrat possui a limitação quanto ao Javascript?</p>
<p>Baterias de testes de aceitação com Selenium demoram muito mais para executar. Da forma como foi mostrado podemos aproveitar o melhor dos dois mundos: a velocidade e praticidade do Webrat e toda a abrangência do Selenium quando ela for necessária.</p>
]]></content:encoded>
			<wfw:commentRss>http://jefferson.eti.br/tech/2010/03/bdd-on-rails-com-cucumber-webrat-em-modo-selenium/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

