JWebTester - Ferramenta para Testes de Aceitação Automatizados em Aplicações Web - PDF
JWebTester - Ferramenta para Testes de Aceitação Automatizados em Aplicações Web
Download "JWebTester - Ferramenta para Testes de Aceitação Automatizados em Aplicações Web"
Cármen Martini Amado
1 JWebTester - Ferramenta para Testes de Aceitação Automatizados em Aplicações Web Marcelo Aita Riss 1, João Carlos Damasceno Lima 2, Iara Augustin 2, Julio Correa 1, Tiago Antônio Rizzetti 2, Edmar Araujo 2 1 SIG - Soluções em Informática e Gestão Rua Alberto Pasqualini, 35 sala Santa Maria, RS {mriss, 2 GMOb - Grupo de Pesquisa em Sistemas de Computação Móvel Universidade Federal de Santa Maria Santa Maria, RS {caio, august, rizzetti, Abstract. The high quality software construction must be done by using best pratices of software analisys and modelling. The sistematic tests are a powerful tool to verify the systems funcionality and trustworthiness. This work reports an evaluation and development of tool to help the automated construction of acceptance tests for web applications at SIG - Soluções em Informática e Gestão. This evaluation had the main goal to verify tools in the market that could help in the functional test cases to aim at improve the number of functional test cases in the web systems constructed at enterprise. Resumo. A construção de softwares de qualidade exige boas técnicas de verificação de confiabilidade e funcionalidade de sistemas através de testes sistemáticos. Este trabalho apresenta um relato de experiḙncia na avaliação e desenvolvimento de ferramentas para automatizar testes funcionais de aceitação na empresa SIG - Soluções em Informática e Gestão. Essa avaliação teve como objetivo principal diagnosticar as ferramentas existentes no mercado, que poderiam facilitar a implementação de casos de testes funcionais, visando aumentar o número desses casos testes nos sistemas WEB desenvolvidos na empresa. Palavras Chave: automatizados. teste de software, Java, aplicações web, frameworks, testes 1. Introdução Dentre as estratégias de testes existem os testes de aceitação que, segundo Myers [MYERS, 1979], são testes funcionais executados para avaliar os critérios de validação, tendo como meta demonstrar a conformidade aos requisitos. Por outro lado, a automatização da criação e execução de testes pode reduzir até 80% do esforço empregado em testes manuais e permite a produção de software de qualidade melhor e com mais rapidez[fewster and GRAHAM, 2000]. Existem ferramentas no mercado que facilitam o desenvolvimento de testes funcionais automatizados, tais como IBM Rational Functional Tester for Java and Web ou actiwate, porém o custo pode ser considerado alto e, muitas vezes, essas ferramentas trazem recursos que estão atrelados a uma plataforma específica. Essas características das Projeto financiado pela FINEP-MCT-CNPq, período de 2005/2006
2 ferramentas levaram a empresa SIG - Soluções em Informática e Gestão a avaliar e propor o desenvolvimento de uma ferramenta de apoio na geração e automatização de testes funcionais de aceitação, visando resolver os seguintes problemas: (a) melhorar a qualidade e o tempo na programação de casos de testes funcionais automatizados por parte dos desenvolvedores, visto que usando os frameworks (HTTPUnit [HTTPUNIT, 2004] e JUnit [JUNIT, 2004]) disponíveis ficou inviável, por questões de tempo, trabalhar na programação dos testes; (b) contruir uma ferramenta que suprisse as deficiências das ferramentas estudadas na adequação a filosofia de desenvolvimento da empresa; (c) estimular o aumento do número de casos de testes funcionais. Com a evolução dos sistemas esse número passou a ficar estagnado, e os testes automatizados deixaram de cobrir algumas funcionalidades importantes. Basicamente a filosofia de desenvolvimento para aplicações WEB da empresa aposta muito em sistemas de integração contínua para a parte de programação Java. Sendo assim, existem scripts que rodam com freqüência dentro de servidores da empresa para: obter a última versão do controlador de fontes, compilar, distribuir no servidor web e realizar todos os planos de testes automatizados. Garantindo assim, que alterações dos programadores ou alterações de versão de frameworks utilizados não tenham causado impacto no sistema através da geração de novos defeitos. Os planos de testes fazem parte do processo de análise e são gerados durante a confecção dos casos de uso, de forma a testar e explorar esses casos de uso. Sendo assim, com o passar do tempo, os scripts de integração contínua passaram a ficar desatualizados em relação a testes funcionais, visto que devido a inviabilidade de tempo, a construção desses testes começou a ser postergada. Notou-se então que essa dificuldade na geração dos casos de testes era relativa aos frameworks utilizados e à abordagem de programação dos testes. Essa programação dos testes era feita manualmente em código Java, onde o programador deveria verificar as especificações de testes vindas da análise e realizar uma programação que simule a navegação WEB, através dos casos de teste. Essa programação começou a se tornar dispendiosa em termos de tempo, e verificou-se que a melhor abordagem seria a gravação dos testes, através da própria navegação, pelo desenvolvedor usando o browser. Além disso, essas navegação, no futuro, poderá ser feita por pessoas não especializadas em programação, usualmente testadores ou usuários. Esse trabalho relata a avaliação das ferramentas e dos frameworks que auxiliam na construção dos testes funcionais de aceitação, e descreve a implementação de uma ferramenta de construção desses testes para aplicações WEB, chamada JWebTester. O objetivo desta ferramenta é obter simplicidade de uso para usuários não especializados, e amenizar os problemas levantados no parágrafo anterior. Desta forma, as funcionalidades oferecidas pela ferramenta são: a) gerar e gerenciar os casos de teste através de código fonte da linguagem de programação utilizada; b) se enquadrar, de forma personalizada, na cultura de organizações que já utilizam testes automatizados através de scripts no processo de desenvolvimento de software; c) permitir a elaboração e execução de roteiros de testes por pessoas que desempenham papel diferenciado no processo de desenvolvimento, usualmente testadores e gerentes de teste; (d) permitir a gravação e reprodução dos casos de testes através de robôs, que irão monitorar e gravar as requisições WEB, e posteriormente gerar os casos de teste. A seqüência do artigo está organizada da seguinte forma: a seção 2 apresenta um quadro comparativo ferramentas avaliadas e frameworks utilizados no desenvolvimento de testes automáticos. Na seção 3 são descritas as características, a estrutura e as funcionalidades da ferramenta JWebTester. Além disso, é apresentado um estudo de caso que mostra o uso prático da ferramenta desenvolvida em uma aplicação WEB real. Na seção 4 são apresentadas as conclusões obtidas, as principais contribuições do trabalho, e
3 as perspectivas para trabalhos futuros. 2. Tecnologias para Testes Automáticos de Aplicações Web Uma vez que o teste de software freqüentemente é responsável por até 40% de todo o esforço despendido em um projeto de desenvolvimento de software [PRESSMAN, 1995], as ferramentas que podem reduzir o tempo de teste (sem reduzir a eficácia) são muito valiosas. Reconhecendo os benefícios potenciais, pesquisadores e profissionais desenvolveram uma primeira geração de ferramentas de teste automatizadas. Miller [MILLER, 1979], no final da década de 70, descreve uma série de categorias de ferramentas de teste: Analisadores estáticos, Auditores de código, Geradores de arquivos de teste, Geradores de dados de teste, Verificadores de teste, Bancadas de teste, Comparadores de saída. Hoje, dentre os frameworks e ferramentas mais utilizados para a realização de teste e apoio ao desenvolvimento de Software estão: JUnit [BECK, 2000], HttpUnit [HTTPUNIT, 2004], Swing [SUN, 2004], Ant [FOUNDATION, 2004a] e JMeter [FOUNDATION, 2004b] Ferramentas para Automatização de Testes de Aceitação em Aplicações WEB A tabela 1 mostra um quadro comparativo de algumas ferramentas para automação da geração de casos de testes funcionais para aplicações WEB. As ferramentas para análise foram escolhidas baseadas em um critério de maior adequação ou semelhança com o processo de desenvolvimento adotado na empresa. As características adotadas para as comparações foram aquelas definidas pela empresa, que tornariam a utilização viável dentro da sua cultura organizacional. Tabela 1: Comparativo entre as ferramentas de teste. JWebTester IBM Rational actiwate Site Tester Center Multiplataforma X X X X Open source X X Gera código X X X padrão Robô de captura X X X X Aceita usuários X X X não-programador Suporta dinâmica URL WebInject Analisando-se o quadro pode-se observar que, se a linha da característica Open Source for suprimida, a única ferramenta que atende a todos os requisitos desejados é o JWebTester. As outras ferramentas não atendem as demais características desejadas pela empresa, o que exigiria uma adequação da empresa a ferramenta e não uma inserção da ferramenta dentro do processo de desenvolvimento sem maior impacto. De todas, a que mais se mostrou viável para a empresa foi o actiwate, porque sua única deficiência era não possibilitar usuário sem experiência em programação. Contudo, essa era uma característica pretendida pela empresa no futuro, visando retirar a atividade de teste funcional e gravação dos casos de testes dos programadores, para usuários não especializados, usualmente testadores ou gerentes de teste.
4 3. JWebTester - UMA FERRAMENTA DE AUXÍLIO AO TESTE 3.1. Características de JWebTester JWebTester tem como objetivo auxiliar o desenvolvimento de testes de aceitação para aplicações WEB, através da captura de requisições e respostas HTTP, geração de casos de teste com as requisições capturadas, execução dos casos de teste e posterior análise de resultados. Suas principais funcionalidades são: Prover as funções de um servidor proxy configurável; Interceptação, captura das requisições e respostas HTTP através do servidor proxy e apresentação das informações capturadas ao usuário; Edição, adição e remoção de requisições HTTP; Filtragem do conteúdo da resposta HTTP que será testado ou comparado, através da criação de filtros por tags HTML ou expressões regulares; Geração de casos de testes com as requisições que foram previamente capturadas e selecionadas. Um caso de teste será um programa Java que poderá ser compilado e executado pelo executor de testes do framework JUnit. Além disso, esse programa Java poderá ser alterado posteriormente caso seja necessário; Gravação de planos de testes; Geração de casos de testes multiplataforma Estrutura Geral A arquitetura da ferramenta compõe-se de quatro módulos principais: o servidor proxy, o controlador proxy, as requisições capturadas e por último o caso de teste. O servidor proxy e o controlador proxy representam o robô da ferramenta. Na figura 1 são mostrados os quatro módulos através de um diagrama funcional [CORREA, 2004]. Figura 1: Diagrama funcional da ferramenta JWebTester
5 O Servidor Proxy do JWebTester é responsável pela monitoração da navegação do usuário pela aplicação WEB. O Controlador Proxy é responsável por receber as requisições e respostas capturadas com seus cabeçalhos, configurar, iniciar e finalizar o Servidor Proxy. As requisições recebidas são gravadas no plano de teste criado pelo usuário e encaminhadas para o módulo Requisições Capturadas. Além disso o Controlador disponibilizará, para edição, os dados da requisição e da resposta. O módulo Requisições Capturadas apresenta as requisições, tratadas e filtradas pelo Servidor e Controlador Proxy. Além disso, o módulo pode receber as requisições de planos de testes criados em outra ocasião. O módulo Caso de Teste gera um programa Java que o representa. A geração ocorre com as requisições selecionadas no módulo Requisições Capturadas e é auxiliada pelos frameworks HttpUnit e JUnit. Cada requisição se transformará em um método da classe Java gerada. Com o auxílio do HttpUnit o módulo efetua a requisição ao servidor HTTP e captura a resposta do servidor. Em seguida são aplicados os filtros de conteúdo à resposta e é gerado o código que compara o conteúdo filtrado com o conteúdo que será capturado, quando o caso de teste for executado. Cada vez que o caso de teste for executado a requisição será refeita, os filtros reaplicados à resposta, e o conteúdo filtrado será comparado com o conteúdo gravado durante a geração do caso de teste. Outra função do módulo é compilar o programa Java gerado para que ele possa ser executado posteriormente. Após o caso de teste ser compilado o módulo poderá invocar o test runner do JUnit para executar o caso de teste. O test runner irá invocar cada método a ser testado e irá mostrar o resultado do teste para futura análise Funcionamento de JWebTester para um Estudo de Caso Para demonstrar o funcionamento de JWebTester, é apresentado um estudo de caso para uma funcionalidade da aplicação WEB denominada Portal de Compras, desenvolvida pela empresa SIG - Soluções em Informática e Gestão. O Portal de Compras permite o acompanhamento de licitações, acesso a documentos de edital, acompanhamento online de pregões eletrônicos, fornecimento de informação direcionada para fornecedores específicos entre outras funcionalidades. O módulo Manutenção do Cadastro de Usuários Fornecedores do Portal de Compras foi utilizado para este estudo de caso. As principais transações do módulo são realizadas de forma interativa com o usuário através de um cliente HTTP que apresenta interfaces para acesso ao cadastro, listagem dos usuários cadastrados, e disponibiliza as ações: cadastrar novo usuário, alterar dados do usuário cadastrado, gerar e enviar senha para o de um usuário cadastrado, invalidar senha e excluir usuários. Após a confirmação das informações do Plano de Teste o usuário poderá configurar e iniciar o servidor proxy. Na janela Proxy, o usuário deve informar a porta onde o servidor aguardará conexões de clientes HTTP, as expressões regulares para a filtragem de URL e opcionalmente, informar um proxy para acesso externo, caso exista um sistema de firewall na rede do usuário. Iniciado o servidor proxy, os passos seguintes são executados externamente à ferramenta. O testador deve configurar o cliente HTTP para que use o proxy para acessar as páginas. Após a configuração do cliente HTTP, o testador deverá navegar pelo módulo da aplicação WEB que será testado. O testador deverá seguir o seguinte roteiro de teste: (1) Efetuar o cadastro de dois usuários fornecedores; (2) Listar os usuários cadastrados; (3) Gerar e enviar a senha para os dois usuários cadastrados; (4) Tentar excluir o segundo usuário cadastrado; (5) Alterar os dados do segundo usuário cadastrado e (6) Tentar invalidar a senha do primeiro usuário cadastrado.
6 Seguindo o roteiro de teste, o servidor proxy faz a captura das requisições efetuadas. As requisições são mostradas em uma janela e podem ser editadas ou excluídas. Além disso pode-se adicionar novas requisições. Uma das funcionalidades importantes do JWebTester é adição de filtros de conteúdo. Esses filtros, servem para selecionar o conteúdo da resposta de uma requisição que será excluído do teste. Os filtros são os seguintes: Árvore: Neste tipo de filtro o testador verá um árvore XML construída a partir das tags HTML do conteúdo da resposta. O testador poderá excluir um nó da árvore. O nó excluído não será testado durante a execução do caso de teste. O filtro conterá os nós excluídos pelo testador. Expressão Regular: Através de uma expressão regular, o testador poderá selecionar partes do conteúdo HTML que não será testado durante a execução do caso de teste. O filtro conterá a expressão regular que será aplicada ao conteúdo da resposta, e opcionalmente poderá ser aplicado a todas as requisições. No estudo de caso foram adicionados os dois tipos de filtros. No conteúdo das respostas existiam campos que indicavam a data e hora no momento da requisição. Esses campos não podem ser testados durante a execução do caso de teste, por isso aplicou-se o filtro de árvore para excluir os nós que continham data e hora. Outro campo possuía a senha do usuário que era gerada de maneira aleatória pela aplicação. Esse campo foi filtrado através de uma expressão regular. Após a aplicação dos filtros, o testador pode selecionar as requisições que farão parte do caso de teste. O próximo passo envolve a geração, compilação e execução do caso de teste. Neste momento a ferramenta refaz as requisições ao servidor HTTP, captura o conteúdo das respostas, aplica os filtros de conteúdo e grava o conteúdo filtrado para posterior comparação durante a execução do caso de teste. A figura 2 mostra a geração do caso de teste. Essa geração corresponde a gerar uma classe Java que estende a classe TestCase do framework JUnit. Esse código Java contém métodos para realizar as requisições e comparar o conteúdo HTML retornado, com aquele previamente gravado pela execução do robô, que foi capturado através da execução do proxy. Figura 2: Geração do programa Java que representa o caso de teste Finalizada a geração do caso de teste, o testador poderá compilar o programa gerado. Caso a compilação seja executada com sucesso, realiza-se o último passo do
7 processo de teste suportado pelo JWebTester, que é a invocação do executor de testes do framework JUnit que irá executar o caso de teste gerado e compilado. O executor de testes é responsável pela execução dos métodos de teste do programa Java gerado anteriormente e pela exibição dos resultados da execução. A ferramenta invocará o executor de testes do JUnit, como pode ser visto na figura 3. Figura 3: Executor de testes do framework JUnit Para finalizar, deve-se gravar o Plano de Teste, para que possa ser editado e gerado o caso de teste no futuro. Através desse estudo de caso pode-se observar as principais funcionalidades da ferramenta JWebTester, bem como tirar proveito dessas funcionalidades para testar uma aplicação WEB real. A tarefa de teste de aplicações WEB é uma tarefa custosa no processo de desenvolvimento dessas aplicações. O uso do JWebTester pode reduzir consideravelmente esse custo, além de desenvolver casos de teste mais abrangentes do que o processo manual. Outra característica do JWebTester é sua flexibilidade tanto na utilização, devido ao fato de possuir uma interface gráfica, quanto no suporte a múltiplos sistemas operacionais. O resultado dessa experiência no estudo de caso mostrou que a ferramenta, após a implementação de algumas extensões citadas na seção 4, poderá aumentar consideravelmente o número de casos de teste funcionais para os sistemas WEB desenvolvidos pela empresa. Isso porque a geração dos casos de testes através da navegação no browser e gravação dos robôs de testes reduzem o tempo de geração desses, tornando viável a sua implementação pelos programadores. A facilidade de uso demostrada na ferramenta, também mostrou que ela está apta a ser usada por usuários não especializados. Isso será implementado através de algumas alterações no processo de desenvolvimento de aplicações WEB na empresa. 4. Conclusões O crescimento significativo de aplicações WEB tem forçado uma melhora na prática de teste nessas aplicações. O teste de software ganhou importância para assegurar uma melhor qualidade dos produtos finais. Por conseqüência, o teste automatizado vem auxiliar o
8 projeto e implementação de aplicações WEB, aumentando o nível de qualidade e confiabilidade dos softwares desenvolvidos, diminuindo o esforço de manutenção e desenvolvimento dos testes. As ferramentas para a automatização dos testes em aplicações WEB avaliadas nesse trabalho, não se adequaram ao processo de desenvolvimento da empresa. Em geral são pouco flexíveis, atreladas a uma plataforma específica compromentendo a flexibilidade e portabilidade, ou apresentam baixo nível de automatização, ou apresentam preços elevados, o que dificulta a utilização devido ao alto investimento necessário. A ferramenta desenvolvida contemplou as características enumeradas no quadro comparativo da tabela 1 e sua utilização não exigiu alteração no processo de desenvolvimento da empresa. Demonstrando assim, a sua eficácia de utilização em empresas que começam a automatizar os seus processos de teste com vista a qualificação de seu produtos. O estudo de caso realizado demonstra que a ferramenta desenvolvida pode ser utilizada em larga escala e o próximo passo de validação da ferramenta será a geração de casos de teste para todo o projeto do portal de compras. Gerando assim estatisticas qualitativas e quantitativas dos casos de teste funcionais do sistema de portal de compras. As melhorias e extensões previstas para a ferramenta são: (1) implementação de ilhas de código, ou seja, de marcações que indiquem as alterações feitas externamente, para que sejam mantidas após nova geração de código pelo JWebTester; (2) adição de novos filtros de conteúdo, que tornem mais flexível a seleção do conteúdo que não deverá ser testado, como um mini-editor de texto onde o testador poderá excluir o texto que não deverá ser testado; (3) adicionar suporte a URLs dinâmicas; (4) possibilitar suporte a aplicações WEB que geram conteúdo aleatório para uma determinada requisição; (5) integração do JWebTester com ferramentas de controle e versionamento de código; (6) colocação do JWebTester como plugin para ferramentas de desenvolvimento (IDE s). Referências BECK, K. (2000). Extreme Programming Explained. Addison-Wesley, Upper Saddle River, NJ. CORREA, J. (2004). JWebTester - Uma Ferramenta para Testes de Aceitação Automatizados em Aplicações Web. Universidade Federal de Santa Maria, Santa Maria, RS. FEWSTER, M. and GRAHAM, D. (2000). Software Test Automation: Effective use of test execution tools. Addison-Wesley, Upper Saddle River, NJ. FOUNDATION, A. S. (2004a). The apache ant project. org/ant/. FOUNDATION, A. S. (2004b). Apache jmeter. jmeter/. HTTPUNIT (2004). Httpunit user manual. JUNIT (2004). Junit documentation. MILLER, E. (1979). Automated Tools for Software Engineering. IEEE Computer Society Press. MYERS, G. (1979). The Art of Software Testing. John Willey & Sons. PRESSMAN, R. S. (1995). Engenharia de Software. Makron Books, São Paulo, SP. SUN (2004). Java language specification. jsp.