Testando aplicações web com Selenium

Por Odracir Antunes Júnior

Creio que boa parte dos desenvolvedores sabe da importância dos testes automatizados como ferramenta indispensável no desenvolvimento de software. Mesmo assim, para deixar as coisas ainda mais claras, gostaria de compartilhar uma experiência que tive com meus amigos em um projeto recente.

Estavamos trabalhando em um projeto de produto genérico, que serviria para várias empresas. Conseguimos um primeiro cliente que, obviamente, solicitou várias adequações para que o produto pudesse se utilizado por ele. Algum tempo depois tínhamos mais dois clientes além daquele inicial. Um deles pretendia utilizar apenas um sub-conjunto do produto original, e outro precisava de mudanças que eram incompatíveis com os outros dois.

A gestão da configuração do projeto se tornava cada vez mais complexa. Precisávamos atuar em frentes diferentes, para atender às necessidades dos clientes. Tínhamos que implementar as novas funcionalidades, porém sem quebrar o que já existia. Pra variar, acabamos atrasando. E os novos prazos estavam ficando cada vez mais apertados. Algumas vezes nós chegamos à entregar versões preliminares para homologação, com bugs em funcionalidades que já tinham sido testadas e aprovadas em versões anteriores. Isto nos causava um grande desgaste perante o cliente, e era preciso garantir a qualidade do que estava sendo entregue.

Tínhamos uma equipe de testes que também estava sobrecarregada, pois quanto mais complexos se tornavam os produtos, maiores eram as dificuldades na simulação dos cenários diferentes para os testes. Foi definido um “Smoke Test“, com as funcionalidades essenciais do produto que eram comuns entre os clientes. No meio da correria, depois de um refactoring crítico na infraestrutura do projeto, eu tive que testar manualmente a aplicação. Fiquei 4 dias testando e mal passei de 40% da cobertura básica!

Passada aquela correria, começamos a automatizar o processo de “Smoke Test” tanto quanto possível. Já sabíamos que muitas outras correria ainda nos esperavem num futuro não muito distante!

Boa parte das aplicações desenvolvidas últimamente são aplicações WEB, e portanto também é fundamental poder fazer testes através do browser, como se fosse um usuário comum operando o sistema. Obviamente isto não exime o desenvolvedor de implementar os testes unitários. Os testes através da camada web devem ser um complemento aos testes mais básicos.

O Selenium é uma ferramenta de para testes de aplicações WEB, distribuído sob a “Apache License, Version 2.0“. Temos os seguintes produtos, e modos de uso do Selenium.

 

Selenium Core – (Modo direto)

Os testes são efetuados diretamente através do browser. As páginas de teste devem estar hospedadas no mesmo servidor que o programa/site a ser testado. Esta restrição/característica é função da segurança relativa à mesma origem requerida pelo javascript.

Vantagens:
  • Suporte para todos os browsers
Desvantagens:
  • É necessário a instalação remota no servidor.
  • Possui algumas limitações para testes mais complexos.
  • Pode ter um comportamento irregular quando se testam páginas com ajax, onde é necessário um controle maior do tempo, e/ou seqüencia de eventos. Este comportamento é altamente dependente do “engine” java script do browser. Dependendo do caso, às vezes pode apresentar falsos erros em função da priorização das atividades, já que tando “quem testa” quanto “quem é testado” estão sendo executados sob o mesmo “engine” java script, e comportamentos concorrentes podem não ser tão previsíveis assim …

Selenium IDE – (Modo indireto – Plugin no browser)

Os testes são efetuados através de um plugin instalado no FireFox. Este plugin é um ambiente integrado de desenvolvimento. Permite gravar a navegação do usuário, e depois repeti-la à titulo de teste. Também permite exportar os testes gravados em outros formatos. (Maiores explicações adiante…)

Vantagens:
  • A instalação é local e simples.
  • É muito fácil de usar.
  • Permite gravar sessões de teste para uso posterior.
  • Permite exportar as sessões de teste como arquivos fonte Java, C#, Perl, PHP, Python e Ruby, que podem ser usados pelo Selenium RC.
  • Excelente para quem inicia o uso do Selenium.
  • Não é preciso saber programar.
Desvantagens:
  • Funciona como plugin apenas no FireFox.
  • Possui algumas limitações para testes mais complexos.
  • Pode apresentar o mesmo comportamento irregular relatado no item Selenuim Core. (colocar link local para #L1)

Selenium RC – (Modo indireto – Programa de teste + Proxy)

Os testes são efetuados através de um programa, que comanda o browser através de um proxy. Este programa pode ser escrito em Java, C#, Perl, PHP, Python e Ruby.

Vantagens:

  • Permite o uso de verdadeiras linguagens de programação.
  • Permite um controle muito mais apurado do tempo, seqüencia de eventos, etc. …
  • É possível importar os testes gerados pelo Selenium IDE.
  • Muito mais flexível e poderoso. Pode evoluir até para grandes suítes de testes, integração contínua, geração de relatórios . Como o programa está nas suas mãos você pode fazer o que quiser!

Desvantagens:

  • A instalação e configuração do ambiente é um pouco mais trabalhosa.
  • É necessário saber programar.
  • Pode ser mais complicado escrever os testes à partir do “zero”.

Qual ferramenta/modo eu devo usar ?

Além das informações listadas aqui, gostaríamos de sugerir a seguinte abordagem híbrida:

  • Instale o Selenium IDE e crie os seus testes básicos.
  • Exporte esses testes como programas (java, por exemplo).
  • Crie um projeto com as suítes de teste para uso com o jUnit.
  • Faça um refactoring nas classes geradas pelo Selenium IDE, pois o código gerado tem muita redundância.
  • Melhor ainda seria arrumar o código para ficar simples como uma mini “DSL” (Links #9 e #10), mais adequada para a sua aplicação, com chamadas de mais alto nível.

Depois de que automatizamos uma parte dos testes, aquilo que eu levei 4 dias era feito em apenas 20 minutos! Uma cobertura mais abrangente e confiável! A tranquilidade e a segurança que temos depois que os testes passam após um “refactoring”, ou mesmo antes de uma entrega do sistema para o cliente, é algo que não tem preço!

Moral da história: O tempo utilizado na elaboração de testes automatizados não é um tempo “gasto”. Na verdade é um tempo “investido”!

[Odracir Antunes Júnior é Analista de Sistemas com mais de 20 anos de experiência de desenvolvimento de sistemas em C, C++ e Java]

  • Leonardo Garcia
    Muito interessante isso. Alguém já viu algum framework parecido para aplicações não-web?
  • Muito interessante isso. Alguém já viu algum framework parecido para aplicações não-web?
  • Pedro
    Olá Odracir, Bacana seu texto, principalmente por falar das limitações, já que isso não é muito dito nos sítios das ferramentas. Gostaria de utilizar seus conhecimentos para me auxiliar em uma dúvida: estou tentando testar uma aplicação web, que possui ajax. Essa aplicação possui um campo texto que tem o recurso de autocomplete com dados vindos de uma tabela, de forma dinamica. Acontece que exijo o clique no popup gerado dinamicamente, para que seja inserido o id do objeto selecionado na pagina. Problema: o Selenium não registra esse clique, e somente colocando para digitar o texto não resolve meu problema, pois o clique em cima do popup é obrigatório para inserir o id do objeto na página. Pergunta: você teria alguma sugestão para mim sobre isso?
  • Olá Odracir,

    Bacana seu texto, principalmente por falar das limitações, já que isso não é muito dito nos sítios das ferramentas.

    Gostaria de utilizar seus conhecimentos para me auxiliar em uma dúvida: estou tentando testar uma aplicação web, que possui ajax. Essa aplicação possui um campo texto que tem o recurso de autocomplete com dados vindos de uma tabela, de forma dinamica. Acontece que exijo o clique no popup gerado dinamicamente, para que seja inserido o id do objeto selecionado na pagina.

    Problema: o Selenium não registra esse clique, e somente colocando para digitar o texto não resolve meu problema, pois o clique em cima do popup é obrigatório para inserir o id do objeto na página.

    Pergunta: você teria alguma sugestão para mim sobre isso?
  • Luiz J
    Estou fazendo um projeto de pesquisa sobre testes automatizados para aplicações web, se vcs puderem me passar alguma dica sobre esse tema. Desde já agradeço. Um grade abraço.
  • Luiz J
    Estou fazendo um projeto de pesquisa sobre testes automatizados para aplicações web, se vcs puderem me passar alguma dica sobre esse tema. Desde já agradeço.

    Um grade abraço.
  • Miguel Galves
    Luis, o post acima com sua enorme quantidade de links já não serve como dica sobre o tema?
  • Raphael
    Miguel, não deu pra ver que o cara tá querendo que você faça a lição de casa dele, também?
  • Miguel Galves
    Luis, o post acima com sua enorme quantidade de links já não serve como dica sobre o tema?
  • Raphael
    Miguel, não deu pra ver que o cara tá querendo que você faça a lição de casa dele, também?
  • Marco Ivan

    Instalei o Selenium IDE e gostei. Mas preciso fazer uns testes mais complexos, vou tentar utilizar o Selenium Core Não estou conseguindo instalar, fiz download, mas não está claro no site da Selenium como instalar, você poderia me dar umas Dicas? Desde já agradeço.

  • Marco Ivan

    Instalei o Selenium IDE e gostei.
    Mas preciso fazer uns testes mais complexos, vou tentar utilizar o Selenium Core
    Não estou conseguindo instalar, fiz download, mas não está claro no site da Selenium como instalar, você poderia me dar umas Dicas?
    Desde já agradeço.

  • Miguel Galves

    Marco, segue a resposta do nosso "expert" em Selenium e autor do texto, Odracir:


    Olá Marco!


    Como você disse que precisa fazer uns testes mais complexos, eu gostaria de sugerir o seguinte:


    1) Baixe o Selenium Remote Control (RC), pois ele já contém o Selenim Core que será usado pelo RC...
    http://seleniumhq.org/download/
    Apesar de ser a versão 1.0 beta 2 ela é bem estável.


    2) Com o Selenium Remote Control, você pode usar uma linguagem de
    programação "decente" (Ruby, Python, Java, etc...); assim será
    possível implementar a sua lógica de testes de uma forma mais
    aprimorada.
    Para maiores detalhes, acesse: http://seleniumhq.org/documentation/remote-cont...>

    3) Se você estiver usando java (o que é mais comum nas empresas ultimamente), acesse o link:
    http://seleniumhq.org/documentation/remote-cont...
    e baixe o arquivo:
    http://seleniumhq.org/documentation/remote-cont...>

    4) Use os exemplos, modifique-os até se sentir mais à vontade, compreendendo como tudo funciona.
    Lembre-se que é necessário ter o servidor do selenium rodando em um outro processo, enquanto os seus testes são executados.
    Vá para o diretório: .../selenium-remote-control-1.0-beta-2/selenium-server-1.0-beta-2/
    Execute: java -jar selenium-server.jar
    Para maiores informações: java -jar selenium-server.jar --help


    5) Resista à tentação de sair codificando imediatmente! :)
    (Primeiro o planejamento, depois a execução ...)


    6) Se você tem acesso aos fontes da aplicação que está sendo testada, o ideal é garantir que todos os elementos que serão manipulados possuam um "id" para serem endereçados pelos testes. Evite acessa-los através da posição, use sempre o id/nome.


    7) Crie classes que representam as suas telas.


    8) Crie convenções que possam ser utilizadas em todas as telas.
    Por exemplo: Todos os botões possuem um id composto pelo prefixo "id" + o texto do botão;
    assim em todas as telas o botão "Gravar" sempre terá o id="botao
    gravar", e assim por diante...
    Coloque todo este comportamento "comum" numa superclasse comum à todas as telas.


    9) Cuidado com temporização. Às vezes é necessário colocar alguns "delays" nos testes após um clique ou evento
    qualquer, para dar tempo de o javascript rodar no browser a atualizar a condição que você espera.
    O mesmo vale pro "Ajax", sincronize as mudanças de estado.


    10) Com o tempo, você vai acabar criando praticamente uma DSL para os seus testes/domínio, desta forma será muito mais fácil implementar novos testes e manter os anteriores. Este é um investimento que vale à pena.


    Se as dúvidas persistirem, indique com mais detalhes o problema observado e o ambiente que você está usando.


    Boa Sorte!


    Odracir.

  • Miguel Galves

    Marco, segue a resposta do nosso "expert" em Selenium e autor do texto, Odracir:

    Olá Marco!

    Como você disse que precisa fazer uns testes mais complexos, eu gostaria de sugerir o seguinte:

    1) Baixe o Selenium Remote Control (RC), pois ele j&aacute; cont&eacute;m o Selenim Core que ser&aacute; usado pelo RC... <a href="http://seleniumhq.org/download/" target="_blank">http://seleniumhq.org/download/ Apesar de ser a vers&atilde;o 1.0 beta 2 ela &eacute; bem est&aacute;vel.

    2) Com o Selenium Remote Control, voc&ecirc; pode usar uma linguagem de programa&ccedil;&atilde;o &quot;decente&quot; (Ruby, Python, Java, etc...); assim ser&aacute; poss&iacute;vel implementar a sua l&oacute;gica de testes de uma forma mais aprimorada. Para maiores detalhes, acesse: <a href="http://seleniumhq.org/documentation/remote-control/

    " target="_blank"><a href="http://seleniumhq.org/documentation/remote-control/

    " target="_blank">http://seleniumhq.org/documentation/remote-control/

    3) Se voc&ecirc; estiver usando java (o que &eacute; mais comum nas empresas ultimamente), acesse o link: <a href="http://seleniumhq.org/documentation/remote-contro..." target="_blank">http://seleniumhq.org/documentation/remote-contro... e baixe o arquivo: <a href="http://seleniumhq.org/documentation/remote-control/languages/selenium-java-example-for-newbies.zip

    " target="_blank"><a href="http://seleniumhq.org/documentation/remote-control/languages/selenium-java-example-for-newbies.zip

    " target="_blank">http://seleniumhq.org/documentation/remote-control/languages/selenium-java-example-for-newbies.zip

    4) Use os exemplos, modifique-os at&eacute; se sentir mais &agrave; vontade, compreendendo como tudo funciona. Lembre-se que &eacute; necess&aacute;rio ter o servidor do selenium rodando em um outro processo, enquanto os seus testes s&atilde;o executados. V&aacute; para o diret&oacute;rio: .../selenium-remote-control-1.0-beta-2/selenium-server-1.0-beta-2/ Execute: java -jar selenium-server.jar Para maiores informa&ccedil;&otilde;es: java -jar selenium-server.jar --help

    5) Resista &agrave; tenta&ccedil;&atilde;o de sair codificando imediatmente! :) (Primeiro o planejamento, depois a execu&ccedil;&atilde;o ...)

    6) Se voc&ecirc; tem acesso aos fontes da aplica&ccedil;&atilde;o que est&aacute; sendo testada, o ideal &eacute; garantir que todos os elementos que ser&atilde;o manipulados possuam um &quot;id&quot; para serem endere&ccedil;ados pelos testes. Evite acessa-los atrav&eacute;s da posi&ccedil;&atilde;o, use sempre o id/nome.

    7) Crie classes que representam as suas telas.

    8) Crie conven&ccedil;&otilde;es que possam ser utilizadas em todas as telas. Por exemplo: Todos os bot&otilde;es possuem um id composto pelo prefixo &quot;id&quot; + o texto do bot&atilde;o; assim em todas as telas o bot&atilde;o &quot;Gravar&quot; sempre ter&aacute; o id=&quot;botaogravar&quot;, e assim por diante... Coloque todo este comportamento &quot;comum&quot; numa superclasse comum &agrave; todas as telas.

    9) Cuidado com temporiza&ccedil;&atilde;o. &Agrave;s vezes &eacute; necess&aacute;rio colocar alguns &quot;delays&quot; nos testes ap&oacute;s um clique ou evento qualquer, para dar tempo de o javascript rodar no browser a atualizar a condi&ccedil;&atilde;o que voc&ecirc; espera. O mesmo vale pro &quot;Ajax&quot;, sincronize as mudan&ccedil;as de estado.

    10) Com o tempo, voc&ecirc; vai acabar criando praticamente uma DSL para os seus testes/dom&iacute;nio, desta forma ser&aacute; muito mais f&aacute;cil implementar novos testes e manter os anteriores. Este &eacute; um investimento que vale &agrave; pena.

    Se as d&uacute;vidas persistirem, indique com mais detalhes o problema observado e o ambiente que voc&ecirc; est&aacute; usando.

    Boa Sorte!

    Odracir.

  • vania

    Como eu posso fazer, para que o arquivo que eu salvei no Selenium IDE funcione no Safari.

  • vania

    Como eu posso fazer, para que o arquivo que eu salvei no Selenium IDE funcione no Safari.

  • Miguel Galves

    Vania,

    o Selenium n&atilde;o roda no Safari.

    Veja em <a href="http://seleniumhq.org/about/platforms.html#browsers

    " target="_blank"><a href="http://seleniumhq.org/about/platforms.html#browsers

    " target="_blank">http://seleniumhq.org/about/platforms.html#browsers

    Firefox 3 Record and playback tests Firefox 2 Record and playback tests IE 8b1 not supported ? ? IE 7 not supported Safari 3 not supported
    Safari 2 not supported
    Opera 9 not supported
    Opera 8 not supported

  • Miguel Galves

    Vania,


    o Selenium não roda no Safari.


    Veja em http://seleniumhq.org/about/platforms.html#brow...>

    Firefox 3 Record and playback tests
    Firefox 2 Record and playback tests
    IE 8b1 not supported ? ?
    IE 7 not supported
    Safari 3 not supported

    Safari 2 not supported


    Opera 9 not supported


    Opera 8 not supported

  • Danilo

    Ol&aacute;,

    minha tela tem um input que precisa receber um &quot;code&quot; obtido pela abertura de um popup. Ent&atilde;o, o usu&aacute;rio clica num bot&atilde;o, aparece nova janela (popup) com uma tabela. O Usu&aacute;rio seleciona uma c&eacute;lula/linha da tabela deste popup e clica no bot&atilde;o adicionar. Da&iacute; o popup fecha e a informa&ccedil;&atilde;o (value) daquela linha &eacute; passada como &quot;code&quot; para o input da outra tela. Tudo funciona perfeitamente. O Selenium chega a abrir o popup mas acusa o erro de n&atilde;o encontrar o &quot;windows&quot;: n&atilde;o consegue selecionar a nova janela que &eacute; aberta. Bem, tentei milh&otilde;es de alternativas. Utilizo Selenium_Ide e trabalho com o formato HTML do Selenium. Ser&aacute; que trabalhar assim limita os recursos da ferramenta?

    obrigado desde j&aacute; ! parab&eacute;ns pela mat&eacute;ria. Abra&ccedil;o

  • Olá,


    minha tela tem um input que precisa receber um "code" obtido pela abertura de um popup.
    Então, o usuário clica num botão, aparece nova janela (popup) com uma tabela. O Usuário seleciona uma célula/linha da tabela deste popup e clica no botão adicionar. Daí o popup fecha e a informação (value) daquela linha é passada como "code" para o input da outra tela.
    Tudo funciona perfeitamente. O Selenium chega a abrir o popup mas acusa o erro de não encontrar o "windows": não consegue selecionar a nova janela que é aberta.
    Bem, tentei milhões de alternativas. Utilizo Selenium_Ide e trabalho com o formato HTML do Selenium. Será que trabalhar assim limita os recursos da ferramenta?


    obrigado desde já !
    parabéns pela matéria.
    Abraço

  • Odracir Antunes Jr.

    Danilo,

    Por favor, abra a seguinte url: <a href="http://seleniumhq.org/projects/core/reference.html

    " target="_blank"><a href="http://seleniumhq.org/projects/core/reference.html

    " target="_blank">http://seleniumhq.org/projects/core/reference.html

    Procure por &quot;selectWindow ( windowID )&quot;

    //--------------------------------------------------

    Tamb&eacute;m existe a seguine extens&atilde;o (que eu n&atilde;o usei): <a href="http://wiki.openqa.org/display/SEL/selectWindow" target="_blank">http://wiki.openqa.org/display/SEL/selectWindow extension

    //--------------------------------------------------

    Acredito que a resposta dada para o &quot;Marco Ivan&quot;, em Abril de 2009 tamb&eacute;m se aplica &agrave; voc&ecirc;, principalmente o item #9, que fala sobre temporiza&ccedil;&atilde;o.

    Conforme a navega&ccedil;&atilde;o e os testes v&atilde;o ficando cada vez mais complexos, se voc&ecirc; usar apenas o Selenium IDE, existe a chance de que n&atilde;o fiquem muito confiaveis. Isto pode ocorrer em fun&ccedil;&atilde;o de problemas de temporiza&ccedil;&atilde;o.

    Usar uma linguagem de programa&ccedil;&atilde;o (Java/Ruby/Python/...) junto com o Selenuim-RC trar&aacute; muitos benef&iacute;cios, principalmente quanto ao controle necess&aacute;rio para se fazer algo robusto e confi&aacute;vel.

    Boa Sorte!

    Odracir.

  • Odracir Antunes Jr.

    Danilo,


    Por favor, abra a seguinte url:
    http://seleniumhq.org/projects/core/reference.h...>

    Procure por "selectWindow ( windowID )"


    //--------------------------------------------------


    Também existe a seguine extensão (que eu não usei):
    http://wiki.openqa.org/display/SEL/selectWindow extension


    //--------------------------------------------------


    Acredito que a resposta dada para o "Marco Ivan", em Abril de 2009
    também se aplica à você, principalmente o item #9, que fala
    sobre temporização.


    Conforme a navegação e os testes vão ficando cada vez mais
    complexos, se você usar apenas o Selenium IDE, existe a
    chance de que não fiquem muito confiaveis.
    Isto pode ocorrer em função de problemas de temporização.


    Usar uma linguagem de programação (Java/Ruby/Python/...)
    junto com o Selenuim-RC trará muitos benefícios, principalmente
    quanto ao controle necessário para se fazer algo robusto e confiável.


    Boa Sorte!


    Odracir.

  • Ribas

    Boa tarde! Estou com dificuldades para gerar o meu test, devido ao fato que alguns dos campos de preenchimento precisa de um delay maior. Assim eu n&atilde;o estou conseguindo configurar o delay no Selenium-IDE e n&atilde;o existe comando de delay na ferramenta que estou utilizando, algu&eacute;m sabe algo sobre ?

    obrigado desde j&aacute; ! parab&eacute;ns pela mat&eacute;ria.

  • Ribas

    Boa tarde!
    Estou com dificuldades para gerar o meu test, devido ao fato que alguns dos campos de preenchimento precisa de um delay maior. Assim eu não estou conseguindo configurar o delay no Selenium-IDE e não existe comando de delay na ferramenta que estou utilizando, alguém sabe algo sobre ?


    obrigado desde já ! parabéns pela matéria.

  • Miguel Galves

    O Selenium IDE é uma ferramenta muito simples que não permite um controle mais apurado dos testes. Para ter um maior controle, utilize o Selenium RC com alguma linguagem de programação decente (nada de VB!).

  • Miguel Galves

    O Selenium IDE &eacute; uma ferramenta muito simples que n&atilde;o permite um controle mais apurado dos testes. Para ter um maior controle, utilize o Selenium RC com alguma linguagem de programa&ccedil;&atilde;o decente (nada de VB!).

blog comments powered by Disqus

Switch to our mobile site