Você está na página 1de 25

Captulo

2
Automao de testes funcionais com o Selenium
Ismayle de Sousa Santos, Pedro de Alcntara dos Santos Neto

Abstract The software testing is fundamental in software quality assurance. The testing can be split according with its objective. An important testing objective is the check of the product behavior. This kind of test is known as functional testing. However, the systematic execution of testing requires time and effort. Many times this activity is ignored. It is important the use os testing tools in order to automate this activity. Selenium is an example of this. It is free of charge and it can export the generated tests for a great variety of technologies, like PHP, Java and Ruby. This work presents the basic concept related to functional testing and describes how to use Selenium integrated to Java. The work also presents good practices related to software testing that can increase productivity and reusability. Resumo O teste de software um elemento fundamental na garantia da qualidade. Os testes podem ser divididos de acordo com seu objetivo. O teste funcional, por exemplo, tem por objetivo vericar o comportamento do produto desenvolvido. Contudo, a realizao do teste, de forma sistemtica, exige tempo e recursos, sendo por muitas vezes desconsiderado. Assim, importante que os testadores utilizem ferramentas que automatizem de alguma forma essa atividade. O Selenium um exemplo de ferramenta que auxilia essa atividade. Ela tem se destacado atualmente por ser gratuita e pela possibilidade de exportao dos testes criados a partir do seu uso para as mais variadas tecnologias, como PHP, Ruby ou Java. Este trabalho apresenta conceitos bsicos do teste funcional, alm de descrever como utilizar o Selenium integrado linguagem Java. A partir dessa integrao sero apresentados boas prticas que podem ser aplicadas ao desenvolvimento de testes funcionais, favorecendo produtividade e reusabilidade dos testes.

2.1. Introduo
No cenrio atual, em que softwares esto presentes nas diversas atividades do cotidiano e no qual os sistemas esto cada vez mais voltados para web, a qualidade exigida pelos

clientes sobre os softwares desenvolvidos se torna cada vez maior. Uma das formas mais utilizadas e recomendadas para se garantir a qualidade de software se d a partir da realizao de testes, visto que testes podem ser usados para revelar a presena de defeitos [Myers 2004]. O teste de software pode ser denido como a vericao dinmica do funcionamento de um programa, utilizando um conjunto nito de casos de teste, adequadamente escolhido dentro de um domnio de execuo, em geral innito, contra seu comportamento esperado [Abran et al. 2004]. Assim, um teste, de maneira geral, envolve a execuo de um programa com a aplicao de certos dados de entrada, examinando suas sadas, vericando se elas combinam com o esperado e estabelecido nas suas especicaes. importante ressaltar que os testes no garantem que o software no contm erros, pois para isso seria necessrio testar todas as entradas vlidas, o que geralmente impossvel. Ao realizarmos testes durante o desenvolvimento de software adicionamos valor ao produto, uma vez que o teste corretamente executado tende a descobrir defeitos, que devem ser corrigidos, aumentando assim a qualidade e conabilidade de um sistema [Pressman 2006]. A falta de testes pode fazer com que o software desenvolvido seja entregue com defeitos, o que pode trazer muitos problemas, como por exemplo, prejuzos nanceiros, danos fsicos e at perda de vidas humanas, alm de prejudicar a imagem da equipe desenvolvedora perante a empresa e desta para com o cliente. Alm disso, o custo de no testar muito maior, j que a identicao de erros se torna mais difcil e onerosa nos estgios nais do projeto e os custos para reparao crescem em uma escala elevada com o passar do tempo [Patton 2006]. Existem vrios tipos de testes, cada um voltado para um determinado objetivo. Testes podem ser criados para vericar se as especicaes funcionais esto corretamente implementadas (teste funcional), podendo ser executados diretamente pelos usurios nais para decidir sobre a aceitao do produto desenvolvido (teste de aceitao); podem vericar se o desempenho do software est dentro do aceitvel (teste de desempenho); se ele funciona sob condies anormais de demanda (teste de estresse); se o software adequado ao uso (teste de usabilidade); testes podem ter como objetivo mostrar que o software continua funcionando aps alguma alterao (teste de regresso); se os procedimentos de instalao so corretos e bem documentados (teste de instalao); para vericar o seu nvel de segurana (teste de segurana); ou para vericar seu funcionamento, a partir da liberao do produto para pequenos grupos de usurios trabalhando em um ambiente controlado (teste alfa) ou em um ambiente no controlado (teste beta) [Neto et al. 2007]. Os testes, entretanto, requerem tempo, conhecimento, planejamento, infraestrutura e pessoal especializado, sendo, portanto, uma atividade onerosa [Myers 2004]. Dependendo do tipo de sistema a ser desenvolvido, ela pode ser responsvel por mais de 50% dos custos [Pressman 2006]. Para se ter uma idia dos custos envolvidos, de acordo com um relatrio publicado pelo NIST [NIST 2002], U$59.500.000.000,00 o valor relativo ao custo de falhas em softwares desenvolvidos nos Estados Unidos, apenas em 2002. Esse mesmo relatrio estima que mais de 37% desse custo (U$22.200.000.000,00) poderia ter sido eliminado se a infraestrutura para teste fosse melhorada. Uma forma de reduzir os custos da atividade de testes a partir da automao dos testes usando alguma ferramenta apropriada. No caso dos testes funcionais, a maioria

das ferramentas disponveis se baseia na gravao de todas as aes executadas por um usurio, gerando um script 1 com os passos realizados. Dessa forma, as aes gravadas podem ser facilmente re-executadas, permitindo assim a automao do teste. Alm disso, o script gerado pode ser facilmente alterado, permitindo modicaes nos testes gravados sem a necessidade de re-execuo do software e nova captura [Neto et al. 2007]. Como exemplo desse tipo de ferramenta temos o Selenium-IDE [OpenQA b], que pode ser usado para automatizar testes funcionais em aplicaes web. Neste captulo sero apresentados alguns conceitos relacionados aos testes de softwares, em especial aos testes funcionais. Tambm sero apresentados os princpios gerais acerca dos testes e a utilizao da ferramenta Selenium integrado com a linguagem de programao Java, a partir do uso do framework JUnit [Gamma and Beck ]. Alm disso, ser apresentada a ferramenta Bromine [OpenQA a], que foi criada para o gerenciamento de testes feitos com o Selenium.

2.2. Conceitos Bsicos


Antes de tudo, preciso diferenciar trs termos muito ligados aos testes de sofwtare: erro, defeito (bug) e falha. Um erro ocorre devido a uma ao humana que produz um resultado incorreto [IEEE 1990]; um defeito em um componente ou sistema pode fazer este falhar na execuo na execuo de alguma funcionalidade; e uma falha corresponde a uma discrepncia entre o resultado ou comportamento atual (identicado durante a execuo dos testes) e o comportamento ou resultado esperado (denido nas especicaes ou requisitos)[Spillner et al. 2006]. Ou seja, o ser humano est sujeito a cometer um erro (engano), que produz um defeito no cdigo. Se um defeito no cdigo for executado, o sistema falhar ao tentar fazer o que deveria (ou o que no deveria), causando possivelmente uma falha [Mller et al. 2007]. Tambm importante diferenciar teste de depurao. Testes podem demonstrar falhas que so causadas por defeitos. Depurao a tarefa de localizar e corrigir os defeitos [Spillner et al. 2006]. Assim, as responsabilidades de cada atividade so bem distintas: testadores testam e desenvolvedores depuram. Um caso de teste uma especicao de como um software deve ser testado. Essa especicao inclui os dados de teste, ou seja, as entradas e as sadas esperadas, e as condies sob as quais o teste deve ocorrer. O projeto de casos de teste um dos grandes desaos do processo de teste de software, e pode ser to desaador quanto o projeto do prprio software [Pressman 2006]. Como geralmente impossvel testar um programa exaustivamente, ou seja, testar todos os possveis casos, o conjunto de casos de teste deve ser o mais abrangente possvel levando em conta qual o sub-conjunto dos casos possveis tem maior probabilidade de exibir falhas. Um procedimento de teste uma especicao de uma seqncia de aes para execuo de um determinado teste. Alguns exemplos so um conjunto de passos a serem seguidos em uma interface grca, um conjunto de funes a serem chamadas ou uma seqncia de requisies de pgina para um sistema web. Quanto a construo dos testes, existem basicamente dois mtodos que podem ser
1 Conjunto

de instrues para um programa.

utilizados [Filho 2003]: (i) mtodo da caixa branca, que objetiva determinar defeitos na estrutura interna do produto, por meio do desenho de testes que exercitem sucientemente os possveis caminhos de execuo; e (ii) mtodo da caixa preta, que tem por objetivo determinar se os requisitos foram total ou parcialmente satisfeitos pelo produto sem levar em conta como ocorre o processamento.

2.3. Princpios dos testes


Burnstein [Burnstein 2003] dene princpios, considerando o domnio da engenharia de sofwtare, como sendo leis, regras ou doutrinas relativas a softwares, a maneira como so construdos e como eles se comportam. Assim, sempre que for implementar testes, o testador deve ter em mente os princpios gerais dos testes [Spillner et al. 2006]: Princpio 1: Testes demonstram a presena de defeitos, no a ausncia. O teste pode demonstrar a presena de defeitos, mas no pode provar que eles no existem. O teste reduz a probabilidade que os defeitos permaneam em um software, mas mesmo se nenhum defeito for encontrado, no prova que ele esteja perfeito. Princpio 2: Teste exaustivo impossvel. Testar todos os valores possveis para todas as entradas, efetuando todas as formas de combinao e levando em conta diferentes precondies geralmente impossvel. Na prtica, na maioria das vezes os softwares requerem nmeros astronomicamente altos de casos de testes. Assim, em vez do teste exaustivo, o testador deve levar em conta os riscos e prioridades do sistema sob teste para focar os casos dos testes. Princpio 3: A atividade de teste deve comear o mais cedo possvel. A atividade de teste deve comear o mais breve possvel no ciclo de desenvolvimento do software e deve ser focado em objetivos denidos. Princpio 4: Defeitos tendem a estar agrupados. Geralmente a maioria dos defeitos so encontrados em algumas partes do software sob teste, ou seja, muito pouco provvel que os defeitos estejam uniformemente distribudos pelo sofwtare. Princpio 5: O paradoxo do perticida. Pode ocorrer de um mesmo conjunto de testes que so repetidos vrias vezes no encontrarem novos defeitos aps um determinado momento. Para superar este paradoxo do pesticida, os casos de testes necessitam ser freqentemente revisados e atualizados. Um conjunto de testes novo e diferente precisa ser escrito para exercitar diferentes partes do software ou sistema com objetivo de aumentar a possibilidade de encontrar mais falhas. Princpio 6: Testes dependem do contexto. Os testes devem ser adaptados aos riscos e ambientes inerentes da aplicao. Softwares de segurana crtica, como por exemplo o do computador de bordo de aeronaves, so testados diferentemente de softwares do comrcio eletrnico Princpio 7: A iluso da ausncia de falhas. Encontrar e consertar defeitos no ajuda se o sistema construdo no atende s expectativas e necessidades dos usurios.

2.4. Testes funcionais de software


O teste funcional um teste para avaliar o quanto o comportamento observado do software est em conformidade com as especicaes [Abran et al. 2004]. Isso signica que esse teste baseado na anlise da especicao de funcionalidades do software testado [Spillner et al. 2006]. Assim, o teste funcional feito para vericar, por exemplo, se o cadastro de um novo usurio em um stio Web funciona conforme o esperado. Para implementar os testes de forma eciente e evitar a construo de casos de testes desnecessrios necessrio utilizar tcnicas especcas para projetar os casos de testes. A seguir sero apresentadas as duas principais tcnicas usadas para o desenho de testes funcionais: a particao de equivalncia e a anlise do valor limite. A partio de equivalncia um mtodo que divide o domnio de entrada em categorias de dados. Cada categoria agrupa dados que possuem as memas caractersticas e revelam uma classe de erros, permitindo assim, que casos de teste na mesma categoria sejam eliminados sem que se prejudique a cobertura dos testes [Filho 2003]. Em um programa de cadastro de um usurio, por exemplo, o ms do nascimento do usurio deve estar entre 1 e 12. Com isso, as possveis classes de equivalncia para essa entrada so: i) todos os valores inteiros menores que 1; ii) valores inteiros entre 1 e 12; e iii) valores inteiros maiores que 12. Para cada uma dessas classes, qualquer valor tem, potencialmente, a mesma capacidade de detectar erros, sendo dispensvel a execuo de vrios testes para valores pertencentes mesma classe de equivalncia. No necessrio, portanto, testar vrios nmeros negativos para vericar como a aplicao se comporta. Assim, um bom conjunto de teste para esse caso seria termos um valor menor que 1, um valor entre 1 e 12, e um valor maior que 12. O uso de outros valores seria desnecessrio, uma vez que todos os valores em uma classe de equivalncia deveriam ter o mesmo comportamento. Na Anlise de Valor-Limite os casos de teste so escolhidos prximo ou nas fronteiras dos domnios de entrada, uma vez que boa parte das falhas tendem a se concentrar prximo a esses valores. O emprego dessa tcnica deve ser complementar ao uso da partio de equivalncia. Assim, em vez de selecionar um elemento aleatrio de cada classe de equivalncia, selecionam-se os casos de teste nas extremidades de cada classe [Filho 2003]. Para utilizar a tcnica do Valor-Limite no exemplo anterior, devemos selecionar como valores representantes das parties, os valores que esto no limite entre uma classe e outra. Assim, para representar a partio de valores abaixo de 1 (um) utilizaramos 0 (zero); para representar valores entre 1 e 12 utilizaramos os nmeros 1 e 12; e o nmero 13 seria o escolhido para representar valores na partio acima de 12.

2.5. Testes manuais versus Testes automatizados


Um teste manual aquele em que o testador executa o software manualmente com base nas especicaes dos testes, as quais detalham os casos e procedimentos de testes. Os testes realizados dessa forma, em geral, so cansativos e de difcil repetio. J os testes automatizados, so aqueles feitos com auxilio de alguma ferramenta apropriada. Eles exigem mais tempo para implementar os testes, mas provem mais segurana na manuteno e permitem que os testes sejam executados a qualquer instante.

Antes de decidir em automatizar ou no os testes, preciso analisar a aplicao testada e quais testes sero contrudos. A principal razo para automao dos testes a necessidade de re-execuo dos mesmos. Supondo, por exemplo, que um testador projetou centenas de testes e optou por execut-los manualmente. Se em algum momento da execuo da bateria de testes2 for descoberto uma falha, ento os desenvolvedores devero ser avisados. Alm disso, dependendo da falha, a execuo dos testes restantes dever ser suspensa at que a mesma seja corrigida. Aps a correo, como existem grandes chances de que outras partes do software sejam afetadas, o testador ter que executar todos os testes novamente e novas falhas podem ser encontradas repedindo o ciclo. Em um caso tpico, existe a necessidade de se executar testes centenas e at milhares de vezes. Isso normalmente justica a automao dos testes. A automao de um conjunto de testes geralmente demanda bem mais esforo que sua execuo manual, mas quando automatizado, sua execuo bastante simples, se atendo a execuo de um script ou o clique de alguns botes [Neto et al. 2007]. Assim, em situaes como a descrita, automatizar os testes a melhor maneira de economizar tempo e dinheiro. Contudo, nem sempre vantajoso automatizar os testes. Existem situaes em que realizar os testes manualmente mais adequado. Se a interface de usurio da aplicao for mudar consideravelmente em um futuro prximo, por exemplo, ento qualquer automao que for feita vai precisar ser refeita. Alm disso, quando o software for simples e no houver tempo suciente, ou se for improvvel o reuso dos testes, ento o teste manual continua sendo uma opo a ser considerada.

2.6. A ferramenta Selenium


O Selenium um conjunto de ferramentas OpenSource3 que pode ser usada para criao de testes funcionais automatizados para aplicaes Web. Uma das suas vantagens a possibilidade de executar os testes em qualquer navegador com suporte a JavaScript4 . Alm disso, as ferramentas que compem o Selenium provem um rico conjunto de funes especcas para a implementao de testes, tais como: open: abre uma pgina usando uma URL5 que fornecida como parmetro; click/clickAndWait: executa o clique em um boto, link ou imagem; verifyTextPresent/assertTextPresent: verica a presena de um texto em qualquer lugar da pgina; verifyText/assertText: verica se um texto aparece em um determinado local; waitForPageToLoad : pausa uma execuo do teste at que uma nova pgina seja carregada. Esse comando chamado automaticamente pelos comandos com terminao AndWait;
2 Conjunto 3 Software

de testes. de cdigo aberto. 4 Linguagem de criao de scripts desenvolvida pela Netscape em 1995. 5 Acrnimo para Uniform Resource Locator.

type: entra com um valor em um determinado campo da pgina; select: seleciona um elemento dentre uma lista de opes. Atualmente as principais ferramentas que compem o Selenium so: SeleniumIDE, Selenium-RC e Selenium-GRID. O Selenium-IDE um ambiente de desenvolvimento integrado para construo de casos de testes. Ele opera como plug-in do FireFox e prov interfaces amigveis para o desenvolvimento e execuo de suites de testes (conjunto de testes). O Selenium-IDE uma ferramenta do tipo record-and-playback, ou seja, ela captura as aes executadas pelo testador e gera um script que permite a re-execuo das aes feitas, automatizando assim, o teste. Sua instalao simples: basta abrir o arquivo de instalao pelo Firefox. Apesar da facilidade de automao dos testes com o Selenium-IDE, algumas tarefas ainda no so simples para se executar com essa ferramenta. Ele no oferece, por exemplo, suporte para testes com interao ou que devem ser executados com base em uma determinadas condies. Para esses casos deve-se utilizar o Selenium RC (RemoteControl). Este possiblita uma maior exibilidade ao testador, permitindo a construo de lgicas de teste mais complexas, a partir do uso de uma linguagem de programao. Para isso, ele prov uma API (Application Programming Interface)6 e bibliotecas para cada uma das linguagens suportadas: HTML, Java, C#, Perl, PHP, Python, e Ruby. O Selenium-Grid permite distribuir os testes em mltiplas mquinas, reduzindo assim o tempo gasto na execuo de uma suite de testes. Ele ideal para escalonar grandes suites de testes ou suites de testes que devem ser executadas em mltiplos ambientes. O Selenium-Grid atua executando mltiplas instncias do Selenium-RC em paralelo de forma transparente, fazendo com que os testes no precisem se preocupar com a infraestrutura utilizada. Como mencionado anteriormente, o conjunto de comandos do Selenium permite realizar uma srie de aes necessrias para execuo de testes em pginas web, tais como, entrar com valores em campos da pgina, selecionar itens de uma lista de opes, clicar em botes, clicar em links e realizar asseres com base nos resultados exibidos da pgina. Os comandos que realizam essas aes so divididas em trs grupos: Actions: so comandos que geralmente causam uma mudana no estado da aplicao. Eles representam operaes realizadas pelo usurio durante a execuo de um sistema web, tais como o comando click que indica um clique em um determinado boto ou link. A maioria desses comandos pode conter o suxo AndWait, o que indica que a ao fez uma chamada ao servidor e que o Selenium deve esperar a pgina carregar para executar o prximo passo. Accessors: examinam o estado da aplicao e armazenam o resultado em variveis, como o comando storeTitle que armazena o titulo da pgina em uma varivel determinada por parmetro. Vale notar que as variveis criadas no Selenium podem ser acessadas de duas formas: ${nomeDaVarivel} ou javascriptstoredVars[nomeDaVarivel].
6 Um

conjunto de rotinas e padres estabelecidos para a utilizao das suas funcionalidades.

Assertions: so como os Accessors, mas vericam se o estado da aplicao est conforme o esperado. Todas as asseres do Selenium podem ser usadas de trs modos: assert, verify e waitFor. Para vericar a presena de um certo texto em um determinado local, por exemplo, pode-se usar o comando assertText, verifyText ou waitForText. Com o assert, se a vericao falhar o teste pra, enquanto que com o verify a ferramenta acusa a falha mas o teste continua executando. J no modo waitFor, que muito til para testar aplicaes com Ajax7 , o Selenium espera o texto aparecer para prosseguir a execuo. Quanto aos parmetros utilizados pelos comandos do Selenium, eles tipicamente so: i) uma identicao para algum elemento da pgina; ii) um texto para vericar se ele aparece na pgina ou para coloc-lo em algum campo da pgina. O nmero de parmetros usados varia de acordo com o comando. Alguns exigem dois parmetros, outros exigem somente um, e existem aqueles que no utilizam parmetros. A Figura 2.1 ilustra um script de teste no formato HTML8 feito com o SeleniumIDE. Nele pode-se perceber que no formato HTML cada comando representado como uma linha de uma tabela. Cada linha por sua vez dividida em trs clulas representando o comando, o alvo e o valor, nessa ordem. O script ilustrado nesta gura, por exemplo, formado por trs comandos: o comando open com apenas um parmetro, que representa a URL a ser acessada (alvo); o comando type, com dois parmetros, o primeiro representando o nome do campo a ter uma informao digitada (alvo) e o segundo contendo o texto que ser entrado no campo (valor); e o comando assertTextPresent, com um parmetro, indicando o texto (alvo) a ser procurado na pgina.

Figura 2.1. Script de teste do Selenium em HTML.

Nas prximas sub-sees sero apresentados o Selenium-IDE e a criao de testes automatizados com o Selenium-RC usando a linguagem Java e o framework JUnit. A Figura 2.2 ilustra a pgina web que ser utilizada como base para a maior parte dos scripts
7 Acrnimo 8 Acrnimo

de Asynchronous Javascript And XML. para HyperText Markup Language.

de testes que sero apresentados no decorrer do captulo. Essa pgina responsvel pelo cadastro de usurios e faz parte de um sistema de administrao de um stio que segue um modelo especco da UFPI.

Figura 2.2. Pgina Web que servir de base para os scripts de testes apresentados neste captulo.

2.6.1. Uma breve introduo ao Selenium-IDE O Selenium-IDE, ilustrado na Figura 2.3, um plug-in do FireFox que permite ao testador desenvolver e executar casos de testes sem a necessidade de conhecimentos em programao. Ele possui uma interface amigvel e exibe o script de teste como uma tabela, se tornando assim, ideal para aprender a sintaxe e o funcionamento do Selenium.

Figura 2.3. A ferramenta Selenium-IDE.

O menu Arquivo permite ao usurio criar, abrir ou salvar testes e suites de testes. O menu Editar contm as operaes para editar os casos de testes e o menu Opes permite mudar as conguraes da ferramenta, como por exemplo, o testador pode especicar o timeout (tempo limite que a ferramenta deve esperar por uma resposta) e qual linguagem (Html, Java, Ruby, etc.) ser usada para salvar os casos de testes. Logo abaixo do menu principal, pode ser especicada a UrlBase, que ser compartilhada por todos os testes, e tambm existem opes para controlar a execuo dos casos de testes, como por exemplo, a velocidade e a forma de execuo. A ferramenta contm um menu que exibido aps o clique ou seleo de um algum elemento da pgina atual. A Figura 2.4 exibe o resultado de um clique com o boto direito do mouse, sobre o texto Inserir Usurio, da pgina ilustrada na Figura 2.2. Nesse caso exibido um menu mostrando alguns comandos do Selenium, a maioria com o parmetro alvo pr-denido de acordo com o elemento selecionado (clicado).

Figura 2.4. Menu exibido ao clicar em algum elemento da pgina.

Comear a construir testes com o Selenium-IDE muito simples: basta abrir a ferramenta por meio da aba Ferramentas do FireFox e o Selenium-IDE j comea a gravar as aes que forem feitas. A Figura 2.5 ilustra o funcionamento da ferramenta, que monta o script de teste medida que aes vo sendo feitas pelo testador. Para encerrar a gravao basta clicar no boto situado nas proximidades no canto superior direito. O Selenium-IDE tambm prov exibilidade ao construir os testes. Conforme exibido na Figura 2.6 o testador pode modicar o comando (digitando ou selecionando algum dentre os exibidos por meio do drop-down destacado na gura), o alvo, o valor, e

Figura 2.5. Gravando testes com o Selenium-IDE.

no caso de dvidas ele pode consultar a API do Selenium na aba Reference, na qual a sintaxe do comando selecionado descrito. Alm disso, a ferramenta permite inserir comentrios, copiar/excluir/remover comandos, executar um nico comando por vez, denir onde deve comear e parar a execuo.

Figura 2.6. A) Visualizao da descrio dos comandos. B) Opes disponveis para alterar o script de teste.

A localizao dos elementos na pgina web, necessria para utilizar muitos dos comandos do Selenium (como o type), pode ser feita a partir de algum identicador,

do XPath9 do elemento, ou a partir do DOM10 . No caso de um campo ou formulrio, o elemento pode ser identicado por meio do seu nome ou identicador (id). Quando no h o atributo name ou id para o elemento desejado, este pode ser localizado usando-se xPath que inicia com //. A expresso //form[1], por exemplo, refere-se ao segundo formulrio da pgina (pois a identicao inicia do zero). Por m, os elementos da pgina tambm podem ser localizados a partir de expresses do tipo document.forms[0].elements[3], a qual se refere ao quarto elemento presente no primeiro formulrio da pgina. O Selenium-IDE tambm fornece meios para tornar os testes mais fceis de entender e manter. Supondo, por exemplo, que foram implementados 100 casos de testes, e que em todos eles necessrio fazer o login para acessar o sistema, ento, se para logar for preciso preencher os campos login e senha, todos os casos de testes iro se referir a esses dois elementos (identicados na pgina por login e senha). Agora, supondo que por algum motivo, como o uso de algum framework, o nome dos campos tenha que ser alterado para form:login e form:senha. Nesse caso, todas as referncias aos campos login e senha devem ser alterados para form:login e form:senha, respectivamente. Fazer essa alterao manualmente certamente exigiria muito tempo e toda vez que a referncia a um elemento da pgina fosse alterada todos os testes deveriam ser atualizados. Agora supondo que um testador que no tenha implementado os 100 testes, mencionados acima, tenha que entend-los para saber quais funcionalidade foram testadas, ento, dependendo de como for feita a referncia aos elementos da pgina, ele poderia perder muito tempo tentanto identic-los. bom lembrar que nem sempre ser possvel se referir a um elemento usando algum termo que permita a sua fcil identicao. Algumas vezes (e no so poucas) os elementos da pgina testada devero ser localizados pelo Selenium a partir de expresses XPath do tipo //table[@width=100]//tr[3]/td[2]//a, o que diculta a leitura do teste. Assim, para tornar os testes mais legveis e fceis de atualizar, o testador pode usar mapeamentos utilizando JSON 11 entre nomes e os elementos da pgina sob teste. Isso possvel a partir do UI-Element que um recurso suportado tanto pelo SeleniumIDE quanto pelo Selenium-RC. A Figura 2.7 ilustra esquerda um teste feito para a pgina de cadastro de usurios (ilustrado na Figura 2.2) feito no Selenium-IDE sem utilizar UI-Element e direita o mesmo teste utilizando o UI-Element. Com base nela, podemos observar que utilizando o mapeamento o teste ca muito mais legvel e fcil de entender. Com o script da parte B da gura fcil perceber que o teste feito sobre a pgina de cadastro de usurio, que aps a preenchimento dos campos foi pressionado o boto Cadastrar e que o resultado esperado uma mensagem com o texto Usurio Cadastrado. Outra vantagem da utilizao do UI-Element a fcil visualizao da descrio dos elementos. Esta especicada a partir do mapeamento e visvel na aba Reference aps clicar em algum comando que utilize um elemento previamente mapeado.
de XML Path Language. de Document Object Model. 11 Acrnimo de JavaScript Object Notation
10 Acrnimo 9 Acrnimo

Figura 2.7. A) Exemplo de teste sem UI-Element. B) Mesmo teste da esquerda com UI-Element.

Essas descries tornam o teste ainda mais claro, permitindo que o mesmo seja rapidamente compreendido. A Figura 2.8 ilustra a descrio associada ao elemento cadastroUsuario::mensagemExibida, localizado no terceiro div da pgina (pois seu locator //div[2]). Para construir o mapeamento entre nomes e elementos basta usar um editor de textos e criar um arquivo no formato .js com mapeamento feito usando os comandos reconhecidos pelo UI-Element. Em seguida, esse arquivo deve ser submetido como extenso do Selenium Core12 a partir do menu Opes do Selenium-IDE. Os comandos que podem ser utilizados para criar o mapeamento atravs do UIElement so: addPageSet: para adicionar uma pgina ou conjunto de pginas que contm os elementos que sero usados no teste. Para cada conjunto deve ser especicado o nome e a descrio. Tambm existem outros atributos que podem ser denidos, como por exemplo, pode-se especicar uma expresso regular para indicar o path das pginas que pertencem ao grupo em questo a partir do atributo pathRegex. addElement: para adicionar os elementos (campos, botes, links, imagens, dentre outros) das pginas. Deve ser denido o nome, a descrio e a localizao do elemento, a qual denida no parmetro locator. A primeira linha do mapeamento deve seguir a estrutura var nomeDaVariavel = new UIMap(). Mais comandos podem ser encontrados atravs do menu Ajuda do
12 Componente

do Selenium responsvel por executar os comandos do Selenium no browser

Figura 2.8. Visualizao da descrio dos campos por meio do UI-Element.

Selenium-IDE. A Figura 2.9 ilustra o mapeamento que foi utilizado no teste exibido na parte B da Figura 2.7. Observe que se a localizao (ou forma de identicao) dos elementos for alterada, basta atualizar o atributo locator para que todos os testes estejam atualizados. Se o endereo da pgina de insero de usurio for alterado, por exemplo, ento basta atualizar o atributo pathRegex do conjunto de pgina (Pageset) nomeado de cadastroUsuario e o atributo locator do elemento linkUsuario para que todos os testes da pgina de cadastro de usurio sejam atualizados. Por m, muitas vezes existem sequncias de comandos que so executadas mais de uma vez em um mesmo teste. Tambm existem sequncias de comando que so executadas em mais de teste, usando os mesmos parmetros ou no, que podem pertencer ou no a uma mesma suite de testes. Assim, interessante usar algum meio para agrupar tais sequncias, possibilitando a invocao de toda a sequncia com um nico comando. Com Selenium-RC, o agrupamento de comandos pode ser facilmente feito a partir de blocos. J para o Selenium-IDE preciso usar o Rollup. A partir da denio das regras de agrupamento (Rollup rules), o testador pode reunir comandos em grupos possibilitando que eles sejam invocados com o comando rollup. A parte A da Figura 2.10 ilustra a denio de regras de agrupamento para reunir uma sequncia de comandos em grupo identicado por login, que efetua o login em uma pgina web. A parte B da Figura 2.10 ilustra um teste que utiliza o comando rollup para efetuar a sequncia de comandos do grupo identicado por login.

Figura 2.9. Mapeamento feito para os elementos da pgina exibida na Figura 2.2.

A criao dos arquivos com os Rollup rules feita da mesma forma que a denio do mapeamento descrito acima, ou seja, a partir da criao de um arquivo no formato .js e da submisso desse arquivo como extenso do Selenium Core a partir do menu Opes do Selenium-IDE. Porm, nesse caso a primeira linha deve seguir a estrutura var nomeDaVariavel = new RollupManager() e o nico comando disponvel comando addRollup, usado para adicionar uma nova regra. Existem vrios atributos que podem ser denidos. No script ilustrado, o principal atributo o getExpandedCommands o qual especica quais sero os comandos a serem executados. 2.6.2. Escrevendo testes com o Selenium RC e a linguagem Java Como mencionado anteriormente, com o Selenium-RC o testador pode construir testes utilizando todo o poder fornecido pela linguagem de programao utilizada. Ele pode, por exemplo, trabalhar com iteraes, expresses condicionais, ler e escrever em arquivos, alm de poder tratar dinamicamente os resultados dos testes.

Figura 2.10. A) Denio das Rollup rules. B) Teste usando o comando rollup.

O Selenium-RC constitudo de dois componentes principais: Selenium Server, ponte para o navegador, a partir do qual os comandos acionados so transmitidos e executados no navegador selecionado; Bibliotecas, conjunto de instrues que so acionadas e que causam uma comunicao com o Selenium Server. Assim, para executar testes feitos com o Selenium e alguma linguagem de programao preciso iniciar o servidor (selenim-server.jar) e para que os comandos do Selenium sejam reconhecidos necessrio acrescentar a biblioteca referente a esta linguagem ao projeto que contm o teste. A maneira mais fcil de iniciar a criao de testes funcionais automatizados utilizando Selenium e Java criando primeiro um script (com a estrutura geral do teste) utilizando o Selenium-IDE. A Figura 2.11 exibe um script de teste no formato HTML feito com o Selenium-IDE para o cadastro de usurios da pgina exibida na Figura 2.2. Observe que as cinco primeiras linhas do script exibido na gura - da abertura da pgina /modelo/admin/index.php at a vericao do texto Sair - esto associadas ao login no sistema. Isso porque para cadastrar um usurio preciso fazer antes o login no sistema. Logo, as aes necessrias para efetuar o login tambm devem ser inseridas no script de teste para que ao executar a sequncia de comandos do teste se tenha acesso a pgina de cadastro de usurio. bom lembrar que o Selenium simula um usurio acessando a aplicao, e como o usurio deve logar para ter acesso as funes administrativas do sistema, o teste com o Selenium tambm deve realizar os procedimentos necessrios para efetuar o login.

Figura 2.11. Script de teste feito com o Selenium-IDE.

O prximo passo converter script do formato HTML para Java, ou seja, converter os comandos do script nas funes disponveis na API para a linguagem Java. Isso feito a partir do menu Opes > Formato > Java (JUnit) SeleniumRC. Caso o testador queira executar os testes no TesteNG ele deve usar a opo Opes > Formato > Java (TestNG) SeleniumRC. O resultado da exportao, para o framework JUnit, do script ilustrado na Figura 2.11 exibido na Figura 2.12.

Figura 2.12. Script de teste da Figura 2.11 exportado para Java (JUnit).

Aps termos o arquivo Java, podemos utiliz-lo a partir do conjunto Eclipse+JUnit para concluir a automao dos testes. Como o teste utiliza a API do Selenium para o Java preciso adicionar a biblioteca da API Java (selenium-java-client-driver.jar) ao projeto

com o teste para que os comandos sejam reconhecidos, caso contrrio, eles caro em destaque conforme exibido na Figura 2.13. Esse destaque indica que o comando no foi reconhecido, gerando assim erro de compilao no teste.

Figura 2.13. Visualizao do teste exportado no Eclipse.

O passo seguinte consiste na construo dos procedimentos de testes parametrizados. Para isso basta criar funes especcas reunindo os comandos de acordo com as aes deles e substituir os valores utilizados por variveis. Assim, para o script da Figura 2.13, podem ser criados duas funes: login (que efetua o login na pgina) e cadastroUsuario (que cadastra um usurio no sistema). Vale lembrar que preciso instanciar uma varivel do tipo Selenium para ter acesso as suas funes. Para que a instanciao do Selenium seja feita somente na classe com os casos de testes, podemos passar a varivel Selenium por parmetro. Com isso, nossa classe com os procedimentos de teste ca como exibido na Figura 2.14. Em seguida, deve-se concluir a implementao dos procedimentos de testes, de forma que eles tambm sejam utilizados para vericar se as operaes vo falhar quando deveriam. Se no login, por exemplo, os campos login e senha no forem corretamente preenchidos aparecer na tela do sistema considerado uma mensagem de alerta (alert) indicando o erro. Assim, podemos concluir a implementao da funo login acrescentando mais uma varivel que armazenar o erro (mensagem do alerta) esperado. Considerando que a mesma situao ocorre durante o cadastro de um usurio, teremos os procedimentos escritos conforme a Figura 2.15. Por m, resta implementar os casos de teste utilizando para isso os procedimentos de testes que foram implementados e as especicaes de testes13 . Na Figura 2.16 apresentamos alguns casos de teste criados para vericar o login e o cadastro de usurios do sistema.
13 Documentos

que descrevem os casos e procedimentos de testes.

Figura 2.14. Classe com o procedimento de teste parametrizado.

Os testes criados com o Selenium so testes que utilizam o JUnit, de forma similar aos testes de unidade. Sua execuo acontece da mesma forma que os testes de unidade, clicando com o boto direito do mouse em cima da classe e solicitando sua execuo via JUnit. No entanto, existe uma diferena: para que o teste execute, necessrio que exista uma instncia do Selenium Server executando na mesma mquina que contm os testes que sero executados. Assim, antes de executar os testes preciso executar o arquivo selenium-server.jar 14 . Sua execuo pode ser feita via comando java -jar seleniumserver.jar". A Figura 2.17 exibe o resultado da execuo dos testes apresentados neste captulo. O lado A da gura apresenta a primeira execuo dos testes, e no lado B a reexecuo dos mesmos. Observe que no lado A da gura, a barra de execuo cou verde, indicando que nenhuma falha foi detectada, ou seja, o teste passou. Enquanto que no lado B, a barra de execuo cou vermelha pois o execuo do ltimo teste encontrou uma falha. Isso porque no ltimo teste, no qual feito o cadastro de um novo usurio, o resultado esperado a mensagem Usurio Cadastrado. Na primeira execuo da suite de testes, eles passaram porque no havia o usurio Usurio de teste15 cadastrado no sistema. Contudo, com a re-execuo da mesma suite de teste, sem restaurar o banco de dados para o estado original, o sistema no permitiu o cadastro do mesmo usurio, no resultando, portanto, no resultado esperado pelo teste.
14 Servidor 15 Nome

do Selenium, que pode ser baixado no site do Selenium. do usurio contido no script de teste.

Figura 2.15. Classe com o procedimento de teste completo.

Vale salientar que tambm possvel implementar e executar casos de teste escritos com o Selenium utilizando a linguagem Java a partir do framework TestNG. Este por sua vez ofecere caractersticas prprias que podem ser utilizadas para facilitar a implementao dos testes. A escolha do framework a ser utilizado deve ser baseado nos conhecimentos da equipe de teste e nos recursos que tais ferramentas oferecem. Assim como no Selenium-IDE, o mapeamento feito com o UI-Element tambm pode ser usado com o Selenium-RC, porm neste s possvel adicionar um arquivo de mapeamento e ele deve ser chamado de user-extensions.js e deve estar no mesmo diretrio do selenium-server.jar. Com isso, basta executar o servidor com o comando java -jar selenium-server.jar -userExtensions user-extensions.js para que o mapeamento seja reconhecido e dessa forma o procedimento de cadastro de usurio, por exemplo, pode ser escrito conforme exibido na Figura 2.18.

Figura 2.16. Classe com os casos de testes.

Figura 2.17. A) A execuo dos testes no encontrou falhas. B) A execuo dos testes encontrou uma falha.

Figura 2.18. Usando mapeamento de interface de usurio com o Selenium-RC.

2.7. Bromine: uma ferramenta para gerenciamento de testes Seleneses


Bromine uma ferramenta que permite a fcil visualizao e execuo de testes usando o Selenium RC. As principais vantagens desta ferramenta se referem ao armazenando dos resultados dos testes para anlises e a forma menos tcnica de apresentao e execuo dos testes, facilitando o gerenciamento dos mesmos. A Figura 2.19 exibe a tela principal da ferramenta, em que deve ser feito o login16 . O processo de instalao da ferramenta pode ser encontrado no site da prpria ferramenta 17 .

Figura 2.19. Tela principal do Bromine.

Dentre as caractersticas do Bromine esto: suporte a testes em Java e PHP; facilita a execuo de testes em mltiplas combinaes de Sistema Operacional (S.O.) e navegador; possibilidade de executar testes com vrias instncias do Selenium Server espalhadas por vrios computadores; armazenamento de todos os comandos executados; possibilidade de criar grupos e usurios restringindo as suas permisses de acesso. Aps efetuar o login no sistema, o primeiro passo para utilizar a ferramenta acessar o painel de controle, exibido na Figura 2.20, para criar um novo projeto. Por padro a ferramenta j vem com um exemplo de projeto para testes na pgina de busca do Google.
16 Por

padro j vem cadastrado o usurio admin, com senha e login igual a admin.

17 http://wiki.openqa.org/display/BR/Installing+Bromine.

Figura 2.20. Painel de Controle do Bromine.

no painel de controle que so denidos os ns (mquinas nas quais h uma instncia do Selenium RC executando), os projetos, os usurios e permisses, alm de outras conguraes que no so descritas aqui. Vale lembrar que no caso de s a mquina local ser utilizada para executar os testes deve-se adicionar um n com o path sendo 127.0.0.1:4444, indicando assim que h uma instncia ativa do Selenium RC na porta 4444 da mquina. Feitas as conguraes necessrias, o prximo passo denir o planejamento dos testes. Para isso deve-se clicar no boto do canto superior direito da pgina para acessar o workspace, onde encontram-se os menus Planning e TestLabs. A partir do menu Planning pode-se especicar os requisitos e os casos de testes, e os relacionamento entre eles, ou seja, a associao entre casos de testes e o(s) requisito(s) que eles atendem. A Figura 2.21 exibe a adio de um requisito ao projeto criado. Observe que nele especicado a(s) plataforma(s) onde os testes sero executados, o que vai depender da congurao dos ns que foram adicionados.

Figura 2.21. Especicando requisitos no Bromine.

A Figura 2.22 exibe a tela onde feita a adio dos casos de testes. Alm de adicionar o script do caso de teste18 , pode-se descrever o que o teste faz, como tambm existe a possibilidade de detalhar os passos do caso de teste.

Figura 2.22. Adicionando casos de testes no Bromine.

A partir do menu TestLabs possvel executar os scripts de testes que foram submetidos ao Bromine, assim como visualizar os resultados dos testes a partir de grcos na forma de pizza.

2.8. Concluses
A atividade de testes essencial para garantir a qualidade dos produtos de software desenvolvidos. Contudo, essa uma atividade onerosa, pois exige tempo, ferramentas apropriadas e pessoal especializado. Por conta disso, muitas vezes essa atividade s possibilitada a partir do uso de ferramentas que permitam a automao dos testes. No caso dos testes funcionais para aplicaes Web, a ferramenta Selenium uma boa opo por ser gratuita e por permitir o uso de linguagens de programao como Ruby ou Java. Neste trabalho apresentamos os princpios e os principais conceitos ligados aos testes de software. Alm disso, foi apresentado o Selenium-IDE e foi descrito em detalhes a automao de testes funcionais utilizando o Selenium, a linguagem de programao Java e o framework JUnit. Por m, foi feita uma breve descrio sobre o Bromine, uma ferramenta que permite a distribuio da execuo da suite de teste entre vrias mquinas (ns), alm de facilitar o gerenciamento dos testes feitos com o Selenium.
script deve estar no formato apropriado para ser reconhecido pelo Bromine, para detalhes deve-se consultar o site http://wiki.openqa.org/display/BR/Creating+a+testscript.
18 Esse

Referncias
[Abran et al. 2004] Abran, A., Moore, J., Bourque, P., Dupuis, R., and Tripp, L., editors (2004). Guide to the Software Engineering Body of Knowledge. IEEE Computer Society. [Burnstein 2003] Burnstein, I. (2003). Practical Software Testing. Springer-Verlag, New York. [Filho 2003] Filho, W. P. (2003). Engenharia de Software: Fundamentos, Mtodos e Padres. LTC, 2nd edition. [Gamma and Beck ] Gamma, E. and Beck, K. Junit testing framework. Technical report, JUnit.org, http://www.junit.org/. ltimo acesso em 10/10/2009. [IEEE 1990] IEEE (1990). IEEE Standard Glossary of Software Engineering Terminology - IEEE Std.610.12-1990. IEEE Computer Society. [Mller et al. 2007] Mller, T., Graham, D., Friedenberg, D., and Veendendal, E. V. (2007). Base de Conhecimento para Certicao em Teste. Foundation Level Syllabus, 2nd edition. [Myers 2004] Myers, G. (2004). The Art of Software Testing. John Wiley & Sons, 2nd edition. [Neto et al. 2007] Neto, P. S., de Sousa, F. V., and Resende, R. (2007). Automao de Teste de Software. Escola Regional de Computao da SBC Cear - Maranho - Piaui, Fortaleza. [NIST 2002] NIST (2002). Planning report 02-3. Technical report, National Institute of Standards and Technology. http://www.nist.gov/director/prog-ofc/report02-3.pdf. Acessado em setembro de 2009. [OpenQA a] OpenQA. Bromine: A web-based qa tool for selenium. Technical report, OpenQA, http://seleniumhq.org/projects/bromine/. ltimo acesso em 10/10/2009. [OpenQA b] OpenQA. Selenium-ide: Integrated development environment for selenium tests. Technical report, OpenQA, http://seleniumhq.org/projects/ide/. ltimo acesso em 10/10/2009. [Patton 2006] Patton, R. (2006). Software Testing. Sams Publishing. [Pressman 2006] Pressman, R. (2006). Engenharia de Software. McGraw-Hill, 6th edition. [Spillner et al. 2006] Spillner, A., Linz, T., and Schaefer, H. (2006). Software Testing Foundations. rockynook, 2nd edition.

Você também pode gostar