Baixe o app para aproveitar ainda mais
Prévia do material em texto
Universidade do Minho Escola de Engenharia Departamento de Informática Tiago Filipe Andrade Brito Testes em Aplicações Web Outubro 2016 Universidade do Minho Escola de Engenharia Departamento de Informática Tiago Filipe Andrade Brito Testes em Aplicações Web Master dissertation Master Degree in Computer Science Dissertation supervised by António Luís Pinto Ferreira de Sousa Daniela Duarte da Costa October 2016 A G R A D E C I M E N T O S Antes de mais gostaria de agradecer e dedicar este trabalho aos meus pais por todo o apoio dado ao longo destes anos, por acreditarem em mim e por contribuírem com o seu melhor para o meu desenvolvimento pessoal e profissional, pois sem eles não seria possível chegar onde cheguei. Quero também agradecer: • Ao meu orientador, Prof. António Sousa e à minha diretora Daniela Costa por todo todo o apoio e contribuição dada no desenvolvimento deste estudo. • A toda a equipa de desenvolvimento Web da Eurotux, por todo o apoio, ideias e conhecimento transmitido. • Ao Prof. Vítor Fonte, por todas as oportunidades que me forneceu. • À minha irmã e cunhado, Carla e Fernando por incentivarem-me sempre a dar o meu melhor e a não desistir. • Ao meu sobrinho, Eduardo por todos os momentos de descontração que proporcio- nou. • À Fabiola Silva, por todo o apoio que me deu quando mais precisava. • A todos os meus amigos que me apoiaram ao longo deste percurso. i A B S T R A C T With the evolution of technology more and more software applications are designed to run in a Web browser, being commonly known as Web applications. As a method to ensure the quality of these applications, the tests are attracting today more and more attention from both the academic and business communities. Having a well-defined test strategy from the beginning of the project and applying them during the development phase, ensures the quality of the final software by reducing the risk of unforeseen problems at later stages. Such problems translate into increased cost of implementation and reduced profitability of the project to the supplier. It may also postpone the projet delivery which result in customer dissatisfaction. On the other hand, the constant software upgrades, imposed by the highly competitive market of today, increase the risk of destroying previously implemented features (called regression). For this reason, it is required that the testing strategy is not only defined and implemented during the design, but also after each step of development in order to ensure that the development does not breaks already existing functionality. Repeated tests, covering all the software at each delivery, is a challenge to organizations due to its high cost and increased possibility of human error. For all these reasons, the Web development team supervisors at Eurotux supported this research work and allowed the resulting prototype to be applied in real projects, developed over the last few months, thus defining a testing strategy aiming to increase customer satisfaction, profitability of the projects and the motivation of the team itself. Several methodologies were studied to allow automate testing of Web applications. Auto- mated testing ensures that the software is in accordance with all the defined specifications, maintaining the confidence of all stakeholders in the expected software quality throughout its life cycle. Some comparative studies were evaluated, being analysed in detail the methodologies for functional testing and regression testing, Selenium tools for defining automatic testing integrated with the Alloy Analyser tool, in order to evaluate the quality of the formal specification. After such analysis, a prototype tool named WebTest was developed in order to build and run automated tests. A report containing the generated test results is then sent to the web application development team, to help keeping track of existing faults in software quality. Lastly the prototype was used in several production projects at Eurotux, receiving highly ii iii positive reviews from both developers and managers, leveraging the time spent testing software after each consecutive update. R E S U M O Com a evolução da tecnologia cada vez mais aplicações de software são desenvolvidas para correrem sob um browser de Internet, sendo normalmente designadas de aplicações Web. Como método de assegurar a qualidade destas aplicações, os testes atraem cada vez mais a atenção das comunidades académica e empresarial. Ter uma estratégia de testes bem definida desde o início do projeto, e executar os mesmos durante a fase de desenvolvimento, além de assegurar a qualidade do software, reduz o risco de surgirem problemas imprevistos numa fase posterior do projeto, que aumentam o custo de implementação e consequentemente diminuem a rentabilidade do projeto para a empresa fornecedora, e ainda provocam atrasos que normalmente resultam na insatisfação do cliente. Por outro lado, as constantes evoluções do software, que o mercado altamente competi- tivo de hoje obriga, aumentam o risco de destruir funcionalidades implementadas anteri- ormente (chamada Regressão). Por este motivo, é necessária que a estratégia de testes seja não só definida e implementada durante o projeto, mas também após o seu fecho. A repetição dos testes que cobrem todo o software em cada momento de entrega, são um desafio para as organizações, na medida em que o seu custo é elevado, e dado que existe a possibilidade de falha humana. Por todos estes motivos, os responsáveis pela equipa de desenvolvimento Web da Euro- tux apoiaram este trabalho de investigação e permitiram que o mesmo fosse aplicado em projetos reais desenvolvidos ao longo dos últimos meses, com o objetivo de ser definida uma estratégia de testes que permitisse tornar o processo de desenvolvimento Web mais robusto, aumentando a qualidade das soluções desenvolvidas. Pretendia-se essencialmente definir uma estratégia de testes automáticos que diminuísse a possibilidade de erro humano na execução dos testes, e que permitisse aumentar a rentabilidade dos projetos gastando menos horas na fase de verificação. Foram assim estudadas várias metodologias, tendo sido os testes funcionais que assegu- ram a concordância da parte funcional do software face às suas especificações, e os testes de regressão que garantem que o novo código não introduz erros, o foco da presente dis- sertação. Foram ainda realizados alguns estudos comparativos de ferramentas, tendo sido escolhido o Selenium para definição de testes automáticos em conjunto com a ferramenta Alloy Analyser para avaliação da qualidade da especificação. Após a escolha das ferramentas que mais se adequaram aos objetivos propostos neste estudo, foi desenvolvida uma ferramenta denominada WebTest que permite a programação iv v automática de testes funcionais e produz relatórios que são enviados por email, permitindo à equipa de desenvolvimento Web acompanhar o nível de qualidade do seu software. A WebTest foi utilizada em projetos reais da empresa, e o feedback por parte da equipa e dos seus responsáveis foi bastante positiva. Com a WebTest foi possível reduzir o tempo gasto com os testes nos projetos e garantir a qualidade da solução apesar das alterações de requisitos e incremento de funcionalidades no software. C O N T E Ú D O 1 introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1 Enquadramento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 Estrutura do documento . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 estado da arte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.2 Engenharia de Software e a importância dos testes . . . . . . . . . . . . 4 2.3 Software Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.3.1 Métodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . 8 2.3.2 Metodologias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.3.3 Relacionamento métodos/metodologias . . . . . . . . . . . . . . 11 2.3.4 Testes nas aplicações WEB . . . . . . . . . . . . . . . . . . . . . . 12 2.3.5 Ferramentas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.3.6 Comparação de ferramentas . . . . . . . . . . . . . . . . . . . . . 15 2.3.7 Seleção de ferramentas . . . . . . . . . . . . . . . . . . . . . . . . 16 2.4 Qualidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.4.1 Definição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.4.2 Evolução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.4.3 Linguagens/Ferramentas de especificação formal . . . . . . . . . 18 2.4.4 Comparação de Linguagens/Ferramentas . . . . . . . . . . . . . 20 2.4.5 Seleção de ferramentas . . . . . . . . . . . . . . . . . . . . . . . . 20 2.5 Análise às ferramentas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.5.1 Verificação formal - Alloy . . . . . . . . . . . . . . . . . . . . . . . 21 2.5.2 Testes - Selenium . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.5.3 União de ferramentas . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.6 Conclusões . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.6.1 Plataforma de testes e verificação . . . . . . . . . . . . . . . . . . 25 3 ferramenta de testes selenium . . . . . . . . . . . . . . . . . . . . . . . 27 3.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.2 História . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.3 Componentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 3.3.1 Selenium Remote Control . . . . . . . . . . . . . . . . . . . . . . . 28 3.3.2 Selenium IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.3.3 Selenium WebDriver . . . . . . . . . . . . . . . . . . . . . . . . . . 30 vi Conteúdo vii 3.3.4 Selenium Grid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.4 Selenium v2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 3.5 Selenium v3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 3.6 As potencialidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 3.7 Conclusões . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 4 ferramenta de automação de testes e qualidade - webtest . . . 35 4.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 4.2 Ambiente de desenvolvimento . . . . . . . . . . . . . . . . . . . . . . . . 36 4.3 Arquitetura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 4.3.1 Dependências . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 4.4 Carregamento de ficheiros . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 4.4.1 O ficheiro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 4.5 Implementação da Selenium Grid . . . . . . . . . . . . . . . . . . . . . . 42 4.6 Casos de teste genéricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 4.7 Testes específicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 4.8 Execução em paralelo e com parâmetros . . . . . . . . . . . . . . . . . . 48 4.9 Validação de modelos Alloy . . . . . . . . . . . . . . . . . . . . . . . . . . 49 4.10 Relatórios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 4.11 GUI - Graphical User Interface . . . . . . . . . . . . . . . . . . . . . . . . 51 4.12 Parâmetros da ferramenta . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 4.12.1 Execução programada . . . . . . . . . . . . . . . . . . . . . . . . . 53 4.13 Conclusões . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 5 avaliação da arquitetura . . . . . . . . . . . . . . . . . . . . . . . . . . 55 5.1 Caso de teste 1 - TeraBunker . . . . . . . . . . . . . . . . . . . . . . . . . 55 5.2 Caso de teste 2 - Site de media . . . . . . . . . . . . . . . . . . . . . . . . 56 6 conclusão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 6.1 Síntese das conclusões . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 6.2 Trabalho futuro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 a instalação e configuração da java virtual machine . . . . . . . 72 b instalação e configuração do postfix . . . . . . . . . . . . . . . . . . 73 c instalação e configuração da selenium grid . . . . . . . . . . . . . 74 d execução da aplicação desenvolvida . . . . . . . . . . . . . . . . . . 78 e exemplo ficheiro json de configuração . . . . . . . . . . . . . . . . . 79 f exemplo classe externa . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 g código - caso de teste 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 L I S TA D E F I G U R A S Figura 1 Black Box Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Figura 2 White Box Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Figura 3 Verificação estática e dinâmica . . . . . . . . . . . . . . . . . . . 12 Figura 4 Funcionamento Selenium Web Driver . . . . . . . . . . . . . . . 14 Figura 5 Funcionamento Sahi . . . . . . . . . . . . . . . . . . . . . . . . . 15 Figura 6 Evolução qualidade . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Figura 7 Selo correção . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Figura 8 Componentes Selenium . . . . . . . . . . . . . . . . . . . . . . . 28 Figura 9 Selenium Remote Control . . . . . . . . . . . . . . . . . . . . . . 29 Figura 10 Selenium IDE v2.9.1 . . . . . . . . . . . . . . . . . . . . . . . . . 30 Figura 11 Selenium Grid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Figura 12 Componentes Selenium v2 . . . . . . . . . . . . . . . . . . . . . . 32 Figura 13 Estrutura aplicação WebTest . . . . . . . . . . . . . . . . . . . . . 37 Figura 14 Infraestrutura Selenium Grid . . . . . . . . . . . . . . . . . . . . 42 Figura 15 Execução em paralelo . . . . . . . . . . . . . . . . . . . . . . . . . 49 Figura 16 Verificação modelo Alloy . . . . . . . . . . . . . . . . . . . . . . . 50 Figura 17 Relatório de testes . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Figura 18 Interface gráfica . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 Figura 19 Resultados caso de teste - TeraBunker . . . . . . . . . . . . . . . 55 Figura 20 Resultados caso de teste - site de media . . . . . . . . . . . . . . 56 Figura 21 Resultados caso de teste - site de media . . . . . . . . . . . . . . 57 Figura 22 Evolução validação . . . . . . . . . . . . . . . . . . . . . . . . . . 57 viii L I S TA D E TA B E L A S Tabela 1 Relacionamento métodos/metodologias . . . . . . . . . . . . . . 11 Tabela 2 Comparação de ferramentas . . . . . . . . . . . . . . . . . . . . . 15 Tabela 3 Comparação de linguagens/ferramentas qualidade . . . . . . . 20 Tabela 4 Planeamento desenvolvimento . . . . . . . . . . . . . . . . . . . 36 ix L I S TA D E C Ó D I G O S 2.1 Código Alloy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.2 Código Alloy - Asserções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.3 Exemplo código Selenium . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 4.1 JSON - Configuração geral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 4.2 JSON - Objeto configuração ambiente . . . . . . . . . . . . . . . . . . . . . . . 40 4.3 JSON - Objeto data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 4.4 JSON - Teste externo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 4.5 JSON - Teste Alloy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 4.6 Classe Externa - Anotação . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 4.7 Classe Externa - Extender . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 4.8 Classe Externa - Parametrização . . . . . . . . . . . . . . . . . . . . . . . . . . 45 4.9 Classe Externa - Construtor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 4.10 Acesso WebDriver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 4.11 Acesso dados teste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 4.12 Acesso relatórios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 4.13 Classe Externa - Teste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 4.14 Carregamento de classes externas . . . . . . . . . . . . . . . . . . . . . . . . . 46 4.15 Execução programada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 4.16 Geração de Cron Job . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 A.1 Instalação JVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 A.2 Verificação versão JVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 A.3 Configuração ambiente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 B.1 Instalação postfix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 B.2 Instalação mailutils . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 B.3 Teste de envio email . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 C.1 Download Selenium 2.53 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 C.2 Execução Selenium HUB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 C.3 Selenium HUB a correr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 C.4 Exemplo JSON configuração nodo . . . . . . . . . . . . . . . . . . . . . . . . . 75 C.5 Execução nodo Selenium . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 x Lista de Códigos xi C.6 Interface Web Selenium . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 D.1 Execução WebTest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 E.1 Exemplo ficheiro JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 F.1 Exemplo classe externa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 G.1 Código caso de teste 1 - Login . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 G.2 Código caso de teste 1 - Pasta . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 1 I N T R O D U Ç Ã O 1.1 enquadramento Ao longo dos anos, as técnicas e ferramentas para desenvolvimento de software têm vindo a ser aprimoradas e cada vez mais utilizadas em diferentes aplicações. Uma das maiores pre- ocupações do desenvolvimento de software está relacionada com a qualidade dos sistemas desenvolvidos e, consequentemente, com a sua estabilidade no ambiente de produção. Uma falha num sistema pode causar prejuízos financeiros, comprometimento de crono- gramas, falta de confiança na aplicação por parte dos seus utilizadores e, em situações mais extremas, até a perda de vida humana. Exemplo disso, foi o equipamento de radioterapia Therac-25, que devido a uma falha de software, foram causados pelo menos seis acidentes (Leve- son and Turner [60]) entre 1985 e 1987, nos quais os pacientes receberam grandes doses de radiação que resultaram em graves problemas, incluindo a morte de alguns. Para reduzir o risco de falhas, as organizações que desenvolvem software começaram progressivamente a ter a necessidade de adotar um processo de desenvolvimento formal, incluindo a execução de testes para verificação do software desenvolvido. Também os responsáveis da Eurotux, onde existe um departamento de desenvolvimento Web desde 2004, têm estas preocupações e têm vindo, ao longo dos anos, a sistematizar o processo de desenvolvimento. Uma das falhas desse processo estava sobretudo relacionado com a qualidade do produto no momento da entrega, e na manutenção da qualidade ao longo do ciclo de vida da aplicação. Todas as aplicações Web devem ser testadas cuidado- samente de forma a assegurar que a aplicação é confiável e está conforme a especificação aprovada pelo cliente. As aplicações Web tipicamente ficam em manutenção a uma velocidade maior do que qualquer outro tipo de sistemas de software e esta manutenção consiste normalmente em pequenas mudanças incrementais (Kirda et al. [59]). Na sequência de uma entrevista com a diretora do departamento de desenvolvimento Web da Eurotux, foram identificados os seguintes problemas: • o software é normalmente entregue em vários sprints, mas em cada entrega é neces- sário testar todo o sistema; 1 1.2. Estrutura do documento 2 • o atual número de browsers e dispositivos aumenta consideravelmente o custo dos testes na medida em que exige a repetição dos mesmos nos diferentes ambientes; • têm sido recorrentes as falhas nos testes realizados, ou porque não foi testado deter- minado ambiente ou porque os casos testados foram insuficientes. Com a realização de testes manuais de aplicações Web é impossível garantir que todos os erros sejam encontrados e retificados, uma vez que seria necessário uma quantidade extremamente elevada de testes, não sendo possível realizá-los a todos manualmente, des- perdiçando tempo (Wang and Du [120]). Para acomodar estas alterações, os testes devem ser automatizados e adaptáveis face à constante evolução dos Web browsers, de forma a garantir a estabilidade e perfeição do software desenvolvido. Perante este cenário, o que se pretende com este trabalho de investigação é assegurar que o processo de desenvolvimento Web da Eurotux se torna mais robusto relativamente à vertente dos testes, de forma a aumentar a qualidade do software produzido e consequen- temente a satisfação do cliente. Para tal, serão estudadas ferramentas que permitam a realização de testes em vários browsers de forma automática, bem como linguagens que assegurem a qualidade quer da especificação, quer da implementação das funcionalidades. Juntando ambas será possível correr testes de forma fácil, simples e recorrente para que seja possível detetar e corrigir todos os erros encontrados antes do lançamento da aplicação ou da nova funcionalidade. De forma a alcançar este resultado são definidos os seguintes objetivos: • selecionar uma ferramenta de testes que permita correr testes em vários browsers e sistemas operativos • selecionar uma ferramenta de verificação formal de forma a validar a especificação • desenvolver uma ferramenta de testes e verificação formal que englobe ambas as ferra- mentas escolhidas e que permita a execução de testes genéricos, bem como específicos de um projeto • obter relatórios detalhados dos testes executados • permitir a execução da ferramenta desenvolvida de forma automática 1.2 estrutura do documento A partir deste capítulo introdutório, a presente dissertação encontra-se organizada em seis capítulos. No Estado da Arte (Capítulo 2) é feita uma introdução à temática dos testes explicando os principais conceitos e metodologias. São analisadas ferramentas de testes e 1.2. Estrutura do documento 3 comparadas entre si. Nesse mesmo capítulo é também abordada a qualidade do software e como esta se encontra relacionada com os testes. São também comparadas várias lingua- gens que permitem a modelação da especificação do software. Este termina com a avaliação da ferramenta de teste e linguagem de modelação escolhidas. No Capítulo 3 é descrita uma análise mais aprofundada da ferramenta que será utilizada para a realização dos testes. Neste capítulo será possível então conhecer a história da ferra- menta e os seus componentes. Posteriormente, no capítulo 4 explica-se o desenvolvimento efetuado de forma a atingir os objetivos identificados anteriormente. É apresentada a arquitetura do sistema e o seu desenvolvimento. No capítulo 5 são apresentados testes à arquiteturaimplementada, com recursos a casos reais, bem como uma análise sobre objetivos que foram atingidos ao utilizar o software desenvolvido. Finalmente no capítulo 6, são dadas algumas pistas de uma possível investigação futura, e ainda as principais conclusões sobre todo o trabalho realizado. 2 E S TA D O D A A RT E 2.1 introdução O presente capítulo pretende apresentar o estado da arte relativamente às metodologias e ferramentas de testes de software (Selenium [104], Sahi [101] e Watir [122]) e ainda as linguagens utilizadas para garantir a qualidade do software (VDM [13], Object-Z [119], OCL [83], Alloy [72]). Este capítulo inicia-se com uma secção introdutória sobre a importância dos testes na engenharia de software, e termina com a avaliação das ferramentas escolhidas e as principais conclusões. 2.2 engenharia de software e a importância dos testes A Engenharia de Software é uma área da computação que se foca na especificação, desen- volvimento e manutenção de sistemas de software. A evolução nesta área é notória, e cada vez mais as organizações investem recursos de forma a garantir a qualidade do software produzido (Pressman [90]). Vários estudos [34, 12] demonstram que apesar das empresas de TI se preocuparem cada vez mais com a qualidade do software, muitas deixam de parte um importante segmento de qualquer projeto de software: os testes. As vantagens e limitações dos testes são bem conhecidas e existe um grande debate sobre a automatização de testes (Berner et al. [12], Ramler and Wolfmaier [93]). Pode tomar-se como exemplo deste debate, os casos de estudo Kim et al. [58] e Talby et al. [109] que demonstram a importância dos testes de software, embora também importe referir, que estes devem ser realizados por fases (Myers et al. [77], Kaner [55]). No entanto, surge uma questão pertinente: Does the practice of software testing effectively meet industry needs? — Software testing and industry needs, Glass et al. [34] 4 2.3. Software Testing 5 De forma a responder corretamente a esta questão, seria necessário fazer um estudo completo e exaustivo à indústria, uma vez que cada segmento teria as suas respetivas ne- cessidades e esse não é objetivo do presente estudo. No entanto, é seguro afirmar que a utilização de uma má abordagem aos testes, pode ter um impacto real na situação econó- mica de uma empresa (Tassey [110]). Os testes são por norma realizados manualmente e pela pessoa responsável pela implementação, o que se traduz num enorme erro na medida em que quem programa, ao testar o seu próprio código já se encontra num ciclo ’vicioso’ aplicando casos de teste genéricos, e que muitas vezes não refletem o comportamento do utilizador final (Reason [95]), principalmente quando este tem pouco à vontade na inte- ração com interfaces de software. Esta situação é bastante problemática, e por vezes as organizações não lhe dão a devida atenção. No entanto, algumas empresas já dispõem de equipas dedicadas a testes. A única função é encontrar erros no software de forma a que eles não cheguem a um ambiente de produção. Outras empresas dedicam-se à metodologia Agile [32], introduzindo o termo de Agile tes- ting onde fazem desenvolvimento focado nos testes ao longo do projeto. No entanto pode haver uma rejeição de qualquer teste que não possa ser automatizado de forma eficiente (Crispin and House [22]), o que pode causar problemas em alguns casos. No entanto, este método tem tido um feedback positivo (Talby et al. [109], Mosley and Posey [75]). Mas será mesmo necessário a empresa incluir uma equipa de testes? Com o avanço das tecnologias e dos métodos formais cada vez menos as organizações adotam processos manuais, optando sempre que possível por processos automáticos. Dado o contexto em que este estudo se insere, o foco deste trabalho estará em eliminar a interação humana nos testes, e permitir correr testes realizados de forma automática logo desde o início de um projeto. No entanto, para alcançar tal objetivo é necessário garantir que o projeto tem uma boa especificação formal. Ou seja, é importante garantir a qualidade da própria especificação, pois só desta forma é possível avançar com o desenvolvimento do software, e em simultâneo realizar testes automáticos. Nas secções seguintes, será explorada a vertente do testing, as suas técnicas, metodolo- gias e ferramentas, bem como a qualidade e quais as ferramentas que permitem garantir que os testes se encontram corretos e de acordo com a especificação. 2.3 software testing O termo de testing surgiu da necessidade de encontrar erros no software produzido (Sawant et al. [103]). Erros, ou utilizando o termo inglês Bugs são falhas no software que podem ou não ser 2.3. Software Testing 6 críticas, resultando simplesmente na paragem inesperada de um programa sem graves con- sequências, ou ter um impacto crítico num sistema que resulte em mortes humanas como no caso do Therac-25 [60] referido anteriormente. Outros exemplos de falhas graves são o bug The Y2K (Year 2000) Bug [113] que se traduziu em várias centenas de biliões de dóla- res gastos, e o Patriot Missile Defense System, que em 1991 o sistema falhou ao defender-se de vários mísseis devido a um erro no relógio interno após 14h de funcionamento (Patton [87]). Devido à ocorrência de erros, surge a necessidade do testing, uma técnica para avaliar as capacidades de um programa ou produto e determinar se está de acordo com a sua especi- ficação (Sawant et al. [103]). Assim pode ser considerada a seguinte definição: The process of executing a software system to determine whether it matches its speci- fication and executes in its intended environment. — What Is Software Testing? And Why Is It So Hard?, Whittaker [124] Do ponto de vista histórico, o conceito de testing surge em 1957, sendo que em 1956 era o período do debugging1 não existindo diferença entre testes e debugging. No período de 1957-1978, ocorreu a separação entre testing e debugging. Neste período também surgiu o conceito de validação formal dos requisitos. O período de 1979-1982, ficou conhecido como o período destrutivo, onde o objetivo era encontrar erros no software. De 1983 a 1987 é classificado como o período orientado à avaliação, em que o objetivo era que durante o tempo de vida do software, fosse feita uma avaliação do produto e medida a sua qualidade. Desde 1988 que vivemos num período de prevenção. É dada importância à correspondência entre o software e a sua especificação de forma a detetar e prevenir falhas. — Gelperin and Hetzel [33] O principal objetivo dos testes nas aplicações Web é correr a aplicação usando combina- ções de inputs e estados de forma a descobrir falhas no software (Lucca and Fasolino [65]). Estes testes necessitam de ser vistos como um processo de desenvolvimento que é efetuado ao longo do projeto e não apenas no final. O processo de desenvolvimento e testes deve ser visto como um único processo, de forma a tornar os testes o mais eficientes possíveis. Desta forma é necessário gerir este processo por fases. Logo desde o início quando está a ser tratada a parte da especificação e requisitos do projeto, os testes devem também ser planeados. Assim ao longo do projeto, conforme vai sendo construido e codificado, devem ser executados testes unitários que permitem testar os outputs (Secção 2.3.2), bem como 1 Processo de encontrar e remover um erro específico do programa. Um processo manual. 2.3. Software Testing 7 na fase de integração devem ser corridos os seus respetivos testes. Desta forma, é possível garantir que o produto resultante está de acordo com os requisitos e especificação antes de ser lançado (Ammann and Offutt [4]). Garantir a correta especificação de um projeto é crucial, no entanto é uma tarefa compli- cada devido à quantidade de cenários possíveis. Apesar dos testes ajudarem nesta tarefa, a sua implementação torna-se complexa devido às dificuldades inerentes aos testes. De forma a analisarmos essas dificuldades, podemos dividir a abordagem de testing em 4 fases conformeWhittaker [124]: • Fase 1 - Modelação do ambiente de software • Fase 2 - Selecionar cenários de teste • Fase 3 - Correr e avaliar os cenários de teste • Fase 4 - Medir o progresso dos testes Segue-se uma breve descrição de cada uma dessas fases: fase 1 • Os testers2 têm de identificar e simular as interfaces que um sistema de software usa e enumerar os inputs por cada interface. • Os testers têm de entender a interação do utilizador que cai fora do controlo do software em teste. Nesta primeira fase os testers deparam-se com dois grandes problemas. Como identificar e simular as interfaces, uma tarefa complexa, devido aos 4 tipos de interface existentes (Humanas, Software, Sistema de ficheiros e Comunicação), e a mais complexa e um pouco imprevisível, como entender a interação do utilizador que cai fora do controlo do software em teste. fase 2 • Existe um número infinito de cenários de teste. Devido à grande quantidade de cenários de teste possíveis, é muito difícil garantir que todos são abrangidos. Assim a melhor abordagem será gerar o maior número possível de testes, de forma a tentar cobrir o maior número de cenários. 2 As pessoas que testam o software. 2.3. Software Testing 8 fase 3 • Os testers tentam automatizar os cenários de teste o melhor que conseguirem. Face à grande quantidade de cenários existem sempre algumas limitações (tecnologia utilizada) no que toca a automatizar os cenários de teste. Assim o tester tenta automatizar o melhor que conseguir. fase 4 • As medidas de contagem dão pouca visão sobre os progressos dos testes. No final dos testes estarem feitos, surgem sempre perguntas como: - Será que testei para erros comuns de programação? - Será que testei todo o código? - Será que corri todos os cenários que espero que um utilizador execute? Este tipo de perguntas no final é muito comum, e devido ao erro humano é possível que algumas tenham uma resposta negativa. Em suma, existem diversos problemas na escrita e implementação de testes. Problemas estes que podem ser atenuados com ferramentas de coverage3 e verificação formal, tal como será analisado mais à frente neste capítulo. De seguida, serão analisados os tipos e metodologias das ferramentas de teste. 2.3.1 Métodos Existem três métodos de testing que podem ser aplicados às aplicações Web. Black box Figura 1.: Black Box Testing 3 Indica percentagem de código testado 2.3. Software Testing 9 Black box, ou caixa preta, é uma técnica de testing que não contém nenhuma informação da funcionalidade e estrutura interna do sistema, tal como mostra na Figura 1. Nesta técnica o tester apenas sabe os inputs e os resultados produzidos, não sabe como o sistema chegou a esses resultados. Geralmente este método é considerado como teste funcional (Nidhra [79]). White Box Figura 2.: White Box Testing White box, ou caixa branca, é uma técnica de testing que ao contrário da black box, tem conhecimento da estrutura e lógica interna. Isto permite, que seja feita uma análise mais aprofundada, tal como a coverage do código escrito e lógica. Neste caso ao encontrar um problema o tester tem de verificar no código qual o pedaço que está a causar o problema (Khan [57]). Grey Box Grey box, ou caixa cinza, é uma técnica de testing que aumenta a cobertura dos testes ao permitirmos focar em todas as camadas de qualquer sistema complexo pela combinação das duas técnicas referidas anteriormente (Khan [57]). Esta técnica surgiu devido a vários estudos (Linzhang et al. [63], Chen et al. [20], Liu and Chen [64]), onde sugerem a utilização de uma técnica que seria uma mistura entre as técnicas de black e white box considerando tanto a estrutura externa como interna. Esta técnica é também bastante bem adaptada aos testes de aplicações Web (Acharya and Pandya [1]). 2.3.2 Metodologias Nesta Secção será feita uma breve análise às várias metodologias de testes existentes, e de seguida feita uma análise das metodologias focadas nas aplicações Web que se enquadram no desenvolvimento desta dissertação. 2.3. Software Testing 10 Testes unitários Unit testing, ou testes unitários são os testes individuais ou de grupos das unidades rela- cionadas (Ieee [42]). Os testes unitários têm como objetivo garantir que os outputs estejam de acordo com o estipulado. São feitos por pedaços de código, ou mesmo apenas a uma função/método de forma a validar o seu funcionamento. Estes testes focam-se em desco- brir defeitos que são propriedades de todo o sistema em vez dos componentes individuais (Lucca and Fasolino [65]). Testes funcionais O objetivo dos testes funcionais é assegurar a concordância da parte funcional do software face às suas especificações (Ibrahim and Keshk [41]). Esta é uma das metodologias de testing mais importante nas aplicações Web, e dado o contexto em que este estudo se insere, será um dos focos deste trabalho. É aqui que se consegue garantir que a uma aplicação se encontra de acordo com os requisitos e especifi- cações. Com esta metodologia de teste verifica-se a sintaxe HTML, links, e muitas outras componentes das aplicações Web. Testes de sistema Com esta metodologia consegue-se garantir que a aplicação Web irá correr de acordo com o estabelecido nas várias plataformas e browsers de Internet (Beizer [10]). Testes de stress Testes de stress são também uma parte importante nas aplicações Web. É necessário garantir que as aplicações Web (incluindo os servidores) aguentam os pedidos dos utilizadores de forma eficiente e sem falhar (Patton [87]). Teste de performance É necessário garantir que as aplicações Web independentemente da quantidade de utilizado- res em simultâneo irão responder num tempo aceitável. Estes testes são a forma de garantir que tal acontece (Weyuker and Vokolos [123]). Testes de usabilidade Os testes de usabilidade são geralmente efetuados com um grupo de utilizadores externos, sem conhecimento da plataforma, que recebem certas tarefas para realizarem e são observa- dos por uma ou mais pessoas, de forma a obter feedback das dificuldades encontradas por 2.3. Software Testing 11 Tabela 1.: Relacionamento métodos/metodologias Black Box White Box Grey Box Unitários X Funcionais X Sistema X Stress X Performance X Usabilidade X Aceitação X Regressão X X X Beta X esses utilizadores. A partir destes testes surgem sugestões de melhorias para a plataforma (Brinkman et al. [15]). Testes de aceitação Estes são o tipo de testes que são feitos pelo cliente para assegurar que o produto vai de encontro aos requisitos e funciona como previsto. Estes enquadram-se nos testes "black box". Testes de regressão Os testes de regressão são os testes realizados após uma alteração no código do software. Geralmente devem ser corridos após a implementação de uma funcionalidade/correção, de forma a garantir que o novo código não introduz erros, e que não afetou o código existente. Este tipo de testes é muito importante, pois com eles é possível evitar a quebra de funcionalidades. Este tipo de testes enquadram-se nos testes "black box"(Kim et al. [58]). Testes beta Estes são os testes realizados por utilizadores finais, sendo uma equipa fora da área de desenvolvimento. A ideia é encontrar erros inesperados. Este tipo de testes enquadram-se nos testes "black box". 2.3.3 Relacionamento métodos/metodologias Conforme pode ser observado na Tabela 1, é possível verificar para cada metodologia o seu relacionamento com o tipo de testes. Na sua maior parte pertencem ao Black Box por não terem conhecimento da lógica interna do sistema. No caso dos testes de regressão é possível observar que pertencem aos 3 tipos existentes. 2.3. Software Testing 12 2.3.4 Testes nas aplicações WEB Aplicando o conceito de testing às aplicações Web, é possível dividir as metodologias indi- cadas anteriormente em dois tipos de verificação, a estática e a dinâmica (Ricca and Tonella [97]). A estática baseia-se em fazer uma verificação ao nível da página HTML e detetar falhas. Esta pode passar por verificar os caminhos percorridos peloutilizador ou no ca- minho que a informação faz de forma a verificar se tudo corre bem. Mais detalhes sobre a análise estática pode ser encontrado no livro de Ricca and Tonella [96]. Esta verificação permite também tratar das questões de páginas que não podem ser alcançadas a partir da página principal. Existem também os casos dos links quebrados que podem ser facilmente detetados com este tipo de verificação. A verificação dinâmica já se enquadra no método do white box, pois ao contrário da verifi- cação estática o código já é executado, e faz validações dos resultados com o esperado. Esta verificação é efetuada a todos os níveis e tanto pode ser black box como white box (Fairley [30]). Figura 3.: Verificação estática e dinâmica Focando nas metodologias abordadas anteriormente, e dado o contexto em que este es- tudo se insere, as mais importantes no desenvolvimento desta dissertação serão as de testes funcionais, de forma a ser possível testar toda a funcionalidade de uma aplicação Web e ve- rificar se a implementação está de acordo com os requisitos e especificação, bem como os testes de regressão. Com estas duas metodologias será possível verificar a qualidade da aplicação Web desenvolvida ao longo de todo o processo de desenvolvimento. Com elas será possível analisar problemas em links, design, compatibilidades entre browsers desktop e mobile, entre muitas outras (Ricca and Tonella [98]). O facto de aliar estas metodologias com a geração de testes automáticos permitirá que este processo se torne bastante simples 2.3. Software Testing 13 de executar. Na Figura 3 pode observar-se a hierarquia de testes e verificação descritas. 2.3.5 Ferramentas Nesta secção será feita uma análise das ferramentas que permitem efetuar testes às apli- cações Web e escolher a que mais se adequa ao contexto em que este estudo está a ser realizado. Visto o objetivo desde documento ser a aplicação de testes ao nível do browser, serão apenas apresentadas as ferramentas que o permitem fazer. Como também se pre- tende reduzir o número de horas investidas em testes de forma a aumentar a rentabilidade dos projetos, as ferramentas estudadas são apenas as que permitem automatizar todo este processo. Selenium [104] é uma ferramenta open-source. Da informação recolhida através de vá- rios fóruns, páginas e incluindo o grupo oficial de discussão do Selenium, esta é a ferra- menta mais utilizada pela comunidade de testes de aplicações Web. Usa javascript e iframes para embutir o sistema de automação de testes no browser, permitindo correr no próprio browser e utilizar as capacidades dadas por esse browser permitindo controlar a aplicação Web em teste. Isto permite que os mesmos scripts de teste possam ser utilizados por múlti- plos browsers e múltiplas plataformas (Holmes and Kellogg [38]). Também está preparada para funcionar nas versões atuais e mais antigas do Internet Explorer [68], Firefox [76], Ch- rome [36], Opera [84] e Safari [100], bem com os browsers dos dispositivos móveis. É uma ferramenta para realizar testes funcionais à aplicação Web. Tem disponível coman- dos para simular a navegação de um utilizador pelo browser e também permite testar AJAX devido aos comandos especiais disponíveis(waitForText, waitForCondition, e waitForSelec- tion). Tudo isto é possível devido ao Selenium WebDriver, permitindo construir conjuntos ro- bustos de testes de regressão baseados no browser. Uma grande vantagem do Selenium WebDriver é também o facto de permitir escalar e distribuir scripts por vários ambientes, facilitando assim os testes em simultâneo e em maior quantidade. Esta framework conta também com vários patrocinadores, tais como o BrowserStack [16], SauceLabs [102], Tricentis [116] e SmartBear [108]. O Selenium WebDriver funciona de forma bastante simples: para cada comando Sele- nium é criado um pedido HTTP e enviado para o driver do browser que por sua vez usa o HTTP Server para obter o pedido enviado. De seguida os comandos são executados no browser e é enviado o estado da execução de volta para o HTTP Server que por sua vez envia o estado de volta para o script de automatização. Conforme a Figura 4 pode ser 2.3. Software Testing 14 Figura 4.: Funcionamento Selenium Web Driver Fonte: Quora [92] observado o seu funcionamento em que o programador fornece as instruções ao driver do browser, sendo que este é responsável por enviar os comandos ao browser de forma a serem executados. Sahi [101] é uma ferramenta open-source que permite gravar um percurso de navegação numa aplicação web e fazer o replay da mesma nos vários browsers. Tem disponível dri- vers em várias linguagens para escrever as scripts de teste, suporta Ajax e conteúdos Web dinâmicos (IBM [39]). É semelhante em características ao Selenium, no entanto dispõe de duas opções, a versão open-source e a versão PRO que é uma versão paga. É de destacar alguns dos seus clientes, tais como a Chanel [19], Tesco [111], EMC2 [28] e muitos mais que podem ser consultados no site oficial [101]. Uma grande vantagem desta ferramenta é a existência de comandos como near e in que permitem identificar mais facilmente elementos na estrutura HTML do documento. Outra grande vantagem passa por não existir a preocu- pação de lidar com os tempos de espera devido ás chamadas AJAX. A Figura 5 apresenta o funcionamento desta ferramenta, para facilitar a sua compreensão, que de forma geral, funciona como um servidor proxy, sendo que nos pedidos HTTP efetu- ados é injetado código Javascript de forma a controlar o browser. Watir [122] é mais uma ferramenta open-source com a licença BSD [17], com uma grande comunidade. Esta diferencia-se devido ao facto de ser escrita em Ruby. É de realçar aqui grandes clientes tais como Oracle [85], Facebook [29] e Yahoo [126]. Uma caraterística impor- tante é o facto que para executar testes nos vários browsers utiliza o seu próprio WebDriver, que no entanto é nada mais do que um elemento que incorpora o Selenium WebDriver. Uma limitação atual da Watir é o facto de apenas ser possível correr uma driver por pro- cesso Ruby [122]. Outra desvantagem é a quantidade de documentação disponível em 2.3. Software Testing 15 Figura 5.: Funcionamento Sahi Fonte: ThoughtWorks [114] comparação com as outras, sendo que neste caso ainda é pouca a documentação disponível face ás suas concorrentes. 2.3.6 Comparação de ferramentas Tendo em conta a informação recolhida das páginas oficiais das ferramentas, para o estudo em causa, bem como no artigo Singh and Tarika [107], foram escolhidas as características mais importantes, que podem ser visualizadas e comparadas na Tabela 2. Tabela 2.: Comparação de ferramentas Selenium Sahi Watir Open Source Sim Sim Sim Comunidade Grande Média Grande Corre em vários browser/SO Sim Sim Sim Suporte mobile Sim Sim Sim Suporta o playback em paralelo Sim Sim Sim Documentação Muita Muita Pouca Geração de relatórios Sim(Através de bibliotecas) Sim Sim(Plugins) Preço Grátis $695/ano Grátis Além destes dados, a partir do artigo Singh and Tarika [107], concluímos que a perfor- mance é no geral melhor na Selenium, sendo que a Watir ainda se encontra um pouco abaixo em termos de performance. 2.4. Qualidade 16 2.3.7 Seleção de ferramentas O estudo comparativo foi apresentado aos responsáveis pela equipa de desenvolvimento Web da Eurotux. Apesar da Sahi apresentar algumas vantagens perante as outras, tem uma grande desvantagem, o facto de ter a versão paga. Infelizmente a versão gratuita da ferramenta é muito limitada, e na Eurotux privilegia-se a utilização de software open source. Como tal, a escolha seria entre a Selenium e a Watir. Dado o artigo já referido anteriormente (Singh and Tarika [107]) é possível retirar conclusões bastante pertinentes a nível de performance, sendo que entre estas duas a Selenium é a que obteve a maior pontuação. O facto de permitir mais linguagens também é uma mais valia assim como o facto de ter mais documentação disponível. Ficou por isso decidido analisar a ferramenta Selenium de formaa garantir que atinge os objetivos. 2.4 qualidade 2.4.1 Definição A qualidade do software baseia-se em obter software livre de bugs ou defeitos, que vá de encontro com os seus requisitos e especificação. A norma ISO 8402-1986 [44] define qualidade da seguinte forma: The totality of features and characteristics of a product or service that bears its ability to satisfy stated or implied needs — Norma 8402-1986, ISO [44] A qualidade é importantíssima para que os utilizadores tenham confiança no software, mas para a conseguir atingir também tem de ser garantido que os testes executados têm qualidade suficiente. Mas o que é qualidade ao certo? An attitude you bring to your work wich is reflected in the properties of your product — Software Quality, Testing & Metrics, Cusick [24] Mas que atitude deve ser essa? Essa atitude passa por implementar logo desde o início testes corretos com base nos requisitos do projeto. De forma mais sucinta, a qualidade de software tem como principal objetivo a normalização de processos de desenvolvimento, sendo o principal objetivo o de garantir que o produto final satisfaça as expectativas do cliente. O fator mais importante para o cliente a nível da qualidade é o perfeito funcionamento 2.4. Qualidade 17 das funcionalidades do software. Estas devem funcionar como esperado e não falhar em situação alguma. No entanto desenvolver software com qualidade de acordo com as necessidades do cliente é uma tarefa complicada. O sucesso, aceitação e falha do software depende do seu nível de qualidade (Kastro and Bener [56]). No geral, pode ser considerada como o comportamento satisfatório do produto, que pode ser a nível funcional ou não funcional (Singh and Singh [106]). Uma das definições mais completas é dada por Crosby [23]: The first erroneous assumption is that quality means goodness, or luxury or shininess. The word “quality” is often used to signify the relative worth of something in such phrases as “good quality”, “bad quality” and “quality of life” - which means different things to each and every person. As follows quality must be defined as “conformance to requirements” if we are to manage it. Consequently, the nonconformance detected is the absence of quality, quality problems become nonconformance problems, and quality becomes definable — Quality is free: The art of making quality certain, Crosby [23] Assim, é possível afirmar que software de qualidade é software que está apto para a sua finalidade (Northrop [80]). 2.4.2 Evolução A preocupação de obter qualidade (Quality Assurance) nos produtos (software ou outro tipo) já vem desde muito atrás sendo que as suas raízes datam aos tempos da idade média, mas apenas há 27 anos devido a preocupações de segurança por parte dos serviços militares dos Estados Unidos da América foi implementado o standard MIL-STD-105E [71], em que definia Tabelas de referência de forma a fazer verificações de segurança nos equipamentos. Desde esse momento a preocupação com a qualidade foi sempre crescendo. Conforme a Figura 6 é possível observar uma descrição da evolução da qualidade ao longos dos últimos anos, sendo que nos anos 60 existe o controlo de qualidade, nos anos 70 temos a garantia de qualidade, nos anos 80 evoluiu para a gestão da qualidade, e dos anos 90 até atualmente evoluiu para a gestão da qualidade total. Cada vez mais a qualidade é importante no dia a dia. Quer sejam produtos de software, ou doutra natureza, a qualidade tem de estar presente e cada vez mais esses padrões se tornam rigorosos. Podem ser consultadas mais informações acerca da evolução da qualidade em Warrier and McGillen [121]. 2.4. Qualidade 18 Figura 6.: Evolução qualidade Fonte: Mohamed [74] Relativamente à qualidade no software foi necessário desenvolver ferramentas que ga- rantissem através de métodos formais que a sua modelação se encontrava correta (Almeida et al. [3]). Assim começaram a surgir ferramentas de modelação e análise de abstrações de software. De seguida será feita uma introdução e análise às linguagens e ferramentas mais importantes. 2.4.3 Linguagens/Ferramentas de especificação formal Nesta secção será feita uma análise das linguagens/ferramentas de especificação formal que permitem validar a especificação de um projeto Web. Com base na investigação efetuada sobre este tema na pesquisa do Google e dos documentos verificados, foram selecionadas as linguagens/ferramentas com o maior número de referências encontradas. VDM [13] ou Vienna Development Method, é uma linguagem de especificação que per- mite efetuar a modelação de sistemas informáticos e analisar a sua especificação e identificar defeitos, numa fase inicial do desenvolvimento do projeto (Fitzgerald et al. [31]). 2.4. Qualidade 19 Esta linguagem é originária da IBM, nomeadamente do IBM’s Vienna Laboratory, desen- volvida em meados de 1970 por Cliff Jones e Dines Bjorner. A VDM também inclui uma linguagem de especificação chamada VDM-SL (VDM Specification Language) [86]. Após o desenvolvimento da VDM apareceram algumas ferramentas para verificar as espe- cificações VDM, mas estas ferramentas eram mais para projetos informais. Em 1988, Peter Froome desenvolveu uma ferramenta chamada SpecBox [2]. Esta ferramenta é utilizada em sistemas de comboios, segurança e até em instalações nucleares. Existem também outras ferramentas para verificar a especificação VDM, tais como IFAD VDM-SL [27] e Centaur-VDM [125] que trazem um ambiente gráfico. Object-Z / Z [119] é uma extensão da linguagem de especificação Z focada em facili- tar a especificação utilizando objetos. A linguagem Z foi desenvolvida em 1977 por Jean- Raymond Abrial na Universidade de Oxford. Esta linguagem utiliza a notação matemática usada em cálculo lambda. OCL [83] é uma linguagem declarativa para descrever regras que se aplicam aos mode- los UML tendo sido desenvolvida na IBM [40]. Inicialmente foi desenhada para ser uma linguagem de anotações para diagramas UML [82], sem incluir qualquer notação textual para declarações. No entanto variações da OCL, tais como a USE-OCL [118] ultrapassam esta limitação. A OCL é baseada na lógica de primeira ordem, no entanto usa uma sintaxe semelhante às linguagens de programação e relacionada com a sintaxe do UML. Algumas das ferramen- tas que suportam o OCL são a Octopus [81], e as Eclipse Model Development Tools [26]. Algumas das funcionalidades são a interpretação de OCL em testes e geração de código. Esta linguagem tem um problema grande em que não pode ser aplicada a especificações de tempo real devido à falta da possibilidade de declarar estados e a sua evolução ao longo do tempo (Clark and Warmer [21]). Devido a esta restrição não será considerada como opção, visto não se adequar aos objeti- vos. Alloy Analyser [72] é uma ferramenta que utiliza a linguagem específica chamada Alloy [72]. A linguagem é de especificação declarativa para expressar estruturas, e permite cons- truir modelos utilizando uma técnica baseada no tempo e com base de objetos. O Alloy foi inspirado pela notação da linguagem Z (Jacky [46]) e foi criada para suportar os chamados Métodos Formais leves [45]. Esta ferramenta, permite com base na especificação declarada, 2.4. Qualidade 20 gerar testes automáticos e correr os mesmos de forma a garantir que a especificação se encontra correta e sem falhas. Tal como a linguagem Z, o Alloy descreve as estruturas em espaço e tempo, com um número mínimo de notações matemáticas, sendo ainda mais simples que a Z. No Alloy, tudo são relações e utiliza lógica não especializada o que facilita a escrita. Permite o acesso a contra exemplos o que é ótimo para se verificar quais os problemas da especificação. Toda a análise realizada pelo Alloy é feita por redução ao SAT (satisfiability). O Alloy tem uma característica muito importante para o contexto em que este estudo se insere: o facto de ser escrito em JAVA e poder ser utilizado como biblioteca. Desta forma é possível integrar com a ferramenta escolhida para a automação dos testes e juntar osmétodos formais à automação e geração de testes. Assim, não só se garante que a especificação se encontra correta, como também os testes executados sobre o projeto de software. 2.4.4 Comparação de Linguagens/Ferramentas Com base nas páginas oficiais das linguagens/ferramentas de especificação formal, e nos ar- tigos Mikusiak et al. [70] e Jones [53] foram identificadas as características mais importantes sendo apresentadas e comparadas na Tabela 3. Tabela 3.: Comparação de linguagens/ferramentas qualidade OCL VDM Object-Z Alloy Integração fácil com Java Sim Sim Não Sim Especificações de tempo real Sim Sim(VDM-RT) Não Sim Lógica de primeira ordem Sim Sim Sim Sim Permite ser automaticamente analisada Sim Não Não Sim Notação ASCII Não Não Não Sim Comparando a linguagem Alloy com a Linguagem Z, uma das vantagens da linguagem Z face ao Alloy é ter uma notação matemática mais rica tornando-a mais expressiva. No entanto, o Alloy trabalha melhor com a lógica de primeira ordem [43]. 2.4.5 Seleção de ferramentas O estudo comparativo foi apresentado aos responsáveis pela equipa de desenvolvimento Web da Eurotux. A escolha recaiu sobre a linguagem Alloy juntamente com a sua ferra- menta Alloy Analyser. O facto de ter a possibilidade de ser incluído noutro projeto por via 2.5. Análise às ferramentas 21 da biblioteca JAVA é uma enorme vantagem. Assim será possível verificar que os testes gerados estão corretos, evitando a execução de testes errados que levam à perda de tempo e induzindo em erro quem analisa os resultados. Ficou por isso decidido analisar a lingua- gem Alloy em conjunto com a ferramenta Selenium de forma a garantir que juntas atingem os objetivos a que este estudo se propõe. 2.5 análise às ferramentas Nesta secção será feita uma análise individual às ferramentas selecionadas de testes e veri- ficação formal, bem como a possibilidade da utilização de ambas na ferramenta a desenvol- ver. 2.5.1 Verificação formal - Alloy Assumindo uma aplicação Web genérica que possui uma página de login, considere-se a seguinte especificação: Um utilizador contém apenas um login. O login é composto por um username e uma password, bem como a relação para o seu respetivo dono. Esta especificação, apesar de muito simples, é a mais usual de ser utilizada. Modelando esta especificação para a linguagem Alloy obtem-se no Código 2.1: sig Email {} sig Password {} sig User { login: one Login } sig Login { email: one Email , password: one Password , owner: one User , } fact { all u:User | u.login.owner = u } Código 2.1: Código Alloy 2.5. Análise às ferramentas 22 Neste código verificamos que define os elementos Email e Password, tendo definido o utilizador como contendo apenas um login (utilizando a palavra one), e o Login como tendo um Email, uma password, e um utilizador. Temos ainda descrito que para todos os utilizadores o dono do seu login será ele próprio. De forma a corrermos este teste basta adicionar a asserção4 com as propriedades a verifi- car: assert a { all l:Login | one l.owner all u:User | one u.login.email all u:User | u.login.owner = u } check a for 4 Código 2.2: Código Alloy - Asserções Neste caso estamos a verificar que para todos os logins apenas existe 1 dono, para todos os utilizadores apenas existe um email associado, e que o dono do login associado é ele próprio. De seguida executamos o comando check para validar, sendo que neste momento são gerados testes e corridos contra o modelo indicado. Ao executar a verificação deste modelo não é encontrado um contra exemplo, ou seja, a especificação encontra-se correta com base nas asserções pedidas. Mas será que esta especificação se encontra mesmo correta? Adicionemos às asserções a regra "all e:Email | (#e. email = 1)". Esta regra verifica que para todos os emails, um email apenas pode estar associado a 1 login(campo email do login). Neste caso ao correr novamente o teste, verificamos que foi encontrado um contra exemplo, pois existe um email que se encontra associado a dois logins. Tudo isto deriva da má especificação dada inicialmente, pois faltava especificar que um email apenas pode estar associado a um login, caso contrário poderia o mesmo email ter várias contas associadas. Com este teste, foi possível detetar uma falha na especificação de um projeto, e assim proceder à sua correção. 2.5.2 Testes - Selenium Com o teste anterior em Alloy verificamos a especificação de um requisito, que agora sa- bemos que se encontra correta. Assim, agora resta testar de forma funcional esse mesmo 4 Proposição que se julga verdadeira 2.6. Conclusões 23 requisito. Para tal, será utilizada ferramenta Selenium para efetuar essa verificação. Um teste utilizando o Selenium baseado na especificação pode ser observado no Código 2.3: from selenium import webdriver from selenium.webdriver.common.keys import Keys import time browser = webdriver.Firefox () browser.get("https :// localhost/login.php") time.sleep (10) username = browser.find_element_by_id("username") password = browser.find_element_by_id("password") username.send_keys("utilizador") password.send_keys("palavra passe") login_attempt = browser.find_element_by_xpath("//*[ @type=’submit ’]") login_attempt.submit () Código 2.3: Exemplo código Selenium Com este teste conseguidos validar se os elementos para o login existem na página, e conseguimos simular a interação humana e efetuar o login na página. Assim, utilizando vários testes deste género seria possível testar logins, e até tentar encontrar falhas no sistema de login. Este é um simples teste que permite verificar se os campos existem e tentar efetuar o login na página, mas muito mais é possível através da API do Selenium. 2.5.3 União de ferramentas Com base nos dois exemplo indicados anteriormente foi possível verificar se a especificação se encontrava correta e com recurso ao Selenium, verificar a sua componente funcional. Um ponto a explorar será certamente aproveitar os casos de testes gerados pelo Alloy para efetuar a verificação da modelação, e injetar esses mesmos casos no Selenium de forma a garantir de imediato uma enorme quantidade de testes. No entanto, face à complexidade de tal implementação, esta ficará como trabalho futuro a realizar. 2.6 conclusões De acordo com o objetivo geral desta dissertação, que é assegurar que o processo de de- senvolvimento Web da Eurotux se torna mais robusto relativamente à vertente dos testes, de forma a aumentar a qualidade do software produzido, para que seja possível mitigar os 2.6. Conclusões 24 problemas descritos pela diretora do departamento na entrevista inicial, deste Capítulo é importante reter o seguinte: • Apesar das empresas de TI se preocuparem cada vez mais com a qualidade do soft- ware, muitas deixam de parte um importante segmento de qualquer projeto de soft- ware: os testes. • Os testes são por norma realizados manualmente e pela pessoa responsável pela im- plementação, o que se traduz num enorme erro na medida em que quem programa, ao testar o seu próprio código já se encontra num ciclo ’vicioso’. • O foco deste trabalho estará em eliminar a interação humana nos testes, e permitir correr testes realizados de forma automática logo desde o início de um projeto. No entanto, para alcançar tal objetivo é necessário garantir que o projeto tem uma boa especificação. Ou seja, é importante garantir a qualidade da própria especificação, pois só desta forma é possível avançar com o desenvolvimento do software, e em simultâneo realizar testes automáticos • Das várias metodologias de testes existentes, o presente estudo irá focar-se essenci- almente nos testes funcionais que asseguram a concordância da parte funcional do software face às suas especificações, e nos testes de regressão que garantem que o novo código não introduz erros. • Relativamente à ferramenta de testing, a Eurotux decidiu optar pela utilização do Selenium. Esta é uma ferramenta open source, com uma forte comunidade e bastante documentação acessível, permite várias linguagens e temboas classificações ao nível da performance. • Quanto à qualidade a escolha da Eurotux foi a linguagem Alloy juntamente com a sua ferramenta Alloy Analyser. O facto de ter a possibilidade de ser incluído a outro projeto por via da biblioteca JAVA é uma enorme vantagem. Assim será possível verificar se os testes gerados estão corretos, e evitar a execução de testes errados que levam à perda de tempo e induzindo em erro quem analisa os resultados. • A avaliação realizada ao Selenium e à linguagem Alloy demonstram que é possível através do Alloy Analyser validar o requisito/especificação e com o Selenium verificar a sua componente funcional. Em suma, a escolha passa por Selenium + Alloy. A sua junção permitirá uma sólida e robusta geração, verificação e execução de testes, de forma automática e simples. Existe também a vantagem de utilizar ferramentas/linguagens que são open source, ajudando 2.6. Conclusões 25 a comunidade a ter melhor software de forma a podermos garantir a aplicação do selo representado na Figura 7. Figura 7.: Selo correção Fonte: José Nuno Oliveira, MFES - Uminho Após o estudo das várias metodologias e a escolha das ferramentas/linguagens, importa agora definir o próximo passo. 2.6.1 Plataforma de testes e verificação Tendo tido em conta as principais possibilidades de ferramentas/linguagens a utilizar, a utilização do Selenium (na parte de testing) e Alloy (na parte de qualidade) certamente apresenta um grande desafio. No entanto, tal como referido anteriormente, é possível juntar as duas devido à biblioteca Java do Alloy e ao Selenium poder ser codificado em Java, facilitando assim a integração de ambas. Desta forma, o próximo passo será desenvolver um projeto Java, que possibilite, dada a especificação do projeto introduzida pelo utilizador, efetuar uma verificação através do Alloy se essa especificação se encontra correta, e se tal for verdade então gerar testes e correr automaticamente através do Selenium nas várias plataformas e browsers. Assim sendo, o projeto a desenvolver deve ter como base as seguintes características: • Ser capaz de receber a especificação de um projeto de software Web (por páginas, ou global); • Ser capaz de interpretar essa especificação e validar que se encontra correta; • Gerar com base na especificação os respetivos testes; • Correr os respetivos testes em diversas plataformas, sistemas operativos e browsers; 2.6. Conclusões 26 • Gerar relatórios com os resultados; Podem ainda ser consideradas algumas características secundárias, nomeadamente a exe- cução de todo o processo através do terminal, de forma a poder ser executado remotamente de forma fácil, e a execução automática ao longo do tempo de forma programada pelo uti- lizador. Antes de descrever a arquitetura do projeto a implementar, segue-se no próximo capítulo uma descrição da ferramenta central deste estudo, o Selenium, assim como a sua história, origem e evolução. 3 F E R R A M E N TA D E T E S T E S S E L E N I U M 3.1 introdução Com base na ferramenta identificada no capítulo anterior, de forma a atingir os objetivos pretendidos de construir um sistema robusto e automático de testes, é necessário analisar de forma aprofundada a ferramenta de testes Selenium. Assim, neste capítulo será apre- sentada a sua história, de onde surgiu e como evoluiu. Será também feita uma análise a todos os seus componentes, sendo esta uma parte importante para o desenvolvimento do sistema, bem como uma análise às suas principais versões e diferenças entre elas. 3.2 história O Selenium é uma ferramenta que já existe desde 2004, tendo sido originalmente produzida por Jason Huggins como uma ferramenta interna da empresa ThoughtWorks [115], com o objetivo de testar um software de gestão de tempo interno e despesas, escrito em Python e utilizando a framework Plone. No desenvolvimento desta ferramenta, Jason já contou com a ajuda de Paul Gross e Jie Tina Wang. Ainda em 2004 foi lançada a primeira versão open source da ferramenta denominada "Selenium Remote Control (RC)". Mais tarde, quando Paul Hammant viu a demonstração da ferramenta, começaram a surgir as ideias de tornar a ferramenta open source, bem como aplicar a casos mais abrangentes e de forma genérica. Assim, com a ajuda de diversos intervenientes o "Selenium Remote Control (RC)"foi evoluindo para a ferramenta Selenium que iremos utilizar neste projeto. Esta ferramenta devido à sua evolução ao longo dos anos dispõe de diversos componentes que podem ser utilizados, permitindo assim efetuar testes rapidamente e diretamente a partir do browser, ou construir algo mais robusto de forma a ser possível testar de forma continua e exaustiva diversas aplicações Web através de uma rede de várias máquinas. Esta ferramenta conta com o apoio de várias entidades, das quais destacamos Browser Stack [16] e Sauce Labs [102], empresas que se dedicam a disponibilizar configurações para 27 3.3. Componentes 28 testes mais fáceis na cloud. O nome Selenium surgiu a partir de um email de Jason Huggins a gozar com o competidor Mercury a indicar que conseguiria curar o envenenamento de mercúrio ao tomar suplementos de selénio (Selenium em inglês). Os colegas ao ter recebido o email gostaram do nome e daí surgir o nome da ferramenta. 3.3 componentes O Selenium, face à sua complexidade encontra-se dividida em 4 componentes. Cada um destes componentes é responsável por uma parte importante da ferramenta, fornecendo pequenas funcionalidades, construindo assim no seu todo uma ferramenta especializada em testes. Na Figura 8 pode ser observada a estrutura da ferramenta, bem como os seus diversos componentes, nomeadamente o IDE, Remote Control, WebDriver e Grid, que serão alvo de uma análise nas próximas secções. Figura 8.: Componentes Selenium 3.3.1 Selenium Remote Control Este componente é um servidor escrito em Java que permite comandar os browsers e as- sim efetuar testes a qualquer site HTTP utilizando um browser com javascript ativo. O Selenium Remote Control é essencialmente divido em duas partes, o servidor que permite interagir com o browser e efetuar ações como pedidos HTTP, abrir e fechar browsers, e a se- gunda parte as bibliotecas para os clientes de forma a poder comandar através de diversas linguagens o servidor e assim, interagir com ele. De forma mais específica, o Selenium Re- mote Control é responsável por receber os comandos Selenium, executá-los e indicar o seu resultado ao nosso programa, injetando no browser o seu núcleo, podendo assim executar os comandos no browser. Por sua vez as bibliotecas do lado do cliente são responsáveis por 3.3. Componentes 29 permitir a partir de várias linguagens interagir com o Selenium Server. Este funcionamento é o normal na versão 1 do Selenium. No caso da versão 2 este componente será associado a outro como poderemos ver mais à frente, alterando um pouco o funcionamento geral, sendo a principal diferença a inclu- são de um WebDriver API e o abandono da injeção dos comandos através de Javascript. Atualmente o Selenium Remote Control dispõe de bibliotecas para as linguagens Java [47], C# [18], Python [91], Ruby [99], PHP [89], Perl [88] e Javascript [48], sendo que toda a documentação se encontra disponível na página oficial [94]. Na Figura 9 podemos observar o funcionamento geral do Selenium RC. De forma sucinta, os scripts são enviados ao Servidor Selenium, que irá iniciar e terminar as sessões dos browsers e efetuar os pedidos HTTP necessários à página de forma a correr os testes. Figura 9.: Selenium Remote Control 3.3.2 Selenium IDE O Selenium IDE (Integrated Development Environment) trata-se de um plugin para o brow- ser Firefox que permite de forma simples gravar, editar e fazer debug sobre testes, sendo que anteriormente era chamado de Selenium Recorder. Esta ferramenta foi criada por Shinya Kasatani no Japão e doada ao projeto em 2006. Dispõe também de uma interface gráfica bastante apelativa, sendo ideal para novos utilizadores que queiram apenas efetuar testes simples e deforma rápida à sua plataforma Web. Esta ferramenta ao permitir gravar as ações, faz com que qualquer utilizador possa rapidamente, sem grande custo efetuar os testes pretendidos. Toda a documentação pode ser consultada na página oficial [105]. 3.3. Componentes 30 Figura 10.: Selenium IDE v2.9.1 3.3.3 Selenium WebDriver Com a evolução do Selenium, e também dos computadores e da Web, surge a necessidade de implementar novos sistemas mais robustos para melhorar e ultrapassar algumas limita- ções dos sistemas antigos utilizados. Assim surge a integração da WebDriver no projeto Selenium. A Selenium WebDriver foi também pensada de forma a melhorar a compatibili- dade com páginas Web dinâmicas (AJAX) entre outros aspetos. Ao efetuar pedidos diretos aos recursos nativos dos browsers disponíveis para automa- ção a sua execução torna-se mais rápida do que com o Selenium RC, no entanto nem todos os browsers dispõem das mesmas capacidades, um exemplo disso é no Google Chrome ser possível aceder aos erros e warnings que aparecem na consola e nos restantes browsers não existir essa opção, pelo que é importante ter em atenção durante a escrita do teste que este não falhe por incompatibilidade com o browser. Juntamente com a Selenium WebDriver veio a sua respetiva API de forma a se poder escre- ver os testes e interagir com a mesma. 3.3.4 Selenium Grid A Selenium Grid não é nada mais do que uma rede de nodos interligados a um servidor. A grid é construida tendo um Servidor centralizado Selenium HUB (Selenium HUB) a ser exe- cutado, e depois tendo vários nodos com diversos browsers, sistemas operativos e versões 3.3. Componentes 31 a ligarem-se ao Selenium HUB dizendo que estão disponíveis para receber comandos. Desta forma os pedidos dos testes são feitos diretamente ao Selenium HUB, sendo responsá- vel por verificar se existe um nodo disponível com as configurações pretendidas e despacha esse teste para esse nodo. No caso de ser efetuado um pedido ao Selenium HUB e não existindo nenhum nodo disponível naquele momento, o pedido ficará em lista de espera até ser possível. Desta forma o Selenium HUB trata de toda a parte de direcionar os testes e executar de acordo os recursos de cada máquina, otimizando sempre o seu funcionamento. Esta grid é essencial para o projeto a desenvolver, uma vez que se pretende ter a execução de múltiplos testes a várias páginas HTTP em simultâneo. Figura 11.: Selenium Grid A Figura 11 apresenta como é construida uma Grid do Selenium, sendo possível ligar e desligar nodos sempre que necessário. O funcionamento geral é o Selenium HUB ficar à espera de ligações na porta definida, e os nodos ligam-se ao Selenium HUB através dessa mesma porta, sendo que depois então te- mos os nodos disponíveis para utilização. No caso de um nodo perder a ligação, é efetuada uma tentativa de estabelecer a ligação durante um período de tempo estipulado e caso não seja possível esse nodo é removido da Grid. Se for necessário verificar quais os nodos que estão disponíveis, bem como browsers e sistemas operativos, basta aceder pelo browser ao endereço "http://<ip do hub>:<porta do hub>/grid/console", e rapidamente é apresentada uma visualização geral de toda a Grid disponível. No caso de um browser estar em uso o ícone é apresentado também com uma opacidade mais baixa, indicando que está em uso. 3.4. Selenium v2 32 3.4 selenium v2 O Selenium ao atingir a versão 2.0 sofreu grandes alterações, sendo que a principal é a união dos componentes Selenium RC com o WebDriver, ficando assim com 3 componentes em vez de 4. Figura 12.: Componentes Selenium v2 Com esta atualização passaram a ser suportados browsers mais modernos, bem como inúmeras correções de erros, e melhoramentos na plataforma. No entanto a verdadeira grande mudança é a união dos componentes e o facto de ter acrescentado a WebDriver API para Python [91], Ruby [99], Java [47] e C# [18]. Com estas alterações tudo passa a ser corrido nativamente no browser de forma segura e mais simples, uma vez que a comunicação é feita diretamente ao browser, ao contrário de anteriormente que seria com o javascript a interagir com o browser. Assim todos os eventos utilizados no browser são nativos e invocados ao nível do sistema operativo. Um dos pontos também importantes foi a garantia da compatibilidade do novo sistema com a grid. Desta forma cada vez mais o Selenium se tornava uma ferramenta robusta e que muitos utilizavam. O facto de dispor da nova WebDriver API, uma API bastante simples que facilita o trabalho de escrever e correr testes. 3.5 selenium v3 Apesar de ainda estar em desenvolvimento, esta versão já se encontra no estado de Beta e incluí uma grande mudança, sendo que a implementação original do Selenium Remote 3.6. As potencialidades 33 Control (Versão 1) foi removida, forçando todos os utilizadores a abandonar esse tipo de implementação e mudar para as WebDriver API. Outras alterações são a obrigação de utili- zar Java 8 (a última versão disponibilizada pela Oracle), o suporte ao Firefox é agora feito através da Mozilla’s gecko driver, o suporte ao safari é fornecido pelo Mac OS através da webdriver da Apple, o suporte ao Microsoft Edge é fornecido através do servidor WebDri- ver da Microsoft, e outra que pode vir a ter impacto na utilização da aplicação produzida é o abandono do suporte a versão inferiores à 9 do Internet Explorer. 3.6 as potencialidades Devido ao Selenium se tratar de um projeto open-source recebeu de imediato bastante apoio da comunidade. Assim, surgem frequentemente novas funcionalidades e melhorias para o projeto, bem como plugins para várias linguagens. Na página de downloads do Selenium é possível observar a quantidade de plugins, desenvolvidos por terceiros, disponíveis para este projeto. Face ao tempo que já existe, também se consegue facilmente obter suporte para a resolução de vários problemas através de uma simples pesquisa na Web. A comprovar a importância e dimensão desta ferramenta, a framework Web Django já possui de raiz a possibilidade da execução de testes através do Selenium, sendo que para isso apenas é necessário instalar o pacote do Selenium. Com o Selenium é possível automatizar todo o processo de teste de uma página Web face ao aspeto funcional, pelo que se pode "simular"totalmente a interação de um ser humano com a aplicação Web que se está a testar e assim detetar de imediato os mais pequenos erros que por vezes passam despercebidos ao programador. O Selenium interage com uma diversidade de browsers (Google Chrome [36], Firefox [76], Internet Explorer [68], Safari [100], Opera [84] e até o novo browser Edge da Microsoft [67]) e dispositivos (iOS [8], Android [35], Windows Phone [69] ou até mesmo BlackBerry 10 [14]). Um exemplo de utilização é configurar o Selenium para aceder a uma página em dis- positivos desktop e móveis, e tirar um printscreen a cada, enviado depois um relatório com as imagens para que possam ser verificadas por alguém para se assegurar que o seu web- site responsivo não quebrou nada com o último commit que foi efetuado. Num exemplo mais avançado, essa tarefa pode ser delegada ao Selenium, indicando-lhe as coordenadas de cada elemento para verificar que nenhum elemento saiu do seu lugar. 3.7. Conclusões 34 3.7 conclusões Feita a análise aprofundada da ferramenta de Selenium, é possível concluir que vai total- mente de encontro com o objetivo da automatização de testes. Através do seu servidor central e da rede de nodos interligados será possível enviar os vários testes e executá-los nos ambientes pretendidos, obtendo assim uma maior cobertura de casos. Assim, com base nas necessidades indicadas anteriormente, é necessário construir uma rede de nodos (Grid) de forma a permitir ter vários ambientes disponíveis para testes, sendo que desta rede será necessário ter no mínimo duas máquinas, uma a funcionar como Selenium HUB e outra a funcionar como nodo. Estes nodos devem ter sistemas operativos diferentes, no- meadamente Windows e Linux, de forma a termos
Compartilhar