<?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>Blog do Seu Enium</title>
	<atom:link href="http://www.seuenium.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.seuenium.com.br</link>
	<description>Testando seus conhecimentos</description>
	<lastBuildDate>Wed, 02 Feb 2011 21:52:47 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.2.4</generator>
	<item>
		<title>Começa hoje a venda dos tickets para a SeleniumConf</title>
		<link>http://www.seuenium.com.br/2011/02/01/comeca-hoje-a-venda-dos-tickets-para-a-seleniumconf/</link>
		<comments>http://www.seuenium.com.br/2011/02/01/comeca-hoje-a-venda-dos-tickets-para-a-seleniumconf/#comments</comments>
		<pubDate>Tue, 01 Feb 2011 14:09:40 +0000</pubDate>
		<dc:creator><![CDATA[Enium]]></dc:creator>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[seconf]]></category>

		<guid isPermaLink="false">http://www.seuenium.com.br/?p=370</guid>
		<description><![CDATA[Isso mesmo galera. Hoje começa a venda das inscrições. Opa, peraí, já começou. Enquanto estou escrevendo esse post foi liberado o primeiro lote dos ingressos, e a boa notícia é que eles são $40 dólares mais baratos que o normal. Corra e garanta já o seu, porque são apenas 50 ingressos com desconto -> http://www.seleniumconf.com/tickets/ [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Isso mesmo galera. Hoje começa a venda das inscrições. Opa, peraí, já começou. Enquanto estou escrevendo esse post foi liberado o primeiro lote dos ingressos, e a boa notícia é que eles são $40 dólares mais baratos que o normal. Corra e garanta já o seu, porque são apenas 50 ingressos com desconto -> <a href="http://www.seleniumconf.com/tickets/">http://www.seleniumconf.com/tickets/</a><br />
Minha ideia é fazer um post pra cada palestra que ver lá, assim quem não for vai poder acompanhar pelo Blog do Seu Enium o que tá rolando por lá.<br />
Nos vemos em San Francisco.<br />
Bye bye!!!</p>
<p>Atualização: os ingressos com desconto acabaram praticamente no mesmo dia. Agora só restam os com valor de US$235</p>
]]></content:encoded>
			<wfw:commentRss>http://www.seuenium.com.br/2011/02/01/comeca-hoje-a-venda-dos-tickets-para-a-seleniumconf/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SeleniumConf – A primeira conferência sobre Selenium</title>
		<link>http://www.seuenium.com.br/2010/12/07/seleniumconf-a-primeira-conferencia-sobre-selenium/</link>
		<comments>http://www.seuenium.com.br/2010/12/07/seleniumconf-a-primeira-conferencia-sobre-selenium/#comments</comments>
		<pubDate>Wed, 08 Dec 2010 01:04:12 +0000</pubDate>
		<dc:creator><![CDATA[Enium]]></dc:creator>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[conferencia]]></category>
		<category><![CDATA[seconf]]></category>

		<guid isPermaLink="false">http://www.seuenium.com.br/?p=366</guid>
		<description><![CDATA[É isso aí pessoal. Ano que vem, 2011, entre os dias 4 e 6 de abril, lá em San Francisco – California, será realizada a primeira conferência oficial e exclusiva sobre Selenium. Serão 3 dias de pura automação. Duas trilhas ao mesmo tempo e sessões paralelas para você colocar a mão na massa. Você terá [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>É isso aí pessoal.</p>
<p>Ano que vem, 2011, entre os dias 4 e 6 de abril, lá em San Francisco – California, será realizada a primeira conferência oficial e exclusiva sobre Selenium.</p>
<p>Serão 3 dias de pura automação. Duas trilhas ao mesmo tempo e sessões paralelas para você colocar a mão na massa. Você terá a oportunidade de conhecer desenvolvedores, usuários e entusiastas do Selenium que estão ao redor desse mundo.</p>
<p>As inscrições poderão ser feitas a partir do dia 28 de Janeiro de 2011 pelo site <a href="http://www.seleniumconf.com/">www.seleniumconf.com</a>.</p>
<p>O valor da inscrição é de $235, o que dá uns R$400. É carinho né, e ainda por cima tem que contar com voo e hospedagem.</p>
<p>Mas se você estiver realmente disposto a ir, fique atento porque são apenas 250 vagas. </p>
<p>Além do site você pode seguir o twitter <a href="http://twitter.com/seleniumconf">@seleniumconf</a> para receber atualizações sobre a conferência.</p>
<p>Nos vemos lá!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.seuenium.com.br/2010/12/07/seleniumconf-a-primeira-conferencia-sobre-selenium/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>O enésimo elemento em Xpath</title>
		<link>http://www.seuenium.com.br/2010/10/06/o-enesimo-elemento-em-xpath/</link>
		<comments>http://www.seuenium.com.br/2010/10/06/o-enesimo-elemento-em-xpath/#comments</comments>
		<pubDate>Wed, 06 Oct 2010 04:57:36 +0000</pubDate>
		<dc:creator><![CDATA[Enium]]></dc:creator>
				<category><![CDATA[selenium]]></category>
		<category><![CDATA[locators]]></category>
		<category><![CDATA[se1]]></category>
		<category><![CDATA[xpath]]></category>

		<guid isPermaLink="false">http://www.seuenium.com.br/?p=339</guid>
		<description><![CDATA[Cada dia aprendo uma coisa nova e surpreendente. Estava eu lendo o “A Smattering of Selenium” do blog oficial do Selenium, que por sinal é muito bom para ficar antenado sobre as notícias do Selenium, e encontrei um post que fala justamente de um problema que comentei recentemente no blog, o problema do enésimo elemento. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Cada dia aprendo uma coisa nova e surpreendente.<br />
Estava eu lendo o <a href="http://seleniumhq.wordpress.com/2010/10/04/a-smattering-of-selenium-29/">“A Smattering of Selenium”</a> do blog oficial do Selenium, que por sinal é muito bom para ficar antenado sobre as notícias do Selenium, e encontrei um <a href="http://blog.browsermob.com/2010/09/effectively-using-seleniums-getxpathcount-function/">post</a> que fala justamente de um problema que comentei recentemente no blog, <a href="http://www.seuenium.com.br/2010/09/03/jquery-locators-no-selenium/">o problema do enésimo elemento</a>.<br />
Até então eu pensava que a única solução nativa era trabalhar com os índices dos elementos pais, mas há outras duas maneiras de resolver o problema.</p>
<p><strong>Problema</strong>: dado abaixo um exemplo em html, quero verificar que o texto da quarta célula da tabela é “Produto 4″<br />
<strong>Exemplo</strong>:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="java" style="font-family:monospace;"> <span style="color: #339933;">&lt;</span>table<span style="color: #339933;">&gt;</span>
   <span style="color: #339933;">&lt;</span>tr<span style="color: #339933;">&gt;</span>
    <span style="color: #339933;">&lt;</span>td<span style="color: #339933;">&gt;</span>Produto <span style="color: #cc66cc;">1</span><span style="color: #339933;">&lt;/</span>td<span style="color: #339933;">&gt;</span>
    <span style="color: #339933;">&lt;</span>td<span style="color: #339933;">&gt;</span>Produto <span style="color: #cc66cc;">2</span><span style="color: #339933;">&lt;/</span>td<span style="color: #339933;">&gt;</span>
    <span style="color: #339933;">&lt;</span>td<span style="color: #339933;">&gt;</span>Produto <span style="color: #cc66cc;">3</span><span style="color: #339933;">&lt;/</span>td<span style="color: #339933;">&gt;</span>
   <span style="color: #339933;">&lt;/</span>tr<span style="color: #339933;">&gt;</span>
   <span style="color: #339933;">&lt;</span>tr<span style="color: #339933;">&gt;</span>
    <span style="color: #339933;">&lt;</span>td<span style="color: #339933;">&gt;</span>Produto <span style="color: #cc66cc;">4</span><span style="color: #339933;">&lt;/</span>td<span style="color: #339933;">&gt;</span>
    <span style="color: #339933;">&lt;</span>td<span style="color: #339933;">&gt;</span>Produto <span style="color: #cc66cc;">5</span><span style="color: #339933;">&lt;/</span>td<span style="color: #339933;">&gt;</span>
    <span style="color: #339933;">&lt;</span>td<span style="color: #339933;">&gt;</span>Produto <span style="color: #cc66cc;">6</span><span style="color: #339933;">&lt;/</span>td<span style="color: #339933;">&gt;</span>
   <span style="color: #339933;">&lt;/</span>tr<span style="color: #339933;">&gt;</span>
 <span style="color: #339933;">&lt;/</span>table<span style="color: #339933;">&gt;</span></pre></td></tr></table></div>

<p><strong>Solução 1</strong>: assertText | //tr[2]/td[1] | Produto 4<br />
<strong>Explicação 1</strong>: essa é a solução simples onde você tem que trabalhar com o índice do elemento pai, no nosso caso o elemento <em>tr</em>.</p>
<p><strong>Solução 2</strong>: assertText | xpath=/descendant::td[4] | Produto 4<br />
<strong>Explicação 2</strong>: você deve trocar o <em>//</em> pela função <em>descendant</em> do xpath. A anotação <em>//</em> de xpath, corresponde à função <em>descendant-or-self</em> que para quando acha o primeiro elemento. Note que tem que forçar o <em>xpath=</em> já que você não vai usar o <em>//</em>. Você pode ler mais sobre isso <a href="http://www.w3.org/TR/xpath/#path-abbrev">aqui</a>.</p>
<p><strong>Solução 3</strong>: assertText | xpath=(//td)[4] | Produto 4<br />
<strong>Explicação 3</strong>: essa solução só funciona com o Selenium, não é nativo do xpath. Você explicita que está usando xpath, coloca sua expressão em parênteses e em seguinda coloca o índice do elemento desejado. </p>
<p>Vivendo e aprendendo!!! To pensando em mudar o nome do blog para <em>O Blog do Seu Enésimo</em> <img src="http://www.seuenium.com.br/wp-includes/images/smilies/simple-smile.png" alt=":)" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br />
Até a próxima.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.seuenium.com.br/2010/10/06/o-enesimo-elemento-em-xpath/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Selenium 2.0, o que muda com essa nova versão?</title>
		<link>http://www.seuenium.com.br/2010/09/14/selenium-2-0-o-que-muda-com-essa-versao/</link>
		<comments>http://www.seuenium.com.br/2010/09/14/selenium-2-0-o-que-muda-com-essa-versao/#comments</comments>
		<pubDate>Tue, 14 Sep 2010 21:09:23 +0000</pubDate>
		<dc:creator><![CDATA[Enium]]></dc:creator>
				<category><![CDATA[selenium 2]]></category>
		<category><![CDATA[se2]]></category>
		<category><![CDATA[webdriver]]></category>

		<guid isPermaLink="false">http://www.seuenium.com.br/?p=306</guid>
		<description><![CDATA[Olá pessoal, Já queria falar sobre esse assunto há um bom tempo, mas fiquei enrolando e finalmente chegou a hora. Para quem ainda não sabe, o Selenium passará (já passa, está em alpha) por uma grande evolução. O Selenium 2.0 é um merge entre o Selenium e o Webdriver. Para quem não sabe, o Webdriver [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Olá pessoal,</p>
<p>Já queria falar sobre esse assunto há um bom tempo, mas fiquei enrolando e finalmente chegou a hora.</p>
<p>Para quem ainda não sabe, o Selenium passará (já passa, está em alpha) por uma grande evolução. </p>
<p>O Selenium 2.0 é um merge entre o Selenium e o Webdriver.<br />
Para quem não sabe, o Webdriver é um projeto criado pelo Google para fazer a mesma coisa que o Selenium faz, mas com algumas melhorias:<br />
1. Uma API voltada para desenvolvedores.<br />
2. Consistência entre os browsers.<br />
3. Corrigir funcionalidades mal suportadas pelo Selenium 1.0.</p>
<p>Para explicar o que realmente muda, nada melhor do que exemplos.</p>
<p>Temos a seguinte <a href="http://www.seuenium.com.br/testes/12-se2/index.html">página</a> mostrando uma tabela com produtos. O nosso teste é verificar se os produtos estão aparecendo corretamente.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html" style="font-family:monospace;">&lt;html&gt;
&lt;body&gt;
 &lt;table border=&quot;1&quot;&gt;
  &lt;tbody&gt;
   &lt;tr&gt;
    &lt;td&gt;Produto 1&lt;/td&gt;
    &lt;td&gt;Produto 2&lt;/td&gt;
    &lt;td&gt;Produto 3&lt;/td&gt;
   &lt;/tr&gt;
  &lt;/tbody&gt;
 &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></td></tr></table></div>

<p>Vamos criar um projeto do zero no maven usando Selenium2. Se você usa outra linguagem, ou não conhece o maven, não se preocupe, pois você vai conseguir entender praticamente tudo.</p>
<p>Crie o projeto com o seguinte comando:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">mvn archetype:create <span style="color: #660033;">-DgroupId</span>=seuenium <span style="color: #660033;">-DartifactId</span>=exemplo-se2</pre></td></tr></table></div>

<p>Agora vamos editar o arquivo pom gerado em exempo-se2/pom.xml.<br />
Acrescente a dependência para o Selenium2:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;dependency<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;groupId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>org.seleniumhq.selenium<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/groupId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artifactId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>selenium<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artifactId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>2.0a5<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dependency<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Agora vamos criar um teste usando a nova API. Crie a classe src/test/java/seuenium/ExemploTest.java.<br />
Em seguida, vamos criar o método anotado com @Before inicializando o Selenium. Vai ficar mais ou menos assim:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ExemploTest
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> FirefoxDriver driver<span style="color: #339933;">;</span>
&nbsp;
    @Before
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> before<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">driver</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> FirefoxDriver<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Aí está a primeira mudança. Antes você tinha que instanciar a classe DefaultSelenium passando o ip do selenium-server, a porta, o browser e a url base e ainda por cima dar chamar o comando start(). Agora você só precisa instanciar a implementação do browser que você quer.<br />
E aí você me pergunta: onde ficam as configurações do servidor e porta?<br />
Aí está outra grande mudança. A API agora conversa diretamente com o browser e você não precisa de um servidor em pé para fazer essa tarefa pra você.<br />
Mas isso é opcional. Você pode continuar com um selenium-server rodando e seus testes devem usar uma instância de RemoteWebDriver. Mas isso é assunto para outro post.</p>
<p>Agora vamos criar o nosso teste que consiste em validar que todos os produtos estão aparecendo na tabela. Crie um método testSucesso anotado com @Test.</p>
<p>O primeiro passo é abrir a URL. Antes usávamos o comando open, agora usa o comando get:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="java" style="font-family:monospace;">driver.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;http://www.seuenium.com.br/testes/12-se2/index.html&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Em seguida vamos validar o texto do primeiro produto da tabela. No Se1, você usaria o seguinte comando:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="java" style="font-family:monospace;">assertEquals<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Produto 1&quot;</span>, selenium.<span style="color: #006633;">getText</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;//table//tr/td[1]&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Agora não tem mais convenção nos locators, você tem que chamar o método específico de como você quer localizar os elementos. Exemplo:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="java" style="font-family:monospace;">assertEquals<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Produto 1&quot;</span>, driver.<span style="color: #006633;">findElementByXPath</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;//table//tr/td[1]&quot;</span> <span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getText</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>ou</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="java" style="font-family:monospace;">assertEquals<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Produto 1&quot;</span>, driver.<span style="color: #006633;">findElement</span><span style="color: #009900;">&#40;</span> By.<span style="color: #006633;">xpath</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;//table//tr/td[1]&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getText</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Note que os métodos findElement* retornam o objeto WebElement, e nele contém outros métodos para pegar o texto, algum atributo e/ou valor.</p>
<p>Agora vamos testar se os outros produtos da tabela estão corretos.<br />
No Se1, você faria algo assim:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="java" style="font-family:monospace;">assertEquals<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Produto 1&quot;</span>, selenium.<span style="color: #006633;">getText</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;//table//tr/td[1]&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
assertEquals<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Produto 2&quot;</span>, selenium.<span style="color: #006633;">getText</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;//table//tr/td[2]&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
assertEquals<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Produto 3&quot;</span>, selenium.<span style="color: #006633;">getText</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;//table//tr/td[3]&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>No Se2 há um jeito melhor de fazer isso:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="java" style="font-family:monospace;">List<span style="color: #339933;">&lt;</span>WebElement<span style="color: #339933;">&gt;</span> elements <span style="color: #339933;">=</span> driver.<span style="color: #006633;">findElements</span><span style="color: #009900;">&#40;</span> By.<span style="color: #006633;">xpath</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;//table//tr/td&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
assertEquals<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Produto 1&quot;</span>, elements.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">0</span> <span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getText</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
assertEquals<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Produto 2&quot;</span>, elements.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">1</span> <span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getText</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
assertEquals<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Produto 3&quot;</span>, elements.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">2</span> <span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getText</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Note que o método findElements retorna uma lista dos elementos encontrados, facilitando o teste.</p>
<p>Outro ponto interessante é que para cada objeto WebElement você também pode chamar os métodos findElement*. Quando isso acontece, o Se2 vai procurar por elementos filhos do elemento atual. Isso sim é uma API voltada para desenvolvedores. Acredito que isso vai facilitar muito, e muita gente vai aposentar de vez o XPath.<br />
No nosso exemplo, se eu <strong>não</strong> quisesse usar <strong>Xpath</strong>, poderia usar algo assim:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="java" style="font-family:monospace;">List<span style="color: #339933;">&lt;</span>WebElement<span style="color: #339933;">&gt;</span> elements <span style="color: #339933;">=</span> driver.<span style="color: #006633;">findElement</span><span style="color: #009900;">&#40;</span> By.<span style="color: #006633;">tagName</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;table&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>.<span style="color: #006633;">findElements</span><span style="color: #009900;">&#40;</span> By.<span style="color: #006633;">tagName</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;td&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        assertEquals<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Produto 1&quot;</span>, elements.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">0</span> <span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getText</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        assertEquals<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Produto 2&quot;</span>, elements.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">1</span> <span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getText</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        assertEquals<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Produto 3&quot;</span>, elements.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">2</span> <span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getText</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Note que usei o locator By.tagName que busca pelo nome dos elementos. Outros locators disponíveis são: By.className( className ), By.cssSelector( selector ), By.id( id ), By.linkText( linkText ), By.name( name ), By.partialLinkText( linkText ), By.tagName( name ), By.xpath( xpathExpression ).</p>
<p>Outro método que precisa ser criado é o método para finalizar o Selenium. Antes era o comando stop(). Agora é o quit:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="java" style="font-family:monospace;">@After
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> tearDown<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">driver</span>.<span style="color: #006633;">quit</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Bom, é isso galera. O exemplo você pode baixar <a href="http://www.seuenium.com.br/testes/12-se2/exemplo-se2.zip">aqui</a>.<br />
Ainda tem muito mais coisa a falar do Selenium 2.0 e pretendo criar outros posts para isso, mas já vimos que as mudanças da nova API vieram para ajudar ainda mais o desenvolimento dos testes. Isso prova cada vez mais que teste automatizado não é só ficar clicando e esperando que alguma ferramenta grave pra você, tem que por a mão na massa. Quem quiser ler mais sobre o Se2, acesse esse <a href="http://seleniumhq.org/docs/09_webdriver.html">link</a> do site oficial.</p>
<p>Valeu pessoal!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.seuenium.com.br/2010/09/14/selenium-2-0-o-que-muda-com-essa-versao/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>JQuery Selectors no Selenium</title>
		<link>http://www.seuenium.com.br/2010/09/03/jquery-locators-no-selenium/</link>
		<comments>http://www.seuenium.com.br/2010/09/03/jquery-locators-no-selenium/#comments</comments>
		<pubDate>Fri, 03 Sep 2010 22:24:56 +0000</pubDate>
		<dc:creator><![CDATA[Enium]]></dc:creator>
				<category><![CDATA[selenium]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[locators]]></category>
		<category><![CDATA[user-extensions]]></category>

		<guid isPermaLink="false">http://www.seuenium.com.br/?p=313</guid>
		<description><![CDATA[Já expliquei aqui no blog quais são as diversas maneiras de selecionar os elementos da página com o Selenium. Mas em alguns casos, as expressões em Xpath ou CSS do Selenium ficam complicadas de serem montadas. Vou dar um exemplo bom de quando isso acontece. Temos a seguinte tabela em html: &#60;table&#62; &#60;tr&#62; &#60;td&#62;Produto 1&#60;/td&#62; [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Já expliquei <a href="http://www.seuenium.com.br/2009/02/09/encontrando-os-elementos-de-uma-pagina-com-o-selenium/">aqui</a> no blog quais são as diversas maneiras de selecionar os elementos da página com o Selenium. Mas em alguns casos, as expressões em Xpath ou CSS do Selenium ficam complicadas de serem montadas.</p>
<p>Vou dar um exemplo bom de quando isso acontece.</p>
<p>Temos a seguinte tabela em html:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html" style="font-family:monospace;">&lt;table&gt;
	&lt;tr&gt;
		&lt;td&gt;Produto 1&lt;/td&gt;
		&lt;td&gt;Produto 2&lt;/td&gt;
		&lt;td&gt;Produto 3&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;Produto 4&lt;/td&gt;
		&lt;td&gt;Produto 5&lt;/td&gt;
		&lt;td&gt;Produto 6&lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;</pre></td></tr></table></div>

<p>Agora queremos validar o texto da quarta célula que é “Produto 4″.</p>
<p>Em Xpath, a primeira tentativa seria:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="dos" style="font-family:monospace;">assertText <span style="color: #33cc33;">|</span> //td[4] <span style="color: #33cc33;">|</span> Produto 4</pre></td></tr></table></div>

<p>Porém isso não funciona. Como a quarta célula está na segunda linha da tabela, você tem que entrar primeiro na linha correta e usar índice 1 no td . Exemplo:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="dos" style="font-family:monospace;">assertText <span style="color: #33cc33;">|</span> //tr[2]/td[1] <span style="color: #33cc33;">|</span> Produto 4</pre></td></tr></table></div>

<p>O mesmo ocorre com css locator.<br />
Não funciona:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="dos" style="font-family:monospace;">css=td:nth-child<span style="color: #33cc33;">(</span>4<span style="color: #33cc33;">)</span></pre></td></tr></table></div>

<p>Funciona:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="dos" style="font-family:monospace;">css=tr:nth-child<span style="color: #33cc33;">(</span>2<span style="color: #33cc33;">)</span> td:nth-child<span style="color: #33cc33;">(</span>1<span style="color: #33cc33;">)</span></pre></td></tr></table></div>

<p>Não seria mais fácil se não precisasse usar o índice da linha?<br />
Para isso, você terá que extender o Selenium com Jquery/Sizzle.</p>
<p>Por baixo dos panos o <a href="http://jquery.com/">JQuery</a> usa o <a href="http://sizzlejs.com">Sizzle</a>, que é uma implementação em Javascript de seletores CSS. Antigamente essa engine de css ficava dentro do próprio JQuery, mas ela foi separada para que evoluisse de forma independente.</p>
<p>Vou exemplificar passo a passo como configurar o Selenium IDE para usar o Sizzle:</p>
<p>1. Acesse <a href="http://sizzlejs.com">http://sizzlejs.com</a> e faça o download do arquivo zip.<br />
2. Extraia o arquivo sizzle.js para algum diretório de sua preferência.<br />
3. Renomeie o arquivo sizzle.js para user-extensions.js<br />
4. Edite o final do arquivo acrescentando:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">function</span> eval_css<span style="color: #009900;">&#40;</span>locator<span style="color: #339933;">,</span> inDocument<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">var</span> results <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    window.<span style="color: #660066;">Sizzle</span><span style="color: #009900;">&#40;</span>locator<span style="color: #339933;">,</span> inDocument<span style="color: #339933;">,</span> results<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">return</span> results<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>5. Abra a IDE e acesse Option -> Option e em Selenium Core extensions, coloque o path do arquivo editado.<br />
6. Feche a IDE e abre-a de novo.<br />
7. Pronto, os locators em css serão interpretados pelo Sizzle!!!</p>
<p>Para quem usa o Selenium RC, é só subir o selenium-server com o parâmetro “-userExtensions user-extensions.js”.</p>
<p>Voltando ao nosso exemplo, o comando abaixo funcionaria perfeitamente, usando apenas um índice:<br />
<strong></p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="dos" style="font-family:monospace;">assertText <span style="color: #33cc33;">|</span> css=td:eq<span style="color: #33cc33;">(</span>3<span style="color: #33cc33;">)</span> <span style="color: #33cc33;">|</span> Produto 4</pre></td></tr></table></div>

<p></strong></p>
<p>Usamos o selector “eq” que faz exatamente o que precisamos. Note que o índice no Sizzle começa em 0 enquanto que no Selenium começa em 1.</p>
<p>Há outras funções que podem ser usadas. Dê uma olhada na documentação do <a href="http://sizzlejs.com/">Sizzle</a>.</p>
<p>A boa notícia é que o Selenium irá <a href="http://code.google.com/p/selenium/source/detail?r=9590">trocar</a> a api atual (cssQuery) que interpreta CSS locators para usar o Sizzle. Então na próxima versão, você não precisará mais alterar o user-extensions.js para sobrescrever o comportamento dos locators css.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.seuenium.com.br/2010/09/03/jquery-locators-no-selenium/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Perguntas e Respostas sobre Selenium</title>
		<link>http://www.seuenium.com.br/2010/08/25/perguntas-e-respostas-sobre-selenium/</link>
		<comments>http://www.seuenium.com.br/2010/08/25/perguntas-e-respostas-sobre-selenium/#comments</comments>
		<pubDate>Wed, 25 Aug 2010 11:38:43 +0000</pubDate>
		<dc:creator><![CDATA[Enium]]></dc:creator>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[perguntas]]></category>
		<category><![CDATA[respostas]]></category>
		<category><![CDATA[selenium]]></category>

		<guid isPermaLink="false">http://www.seuenium.com.br/?p=304</guid>
		<description><![CDATA[Para quem não conhece, foi criada uma área no StackExchange dedicada 100% ao Selenium. É um site de perguntas e respostas, e o grande lance é que geralmente as perguntas e respostas são de alta qualidade, já que muito expert no assunto participa. O site ainda está na fase de commitment, e isso quer dizer [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Para quem não conhece, foi criada uma área no StackExchange dedicada 100% ao Selenium. É um site de perguntas e respostas, e o grande lance é que geralmente as perguntas e respostas são de alta qualidade, já que muito expert no assunto participa.<br />
O site ainda está na fase de commitment, e isso quer dizer que precisa atingir um certo número de usuários comprometidos a fazer perguntas e respostas para passar para a próxima fase. Quando isso acontecer, o site finalmente será liberado para perguntas e respostas. Hoje a taxa de commitment está em 22%, precisamos chegar nos 100%.<br />
Se você acho o Selenium muito legal e tem interesse em contribuir para a comunidade, inscreva-se agora!!<br />
<a href="http://area51.stackexchange.com/proposals/4693/selenium?referrer=vmmwIuj1CafWgagw76fBpg2">http://area51.stackexchange.com/proposals/4693/selenium</a></p>
<p>O único problema é que o site é em inglês. Se você não se sente confortável em ler e escrever em inglês, tire suas dúvidas em português na parte de <a href="http://www.seuenium.com.br/duvidas/">Dúvidas</a> do blog.</p>
<p>Ajude a divulgar essa ideia!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.seuenium.com.br/2010/08/25/perguntas-e-respostas-sobre-selenium/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Autenticação HTTP básica e Selenium</title>
		<link>http://www.seuenium.com.br/2010/05/14/autenticacao-http-basica-e-selenium/</link>
		<comments>http://www.seuenium.com.br/2010/05/14/autenticacao-http-basica-e-selenium/#comments</comments>
		<pubDate>Fri, 14 May 2010 19:10:29 +0000</pubDate>
		<dc:creator><![CDATA[Enium]]></dc:creator>
				<category><![CDATA[selenium]]></category>
		<category><![CDATA[ie]]></category>

		<guid isPermaLink="false">http://www.seuenium.com.br/?p=286</guid>
		<description><![CDATA[Recentemente, um dos leitores do blog me perguntou como automatizar um teste quando o sistema tem uma autenticação HTTP básica e achei interessante compartilhar com vocês. Não há nada específico para o Selenium, mas sim sobre o protocolo HTTP. Segundo a RFC 1738 que descreve como devem ser escritas as URLs, você pode definir o [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Recentemente, um dos leitores do blog me perguntou como automatizar um teste quando o sistema tem uma autenticação HTTP básica e achei interessante compartilhar com vocês.</p>
<p><img style="text-align: center;" src="http://www.seuenium.com.br/testes/11-http-auth/screenshot-http-basic-auth.png" alt="Exemplo de autenticação HTTP básica" /></p>
<p>Não há nada específico para o Selenium, mas sim sobre o protocolo HTTP.<br />
Segundo a <a href="http://www.faqs.org/rfcs/rfc1738.html">RFC 1738</a> que descreve como devem ser escritas as URLs, você pode definir o usuário e senha diretamente no endereço que deseja acessar. Exemplo:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="dos" style="font-family:monospace;">http://usuario:senha<span style="color: #33cc33;">@</span>www.seusite.com/home.html</pre></td></tr></table></div>

<p>Aparentemente, isso deveria funcionar para todos os browsers, já que é um padrão. Mas no Internet Explorer não vai funcionar. Isso porque o Windows desabilita essa autenticação por medidas de segurança. Mas como para <a href="http://www.seuenium.com.br/2009/01/20/como-rodar-os-testes-do-selenium-no-ie-ou-em-outro-browser/">testar no IE</a> você tem que subir o Selenium Remote Control, isso não será um problema já que o próprio RC altera o registro do Windows habilitando essa funcionalidade. Para maiores informações você pode dar uma olhada <a href="http://wiki.openqa.org/display/SEL/Selenium+Core+FAQ#SeleniumCoreFAQ-HowdoIuseSeleniumtologintositesthatrequireHTTPbasicauthentication%28wherethebrowsermakesamodaldialogaskingforcredentials%29%3F">aqui</a>.</p>
<p>Portanto, no seu teste automatizado, você teria que usar o comando open e alterar a URL desejada para conter os dados de acesso:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="dos" style="font-family:monospace;">open <span style="color: #33cc33;">|</span> http://usuario:senha<span style="color: #33cc33;">@</span>www.seusite.com/home.html</pre></td></tr></table></div>

<p>Até a próxima <img src="http://www.seuenium.com.br/wp-includes/images/smilies/simple-smile.png" alt=":)" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.seuenium.com.br/2010/05/14/autenticacao-http-basica-e-selenium/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Screenshot com Selenium &#8211; Parte 2, TestNG</title>
		<link>http://www.seuenium.com.br/2010/04/23/screenshot-com-selenium-parte-2-testng/</link>
		<comments>http://www.seuenium.com.br/2010/04/23/screenshot-com-selenium-parte-2-testng/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 22:46:49 +0000</pubDate>
		<dc:creator><![CDATA[Enium]]></dc:creator>
				<category><![CDATA[paralelizacao]]></category>
		<category><![CDATA[selenium]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[testng]]></category>

		<guid isPermaLink="false">http://www.seuenium.com.br/?p=276</guid>
		<description><![CDATA[Há um tempo atrás escrevi um post demonstrando como dar print screen com Junit, Maven e Selenium se houvesse algum erro no teste. Recentemente, um dos leitores do blog me perguntou se era possível fazer o mesmo só que usando o TestNG. Como eu não uso muito o TestNG, eu não sabia se isso era [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Há um tempo atrás escrevi um <a href="http://www.seuenium.com.br/2010/01/04/capturando-a-tela-com-o-selenium-e-junit/">post</a> demonstrando como dar print screen com Junit, Maven e Selenium se houvesse algum erro no teste.<br />
Recentemente, um dos leitores do blog me perguntou se era possível fazer o mesmo só que usando o TestNG.<br />
Como eu não uso muito o TestNG, eu não sabia se isso era possível, e fui atrás da <a href="http://testng.org/doc/documentation-main.html">documentação do TestNG</a> e a do plugin <a href="http://maven.apache.org/plugins/maven-surefire-plugin/examples/testng.html">Surefire</a> do maven. </p>
<p>Para fazer isso, você terá que extender a classe TestListenerAdapter e implementar o método onTestFailure que será invocado após qualquer exceção disparada.</p>
<p>Deve ficar mais ou menos assim:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.testng.ITestResult</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.testng.TestListenerAdapter</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">com.thoughtworks.selenium.DefaultSelenium</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ScreenshotListener <span style="color: #000000; font-weight: bold;">extends</span> TestListenerAdapter
<span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onTestFailure<span style="color: #009900;">&#40;</span>ITestResult result<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>        
        <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
&nbsp;
            AbstractTestCase testCase <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>AbstractTestCase<span style="color: #009900;">&#41;</span> result.<span style="color: #006633;">getTestClass</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getInstances</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
            DefaultSelenium selenium <span style="color: #339933;">=</span> testCase.<span style="color: #006633;">getSelenium</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>selenium <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #003399;">String</span> fileName <span style="color: #339933;">=</span> <span style="color: #003399;">System</span>.<span style="color: #006633;">getProperty</span><span style="color: #009900;">&#40;</span>
                        <span style="color: #0000ff;">&quot;screenshots.dir&quot;</span>, <span style="color: #0000ff;">&quot;/tmp&quot;</span><span style="color: #009900;">&#41;</span>
                        <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;/&quot;</span> <span style="color: #339933;">+</span> result.<span style="color: #006633;">getTestClass</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;-&quot;</span> <span style="color: #339933;">+</span> result.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;.png&quot;</span><span style="color: #339933;">;</span>
                <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Capturando erro em: &quot;</span> <span style="color: #339933;">+</span> fileName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                selenium.<span style="color: #006633;">captureEntirePageScreenshot</span><span style="color: #009900;">&#40;</span>fileName, <span style="color: #0000ff;">&quot;background=#FFFFFF&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> e2<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #003399;">System</span>.<span style="color: #006633;">err</span>
                    .<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Não foi possível capturar o screenshot&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Outro passo necessário é configurar o plugin surefire e informar o listener a ser usado:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;plugin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;groupId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>org.apache.maven.plugins<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/groupId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artifactId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>maven-surefire-plugin<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artifactId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;properties<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>listener<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;value<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>br.com.seuenium.ScreenshotListener<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/value<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/property<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/properties<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/plugin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Pronto.</p>
<p>Que tal integrar esse código com o exemplo de paralelização em testes do Selenium com TestNG descritos <a href="http://www.seuenium.com.br/2009/04/05/testes-em-paralelo-com-selenium-grid-maven-e-testng/">nesse post</a>? </p>
<p>Como eu sou bonzinho, já deixei isso pronto. Pode baixar o exemplo <a href="http://www.seuenium.com.br/testes/10-testng-screenshot/testes-em-paralelo.zip">AQUI</a> e depois rode o comando mvn clean install.</p>
<p>Até a próxima.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.seuenium.com.br/2010/04/23/screenshot-com-selenium-parte-2-testng/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Testes unitários com EasyMock e JUnit &#8211; Introdução</title>
		<link>http://www.seuenium.com.br/2010/04/13/testes-unitarios-com-easymock-e-junit-introducao/</link>
		<comments>http://www.seuenium.com.br/2010/04/13/testes-unitarios-com-easymock-e-junit-introducao/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 16:24:44 +0000</pubDate>
		<dc:creator><![CDATA[leandro]]></dc:creator>
				<category><![CDATA[unitario]]></category>
		<category><![CDATA[easymock]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[testes]]></category>

		<guid isPermaLink="false">http://www.seuenium.com.br/?p=224</guid>
		<description><![CDATA[A partir de agora, o Blog do Seu Enium terá a participação de um novo colaborador. Seu nome é Leandro, mais conhecido como Mendigo, e trabalhamos juntos no UOL. Para iniciar a participação dele no blog, ele vai falar um pouco sobre uma biblioteca que auxilia bastante na hora de efetuar testes unitários com java: [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>A partir de agora, o Blog do Seu Enium terá a participação de um novo colaborador. Seu nome é Leandro, mais conhecido como Mendigo, e trabalhamos juntos no UOL.</p>
<p>Para iniciar a participação dele no blog, ele vai falar um pouco sobre uma biblioteca que auxilia bastante na hora de efetuar testes unitários com java: EasyMock.</p>
<p>Esta biblioteca permite que nós criemos objetos de um determinado tipo (classe ou interface), para podermos isolar a classe a ser testada.</p>
<p>Mas por que fazer isso? Bom, quando estamos testando de forma unitária, é interessante que foquemos somente na classe, ou mesmo somente em um método da classe. Porém, em um projeto orientado à objetos, o que temos, idealmente, é um conjunto de classes efetuando tarefas específicas e interagindo entre si. A grande maioria das classes possui dependências em relação à outras classes. É importante que o grau de dependência (ou acoplamento) seja baixo, para que alterações em dependências não afetem drasticamente a classe dependente, mas esse acoplamento dificilmente será zero (nesse caso teríamos uma classe inchada, fazendo muita coisa, e difícil de manter).</p>
<p>Por exemplo, vamos considerar uma classe que leia informações de uma fonte de entrada, e escreva informações em um destino. Além disso, essa classe é capaz de interpretar alguns comandos básicos para manipular os dados de entrada (neste primeiro exemplo a classe sabe somente enviar a hora atual).</p>
<p>(o código do exemplo está disponível <a href="http://www.seuenium.com.br/testes/9-easymock/SeuEniumExemplos.zip">aqui</a>)</p>
<p>Processor</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">foo</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Processor
<span style="color: #009900;">&#123;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">private</span> Source source<span style="color: #339933;">;</span>
   <span style="color: #000000; font-weight: bold;">private</span> Destination destination<span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">public</span> Processor<span style="color: #009900;">&#40;</span> Source source, Destination destination <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">source</span> <span style="color: #339933;">=</span> source<span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">destination</span> <span style="color: #339933;">=</span> destination<span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> process<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #003399;">String</span> input <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">try</span>
      <span style="color: #009900;">&#123;</span>
         input <span style="color: #339933;">=</span> source.<span style="color: #006633;">read</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> e<span style="color: #009900;">&#41;</span>
      <span style="color: #009900;">&#123;</span>
&nbsp;
      <span style="color: #009900;">&#125;</span>
&nbsp;
      <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> input <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
         <span style="color: #003399;">String</span> output <span style="color: #339933;">=</span> transform<span style="color: #009900;">&#40;</span> input <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
         <span style="color: #000000; font-weight: bold;">try</span>
         <span style="color: #009900;">&#123;</span>
            destination.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span> output <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
         <span style="color: #009900;">&#125;</span>
         <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> e<span style="color: #009900;">&#41;</span>
         <span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> ProcessorException<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Nao foi possível enviar os dados&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
         <span style="color: #009900;">&#125;</span>
      <span style="color: #009900;">&#125;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> transform<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> input<span style="color: #009900;">&#41;</span>
   <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;[[Time]]&quot;</span>.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span> input <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
         <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;time: &quot;</span> <span style="color: #339933;">+</span> <span style="color: #003399;">System</span>.<span style="color: #006633;">currentTimeMillis</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #000000; font-weight: bold;">return</span> input<span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Source</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">foo</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> Source
<span style="color: #009900;">&#123;</span>
&nbsp;
   <span style="color: #003399;">String</span> read<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Destination</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">foo</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> Destination
<span style="color: #009900;">&#123;</span>
&nbsp;
   <span style="color: #000066; font-weight: bold;">void</span> write<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> output<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Para complicar um pouco, vamos considerar que Source obtém os dados de um banco de dados e que Destination envia os dados escritos pela rede. Dessa foram para testarmos a classe Processor, seria necessário acessar um banco de dados e enviar dados pela rede.</p>
<p>Em testes de integração ou de sistema, isso está OK, mas em testes de unidade não. Estes deveriam ser isolados, contidos, não condicionados à disponibilidade ou não dos recursos externos como rede ou banco. Além disso, eles deveriam rodar de forma muito rápida, para não atrasar o processo de build e de desenvolvimento.</p>
<p>Com o EasyMock podemos criar um objeto que se passe por um Source, mas que não acessa realmente o banco de dados, e um outro que emule o comportamento de um Destination, sem efetivamente enviar dados pela rede, isolando assim a nossa “unidade” (Processor) e tendo um controle total sobre os mocks (Neste post estou chamando tudo de mock, porém há algumas implicações “técnicas” nesta nomenclatura, e para quem quiser se aprofundar melhor, sugiro este texto: <a href="http://martinfowler.com/articles/mocksArentStubs.html">http://martinfowler.com/articles/mocksArentStubs.html</a>)</p>
<p>Vamos escrever um teste para o fluxo mais básico do nosso Processor.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">foo</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.easymock.EasyMock</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.junit.Test</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ProcessorTest
<span style="color: #009900;">&#123;</span>
&nbsp;
   @Test
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> testProcess<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
   <span style="color: #009900;">&#123;</span>
      <span style="color: #666666; font-style: italic;">// Criação dos mocks e configurando o comportamento esperado</span>
      Source source <span style="color: #339933;">=</span> EasyMock.<span style="color: #006633;">createMock</span><span style="color: #009900;">&#40;</span>Source.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      Destination destination <span style="color: #339933;">=</span> EasyMock.<span style="color: #006633;">createMock</span><span style="color: #009900;">&#40;</span>Destination.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      EasyMock.<span style="color: #006633;">expect</span><span style="color: #009900;">&#40;</span>source.<span style="color: #006633;">read</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">andReturn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SeuEnium&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      destination.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SeuEnium&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      EasyMock.<span style="color: #006633;">replay</span><span style="color: #009900;">&#40;</span>source, destination<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #666666; font-style: italic;">// Testando a nossa &quot;unidade&quot;</span>
      Processor processor <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Processor<span style="color: #009900;">&#40;</span>source, destination<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      processor.<span style="color: #006633;">process</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #666666; font-style: italic;">// Verificando o comportamento</span>
      EasyMock.<span style="color: #006633;">verify</span><span style="color: #009900;">&#40;</span>source, destination<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Neste teste podemos ver um esquema básico de utilização de mocks:</p>
<ul>
<li>
<ol><strong>Criação dos mocks</strong> – a forma mais simples é a ilustrada no exemplo: <code>EasyMock.createMock( Source.class )</code><br />
Este método irá criar um mock do tipo especificado (Classe ou Interface) – O EasyMock é capaz de criar mocks tanto de classes quanto de interfaces (neste exemplo vamos lidar somente com interfaces)</ol>
<ol><strong>Comportamento esperado</strong> – os mocks são criados em um estado de gravação – tudo o que for feito com o objeto até a chamada de <code>EasyMock.replay( source )</code> será gravado internamente pelo EasyMock, e esse comportamento será depois validado.<br />
Como podemos ver no exemplo, utilizando <code>EasyMock.expect( source.read() )</code> estamos dizendo ao EasyMock que é esperada uma chamada ao método read do mock, e que esta chamada deve retornar a String “SeuEnium”. Porém, como podemos ver em <code>destination.write("SeuEnium")</code>, não é necessário utilizar <code>EasyMock.expect</code> para mockar uma chamada (neste caso não é nem possível, pois o método <code>write</code> é void, e ocorrerá um erro de compilação caso se tente mockar <code>write</code> utilizando <code>EasyMock.expect</code>). O uso de <code>EasyMock.expect</code> se faz necessário quando queremos especificar um valor de retorno para o método mockado.<br />
Para indicar ao EasyMock que já configuramos o comportamento do mock e que a partir deste momento o objeto deve se comportar realmente como um objeto “normal”, utilizamos <code>EasyMock.replay( source, destination )</code>. A partir deste ponto, não é mais possível efetuar chamadas a <code>EasyMock.expect</code>, a não ser que se utilize <code>EasyMock.reset( source )</code>.</ol>
<ol><strong>Execução do teste da “unidade”</strong> – aqui vamos fazer o teste propriamente dito e efetuar quaisquer verificações de resultado da unidade testada.</ol>
<ol><strong>Verificação do comportamento</strong> – <code>EasyMock.verify( source, destination )</code> diz ao EasyMock para verificar se os métodos esperados foram chamados – se o comportamento esperado não for satisfeito, o EasyMock irá disparar um exceção, fazendo o teste unitário falhar.</ol>
</li>
</ul>
<p>O EasyMock oferece uma grande flexibilidade na especificação do comportamento dos mocks, o que permite que sejam testados muitos cenários que de outro modo seriam difíceis de testar – por exemplo, vamos supor que queremos verificar que nosso <code>Processor</code> se comporte de uma determinada maneira quando ocorrer um problema ao ler do banco de dados. Podemos dizer ao <code>EasyMock</code> para disparar uma exceção no momento de leitura, e verificar o comportamento do <code>Processor</code> quando isso acontece.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="java" style="font-family:monospace;">   @Test
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> testProcessWhenReadFails<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #666666; font-style: italic;">// Criação dos mocks e configurando o comportamento esperado</span>
      Source source <span style="color: #339933;">=</span> EasyMock.<span style="color: #006633;">createMock</span><span style="color: #009900;">&#40;</span>Source.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      Destination destination <span style="color: #339933;">=</span> EasyMock.<span style="color: #006633;">createMock</span><span style="color: #009900;">&#40;</span>Destination.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #666666; font-style: italic;">// Especificando o disparo de uma exceção</span>
      EasyMock.<span style="color: #006633;">expect</span><span style="color: #009900;">&#40;</span>source.<span style="color: #006633;">read</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">andThrow</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">RuntimeException</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Erro na leitura&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      EasyMock.<span style="color: #006633;">replay</span><span style="color: #009900;">&#40;</span>source, destination<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #666666; font-style: italic;">// Testando a nossa &quot;unidade&quot;</span>
      Processor processor <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Processor<span style="color: #009900;">&#40;</span> source, destination <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      processor.<span style="color: #006633;">process</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #666666; font-style: italic;">// Verificando o comportamento</span>
      EasyMock.<span style="color: #006633;">verify</span><span style="color: #009900;">&#40;</span>source, destination<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Neste código estamos testando que <code>Processor</code> nunca irá tentar escrever os dados pela rede quando houver uma exceção na leitura dos dados – Como não configuramos nenhum comportamento para <code>destination</code>, qualquer chamada a métodos desse objeto irá disparar uma exceção.</p>
<p>Digamos agora que gostaríamos de testar o comportamento de Processor quando ocorrer um erro ao escrever pela rede. Neste caso, gostaríamos que uma exceção fosse lançada pelo próprio Processor, para notificar o erro.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="java" style="font-family:monospace;">   @Test<span style="color: #009900;">&#40;</span>expected<span style="color: #339933;">=</span>ProcessorException.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span>
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> testProcessWhenWriteFails<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #666666; font-style: italic;">// Criação dos mocks e configurando o comportamento esperado</span>
      Source source <span style="color: #339933;">=</span> EasyMock.<span style="color: #006633;">createMock</span><span style="color: #009900;">&#40;</span>Source.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      Destination destination <span style="color: #339933;">=</span> EasyMock.<span style="color: #006633;">createMock</span><span style="color: #009900;">&#40;</span>Destination.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #666666; font-style: italic;">// Especificando o disparo de uma exceção</span>
      EasyMock.<span style="color: #006633;">expect</span><span style="color: #009900;">&#40;</span>source.<span style="color: #006633;">read</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">andReturn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SeuEnium&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      destination.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SeuEnium&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      EasyMock.<span style="color: #006633;">expectLastCall</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">andThrow</span><span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">RuntimeException</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Erro na escrita&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      EasyMock.<span style="color: #006633;">replay</span><span style="color: #009900;">&#40;</span>source, destination<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #666666; font-style: italic;">// Testando a nossa &quot;unidade&quot;</span>
      Processor processor <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Processor<span style="color: #009900;">&#40;</span> source, destination <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      processor.<span style="color: #006633;">process</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Um outro ponto em que o EasyMock oferece flexibilidade é na verificação dos parâmetros passados para as chamadas ao mock. Por padrão, o EasyMock irá utilizar o <code>equals()</code> para verificar se o parâmetro fornecido é o mesmo que foi configurado como esperado. Porém, algumas vezes esse comportamento pode ser restritivo, e o EasyMock oferece formas para mudarmos a maneira como ele irá verificar os parâmetros.</p>
<p>Por exemplo, o no processor sabe interpretar o comando “[[Time]]”. Quando essa String é recebida, o processor envia pela rede o tempo em milissegundos atual. Da maneira como está implementado, o tempo enviado irá ser diferente a cada execução do teste. Há diversas maneiras de testar este tipo de comportamento, e a que vamos utilizar aqui não é a melhor delas, mas ela ilustra o conceito. Vamos utilizar um regexp para validar se foi enviado o tempo para o destino.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="java" style="font-family:monospace;">   @Test
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> testProcess2<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #666666; font-style: italic;">// Criação dos mocks e configurando o comportamento esperado</span>
      Source source <span style="color: #339933;">=</span> EasyMock.<span style="color: #006633;">createMock</span><span style="color: #009900;">&#40;</span>Source.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      Destination destination <span style="color: #339933;">=</span> EasyMock.<span style="color: #006633;">createMock</span><span style="color: #009900;">&#40;</span>Destination.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #666666; font-style: italic;">// Especificando o disparo de uma exceção</span>
      EasyMock.<span style="color: #006633;">expect</span><span style="color: #009900;">&#40;</span>source.<span style="color: #006633;">read</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">andReturn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;[[Time]]&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      destination.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span> EasyMock.<span style="color: #006633;">matches</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;time: <span style="color: #000099; font-weight: bold;">\\</span>d+&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      EasyMock.<span style="color: #006633;">replay</span><span style="color: #009900;">&#40;</span>source, destination<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #666666; font-style: italic;">// Testando a nossa &quot;unidade&quot;</span>
      Processor processor <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Processor<span style="color: #009900;">&#40;</span> source, destination <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      processor.<span style="color: #006633;">process</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Bom pessoal, essa foi uma introdução ao uso do EasyMock para facilitar testes de unidade. No próximo post, vamos dar uma olhada em um exemplo um pouco menos vago, e vamos ver como efetuar mock de classes realmente, e não somente de interfaces.</p>
<p>Um abraço.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.seuenium.com.br/2010/04/13/testes-unitarios-com-easymock-e-junit-introducao/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Novos recursos do Selenium Grid</title>
		<link>http://www.seuenium.com.br/2010/03/17/novos-recursos-do-selenium-grid/</link>
		<comments>http://www.seuenium.com.br/2010/03/17/novos-recursos-do-selenium-grid/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 03:49:35 +0000</pubDate>
		<dc:creator><![CDATA[Enium]]></dc:creator>
				<category><![CDATA[paralelizacao]]></category>
		<category><![CDATA[selenium]]></category>
		<category><![CDATA[selenium grid]]></category>

		<guid isPermaLink="false">http://www.seuenium.com.br/?p=225</guid>
		<description><![CDATA[Saiu ontem a versão 1.0.5 do Selenium Grid, e com ela veio uma das funcionalidades mais esperadas: o gerenciamento dos Remote Controls conectados ao hub. Antes, se um Remote Control (RC) estivesse fora por algum motivo inesperado, ele continuava disponível no hub, o que fazia com que se algum cliente tentasse se conectar a esse [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Saiu ontem a versão <a href="http://selenium-grid.seleniumhq.org/download.html">1.0.5</a> do Selenium Grid, e com ela veio uma das funcionalidades mais esperadas: o gerenciamento dos Remote Controls conectados ao hub.</p>
<p>Antes, se um Remote Control (RC) estivesse fora por algum motivo inesperado, ele continuava disponível no hub, o que fazia com que se algum cliente tentasse se conectar a esse RC ele receberia um erro.</p>
<p>Agora, se um RC está fora do ar, ele sai automaticamente da lista de RCs disponíveis. Essa retirada pode ocorrer por três diferentes motivos:</p>
<ul>
<li>Se um cliente solicita uma sessão ao Hub e ao tentar reservar um RC, esse RC está indisponível</li>
<li>Se o RC não responder a uma chamada periódica do hub para verficar se o RC está vivo. Esse mecanismo se chama hearbeat mechanism, que traduzindo é uma checagem do batimento cardíaco. A frequência dessa checagem é de 3 minutos. Você pode alterar esse valor no grid_configuration.yml usando a propriedade remoteControlPollingIntervalInSeconds</li>
<li>Se uma sessão do RC está idle por mais de um tempo configurável. O valor default é a cada 5 minutos e você pode alterar isso no grid_configuration.yml usando a propriedade sessionMaxIdleTimeInSeconds</li>
</ul>
<p>Outro cenário que poderia ocorrer e que foi corrigido é se você tivesse que reiniciar o hub, você perderia todos os RCs conectados a ele. Foi criada uma configuração para que cada RC pingue o hub a cada X segundos configuráveis. Com isso você pode reiniciar o hub e é só uma questão de segundos até que todos os RCs disponíveis voltem a ficar disponíveis para serem usados. A frequência dessa checagem é a cada 30 segundos, mas você pode alterar isso ao iniciar o RC:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">ant <span style="color: #660033;">-DhubPollerIntervalInSeconds</span>=<span style="color: #000000;">120</span> launch-remote-control</pre></td></tr></table></div>

<p>É claro que todas essas checagens consomem recursos da máquina e da rede, mas vale muito a pena, já que antes não havia nenhum gerenciamento e era uma dor de cabeça quando você tinha algum problema de RCs indisponíveis ou travados.</p>
<p>Para mais informações leia <a href="http://selenium-grid.seleniumhq.org/self-healing.html">essa</a> documentação em inglês.</p>
<p>Outra notícia que saiu, é que o mantenedor do projeto opensource do Selenium Grid irá mudar. O desenvolvedor atual está sem tempo e sem prioridades para manter o projeto e está em busca de um sucessor. Para ler mais sobre isso acesse <a href="http://ph7spot.com/blog/selenium-grid-needs-a-new-maintainer">aqui</a>.</p>
<p>Até a próxima.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.seuenium.com.br/2010/03/17/novos-recursos-do-selenium-grid/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
