Instituto Politécnico de Coimbra Instituto Superior de Engenharia Automatização de Testes de Software Dashboard QMSanalyser Márcio Filipe Alves Carvalho Relatório de Estágio para obtenção do Grau de Mestre em Automação e Comunicações em Sistemas de Energia COIMBRA Dezembro de 2010 Instituto Politécnico de Coimbra Instituto Superior de Engenharia Automatização de Testes de Software Dashboard QMSanalyser Orientador(es): Fernando José Pimentel Lopes Professor Coordenador, ISEC Inácio de Sousa Adelino da Fonseca Professor Adjunto, ISEC Mário Bugalhão Director QMS Team , Optimus Paulo Grilo Manager QMS Team, Optimus Paulo Isménio Team Leader QMS-TST, Optimus Márcio Filipe Alves Carvalho Relatório de Estágio para obtenção do Grau de Mestre em Automação e Comunicações em Sistemas de Energia COIMBRA Dezembro de 2010 Dedico este trabalho aos meus pais, cuja fé em mim me ensinou a ter fé em mim mesmo. i Agradecimentos Agradeço aos professores orientadores Doutor Fernando José Pimentel Lopes e Doutor Inácio de Sousa Adelino da Fonseca, pelo apoio e disponibilidade manifestada, aos meus orientadores na empresa Optimus, Doutor Mário João Bugalhão, Doutor Paulo Morgado Grilo, Eng. Paulo António Isménio, pelas oportunidades, pelas ideias e sugestões apresentadas, pela atenção e apoio. Aos professores que tive durante toda a minha vida, pois foram os semeadores de ideias que contribuíram para o meu desenvolvimento intelectual. À minha família, em especial aos meus pais e irmã, pelo apoio e compreensão. Para finalizar, o meu grande agradecimento aos meus amigos e companheiros de trabalho pela convivência e amizade nos bons e maus momentos. iii Resumo Elaborado no âmbito do Mestrado em Automação e Comunicações em Sistemas de Energia, o presente Relatório de Estágio descreve o trabalho desenvolvido na empresa Optimus na equipa de Quality Management Systems (QMS). A equipa de QMS tem como principal objectivo a garantia de qualidade de qualquer software que se destine a ser utilizado na empresa Optimus. Esta garantia, consiste em assegurar a qualidade de um software associado aos processos de negócio da empresa, efectuando diversos tipos de testes. Assim, o presente relatório apresenta metodologias e processos utilizados em Testes de Software. Testar um software, é um dos processos do seu ciclo de desenvolvimento com o objectivo de exercitar um conjunto de “acções” nesse software a fim de identificar possíveis erros. Por norma, estes testes são previamente definidos e realizados manualmente. Assim, para a realização deste Estágio foi lançado o desafio de automatizar casos de teste com o auxílio de ferramentas específicas, analisar o resultado final do automatismo e ter a possibilidade de, através de um DashBoard, analisar os erros gerados no servidor do software. Palavras chave: Qualidade de software; Testes de software; Quality Management Systems; Software em Processos de Negócios. v Abstract Prepared under the Master in Automation and Communications in Energy Systems, this Internship Report describes the work carried out at Optimus, in the Quality Management Systems (QMS) team. The major goal of the QMS team is to achieve quality assurance of the software that is intended to be used at the Optimus company. This is required to ensure the quality of the software programs associated with the company's business processes, by conducting various types of tests. Therefore, this report presents methodologies and processes used in software testing. Software testing is a process of a software development cycle, achieved by performing a set of "actions" in the software, in order to identify possible errors. As a rule, these tests are pre-defined and manually performed. Thus, in the present Internship the challenge was to automatize test cases with the help of specific tools, to analyze the outcome of the automatism and be able to, through a developed DashBoard, analyze the errors generated in the software server. Keywords: Software Quality, Software Testing, Quality Management Systems, Software Process and Business. vii Índice Agradecimentos iii Resumo v Abstract vii Índice ix Lista de Figuras xiii Lista de Tabelas xv !omenclatura 1 2 3 4 Introdução xvii 1 1.1 Objectivos 2 1.2 Estrutura do Relatório 3 Enquadramento Empresarial 4 2.1 Equipa de QMS 4 2.2 Enquadramento Pessoal na Equipa 5 Ferramentas existentes no Mercado 7 3.1 Enquadramento Histórico 7 3.2 Selenium IDE 7 3.3 iMacros 9 3.4 Watir 9 3.5 TestMaker 10 3.6 Winrunner 11 3.7 Quick Test Pro 11 3.8 LoadRunner 12 3.9 Conclusão 13 Testes de Software 14 4.1 Introdução 14 4.2 Objectivo dos Testes de Software 15 ix 4.3 Terminologia 16 4.4 Porquê realizar testes de Software? 16 4.5 Enquadramento da Fase de Teste 17 4.6 Fases de Teste 21 4.7 Plano de Teste 22 4.8 Caso de Teste 23 4.9 Tipos de Teste 24 4.10Tipos de Testes / Nível do processo de Teste 29 4.11Técnicas de Testes de Software 29 4.11.1 Teste White-Box (Caixa-Branca) 5 6 x 30 4.11.2 Teste Black-Box (Caixa-Preta) 4.12Custos da Qualidade em Testes de Software 31 31 4.13Uma nova abordagem: Automatização 33 4.14Porquê Automatizar? 34 4.15Âmbito da Automatização na Optimus 34 Automatismos 36 5.1 Introdução 36 5.2 Arquitectura dos Testes de Regressão 38 5.3 Ferramenta de Automatização Quick Test Pro 39 5.4 Principais Funcionalidades da Ferramenta QuickTest Professional 41 5.5 Técnicas para implementação de scripts de testes automáticos 43 5.6 Fases de Construção de um Script 46 5.7 Estrutura de um Servidor de Testes de Regressão 48 5.8 Ferramenta Quality Center 51 5.9 Arquitectura de funcionamento Quality Center-QTP 54 5.10Produtos Automatizados 55 5.11Arquitectura dos Testes de Carga 55 5.12Fases de Construção de um Script 56 5.13Ferramenta LoadRunner 57 DashBoard 62 6.1 Introdução 62 6.2 Estrutura do Servidor 62 7 6.3 Funcionalidades da Ferramenta Splunk 63 6.4 DashBoard QMSAnalyser 66 6.5 Demonstração da utilidade da Ferramenta 67 Conclusão 69 Referências 71 Anexo I – Exemplo de Caso de Teste 75 Exemplo Caso de Teste – Site CPM 75 Anexo II - Exemplos de Automatismos 78 Exemplo Script Quality Center – Site CPM 78 Exemplo Script Controlo ou Principal – Site CPM 78 Exemplo Script Suporte – Site CPM 79 Exemplo Script Suporte – Login Site CPM 80 Exemplo Script Suporte – Logout Site CPM 81 Exemplo Script Controlo ou Principal – Site Optimus 81 Exemplo Script Suporte – Site Optimus 81 Exemplo Script Suporte – Login Site Optimus 83 Exemplo Script Suporte – Logout Site Optimus 84 Exemplo Script Controlo ou Principal – Site Kanguru 84 Exemplo Script Suporte – Site Kanguru 84 Anexo III – Exemplos de Relatórios 86 Exemplo de 0ewsLetter da Equipa de QMS 86 Exemplo de Email de Execução de Testes de Carga 87 xi xii Lista de Figuras Figura 3.1. Software Selenium IDE (add-ons). Figura 3.2. Software Selenium IDE. Figura 3.3. Software iMacros. Figura 3.4. Software Watir. Figura 3.5. Software TestMaker. Figura 3.6. Software Winrunner. Figura 3.7. Software Quick Test Profissional. Figura 3.8. Software Loadrunner. Figura 4.1. Modelo de Ciclo de Vida em Cascata (adaptado de [Sommerville, 2000] ). Figura 4.2. Modelo de Ciclo de Vida em V (adaptada de [Pressman,2000]). Figura 4.2. Modelo de Ciclo de Vida em “V” (adaptada de [Pressman,2000]). Figura 4.3. Visão Geral de um Processo de Testes (adaptada de [Sommerville, 2000]). Figura 4.4. Plano de Testes. Figura 4.5. Exemplo de um Caso de Teste. Figura 4.6. Diferenças entre Teste de Carga/Volume/Stress. Figura 4.7. Técnica de White-Box ou (Caixa-Branca). Figura 4.8. Técnica de Caixa Preta ou Black-Box. Figura 4.9. Custos da Qualidade (adaptado de [Miguel, 2004]). Figura 4.10. Custos da correcção de erro (adaptado de [Miguel, 2004]). Figura 5.1. Actividades de teste para automatizar casos de teste na equipa de QMS [adaptado de Correia at al , 2004]. Figura 5.2. Arquitectura Testes de Regressão – Equipa de QMS. Figura 5.3. Add-ins da Ferramenta QuickTest Professional. Figura 5.4. Ferramenta QuickTest Professional. Figura 5.5. Ferramenta QuickTest Professional (Record). Figura 5.6. Ferramenta QuickTest Professional (Object Repository). Figura 5.7. Ferramenta QuickTest Professional (CheckPoints). Figura 5.8. Exemplo da estrutura de um Script (Técnica Keyword-driven). Figura 5.9. Fases de construção de um script. Figura 5.10. Estrutura de um script de Teste de Regressão implementado na equipa QMS. Figura 5.11. Estrutura da pasta sourcecode um servidor de Teste de Regressão. Figura 5.12. Estrutura de um servidor de Teste de Regressão. xiii Figura 5.13. Ferramenta Quality Center (Página Login). Figura 5.14. Ferramenta Quality Center (Página Test Plan). Figura 5.15. Ferramenta Quality Center (Página Test Lab). Figura 5.16. Ferramenta Quality Center (Página Test Instance Properties). Figura 5.17. Sincronização da ferramenta Quality Center com servidor de Testes de Regressão. Figura 5.18. Scripts Automatizados. Figura 5.19 Arquitectura dos Scripts de Carga. Figura 5.20. Estrutura de um script de Teste de Carga implementado na equipa QMS. Figura 5.21. Ferramenta LoadRunner. Figura 5.22. Janela de definição dos Dados de Teste. Figura 5.23. Estrutura de um script de Teste de Carga. Figura 5.24. LoadRunner Controller (Definição de Cenário). Figura 5.25. LoadRunner Controller (Análise da evolução do Cenário). Figura 5.26. LoadRunner Analysis (Análise do Resultado do Cenário). Figura 6.1. Estrutura Servidor Splunk. Figura 6.2. Definir Pesquisa no Splunk. Figura 6.3. Opções disponibilizadas pela ferramenta. Figura 6.4. Opção Data Inputs. Figura 6.5. Opção main. Figura 6.6. Opção Indexes. Figura 6.7. DashBoard QMSAnaliser. Figura 6.8. DashBoard QMSAnaliser – Problema 1. Figura 6.9. DashBoard QMSAnaliser – Problema 2. Figura 6.10. DashBoard QMSAnaliser – Problema 3. xiv Lista de Tabelas Tabela 3.1. Ferramentas de Automatização. Tabela 4.1. Características da Norma ISO/IEC 9126. Tabela 4.2. Fase/Tipo de Testes. xv !omenclatura Abreviaturas ISSO Internacional Standard Organization IEEE Institute of Electrical and Electronics Engineers HP Hewlett-Packard ISTQB International Software Testing Qualifications Board QMS Quality Management Systems QMS-CM Quality Management Systems - Configuration Management QMS-CA Quality Management Systems - Quality Assurance QMS-IQM Quality Management Systems - Integrated Quality Management QMS-TST Quality Management Systems - Test Logs Expressão utilizada para descrever o processo de registo de eventos num ficheiro de dados num determinado servidor DashBoard Expressão utilizada para indicar um "painel de indicadores" Script Programa de software escrito em linguagem de script Patches Ficheiro de actualização ou melhoria de um determinado software Web Word wide Web TI Tecnologia da Informação SI Sistemas da Informação Browser Expressão utilizada para descrever 0avegador de Internet Site Expressão utilizada para descrever Portal SOA Service-Oriented Architecture DHCP Dynamic Host Control Protocol D0S Domain 0ame System FTP File Transfer Protocol TFTP Trivial File Transfer Protocol http Hyper Text Transfer Protocol HTTPS Hyper Text Transfer Protocol Secure IP Internet Protocol TCP Transmission Control Protocol xvii SMTP Simple Mail Transfer Protocol POP Post Office Protocol IMAP Internet Message Access Protocol HSDPA High-Speed Downlink Packet Access Downlink Capacidade/velocidade de transferência de dados utilizando o protocolo HSDPA Plugin/ Add-in / Add-on fornecendo alguma funcionalidade especial ou muito específica XML eXtensible Markup Language HTML HyperText Markup Language PHP Hypertext Preprocessor SGPS Sociedade Gestora de Participações Sociais GSM Global System for Mobile Communications GPRS General Packet Radio Service UMTS Universal Mobile Telecommunication System xviii Programa de software usado para adicionar funções a outros programas, 1 Introdução Um dos grandes desafios para a Engenharia de Software tem sido desenvolver software de qualidade tendo em conta o prazo, o esforço e os custos estabelecidos. Ao mesmo tempo que se requer software cada vez mais complexo, o mercado exige produtos de maior qualidade. Nesta direcção, as empresas que desenvolvem software têm-se preocupado cada vez mais com a qualidade dos produtos de software que criam. Desta forma, as empresas têm criado mecanismos para que a qualidade possa ser planeada, controlada, avaliada e alcançada [Rocha at al,2001]. Controlar a qualidade de sistemas de software é um grande desafio devido à alta complexidade dos produtos e às inúmeras dificuldades relacionadas com o processo de desenvolvimento, que envolve questões humanas, técnicas, burocráticas, de negócio e políticas. Idealmente, os sistemas de software devem não só fazer correctamente o que o cliente necessita, mas também fazê-lo de forma segura, eficiente e escalável, flexível, de fácil manutenção e evolução. Salvo honrosas excepções, na indústria de desenvolvimento de software, estas características são muitas vezes asseguradas através de testes manuais, após a finalização de módulos específicos ou até mesmo do software completo. O teste pode ser visto como uma parcela do processo de qualidade de software. A qualidade da aplicação pode, e normalmente, varia significativamente de sistema para sistema. Segundo a norma ISO 9126, norma ISO que estabelece um modelo de qualidade para produtos de software e que se enquadra no modelo de qualidade das normas da família 9000, os atributos qualitativos previstos são: funcionalidade, confiabilidade, usabilidade, eficiência, manutenibilidade e portabilidade. De forma geral, medir o bom funcionamento de um software envolve compará-lo com elementos como especificações, outros softwares da mesma linha, versões anteriores do mesmo produto, inferências pessoais, expectativas do cliente, normas relevantes, leis aplicáveis, entre outros. Enquanto a especificação do software diz respeito ao processo de verificação, a expectativa do cliente diz respeito ao processo de validação do software [Qualidade, 2010]. Assim, um teste de software pode definir-se como o processo de executar o software de forma controlada com o objectivo de avaliar se o mesmo se comporta conforme o especificado [Beizer, 1995]. A actividade de testes é uma etapa crítica para o desenvolvimento de um software. Embora durante todo o processo de desenvolvimento sejam utilizados métodos, técnicas e ferramentas com o objectivo de evitar que erros sejam introduzidos no produto, não significa que sejam eliminados 1 todos os erros, assim a actividade contínua de testes ao longo do desenvolvimento e depois da conclusão do software é de fundamental importância para a eliminação dos erros que persistem. A execução de testes de software pode ser efectuada tanto de forma manual como automatizada. A execução manual consiste na reprodução por uma pessoa do teste previamente definido e documentado. Já a execução automática consiste na automação do processo do teste manual. Para a execução dos testes automatizados são desenvolvidos scripts que simulam as tarefas manuais e serão executados automaticamente. Cada uma destas formas tem as suas vantagens e desvantagens, no entanto, salienta-se que os testes manuais têm um grande problema em relação ao tempo de execução, assim como em relação ao número de vezes que podem ser executados num curto espaço de tempo. A realização de testes automatizados, além de possibilitar a redução do ciclo de testes, também permite aumentar a abrangência dos testes e, consequentemente, a sua qualidade, porque permite que os Testers (ver Secção 4.3) utilizem os seus esforços noutros tipos de teste ou em testes que não possam ser automatizados. 1.1 Objectivos O objectivo deste Estágio passa por aplicar conhecimentos já adquiridos, assim como aumentar o nível de conhecimento sobre testes de software. Juntamente com o levantamento de ferramentas existentes no mercado, vamos automatizar casos de testes, analisar erros de um determinado software e analisar os logs de um determinado servidor utilizando um DashBoard. A metodologia de funcionamento do DashBoard é similar à metodologia de um sensor inteligente, isto é, o DashBoard está sempre a “escutar” a actividade gerada nos logs e segundo condições pré-definidas, tomará decisões e efectuará tarefas associadas à decisão. O dashBoard, também terá a possibilidade de definir novas condições de decisão. A actividade gerada nos logs surge dos automatismos criados tendo como base casos de teste. Estes automatismos, são scripts implementados utilizando ferramentas específicas. Os scripts realizarão a navegação por uma determinada página Web, efectuarão a inserção e selecção de dados, assim como a detecção de falhas na referida página. Por fim, efectuaram uma validação consultando dados numa Base de Dados Oracle. Nesta sequência, serão implementados vários scripts tendo em conta algumas das aplicações Web existentes na empresa Optimus. 2 1.2 Estrutura do Relatório Estruturalmente este trabalho está dividido em sete capítulos, cada um composto por sub-capítulos. O relatório inicia-se com uma introdução, que inclui os objectivos e as linhas gerais propostas para o período de Estágio. Assim, no Capítulo I, “Introdução”, como referido anteriormente, é desenvolvida uma introdução e são apresentados os objectivos, tendo como base o tema do Estágio. O Capítulo II, “Ferramentas existentes no Mercado”, é dedicado à análise de ferramentas existentes no mercado para a automatização de casos de teste e para a análise de logs de servidores. O Capítulo III, “Enquadramento Empresarial”, retrata o enquadramento geral, do qual faz parte uma descrição da equipa onde foi desenvolvido o Estágio, os objectivos e a sua importância. O Capítulo IV, “Testes de Software”, faz uma introdução aos testes de software, tipos de testes, metodologias, vantagens e desvantagens da automatização de testes. O Capítulo V, “Automatismos”, aborda os automatismos desenvolvidos ao longo do Estágio, descreve a sua arquitectura e modo de funcionamento, tendo em conta as ferramentas já utilizadas na empresa e a forma como os Testers podem interagir com os automatismos sem causar impacto na forma como já funcionavam. Neste capítulo, além da descrição das ferramentas utilizadas, também são abordadas as características de funcionamento dessas mesmas ferramentas. O Capítulo VI, “DashBoard”, apresenta a arquitectura implementada para o desenvolvimento do DashBoard, a metodologia de funcionamento e as suas características. O Capítulo VII, “Conclusão”, proporciona uma análise e reflexão sobre o trabalho apresentado assim como um conjunto de sugestões para desenvolvimentos futuros. No Anexo I e no Anexo II, encontram-se um Caso de Teste e um conjunto de scripts exemplo, respectivamente. Por fim, no Anexo III, encontram-se exemplos da informação enviada para outras equipas da área de Sistemas de Informação da empresa Optimus, relativa aos scripts automatizados. Por razões de confidencialidade o número de exemplos é limitado. 3 2 Enquadramento Empresarial O presente Estágio foi realizado na equipa de Quality Management System da empresa Optimus. Esta equipa destaca as políticas e procedimentos necessários para a melhoria e controlo da qualidade de software das diversas aplicações desenvolvidas pela empresa Optimus. A Optimus é uma operadora de Telecomunicações Móveis Portuguesa, sendo portadora de licenças de utilização GSM e UMTS e é gerida a 100% pela Sonaecom SGPS. A Sonaecom actua em três áreas principais de negócio, designadamente: Telecomunicações (Optimus); Media (Público) e Software e Sistemas de Informação (Bizdirect, Mainroad, WeDo e Saphety). Constituída no final de 1997 como Optimus Telecomunicações, S.A., iniciou as suas operações no sistema GSM em 15 de Setembro de 1998. Em 2005, com o nome comercial de Kanguru, lança o serviço de Internet sem fios através do GPRS e 3G, com velocidades de downlink acima de 386 kbits/s. Este serviço sofreu uma mudança nas suas características em Maio de 2006 com o lançamento do Kanguru Xpress, que utiliza HSDPA (protocolo de telefonia móvel também chamado 3.5G) com uma velocidade acima dos 1.8 Mbits/s. A 8 de Janeiro de 2008 é lançada oficialmente a nova imagem da empresa. O boomerang, utilizado nos últimos 10 anos, foi trocado pelo magma, transmitindo uma ideia de organismo vivo, moderno e facilmente moldável. Em 2010, acontece a fusão da Optimus com a Clix, sendo a Optimus a empresa única de telecomunicações da Sonaecom. Com a integração total do Clix, a Optimus é hoje o único operador integrado de telecomunicações em Portugal e a marca única da Sonaecom para o sector das Telecomunicações. Cobrindo todos os segmentos de mercado - Residencial, Particulares, Mass Business, Corporate e Wholesalede – conta com cerca de 4 milhões de utilizadores, dos quais 3,3 milhões no móvel e 514 mil no fixo, servindo directamente 1 em cada 3 utilizadores em Portugal (empresas e particulares) com soluções de última geração de Voz, Internet, Televisão e Dados, através de terminais móveis ou fixos, permitindo-lhes usufruir de múltiplas soluções adaptáveis a cada perfil [Sonaecom, 2010] [Optimus, 2010]. 2.1 Equipa de QMS A equipa de QMS divide-se em quatro sub-equipas: 4 Integrated Quality Management (QMS-IQM) A equipa IQM visa estabelecer o contacto com as outras áreas que vão trabalhar com a equipa de QMS, isto é, assegura o envolvimento das outras equipas com a equipa de QMS de forma a reduzir o risco de integração e sincronização com as outras equipas de outras áreas. Esta equipa faz uma ponte com as outras áreas de negócio existindo assim uma melhor comunicação entre equipas; Configuration Management (QMS-CM) A equipa de CM, tem como função coordenar e controlar: código, requisitos, documentação, problemas, solicitações de mudança, ferramentas / compiladores / bibliotecas / patches; Quality Assurance (QMS-QA) A equipa de QA é responsável por garantir a qualidade do produto ao longo do tempo. É responsável por verificar que durante a fase de produção os problemas encontrados no produto são resolvidos e restantes funcionalidades continuam a funcionar correctamente; Test (QMS-TST ) Tendo como referencia as normas elaboradas pela International Software Testing Qualifications Board (ISTQB) a equipa de Test (TST) é responsável pela fase de testes de software das diversas aplicações desenvolvidas pela empresa Optimus. A fase de testes desempenha um papel crucial na garantia da qualidade do software, uma vez que valida o cumprimento dos requisitos definidos. A equipa de QMS-TST é responsável pelo registo e gestão de defeitos do software a testar. A equipa efectua o relacionamento directo entre defeitos e casos de teste, isto é, para cada caso de teste falhado é disponibilizada a informação do defeito associado. 2.2 Enquadramento Pessoal na Equipa A realização deste Estágio foi associada à equipa QMS-TST. Para o período de duração do Estágio foi lançado o objectivo de automatizar casos de testes e analisar os respectivos erros, utilizando ferramentas específicas para automatização. Outro objectivo proposto foi encontrar uma forma de analisar os logs de um determinado servidor utilizando um DashBoard. Assim, ao longo deste relatório descrevem-se as actividades exercidas assim como as ferramentas utilizadas. O Estágio decorreu de Janeiro a Setembro de 2010. 5 6 3 Ferramentas existentes no Mercado Tendo em conta os objectivos propostos para a realização do Estágio, o presente capítulo vai descrever algumas das ferramentas existentes no mercado. As características das respectivas ferramentas serão utilizadas para determinar a melhor estratégia a seguir durante o período de Estágio. Descreve-se nesta Secção algumas das ferramentas existentes no mercado que permitem realizarem a tarefa de automatização de casos de teste de software. 3.1 Enquadramento Histórico As primeiras ferramentas de testes de software surgiram por volta de 1980 e as suas principais funcionalidades baseavam-se no debuging do software. Após essas ferramentas ganharem popularidade, surgiram as ferramentas de gestão de testes que tinham como objectivo organizar e guardar dados dos testes, organizarem o resultado da execução dos testes e apresentar relatórios de testes. Por volta de 1995 surgiram as primeiras ferramentas para automatização de casos de testes. Estas eram inicialmente focadas em medições básicas de algumas plataformas. Hoje em dia as ferramentas de automatização são de fácil utilização e permitem realizar um maior número de funções em relação às ferramentas desenvolvidas inicialmente. De salientar, que este tipo de ferramentas encontra-se em crescente desenvolvimento e é uma aposta das grandes companhias de software como IBM e a HP. Este facto, deve-se à automatização de testes de software ser vista como uma das principais medidas para melhorar a eficiência da actividade de teste, agregar qualidade ao produto e antecipar a descoberta de falhas e incompatibilidades, reduzindo assim o custo do projecto e melhorando a produtividade a vários níveis [Ferramentas, 2010] [Vinicius, 2008] [Fantinato at al, 2008] . Assim, várias soluções têm surgido no mercado, sendo algumas delas descritas no sub-capítulo seguinte. 3.2 Selenium IDE Selenium IDE é uma ferramenta que permite testar aplicações Web de forma automatizada. É um Add-on do Firefox como se pode visualizar pela Figura 3.1 e o seu modo de funcionamento consiste em gravar passo-a-passo os testes que o utilizador realiza na aplicação, isto é, grava exactamente as acções que o utilizador de uma aplicação Web realiza. Com os testes gravados, é 7 possível executar repetidamente as acções previamente realizadas. Dessa forma, o utilizador precisará de executar os testes manualmente apenas uma única vez e o processo repetitivo será realizado pela ferramenta. Figura 3.1. Software Selenium IDE (add-ons). Como se pode visualizar na Figura 3.2, o Selenium IDE fica instalado na caixa de ferramentas do Firefox. O modo de utilização consiste em abrir o Selenium IDE, seleccionar a opção de gravar, minimizar a janela e começar a realizar os testes. Enquanto o teste é executado, a ferramenta está a gravar todos os passos. Ao acabar de executar um caso de teste e maximizar a aplicação novamente e após parar o modo de gravação automático, pode-se observar os comandos gerados pela aplicação, que são função dos passos executados pelo operador. Figura 3.2. Software Selenium IDE. O teste deve ser gravado no formato .html. Assim, os testes podem ser abertos posteriormente e executados automaticamente. Esta ferramenta é de fácil instalação e utilização mas não pode ser utilizada noutros Browsers como por exemplo Internet Explorer, nem pode ser utilizado noutros tipos de aplicações. 8 3.3 iMacros O Software iMacros foi desenvolvido para automatizar as tarefas mais repetitivas na Web como visitar os mesmos sites todos os dias, preencher formulários, lembrar senhas, realizar download de informações de outros sites, capturar a Web (conseguir dados de múltiplos sites), etc. A grande vantagem é que se pode manter as Macros no computador para utilização própria, ou pode-se partilhá-las com outros utilizadores adicionando-as a um Blog ou Intranet da empresa. A Figura 3.3 ilustra o interface do Software iMacros. O seu modo de funcionamento consiste em seleccionar o botão de Play e começar a realizar os testes. Enquanto o teste é executado, o iMacros grava todos os passos. Ao acabar de executar um caso de teste, ao seleccionar o botão Stop termina a gravação e pode-se observar os comandos gerados. Para executar novamente a navegação basta seleccionar no botão Play (Loop) (Figura.3.2). Figura 3.3. Software iMacros. 3.4 Watir Watir é uma biblioteca para a linguagem Ruby que permite interagir com o Internet Explorer, Firefox e até o Safari (usando uma biblioteca especifica) para simular a experiência de navegação do utilizador no sistema. Os scripts de teste são escritos na linguagem de programação Ruby, como se pode visualizar pela Figura 3.4. Ruby é uma linguagem relativamente recente. Foi criada em 1995 pelo japonês Yuri Matsumoto. Uma linguagem directa, orientada a objectos, simples de se aprender e trabalhar. Com muitas semelhanças ao Perl, SmallTalk e Python. Uma Linguagem multiplataforma, sendo assim suportada por diversos tipos de sistemas operativos como Linux, Windows, e outros [Ruby, 2010]. Possui muitas features interessantes como o Ruby Gems, Code Blocks, Mixins, entre outras. No entanto, o Watir já não é tão fácil de instalar e utilizar como o Selenium ou 9 o iMacros. Esta ferramenta é mais complexa mas apresenta mais funcionalidades em relação ao software Selenium ou iMacros. Figura 3.4. Software Watir. 3.5 TestMaker A ferramenta PushToTest Test Maker ou como é chamada TestMaker, é uma ferramenta baseada na arquitetura SOA(Service-Oriented Architecture) e é Open-Source. Na Figura 3.5 apresenta-se uma ilustração da ferramenta. Nela é possível fazer Testes de Funcionalidade, Testes Unitários, Testes de Integração, Testes de Regressão e Testes de Carga em aplicações SOA, incluindo Wizards e Recorders (gravação de scripts), sendo a sua interface muito amigável e de fácil utilização pelos analistas de testes. Inúmeras linguagens são suportadas pela ferramenta como PHP, Ruby, Java e outras, além de claro dar suporte a Web Services, AJAX e protocolos como HTTP, HTTPS, SOAP, XML, SMTP, POP e IMAP [Pushtotest, 2009] [Testexpert,2009]. Figura 3.5. Software TestMaker. 10 3.6 Winrunner O WinRunner é uma ferramenta do tipo Capture and Playback, isto é, grava passo a passo as acções que o utilizador de uma aplicação Web realiza e de seguida permite executar essas acções. A interface com o utilizador apresenta-se na Figura 3.6. A ferramenta WinRunner fornece uma linguagem estruturada, semelhante a C, chamada TSL (Test Script Language). O seu funcionamento é muito semelhante ao funcionamento das ferramentas referidas anteriormente, no entanto, o código gerado é diferente e permite criar scripts de maior complexidade. Figura 3.6. Software Winrunner. 3.7 Quick Test Pro O QuickTest Professional (QTP) é uma evolução da ferramenta Winrunner. Esta ferramenta elimina algumas limitações da ferramenta Winrunner e oferece mais funcionalidades, como por exemplo, Add-ins para interligação com outras ferramentas. Tal como o Winrunner, o seu funcionamento é do tipo Capture and Playback. Na Figura 3.7 ilustra-se a interface com o utilizador. O QuickTest Professional usa a linguagem Visual Basic Scripting Edition (VBScript) para especificar uma actividade executada na aplicação em teste. De salientar que o código produzido pelo QTP é gerado como em todas as ferramentas referidas até ao momento. 11 Figura 3.7. Software Quick Test Profissional. 3.8 LoadRunner O LoadRunner é também uma ferramenta do tipo Capture and Playback . O LoadRunner usa a linguagem C para gerar código quando utilizado por exemplo para simular um caso de teste. No entanto, este software, além de permitir criar automatismos, serve para simular vários utilizadores a utilizarem simultaneamente uma aplicação, ou seja, permite efectuar testes de carga. Uma ilustração do interface é apresentada na Figura 3.8. Figura 3.8. Software Loadrunner. 12 3.9 Conclusão Para a realização de testes automatizados existem ferramentas prontas que auxiliam na criação, desenvolvimento e manutenção desses testes. Estas permitem que scripts com testes automatizados sejam criados, alterados e executados. Assim, tendo em mente o que são testes automatizados, o ponto de partida para este estágio foi efectuar um levantamento das tecnologias existentes no mercado. Do conjunto das ferramentas pesquisadas, algumas são gratuitas e outras não, todas possuem vários pontos positivos, e também vários pontos negativos. A Tabela 3.1 ilustra de forma comparativa algumas das características deste conjunto de ferramentas. Tabela 3.1. Ferramentas de Automatização. Ferramentas Caracteristicas LoadRunner Tempo de Aprendizagem Winrunner QTP TestMaker Watir iMacros Selenium Alta Alta Alta Média Média Média Média Versatilidade Alta Alta Alta Média Baixa Baixa Baixa Estabilidade Alta Alta Alta Média Média Média Média Actualizações Hewlett-Packard Hewlett-Packard Hewlett-Packard pushtotest Linguagem Ruby e framework Watir Firefox Framework Selenium Open Source Não Não Não Sim Sim Sim Sim Depois de analisadas e testadas as ferramentas, e tendo em consideração os objectivos propostos, concluiu-se que a ferramenta QuickTest Professional e a ferramenta LoadRunner são as que melhor satisfazem os requisitos. Estas são ferramentas poderosas que permitem a criação de testes automatizados de todos os tipos, para todas as aplicações. Esta flexibilidade obtém-se adicionando os Add-Ins disponíveis para cada caso específico. Além disso, estas ferramentas já são uma referência no mercado, são estáveis e versáteis. No entanto, são ferramentas completas e com alguma complexidade, caso se pretenda ir para além de gravar e executar, logo, necessitam de tempo de aprendizagem para poderem ser convenientemente exploradas. Outra grande vantagem destas ferramentas é que possibilitam a interligação com outras ferramentas da HP, utilizadas na equipa de QMS. 13 4 Testes de Software Nos últimos anos, tem-se constatado que o mercado de desenvolvimento de software aumentou a sua competitividade, devido à modernização das tecnologias envolvidas e devido ao amadurecimento da capacidade em desenvolver software. Assim, a gama de soluções em tecnologias da informação, para atender às necessidades das organizações consumidoras, tem aumentado consideravelmente, o que acaba por dificultar a escolha dos utilizadores, no momento de adquirir um produto. Neste cenário de competitividade, as organizações consumidoras na ocasião de optar por um software, baseiam-se cada vez mais em critérios de qualidade. Um dos pilares para a garantia dessa qualidade do produto de software é o processo de teste. Com o objectivo de se conhecer melhor como o processo de teste faz parte da garantia de qualidade de um produto de software, abordam-se neste capítulo alguns conceitos, metodologias e técnicas de testes de software. Esta abordagem teórica é de elevada importância dado que é a partir dessa fundamentação que se realiza toda a actividade de testes na equipa de QMS-TST [Azevedo, 2008] [Tozelli, 2008] [Ferramentas, 2010]. 4.1 Introdução No mercado de software actual a preocupação por criar produtos de qualidade e sem erros tem conduzido a que as empresas procurem modelos e processos que garantam qualidade de forma a satisfazer as necessidades dos seus clientes. Projectos mal sucedidos, com prazos vencidos e produtos com defeitos, conduzem à insatisfação dos clientes, a gastos elevados com manutenção e comprometem a imagem da empresa. Garantir a qualidade do software representa um conjunto de actividades de prevenção que devem ser aplicadas e geridas ao longo de todo o processo de desenvolvimento, envolvendo revisões técnicas formais, múltiplas fases de teste, controle da documentação de software e das mudanças nos procedimentos, a fim de garantir ao cliente que o software desenvolvido estará de acordo com as especificações e atendendo às suas necessidades [Pressmann, 1995] [Myers et al, 2004]. Estas actividades de prevenção começam no início do processo de desenvolvimento do software, com a revisão dos requisitos, e continuam até que o teste do produto esteja completo e 14 implantado. Através destes procedimentos pode-se obter melhorias drásticas na eficácia e eficiência dos testes, e consequentemente aumentar a qualidade do software [Bastos, 2007]. Ao longo deste Capítulo descrevem-se conceitos e procedimentos utilizados para a obtenção da qualidade de um software pela equipa de QMS. Apresenta-se os objectivos e os benefícios da fase de testes, assim como, o seu enquadramento na fase de desenvolvimento de um software. 4.2 Objectivo dos Testes de Software O objectivo principal de um teste de software consiste em definir se a implementação deste cumpre todas as especificações e expectativas definidas e esperadas pelo cliente, ou seja, o objectivo é “verificar” se o que foi especificado na fase de requisitos é o que realmente foi desenvolvido. Quando se verifica se o software implementado cumpre todas as especificações e expectativas definidas e esperadas pelo cliente, também se procura por erros no software. O teste de software deve ser visto como uma parcela no processo de qualidade deste. Para se classificar um software com um determinado padrão de qualidade, este tem de possuir determinados atributos definidos segundo a norma ISO/IEC 9126. Esta norma foi publicada em 1991 e representa a actual padronização mundial para a qualidade de produtos de software. Assim, a norma ISO 9126 é utilizada para a definição dos requisitos de qualidade de um produto de software. Esta estabelece critérios ou medidas de qualidade tais como: funcionalidade, confiabilidade, usabilidade, eficiência, manutenabilidade e portabilidade, tal como ilustrado na Tabela 4.1 [Pressmann, 1995] [IEEE, 1990] [Pfleeger, 2004]. Tabela 4.1. Características da Norma ISO/IEC 9126. Característica Funcionalidade (satisfaz as necessidades?) Confiabilidade (é imune a falhas?) Usabilidade (é fácil de usar?) Eficiência Manuseabilidade (é fácil de modificar?) Portabilidade Sub-característica Adequação Acurácia Interoperbilidade Conformidade Segurança de acesso Maturidade Tolerância a falhas Recuperabilidade Intelegibilidade Apreensibilidade Operacionalidade Tempo Recursos Analisabilidade Modificabilidade Estabilidade Testabilidade Adaptabilidade Capac. para ser instalado Pergunta chave para a sub-característica Propõe-se a fazer o que é apropriado? Faz o que foi proposto de forma correcta? Interage com os sistemas especificados? Está de acordo com as normas, leis, etc.? Evita acesso não autorizado aos dados? Com que frequência apresenta falhas? Ocorrendo falhas, como reage? É capaz de recuperar dados em caso de falha? É fácil entender o conceito e a aplicação? É fácil de aprender a usar? É fácil de utilizar e controlar? Qual é o tempo de resposta, a velocidade de execução? Quanto utiliza de recursos da máq? Durante quanto tempo? É fácil de encontrar uma falha, quando ocorre? É fácil modificar e adaptar? Há grande risco quando se faz alterações? É fácil testar quando se faz alterações? É fácil adaptar a outros ambientes? É fácil instalar noutros ambientes? 15 (é fácil de usar noutro ambiente?) Conformidade Capac. para substituir Está de acordo com padrões de portabilidade? É fácil substituir outro? A Tabela 4.1 apresenta um conjunto de características e sub-características, definidas na norma que devem ser verificadas pelo software, para que este seja considerado um "software de qualidade". 4.3 Terminologia O IEEE tem realizado vários esforços de padronização, entre eles a definição da terminologia utilizada no contexto da Engenharia de Software. O padrão IEEE N.º 610.12-1990 diferencia os termos [IEEE, 1990]: defeito (fault) Passo, processo ou definição de dados incorrecto, como por exemplo, comando incorrecto; engano (mistake) Acção humana que produz um resultado incorrecto, como por exemplo, uma acção incorrecta realizada pelo programador; erro (error) Diferença entre o valor obtido e o valor esperado, ou seja, qualquer estado intermédio incorrecto ou resultado inesperado na execução do programa constitui um erro; falha (failure) Produção de uma saída incorrecta em relação ao especificado; Tester Responsável por realizar tarefas que vão desde o levantamento de requisitos até à execução do teste; Especificação dos requisitos Define (tudo) aquilo que o utilizador pretende de um determinado sistema/produto. 4.4 Porquê realizar testes de Software? Existem vários factores que justificam a realização de testes de software. No entanto, os principais factores que levam os gestores de Tecnologias de Informação (TI) à realização de testes de software são a diminuição do risco, a diminuição dos custos associados à produção e manutenção e garantir que todas as especificações e expectativas definidas e esperadas pelo cliente ou serviço 16 são cumpridas, para que não exista a insatisfação do cliente ou serviço. Outro factor que torna extremamente importante a realização de testes de software é o facto das organizações dependerem cada vez mais de sistemas que suportam os seus processos vitais de negócio. Além disso, os sistemas de informação estão a tornar-se cada vez mais complexos, incluindo muitas componentes. Associado a estes aspectos está a vertente financeira, um dos elementos que mais preocupa os gestores na área das TI. Assim, os custos podem ser elevados se não se testar devidamente o software. Nomeadamente, se forem associados à perda de qualidade com impacto nos produtos disponibilizados ou nos serviços prestados ao cliente [William, 2000][Ron, 2005][Almeida, 2010 ]. Além dos benefícios da prática de testes de software já descritos na Secção 4.4, outros benefícios práticos e importantes são [Teste, 2010] : - Optimização do processo de desenvolvimento; - Melhoria da qualidade na cadeia de desenvolvimento (requisitos, implementação, documentação); - Garantia de entrega dos requisitos; - Imposição de critérios de qualidade bem definidos e claros aos fornecedores de software; - Cliente mais satisfeito. Outro benefício importante da prática de testes tem a ver com o custo final da resolução de erros (ver Secção 4.12). 4.5 Enquadramento da Fase de Teste A Fase de Testes enquadra-se numa das etapas do ciclo de desenvolvimento do software, no entanto, a fase de testes é executada conforme o modelo de desenvolvimento do software. Alguns dos modelos de desenvolvimento de software mais utilizados são: Modelo em Cascata, Modelo em Espiral, Modelo Bottom-Up, Modelo Top-Down, Modelo V, Programação Extrema e Scrum. Contudo, nesta Secção, vão-se apenas abordar dois modelos, um mais recente e bastante utilizado, o modelo de Ciclo de Vida em V, e outro não tão recente, o modelo de Ciclo de Vida em Cascata ou Clássico. O modelo de ciclo de vida em cascata foi o primeiro modelo a ser conhecido em Engenharia de Software e está na base do desenvolvimento de outros modelos utilizados actualmente [Almeida, 2010 ] [Prass, 2010] [Ciclos, 2010]. De salientar, que neste relatório não se pretende descrever detalhadamente os vários modelos de desenvolvimento de software, apenas se pretende situar de forma simplificada onde é realizada a Fase de Teste tendo como base modelos de desenvolvimento usados na construção de projectos de software. Assim, o modelo de Ciclo de Vida 17 em Cascata ou Clássico consiste basicamente num modelo linear em que cada passo deve ser completado antes que o próximo passo possa ser iniciado como ilustra a Figura 4.1. Figura 4.1. Modelo de Ciclo de Vida em Cascata (adaptado de [Sommerville, 2000]). Os nomes dados em cada passo do ciclo variam, assim como varia a definição exacta de cada um deles, mas basicamente o ciclo de vida começa com [Celapar, 2009] [Pressmann, 1995] [Sommerville, 2000]: Levantamento de Requisitos É a fase em que o profissional de informática deve estar directamente ligado ao cliente. Exige um trabalho em equipa para a recolha das necessidades do cliente em relação ao desenvolvimento do sistema em termos de: funções, dados, hardware, etc. Esses requisitos podem ser classificados como: - Funcionais: devem descrever o que o software deverá fazer; - Não funcionais: segurança, integridade, riscos e restrições, problemas de negócio, etc. - De desenvolvimento e manutenção: cronograma, testes, prioridade das funções etc; Análise de Requisitos Constitui a modelação lógica do sistema. Nesta fase, os requisitos levantados são transformados em modelos. O resultado desta fase deve ser um documento ou vários documentos que sejam: inteligíveis, precisos, completos, consistentes, sem ambiguidade e facilmente modificáveis. Estes documentos servirão de instrumento de comunicação entre o programador e cliente; Projecto 18 Nesta fase, os modelos teóricos são transformados em modelos físicos, os quais devem estar mais próximos da implementação. São características da fase de projecto: - Definição de interface; - Definição de estrutura de dados; - Definição de módulos; - etc. A fase de Projecto permite que o software possa ser avaliado antes da programação ter início; Implementação Tradução do projecto numa forma que seja legível pela máquina; Testes Os testes são realizados após a implementação. São realizados vários tipos de testes como por exemplo, internamente a um módulo, linha a linha, ou testes de integração dos módulos; Manutenção A fase de manutenção pode ser: - Correctiva: Erros podem ser encontrados durante o funcionamento do sistema; - Adaptativa: O cliente pode propor alguma mudança que implique mudanças de alguns procedimentos, como, por exemplo, nova versão do sistema operativo, etc; - Preventiva: Mudar o sistema em função de mudanças necessárias para manter sua fiabilidade e eficiência, como, por exemplo, reorganizar a Base de Dados, etc. Outro modelo muito utilizado é o modelo em “V”. Neste modelo os processos de desenvolvimento e testes são definidos, alinhados e iniciam-se em simultâneo. No conceito do Ciclo de Vida em “V”, os processos de “fazer” e “verificar” convergem do início até o fim do projecto, conforme mostra a Figura 4.2. 19 Figura 4.2. Modelo de Ciclo de Vida em “V” (adaptada de [Pressman, 2000]). Este modelo baseia-se em verificar o software durante todo o ciclo de desenvolvimento, para conseguir uma detecção antecipada dos erros. Cada módulo no processo de desenvolvimento é avaliado, verificado, validado e testado. Os módulos de cada fase necessitam de ser verificados e validados para se assegurar que estão completos e correctos. O trabalho prossegue para a fase seguinte quando todos os pontos do projecto duma fase se encontram conforme as exigências de verificação e validação. Este modelo introduz a criação de testes de dados e cenários de teste durante o ciclo de desenvolvimento do software, ao contrário de outros que só fazem testes no fim do ciclo. Este modelo especifica diferentes fases de teste, como por exemplo: testes de unidade, testes de integração e testes de sistema ou testes de aceitação [Macoratti, 2008]. O modelo em V retracta a importância do teste do software no início do desenvolvimento do ciclo e aumenta a qualidade do software, porque este é testado várias vezes ao longo do ciclo [William, 2000] [Pfleeger, 2004]. Em geral, este modelo reforça a ideia de que o teste é uma parte integrante do ciclo de desenvolvimento do software. Pode-se verificar, tendo como base os dois modelos de desenvolvimento de software referidos nesta Secção, que a fase de testes é elaborada de acordo com o modelo de desenvolvimento escolhido pelas equipas. 20 4.6 Fases de Teste Devido à complexidade dos sistemas a actividade de testes deve ser efectuada ao longo de diferentes estágios. O processo de testes mais utilizado é composto por cinco estágios, como ilustra a Figura 4.3. Figura 4.3. Visão Geral de um Processo de Testes (adaptada de [Sommerville, 2000]). O processo é iterativo, em que a informação produzida em cada estágio, poderá fluir entre estágios adjacentes. Os estágios do processo de testes segundo [Sommerville, 2000] [Correia at al , 2004] são: Testes de Unidade Os componentes individuais são testados independentemente de outros componentes para certificação de que operam correctamente; Testes de Módulo Um Módulo é uma colecção de Componentes relacionados tais como classes, tipos abstractos de dados ou um conjunto de procedimentos ou funções. Durante este Estágio cada módulo é testado individualmente. Testes de unidade e de módulo fazem parte do processo de implementação e são da responsabilidade dos programadores que participaram no desenvolvimento do componente alvo e/ou o componente para testar o componente alvo; Testes de Sub-Sistema ou Testes de Integração Esta fase envolve o teste de módulos integrados em sub-sistemas. Os sub-sistemas podem ser desenhados e implementados independentemente. Um problema comum em grandes sistemas está na integração das interfaces entre os módulos dos sub-sistemas. Estes testes 21 devem portanto concentrar-se no exercício rigoroso de tais interfaces para detecção de possíveis erros; Testes de Sistema Os sub-sistemas são integrados para formarem um único sistema. O processo deste tipo de teste irá detectar falhas resultantes das interacções entre sub-sistemas e componentes de sistema; Testes de Aceitação Este é o Estágio final do processo de testes antes do sistema ser aceite para uso operacional. O sistema é testado com dados fornecidos pelo utilizador final, ao contrário de dados fictícios ou simulados. Os testes de aceitação revelam principalmente erros e omissões na definição dos requisitos, pois através do uso de dados reais o sistema é exercitado de formas variadas. 4.7 Plano de Teste O Plano de Testes é um documento que especifica como, quando, onde, quem, o porquê e o quê sobre o teste. Descreve os objectivos dos testes a serem realizados e detalha cada um deles. Também, são registados os recursos necessários para a realização dos testes. Este documento é caracterizado por identificar informações e componentes de software no projecto a serem testados, listar requisitos recomendados para teste, especificar e descrever estratégias de teste a serem utilizadas, identificar os recursos e definir o esforço de teste previsto [Mariana, 2010] [Pressman, 1995]. Faz parte também da actividade de planeamento determinar quais são os testes mais importantes e que deverão ser executados. A Figura 4.4 ilustra um exemplo de um Plano de Testes elaborado na empresa Optimus. 22 Figura 4.4. Plano de Testes. 4.8 Caso de Teste O Caso de Teste é um conjunto de condições usadas para realizar testes de software numa Fase de Testes. Um Caso de Teste possui as entradas a inserir no sistema/programa e saídas esperadas. Isto é, o caso de teste deve definir a saída esperada, de forma a reduzir a interpretação do critério de sucesso. A saída da execução do teste deve ser exaustivamente analisada. Os casos de teste devem verificar não somente as condições inválidas de execução, como também as condições válidas [Myers et al,, 2004]. Assim, os casos de teste servem como base para que os Testers possam executar os testes manualmente, mas podem ser criados com o intuito de serem automatizados. No entanto, seja qual for finalidade, devem sempre cobrir o máximo de situações possíveis. Os campos necessários para um Caso de Teste segundo a norma IEEE 829 são: 23 - Identificador do Caso de Teste; - Itens de teste; - Especificações de entrada; - Especificações de saída; - Ambiente necessário; - Exigências especiais; - Dependências. Como exemplo, apresenta-se na Figura 4.5 um exemplo de um Caso de Teste realizado na empresa Optimus. Figura 4.5. Exemplo de um Caso de Teste. 4.9 Tipos de Teste Tendo como referência os diferentes estágios num processo de testes, Testes de Unidade, Testes de Módulo, Testes de Sub-Sistema ou Testes de Integração, Testes de Sistema e Testes de Aceitação, dentro de cada um destes estágios são elaborados diferentes tipos de teste, onde cada tipo de teste desempenha um papel diferente e com objectivos bem distintos. Segundo o International Software Testing Qualifications Board (ISTQB) alguns dos testes elaborados nos estágios do processo de testes são [Wintrust, 2006] [Travassos at al, 2007] [Caetano, 2009]: Teste de Componentes (Component Test) Tipo de Teste Unitário que foca o teste num bloco de código ainda mais pequeno que uma unidade executável. Por exemplo, uma sub-rotina ou uma classe de um objecto. Este tipo de teste é apropriado para aplicações que são desenvolvidas segundo uma aproximação Orientada a Objectos; Testes de Concorrência (Concurrent Test) 24 Tipo de Teste Unitário que avalia a capacidade do módulo ou programa em ser utilizado/chamado por múltiplos utilizadores em simultâneo; Testes de Memória (Storage Test) Serve para testar se a memória ocupada por um dado componente está de acordo com o objectivo (quer memória - RAM - quer memória secundária - disco); Teste de Touchpoint É uma forma Teste de Unitário. Um teste de Touchpoint é usado durante a manutenção do sistema. A intenção deste teste é testar as linhas de código alteradas e prescindir do teste às partes não modificadas; Testes Unitários (Unit Test) Um Teste Unitário é um tipo de teste desenhado para testar um único módulo da aplicação como um ecrã, página, programa ou subrotina. Este teste, tenta cobrir todas as instruções e ramificações do código desse módulo. Os testes unitários incluem normalmente os Testes Negativos e Positivos, designadamente: - Teste Positivo: é quando se introduz uma entrada válida e se espera que a acção termine de acordo com os requisitos; - Teste Negativo: é quando se introduz uma entrada inválida e se espera que a acção termine com uma mensagem de erro; Testes Funcionais (Functional Test) Os Testes Funcionais permitem demonstrar, de forma sistemática, que as funções disponibilizadas estão de acordo com o especificado nos requisitos técnicos e requisitos de negócio, na documentação do sistema e nos manuais de utilizador. Uma distinção chave dos testes funcionais é que estes são orientados na perspectiva dos especialistas da aplicação. Os Testes Funcionais centram-se à volta dos seguintes pontos: - Input Válido – Intervalos de valores válidos que o sistema deverá aceitar; - Input Inválido – Intervalos de valores inválidos que o sistema deverá rejeitar; - Funções – Funções que deverão ser executadas; - Output – Intervalos de valores de saída que deverão ser testados; - Sistemas/Procedimentos – sistemas ou procedimentos com os quais o sistema dialoga que deverão ser chamados. A preparação e organização dos testes funcionais devem ser focadas nos requisitos, nas funções chave, ou nos casos de testes especiais. Adicionalmente, o teste deve considerar uma cobertura das funcionalidades de forma sistemática, para que seja possível identificar os processos de negócio e os campos de informação; 25 Testes de Integração (Integration Test) O Teste de Integração é desenhado para testar grupos de módulos de forma a assegurar que os dados e respectivos procedimentos de controle estão a fluir adequadamente entre esses módulos. Os Testes de Integração demonstram que apesar dos componentes funcionarem satisfatoriamente a nível individual (como demonstram os Testes Unitários bem sucedidos), a sua combinação está correcta e consistente. Testes de Integração visam especificamente expor os problemas que surjam da combinação dos componentes; Testes de Sistema (System Test) O Teste de Sistema é um tipo de teste desenhado para verificar a aplicação na sua plenitude. Este teste é executado depois da aplicação estar completamente integrada e concluída. Com este teste pretende-se validar os requisitos funcionais; Teste de Portabilidade (Portability Test) Tipo de teste que verifica a eficácia de transferir o sistema para outro ambiente; Teste de Coexistência (Coexistence Test) Tipo de teste desenhado para verificar a co-habitação da aplicação com outros componentes que não estejam directamente ligados a ela. A intenção deste tipo de teste é testar como a aplicação interage com outros componentes do seu ambiente, como por exemplo periféricos partilhados, plataformas partilhadas, etc; Teste de Desinstalação (Backout Test) Este é um tipo de teste desenhado para validar os procedimentos de desinstalação da aplicação. A intenção deste teste é verificar que uma aplicação pode ser retirada de produção e a versão anterior re-instalada se necessário. O seu objectivo é provar que existe um mecanismo de recuperação seguro e que pode ser invocado se necessário. Este teste é executado normalmente em sintonia com um Teste de Implementação; Testes de Segurança (Security Test) Testes baseados em objectivos de segurança específicos (Ex: um mecanismo de protecção de memória de um sistema operativo, injecção de SQL ou mecanismos de segurança de dados); Testes de Disaster Recovery (Disaster Recovery Test) Tipo de teste desenhado para recuperar de uma quebra ou perda de dados na aplicação seguindo um plano pré-definido. Também podem ser chamados de Testes de Indisponibilidade; Testes End to End (End to End Test) É um tipo de Teste de Integração bastante abrangente pois vai desde o input original, atravessando todos os componentes da aplicação, até ao output final. Este tipo de teste baseiase no ponto de vista funcional e pode envolver actividades que cruzam as fronteiras de diversas 26 aplicações. Um exemplo deste tipo de teste pode ser o teste da entrada de uma encomenda, expedição do produto e emissão da factura; Testes de Implementação ou Testes de Instalação (Implementation Test) Tipo de teste que visa validar os procedimentos de instalação da aplicação e não o seu código. Do leque de validações possíveis há que considerar se há tempo suficiente para instalar as alterações, nomeadamente, tempo para converter ficheiros, executar utilitários e promover a aplicação para o ambiente de produção; Testes Paralelos (Parallel Test) Tipo de teste que é desenhado para determinar se as funções novas do sistema, ou funções alteradas, funcionam da mesma forma que uma versão anterior ou uma versão de outra aplicação com o mesmo fim. Normalmente, os Testes Paralelos são efectuados usando os dados de entrada do actual ambiente de produção para serem processados pelo novo sistema de forma a avaliar se os seus dados de saída são os mesmos. Testes Paralelos são particularmente úteis quando se está a redesenhar um novo sistema para uma nova plataforma sem fazer grandes mudanças a nível funcional; Testes de Smoke Test Tipo de teste desenhado para executar as funções mais críticas da aplicação com os dados mais usuais. Este teste é geralmente executado após a compilação da aplicação para validar que a mesma está pronta para entrar no ciclo de teste, ou seja, este teste é utilizado como pré-teste para ajudar a determinar se a aplicação está pronta para testes mais rigorosos (de acordo com o plano de testes); Testes de Performance (Performance Test) Testes de Performance determinam a performance da aplicação em produção bem como da sua infra-estrutura de suporte sob determinadas condições. Os Testes de Performance são usados para medir certas características do sistema tais como, velocidade de processamento, tempo de resposta, consumo dos recursos, nº de pedidos por segundo e eficiência. O termo Testes de Performance é utilizado frequentemente para referir não só testes de performance mas também testes de stress, carga e de volume; Teste de Aceitação (Acceptance Test) Teste de Aceitação é um tipo de teste desenhado para simular, o mais aproximado possível, a utilização real da aplicação. Este teste inclui o envolvimento do utilizador final da aplicação; Testes de Regressão (Regression Test) 27 O Teste de Regressão consiste na aplicação de testes à versão mais recente do software, para garantir que não surgiram novos defeitos nos componentes já testados. Se, ao juntar um novo componente, ou devido a alterações em componentes do sistema, surgirem novos defeitos em componentes inalterados, então considera-se que o sistema regrediu. Os Testes de Regressão são compostos por um conjunto de testes que são executados sempre que qualquer componente da aplicação é alterado. Com esta política ganha-se a confiança que o sistema continuará a funcionar apesar dos novos requisitos implementados, isto é, este tipo de teste garante que um determinado produto que “sofreu” novas actualizações continua a funcionar correctamente; Testes de Carga (Load Test) Simulação da carga prevista dentro dos requisitos operacionais do sistema; Testes de Stress (Stress Test) Teste direccionado para avaliar um sistema ou um componente do sistema no limite (ou para além do limite) dos requisitos especificados. O desempenho e as funções normais de um sistema são confrontados com situações anormais. Este tipo de teste é geralmente desenhado para exceder os requisitos do desempenho normal da aplicação e determinar o limite máximo das suas capacidades; Testes de Volume (Volume Test) Simula o volume de transacções máximo esperado e respectivos acessos no período de maior tráfego para se perceber o impacto na rede, nos tempos de resposta e noutros componentes da infra-estrutura. É uma variação de Testes de Stress. O esquema da Figura 4.6 ilustra a diferença entre estes tipos de teste; Figura 4.6. Diferenças entre Teste de Carga/Volume/Stress. Testes de Usabilidade (Usability Test) Tipo de teste desenhado para verificar se a utilização da aplicação por parte do utilizador está de acordo com as suas necessidades. Um Teste de Usabilidade é tipicamente executado 28 por utilizadores finais como parte da fase de desenho, utilizando para o efeito um protótipo. O objectivo é simular o ambiente normal de trabalho; Testes de Documentação (Documentation Test) Testes que se preocupam com a qualidade da documentação para os utilizadores finais. Por exemplo, verificam que os documentos são claros e concisos, e que são usados os exemplos nos documentos para criar os casos de teste. 4.10 Tipos de Testes / !ível do processo de Teste Nesta Secção assimila-se os Tipos de Testes apresentados na Secção anterior com Fase de Teste apresentado na Secção 4.6. Assim, a Tabela 4.2 relaciona cada tipo de teste, bem como a fase em que o mesmo se aplica, tendo em conta o nível do processo de teste. Tabela 4.2. Fase/Tipo de Testes. Fase Tipo Unitário Integração Integração Sistema Componentes Componentes Componentes Carga Concorrência Concorrência Aceitação Aceitação Aceitação Aceitação Beta Funcional /Integração Coexistência Carga Memória Regressão Desinstalação Documentação Carga Touchpoint Segurança Disaster & Recovery Regressão Performance Funcional Stress Piloto Usabilidade Stress Instalação Volume Volume Unitário de Teste Paralelos Portabilidade Regressão Segurança Smoke Stress Sistema Volume Ambiente Desenvolvimento Qualidade Pré - Produção Produção 4.11 Técnicas de Testes de Software Uma grande variedade de técnicas é utilizada para realizar o projecto de casos de teste para software. Estas técnicas fornecem mecanismos que podem ajudar na elaboração dos casos de teste e fornecem uma probabilidade maior de descobrir erros. Qualquer produto que passa por Engenharia 29 de Software (e não só) por ser testado de duas maneiras: (1) sabendo a função específica para a qual foi projectada para realizar, podem ser realizados testes que demonstrem que a função está plenamente operacional; (2) sabendo como é o funcionamento interno de um produto, podem ser realizados testes para garantir que “todas as engrenagens combinam”, isto é, que as operações internas são realizadas de acordo com as especificações e que todos os componentes internos foram adequadamente exercitados. A primeira abordagem de teste chama-se técnica de teste White-Box ou Caixa-Branca e a segunda, técnica de teste Black-Box ou Caixa-Preta [Nina, 2007] [Pressman, 1995]. 4.11.1 Teste White-Box (Caixa-Branca) Este tipo de técnica de teste avalia o comportamento interno do componente de software, como ilustra a Figura 4.7. A técnica de Caixa-Branca opera directamente sobre o código-fonte do componente. Os aspectos avaliados neste teste dependerão da complexidade e da tecnologia que determinaram a construção do componente de software. Dados de Entrada Dados de Saída Figura 4.7. Técnica de White-Box ou (Caixa-Branca). O programador responsável pelos testes tem acesso ao código fonte da aplicação e pode construir códigos para efectuar a ligação de bibliotecas e componentes. Esta técnica de teste baseiase num conjunto de métodos que, garantem que todos os caminhos independentes de um módulo tenham sido exercitados pelo menos uma vez, que executem todos os ciclos nos seus limites e dentro dos seus intervalos operacionais, e exercitem as estruturas de dados internas para garantir a sua validade. Estes testes podem ser testes manuais ou testes efectuados com apoio de ferramentas para verificação de aderência a boas práticas de codificação, reconhecidas pelo mercado de software. A técnica de teste de Caixa-Branca é recomendada para as fases de Teste da Unidade e Teste da Integração, cuja responsabilidade principal, em geral, fica a cargo dos programadores do software, que por sua vez conhecem bem o código-fonte produzido [Ireland, 1991] [Pressman, 1995]. 30 4.11.2 Teste Black-Box (Caixa-Preta) Este tipo de técnica de teste consiste em verificar a saída dos dados usando vários tipos de entradas de dados, como ilustra a Figura 4.8. Neste tipo de técnica os dados de entrada são fornecidos, o teste é executado e o resultado obtido é comparado a um resultado esperado previamente conhecido. Dados de Entrada Dados de Saída Figura 4.8. Técnica de Caixa Preta ou Black-Box. A técnica Black-Box utiliza um conjunto de dados de entrada que vão exercitar todos os requisitos funcionais do software. Este tipo de técnica tenta encontrar, por exemplo, erros de interface, erros de estrutura de dados ou de acesso a bases de dados, erros de comportamento e desempenho. Com este objectivo, utiliza vários métodos que são: métodos de teste baseados em grafo, particionamento de equivalência, teste de comparação, teste de matriz ortogonal [Nina, 2007] [Beizer, 1995] [Pressman, 1995]. No entanto, com base nas literaturas pesquisadas, a técnica de teste de Caixa Preta também pode ser chamada de técnica de teste funcional. No âmbito deste Estágio, esta técnica de teste foi utilizada no desenvolvimento de casos de teste para automatização. Nos anexos, na Secção “Exemplo de Caso de Teste” encontra-se um exemplo de um caso de teste para automatizar. Este foi desenvolvido utilizando os conceitos referidos nesta Secção. Por exemplo, os dados utilizados ao longo do teste são inseridos e no final da execução do teste são validados. 4.12 Custos da Qualidade em Testes de Software O custo da qualidade inclui todos os custos decorrentes da procura de qualidade ou da execução de actividades relacionadas com a qualidade [Pressman, 1995]. A medição do custo da qualidade pode ser usada para comparar o custo de um produto final, para determinar a diferença relativamente a um produto similar, ou por exemplo usar-se para avaliar o custo adicional de se falhar a satisfação dos requisitos da qualidade imposto pelo cliente. Assim, os custos da qualidade podem ser vistos de duas formas. A primeira, mais simplista, encara dois tipos de custos [Miguel, 2004]: 31 Custos da Conformidade Custos associados à formação, treino, verificações, validações, teste, manutenção, calibragem, auditorias; Custos da !ão-Conformidade Incluem itens como desperdícios, trabalho adicional de correcção de erros, reparações em garantias, devolução de produtos e gestão de reclamações. O outro método de classificar os custos da qualidade leva em consideração todos os itens que contribuem para a sua formação. Estes itens podem ser descritos como [Horch, 1996], [Miguel, 2004]: Custos de Prevenção Custos visíveis orientados para a satisfação dos requisitos do cliente (revisão de desenho, treino, planeamento da qualidade, inspecções a fornecedores, etc.). Ou seja, tem a ver com a estratégia de incorporação da qualidade; Custos de Avaliação Custos associados com a avaliação e testes do produto ou processo, para garantir que satisfaz os requisitos do cliente. Ou seja, tem a ver com a estratégia de controlo de qualidade; Custos de Falhas Internas Custos associados com a falha de processos em fazer produtos aceitáveis para o cliente (reescrever especificações e planos, voltar a rever após a correcção de defeitos, voltar a testar após a correcção de defeitos, etc); Custos de Falhas Externas Custos associados com a determinação, pelo cliente, de que os seus requisitos não foram satisfeitos (tratamento de reclamações de clientes, visitas ao cliente para resolução de queixas, perda de clientes, perda de oportunidades, etc.). Este tipo de custo está associado com a estratégia de preservação da qualidade. Podemos considerar que os dois primeiros custos representam os custos de incorporar a qualidade e os dois últimos representam os custos das falhas. A Figura 4.9 ilustra os resultados esperados pelo sistema de gestão da qualidade nos custos da qualidade. Numa organização sem um sistema de gestão da qualidade, os custos da qualidade têm a estrutura indicada no gráfico da 32 esquerda; o gráfico da direita mostra que a introdução de um sistema de gestão da qualidade permite obter economias significativas. Figura 4.9. Custos da Qualidade (adaptado de [Miguel, 2004]). Podemos assim concluir que o investimento sério na prevenção provoca uma diminuição em todos os outros custos, com especial incidência nos custos devido às falhas internas e externas. Como podemos analisar pela Figura 4.10 quanto mais tarde se encontra uma falha/erro, maior será o seu custo. Figura 4.10. Custos da correcção de erro (adaptado de [Miguel, 2004]). 4.13 Uma nova abordagem: Automatização Muitas das metodologias de Engenharia de Software recomendam que todas as pessoas envolvidas num projecto (programadores, gestores, equipas de homologação e até mesmo os 33 clientes) trabalhem com o objectivo de controlar a qualidade do produto todos os dias e a todo o momento, pois acreditam que prevenir defeitos é mais fácil e barato que identificá-los e corrigi-los. Assim, cada vez mais é recomendado testes automatizados para ajudar a garantir a qualidade dos sistemas de software. Testes automatizados são programas ou scripts simples que exercitam funcionalidades do sistema a ser testado e fazem verificações automáticas nos efeitos colaterais obtidos. A grande vantagem desta abordagem é que todos os casos de teste podem ser facilmente e rapidamente repetidos, a qualquer momento e com pouco esforço [Kon at al, 2008] [Aniela, 2010] [Sommerville, 2000]. 4.14 Porquê Automatizar? A necessidade de automatizar deve-se essencialmente à necessidade de repetir os testes a qualquer momento. Assim, com a elaboração de automatismos torna-se possível, e com extrema facilidade, executar todos os testes quando se desejar, permitindo assim analisar se existem mudanças no sistema. A reprodutibilidade dos testes permite simular identicamente e inúmeras vezes situações específicas, garantindo que passos importantes não serão ignorados por falha humana, facilitando a identificação de um possível comportamento não desejado. Além disso, como os casos para verificação são descritos através de um código interpretado por um computador, é possível criar situações de testes bem mais elaboradas e complexas do que as realizadas manualmente, possibilitando qualquer combinação de comandos e operações. Permite que os Testers estejam mais preocupados com outras tarefas críticas e impossíveis de automatizar, em vez, de estarem a executar tarefas rotineiras. Outro ponto importante da automatização, é que permite de forma trivial simular centenas de utilizadores a acederam a um sistema ou a inserirem milhares de registos numa base de dados, o que não é fazível com testes manuais. Todas estas características ajudam a solucionar os problemas encontrados nos testes manuais, diminuindo a quantidade de erros e aumentando a qualidade do software [Kon at al, 2008] [Aniela, 2010] [Martha, 2008] [Nina, 2007]. 4.15 Âmbito da Automatização na Optimus Com o objectivo de aumentar a qualidade, dentro dos processos de negócio core, a Equipa de QMS da Optimus decidiu automatizar casos de teste, assim como, algumas tarefas rotineiras que antes eram realizados manualmente, de forma a ajudar os colaboradores a economizar tempo e energia a fazerem o seu trabalho. Assim, depois de executar manualmente o caso de teste, este é 34 automatizado com o auxílio da ferramenta Quick Test Professional para garantir que não surgem novos defeitos nos componentes já testados. A este tipo de teste atribui-se o nome de Teste de Regressão (ver Secção 4.9). Outro tipo de teste resultante da automatização de um caso de teste é o Teste de Carga/Stress/Volume (ver Secção 4.9). Estes têm um objectivo bem distinto dos Testes de Regressão, pois, o seu objectivo não é encontrar defeitos nos componentes já testados, mas sim simular vários utilizadores a utilizarem a mesma aplicação e verificar o comportamento do servidor da aplicação. De salientar que a única diferença entre Teste de Carga, de Stress e de Volume encontra-se no número de utilizadores simulados durante a execução dos respectivos testes. Assim, ao longo do Capítulo 5, vamos apenas fazer referencia a Teste de Carga, dado que os Testes de Stress e de Volume apenas simulam mais utilizadores. Para este tipo de teste utiliza-se a ferramenta Loadrunner. No Capítulo 5 serão retratados estes tipos de teste, Testes de Regressão e Testes de Carga, acompanhados de alguns exemplos práticos implementados no âmbito deste Estágio. 35 5 Automatismos Neste Capítulo abordam-se os automatismos desenvolvidos ao longo do Estágio, é apresentada a sua arquitectura e o seu modo de funcionamento, assim como as ferramentas utilizadas e as suas principais características. Ao longo deste Capítulo serão também apresentadas as metodologias utilizadas justificando a sua aplicação com exemplos do Site Optimus e do Site CPM. Estes Sites são dos produtos com maior número de automatismos desenvolvidos ao longo do período de Estágio (ver Secção 5.10). 5.1 Introdução Com a presente introdução pretende-se enquadrar a fase de desenvolvimento de scripts tendo em conta as metodologias da equipa de Quality Management Systems (QMS) na empresa Optimus. Assim, de forma simples e resumida descreve-se o enquadramento da fase de desenvolvimento de scripts durante as fases da actividade de teste. Estas são normalmente realizadas na seguinte sequência: (1) Identificação, (2) Desenho, (3) Construção, (4) Execução e (5) Comparação, como mostra a Figura 5.1. No entanto, nem sempre é possível realizar estas actividades na sequência apresentada. Por vezes, quando se está numa fase intercalar, verifica-se que existe informação, dados ou validações que deviam ter sido descritas numa fase anterior. Devido a este facto, por vezes tem que se repetir o processo ciclicamente até se darem por concluídas todas as fases [Fewster at al, 1999] [Correia at al , 2004] [Sommerville, 2000]. Tendo como base a Figura 5.1 pode-se descrever individualmente cada uma das fases: 36 Figura 5.1. Actividades de teste para automatizar casos de teste na equipa de QMS (adaptado de [Correia at al , 2004]). Identificação Nesta primeira etapa, o Tester determinará o alvo a verificar, identificando as condições de teste (itens ou eventos) que precisam ser verificados por cada teste. As condições de teste são descrições de circunstâncias que devem ser examinadas. A abordagem usualmente usada pela equipa de QMS nesta fase é a abordagem de testes funcionais ou Black-Box (ver Secção 4.11.2); Desenho O desenho dos casos de teste determinará como as condições de testes serão verificadas. Um caso de teste é um conjunto de passos realizados em sequência e com um objectivo comum – verificar/validar. Para a correcta execução de um caso de teste é necessário fornecer os dados de entrada e respectivas saídas. Os pré-requisitos para realização dos testes, tais como variáveis do ambiente de execução ou estado da base de dados, devem ser explicitados para cada caso de teste. A saída ou resultado esperado inclui a criação ou visualização de itens, a modificação ou actualização de itens (em base de dados, por exemplo) ou a remoção de itens. No Anexo I, na Secção “Exemplo de Caso de Teste - Site CPM” apresenta-se um caso de teste realizado no âmbito do Estágio para o Site CPM. Neste exemplo pode-se verificar a query de dados de entrada e de validação, assim como a sequência a realizar pelo script; Implementação 37 Nesta fase os casos de teste são transformados em scripts de teste. No entanto, um script pode executar mais que um caso de teste. Conforme o objectivo final, o script é desenvolvido com o auxílio das ferramentas QTP (caso se automatizem casos de testes para testes de regressão) ou LoadRunner (caso se automatizem casos de teste para teste de carga) e é guardado num ficheiro com a extensão definida automaticamente pela ferramenta utilizada na sua implementação. Como exemplo, apresenta-se no Anexo II, na Secção “Exemplo Script de Suporte - Site CPM” um script que ilustra a navegação efectuada no respectivo site e no final executa a actividade de validação (neste caso chama uma função para consultar uma base de dados); Execução Nesta actividade são executados os scripts de teste. Caso se pretenda executar um script de testes de regressão (ver Secção 5.2) utiliza-se a ferramenta Quality Center (ver Secção 5.8) permitindo assim lançar os scripts remotamente e serem executados por qualquer Tester, caso se pretenda executar um script de teste de carga (ver Secção 5.13) este deve ser executado apenas pelo programador; Comparação Os resultados obtidos do sistema sob teste são utilizados para determinação da validação do teste. Existem dois resultados possíveis: Failed (Falhou) ou Passed (Passou). Por norma, são realizadas várias verificações durante a execução do script do caso de teste mas, por exemplo, resultados que fazem modificações de registos numa base de dados podem apenas ser comparados depois da execução do caso de teste estar finalizado. Por exemplo, o script que se encontra no Anexo II, Secção “Exemplo Script Suporte – Site CPM” retrata esta situação. É efectuada a navegação no respectivo site e no final é executada a actividade de validação, ou seja, é utilizada uma função para consultar uma base de dados (ver Secção 5.6). Contudo, quando estamos perante os testes de regressão é a ferramenta Quality Center que apresenta o resultado final assim como as comparações e verificações dos dados realizadas ao longo do script (ver Secção 5.8). Todavia, caso se executem scripts de testes de carga, a validação é apresentada num relatório gerado automaticamente pela ferramenta (ver Secção 5.13); 5.2 Arquitectura dos Testes de Regressão A arquitectura dos testes de regressão foi desenhada tendo em conta as ferramentas já utilizadas pelos Testers e a ferramenta QTP. O objectivo principal, foi definir uma forma que fosse simples para os Testers utilizarem as ferramentas com que já tinham afinidade. Uma dessas 38 ferramentas é o Quality Center, tendo-se verificado que esta ferramenta conseguia interagir com a ferramenta QTP. Assim, na sequência deste Estágio, integrou-se o QTP com a ferramenta Quality Center. Esta ferramenta, muito utilizada pelos Testers, serve para estes definirem, gravarem e executarem um caso de teste. Então, definiu-se que a ferramenta Quality Center iria fazer a ponte entre os Testers e os automatismos criados pela ferramenta QTP. Como se pode observar na Figura 5.2, pode-se afirmar que a arquitectura dos testes de regressão é constituída por um utilizador (usualmente um Tester, mas pode ser o programador ou gestor de equipa), (para mandar executar um caso de teste automático), um servidor com a ferramenta Quality Center, (para guardar os dados e resultados do caso de teste), e um servidor com a ferramenta QTP, (para executar os scripts que executam o caso de teste automatizado). Figura 5.2. Arquitectura Testes de Regressão – Equipa de QMS. O funcionamento da arquitectura, consiste no Tester (quem mais utiliza a ferramenta) aceder ao interface da ferramenta Quality Center via Web, escolher o caso de teste automatizado, definir os dados de teste que pretende que o script utilize (ver Secção 5.8), definir o servidor onde pretende executar o caso de teste automatizado, e de seguida ordenar a execução num servidor com a ferramenta QTP. 5.3 Ferramenta de Automatização Quick Test Pro Como descrito anteriormente, o QTP é uma ferramenta de Capture and Replay. Esta ferramenta foi inicialmente desenvolvida pela empresa Mercury Interactive e adquirida pela empresa HP. Como ilustra a Figura 5.3, esta ferramenta usa vários Add-ins (por exemplo, ActiveX, VisualBasic, Web) para melhorar a velocidade de execução e para melhor reconhecer as aplicações em teste. 39 Figura 5.3. Add-ins da Ferramenta QuickTest Professional. O modo de funcionamento do QTP baseia-se no reconhecimento de objectos de uma aplicação ou página Web. Isto é, a ferramenta reconhece as propriedades de um determinado objecto (por exemplo: um Button, uma TextBox, uma ComboBox), armazena essas propriedades num local centralizado chamado de Repositório de Objectos (Object Repository) e gera uma linha de código referenciando esse objecto no repositório. A Figura 5.4 apresenta a interface do Repositório de Objectos. Assim, quando o programador que implementa a automatização dos casos de teste efectua uma navegação, a ferramenta vai guardando os dados, as propriedades dos objectos que vão sendo utilizados na navegação, e gerando o código do script. Terminada esta fase, quando se executa o script, o código gerado para um determinado objecto vai comparar as propriedades desse objecto no repositório de objectos com as propriedades da aplicação. Isto é, os objectos da aplicação ou página Web são identificados / reconhecidos pela comparação das suas propriedades com as propriedades armazenadas no repositório de objectos. 40 Figura 5.4. Ferramenta QuickTest Professional. Caso as propriedades no repositório de objectos sejam diferentes das encontradas na aplicação é gerada uma mensagem de erro. Os Add-ins disponibilizados pela ferramenta são muito úteis para o reconhecimento das propriedades dos objectos nos diversos tipos de aplicações. 5.4 Principais Funcionalidades da Ferramenta QuickTest Professional A ferramenta QTP, tal como outras ferramentas que permitem a automatização de casos de teste, apresenta um conjunto elevado de funcionalidades, no entanto, no contexto deste Estágio as funcionalidades com maior relevância são (Figura 5.5, 5.6, 5.7): Reconhecimento automático dos objectos e respectiva geração automática de código Figura 5.5. Ferramenta QuickTest Professional (Record). 41 Repositório comum de Objectos (Object Repository) Figura 5.6. Ferramenta QuickTest Professional (Object Repository). Introdução de verificação de pontos (Checkpoints) Os Checkpoints permitem verificar que uma determinada característica da aplicação existe. Com esta funcionalidade é possível comparar o resultado real com os resultados esperados pré-definidos. Existem vários tipos de Checkpoints, tais como, Standard Checkpoint, Text Checkpoint, Bitmap Checkpoint, Database Checkpoint, e XML Checkpoint, como apresentado na Figura 5.7. O Database Checkpoint é, por norma, pouco utilizado. O mais comum é efectuar-se uma consulta à base de dados através de funções implementadas na linguagem de programação Visual Basic. 42 Figura 5.7. Ferramenta QuickTest Professional (CheckPoints). 5.5 Técnicas para implementação de scripts de testes automáticos Nesta secção vamos descrever as técnicas utilizadas para a implementação de scripts no âmbito do Estágio, exemplificando com um caso prático em funcionamento. As técnicas para implementação de scripts de testes automáticos são semelhantes às técnicas de programação. Para a implementação de scripts, usando-se como referencia [Fewster at al, 1999] [Sommerville, 2000] [Correia at al, 2004], foram desenvolvidos vários scripts utilizando as técnicas consideradas pelos autores que se resumem-se a cinco: Scripts Lineares A técnica de scripts lineares é obtida a partir da gravação feita por uma ferramenta Capture and Replay ou (gravação e execução). É uma forma rápida de iniciar a implementação de scripts para testes automáticos, pois não requer conhecimento da linguagem oferecida pela ferramenta. No entanto, estes scripts não são úteis num plano a longo prazo. Normalmente, possuem informação excessiva e repetida, dados registados junto às acções (hard-coded) e estão muito associados a particularidades do sistema na fase da gravação, o que os torna bastante vulneráveis a mudanças no sistema a ser testado; 43 Scripts Estruturados Esta técnica de implementação de scripts Estruturados utiliza estruturas de controlo como “If”, “For”, “Loop”,etc, o que garante uma flexibilidade não existente nos scripts lineares; Scripts Partilhados Com esta técnica pretende-se implementar scripts que podem ser usados por mais de um caso de teste. Os scripts partilhados podem ser específicos a uma aplicação ou independentes da aplicação. Uma vez identificado um conjunto de acções úteis para mais de um teste, um script partilhado deve ser criado e disponibilizado para invocação a partir de qualquer outro teste. As informações variáveis devem ser passadas como parâmetro, tal como acontece na invocação de uma função na programação estruturada, de forma a se utilizar em vários scripts partilhados. No âmbito deste Estágio, a implementação de testes automáticos através desta técnica e das anteriores foi apenas utilizada para demonstração do funcionamento das ferramentas QTP e Loadrunner, dado que estas técnicas não utilizam os dados de teste ou os resultados esperados a partir de um ficheiro de dados, Excel ou base de dados; Scripts Data-driven Com esta técnica, são implementados scripts mais abrangentes. Estes utilizam dados de forma dinâmica, isto é, lêem os dados a utilizar durante o script ou os resultados esperados a partir de um ficheiro de dados, tabela de dados, ou base de dados evitando dados hard-coded no próprio script. Esta técnica permite que novos casos de teste sejam realizados, uma vez que em alguns casos a existência de novos casos de teste pode ser expressa pela inclusão de novas entradas numa tabela de dados, sem nenhuma alteração no script. Muitas ferramentas de Capture and Replay encorajam à utilização desta técnica fornecendo mecanismos para armazenamento de dados de entrada em ficheiro texto e atribuição dos mesmos, durante a execução, a variáveis do script. Esta técnica foi a mais utilizada no desenvolvimento de scripts durante o Estágio. Como exemplo da implementação desta técnica pode-se observar um exemplo do script do Site CPM no Anexo II, Secção “Exemplo Script de Suporte - Site CPM”. Pode-se observar a utilização das variáveis ao longo do script. De salientar que o valor destas variáveis foi definido no Quality Center; Scripts Keyword-driven Na técnica data-driven, a navegação e acções realizadas são as mesmas para cada caso de teste e o conhecimento lógico sobre os testes está contido no ficheiro de dados e no script de controlo ou principal, os quais precisam ser sincronizados. A técnica keyword-driven combina 44 a técnica data-driven com a possibilidade de especificar os casos de teste de forma menos detalhada. O script de controlo tem habilidade de interpretar estas keywords (palavras-chave), as quais estão implementadas fora do script de controlo. Esta separação na implementação das keywords requer um nível adicional de implementação técnica, que é efectuado através dos chamados scripts de suporte. Temos portanto três estruturas básicas que são os ficheiros de teste, onde se define as keywords, o script de controlo, e os scripts de suporte. No âmbito deste Estágio esta técnica é muito utilizada dado que através de keywords definidas nos dados de teste, existe a possibilidade de construir scripts de controlo mais dinâmicos aumentando assim a possibilidade de criar um maior número de casos de teste para a aplicação a verificar. Na Figura 5.8 apresenta-se como se aplica esta técnica em vários scripts do Site CPM. O exemplo consiste em mostrar a forma como através da keyword definida nos dados a utilizar pelos scripts, o script de controlo define qual o script de suporte a utilizar. Neste caso, pretende-se adicionar/remover um cliente ou efectuar descontos directo/crédito. A acção depende das keywords invocadas nos dados para utilizar durante a execução dos scripts. No entanto, apenas se utiliza um script de controlo e um conjunto definido de scripts de suporte. 45 Figura 5.8. Exemplo da estrutura de um Script (Técnica Keyword-driven). Esta última técnica, Keyword-driven, e a técnica Data-driven, são as técnicas mais utilizadas na implementação dos scripts realizados neste Estágio. 5.6 Fases de Construção de um Script Para a elaboração de um script pode-se dizer, de forma simplificada, que são necessárias três fases, como é ilustrado na Figura 5.9, que são: (1) Criar Script, (2) Executar Script, (3) Analisar Test Result. 46 Figura 5.9. Fases de construção de um script. (1) Criar Script Esta primeira fase é a fase mais demorada e mais importante. Tendo em conta o caso de teste para automatizar, nesta fase realiza-se a gravação dos objectos, simulando uma navegação delineada no caso de teste. De seguida, definem-se as variáveis dinâmicas no script e as variáveis para utilizar os scripts de suporte; (2) Executar Script Nesta fase, é efectuado o debug do script; (3) Analisar Resultados Por fim, esta última fase consiste em analisar o resultado gerado pela própria ferramenta. No caso de se utilizar a ferramenta QTP é gerado um relatório - o TestResult. Este relatório serve para validar se os objectos utilizados pelo script estão efectivamente presentes na aplicação que se está a testar. Isto é, este relatório permite analisar se por exemplo, quando se selecciona um objecto, se é apresentada a janela correcta. Permite também analisar se uma função que é utilizada no script é executada com sucesso. Caso se utilize a ferramenta Loadrunner o resultado do script é apresentado na própria ferramenta na interface principal na zona de logs (ver Secção 5.13). Os parágrafos anteriores descrevem o conjunto de fases para desenvolver um script. No entanto, quando se está a executar um Teste de Regressão Automatizado, não se está a executar um script mas sim um conjunto de scripts geridos por um script de controlo ou principal. Isto é, a gestão dos scripts a utilizar é efectuada por um script de controlo e este realiza a sincronização com os vários scripts para que se concretize a navegação definida no caso de teste. O script de controlo executa de forma sequencial cada um dos scripts individuais. Assim, inicialmente executa o Script Init, onde são inicializadas as variáveis necessárias para se poder iniciar a navegação numa determinada aplicação. De seguida, executa o Script de Login, onde realiza a operação de login. O script seguinte a ser executado é o Script de Navegação. Este realiza a navegação e introduz os 47 dados necessários dentro da aplicação, e pode também utilizar outros Scripts de Suporte para auxiliar a navegação. O Script Navegação realiza, como última operação, a validação. Esta validação pode ser um checkpoint, por exemplo para verificar que determinado valor surge na janela da página Web, ou pode ser utilizada uma função de validação. Por fim, o último script a ser executado é o Script de Logout. A Figura 5.10 apresenta o caso mais comum de scripts em Testes de Regressão realizados no âmbito deste Estágio. Figura 5.10. Estrutura de um script de Teste de Regressão implementado na equipa QMS. De salientar, que Get_TestData é uma função que tem como objectivo obter os dados a utilizar no script. A query a utilizar e a Base de Dados a consultar são definidos na ferramenta Quality Center. Esta metodologia é também utilizada quando se define uma função de validação no script de Navegação. 5.7 Estrutura de um Servidor de Testes de Regressão De forma a ser possível executar vários scripts em vários servidores definiu-se uma estrutura standard para utilizar sempre que se pretende que um determinado servidor executa Testes de Regressão. Tendo em conta este objectivo, definiu-se a seguinte estrutura: Na directoria C:\ existe uma pasta com o nome CQOS. Dentro dessa pasta existe um conjunto de pastas que são: 48 backup Utilizada para realizar backups dos scripts, de dados, logs, etc; logs Para colocar os logs, por exemplo, de um servidor Unix, de consulta a uma base de dados, etc; ScreenShots Para colocar os screenshots realizados durante a navegação do script. Normalmente, estes screenshots são criados quando o script encontrou um erro de navegação. Estes erros surgem devido à introdução de dados incorrectos na aplicação em teste, ou de um erro no GUI da aplicação em teste; scripts Local onde se situam os ficheiros .bat e .exe necessários para executar tarefas auxiliares nos scripts de suporte; setup Usada para colocar o ficheiro .xml usado para iniciar o processo de consulta a base de dados de testes; sourcecode Usada para guardar todos os scripts de controlo e scripts de suporte. Esta pasta tem como sub-pasta a QTP e a pasta QTP_TAF. A primeira possui uma sub-pasta, COMMO0, que tem guardadas todas as funções e procedimentos comuns a todos os scripts. A segunda pasta, QTP_TAF, é constituída por sub-pastas com o nome das aplicações/produtos automatizados. Dentro destas sub-pastas são armazenados todos os scripts de controlo e scripts de suporte do conjunto de aplicações/produtos, como se ilustra na Figura 5.11; 49 Figura 5.11. Estrutura da pasta sourcecode de um servidor de Testes de Regressão. template Utilizada para guardar templates de scripts, documentos de automatização, etc; TestData Utilizada para guardar ficheiros de TestData, como por exemplo um Excel ou um 0otepad; temp É utilizada durante a execução de um script e serve para armazenar dados temporários. A Figura 5.12 permite visualizar a disposição das pastas dentro da directoria C:\CQOS. Esta estrutura existe em todos os servidores que executam os Testes de Regressão. 50 Figura 5.12. Estrutura de um servidor de Teste de Regressão. 5.8 Ferramenta Quality Center A ferramenta Quality Center, apresentada na Figura 5.13, é desenvolvida pela Hewlett-Packard tendo como principal objectivo a gestão de testes. A utilização desta ferramenta define-se por actividades geradas através da interface Web disponibilizada pela ferramenta. Esta apresenta vários tipos de funcionalidades, no entanto, as suas funcionalidades principais resumem-se em quatro secções: gestão de requisitos (Requirements), gestão de Casos de Teste (Test Plan), execução dos testes (Test Lab) e gestão de defeitos (Defects). O Quality Center permite também armazenar os procedimentos de teste e controlar as versões dos mesmos. Também controla o estado actual dos testes comparando os resultados esperados com os resultados obtidos, permitindo assim gerir os defeitos encontrados durante a execução dos testes. 51 Figura 5.13. Ferramenta Quality Center (Página Login). Para a elaboração dos testes de regressão utilizam-se as opções para criar, executar e analisar testes automáticos. As restantes opções permitem aceder a opções de execução e gestão de testes manuais. Na ferramenta Quality Center utiliza-se a opção Test Plan para criar um teste automático. Nesta opção define-se também a query de dados de teste, (que pode ser dinâmica ou não), a query de validação de dados de teste e a base de dados onde se executam as querys referenciadas. Como se ilustra na Figura 5.14, pode-se visualizar um exemplo de caso de teste e a respectiva query de dados de teste e de validação. Figura 5.14. Ferramenta Quality Center (Página Test Plan). 52 Para a execução dos Testes de Regressão automatizados é utilizada a opção Test Lab, como ilustra a Figura 5.15. Nesta opção, é definido qual o servidor onde vão ser executados os testes e selecciona-se a opção Run All para se proceder à execução dos respectivos testes. Figura 5.15. Ferramenta Quality Center (Página Test Lab). Depois de executados os testes, procede-se à verificação dos resultados e analisa-se se o teste passou em todas as instruções. Analisam-se também mensagens enviadas durante a execução do teste. Como se apresenta na Figura 5.16 pode-se visualizar um exemplo dos resultados gerados para um determinado caso de teste. Figura 5.16. Ferramenta Quality Center (Página Test Instance Properties). 53 5.9 Arquitectura de funcionamento Quality Center-QTP Para se lançar remotamente um script guardado num servidor de Teste de Regressão utiliza-se a ferramenta Quality Center (QC). Esta ferramenta guarda num repositório um script desenvolvido na ferramenta QTP. O script contém o caminho para o script de controlo e para os scripts de suporte que existem em qualquer servidor de teste de regressão para uma determina aplicação. No entanto, apenas é definido no script, guardado na ferramenta QC, para executar o script de controlo (ver exemplo de script no Anexo II, Secção “Exemplo Script Quality Center - Site CPM”). Assim, quando se executa um caso de teste automatizado na ferramenta QC, esta ferramenta vai executar o script associado a esse caso de teste, guardado no repositório. De seguida, o script guardado na ferramenta QC vai ligar-se remotamente ao servidor de teste de regressão definido, que por sua vez executa o script de controlo definido dentro do script guardado na ferramenta de QC. A Figura 5.17 ilustra este passo. Figura 5.17. Sincronização da ferramenta Quality Center com servidor de Testes de Regressão. Ao longo da navegação, vão sendo enviadas mensagens para o repositório do Quality Center. Estas mensagens contêm informação dos objectos que vão sendo analisados ao longo de qualquer script. No final de executar o script de controlo, a ferramenta Quality Center apresenta o resultado 54 de Passed, caso tenha executado todas as instruções dos scripts com sucesso, ou Failed, caso tenha encontrado algum erro nas instruções definidas em um ou mais scripts. 5.10 Produtos Automatizados Até à data de entrega deste Relatório, e no âmbito deste Estágio, foram automatizados cerca de 185 casos de teste de diversos produtos como se pode analisar pela Figura 5.18. O número de scripts realizados num determinado período de tempo é apresentado através da 0ewLetter de QMS. No Anexo III, na Secção "Exemplo de 0ewsLetter da Equipa de QMS" apresenta-se o exemplo da 0ewsLetter que é enviada para outras equipas da área de Sistemas de Informação da empresa Optimus. No entanto, existem dois produtos que se destacam. Um é o Site CPM, que é uma aplicação Web utilizada pelos Call Centers. A razão desta aplicação ter um elevado número de automatismos, deve-se ao facto de ser uma aplicação de extrema importância para a empresa Optimus. Permite efectuar a consulta de todos os dados de todos os clientes e é utilizada em larga escala. Um erro nesta aplicação pode ter consequências muito negativas para o cliente, logo, também para a empresa. A outra aplicação que tem um elevado número de automatismos é o Site Optimus. Este está a sofrer constantes alterações logo, pretende-se garantir que determinadas operações que estavam a funcionar não sofreram nenhum impacto devido às alterações recentes realizadas. Figura 5.18. Scripts Automatizados. 5.11 Arquitectura dos Testes de Carga A arquitectura de Testes de Carga é ligeiramente diferente da arquitectura dos Testes de Regressão. Como se pode verificar na Figura 5.19, apenas existe o programador e o servidor com a 55 ferramenta LoadRunner. Ou seja, ao contrário dos testes de regressão, estes testes são executados e analisados pelo programador e não pelo Tester. Como referido no Capítulo III, este tipo de teste tem como objectivo simular vários utilizadores a executarem várias operações numa determinada aplicação, de forma que se possa verificar o seu comportamento evolutivo. Figura 5.19 Arquitectura dos Scripts de Carga. 5.12 Fases de Construção de um Script Neste tipo de teste, as fases e metodologias de desenvolvimento do script dentro do servidor Loadrunner, são iguais às fases e metodologias utilizadas no servidor de Testes de Regressão. Pela ilustração da Figura 5.20 pode-se analisar a estrutura de um script de Testes de Carga. De salientar, que estes não utilizam nenhuma função para ler os dados a utilizar no script, os dados são definidos numa das funcionalidades da ferramenta Loadrunner (ver Secção 5.13). A única e grande diferença é na linguagem de programação. Para a elaboração dos automatismos dos testes de regressão, a linguagem de programação utilizada foi o Visual Basic (VB) enquanto para este tipo de teste a linguagem de programação utilizada foi a linguagem C. No Anexo II, na Secção “Exemplo de Script LoadRunner - Site CPM ” encontra-se um exemplo de um script desenvolvido na ferramenta Load Runner, de acordo com esta descrição. 56 Figura 5.20. Estrutura de um script de Teste de Carga implementado na equipa QMS. 5.13 Ferramenta LoadRunner O LoadRunner (Figura 5.21) é uma ferramenta desenhada para realizar testes de volume, carga ou stress. Esta ferramenta é constituída por dois componentes, o LoadRunner Virtual User Generator (para implementar os scripts) e o LoadRunner Controller (para executar cenários de testes de volume, carga ou stress). O modo de funcionamento desta ferramenta é semelhante ao QTP, ou seja, é também uma ferramenta do tipo Capture and Playback. No entanto, usa a linguagem C para gerar código. Por outro lado, quando utilizada por exemplo para simular um caso de teste, e ao nível da execução do script, não se visualiza a execução da aplicação como acontece com a ferramenta QTP. 57 Figura 5.21. Ferramenta LoadRunner. Embora sejam bastantes as semelhanças com a ferramenta QTP, existem algumas diferenças internas. Algumas dessas diferenças são ao nível da definição de dados de teste e de configurações do script. Como mostra a Figura 5.22 os dados de teste são introduzidos numa janela dentro do script e não definidos noutra aplicação. Figura 5.22. Janela de definição dos Dados de Teste. 58 Conhecendo-se a ferramenta QTP facilmente se utiliza o LoadRunner dado que os interfaces de utilização de ambas as ferramentas são idênticos. Para se elaborar um script os conceitos a utilizar são os mesmos para ambas as ferramentas. Na Figura 5.23 apresenta-se a estrutura de um script de Testes de Carga realizado no âmbito deste Estágio. Logs de Debug Figura 5.23. Estrutura de um script de Teste de Carga. Depois de se elaborar um script, executamos o script com a ferramenta LoadRunner Controller (componente da ferramenta LoadRunner). Isto é, implementamos o script com o auxílio da ferramenta LoadRunner Virtual User Generator e com o auxílio da ferramenta LoadRunner Controller vamos simular um cenário de n utilizadores a executarem um script ou vários scripts de uma determinada aplicação, durante um determinado período de tempo. A Figura 5.24 permite visualizar a definição de um cenário, assumindo um determinado período de tempo, para um script específico. 59 Figura 5.24. LoadRunner Controller (Definição de Cenário). Para acompanhar a evolução do número de utilizadores a provocarem carga num servidor, o LoadRunner Controller tem uma opção que permite visualizar este tipo de comportamento, assim como analisar os erros que possam ser detectados. A Figura 5.25 ilustra essa evolução. Figura 5.25. LoadRunner Controller (Análise da evolução do Cenário). No final da execução do cenário definido, a ferramenta LoadRunner Controller gera um relatório que permite visualizar o comportamento do servidor da aplicação em teste, como mostra a 60 Figura 5.26. Este relatório permite efectuar uma análise detalhada da resposta do servidor a múltiplas solicitações ao longo do tempo. Figura 5.26. LoadRunner Analysis (Análise do Resultado do Cenário). O relatório gerado pela ferramenta é utilizado para tirar conclusões sobre o comportamento de determinado servidor tendo em conta número de utilizadores a provocarem carga. Essas conclusões são enviadas para as equipas responsáveis pelas aplicações e pelo servidor sujeito aos testes de carga. No Anexo III, na Secção "Exemplo de Email de Execução de Testes de Carga" apresenta-se o email que é enviado com as conclusões fundamentadas do relatório gerado pela ferramenta LoadRunner. 61 6 DashBoard 6.1 Introdução Tendo em conta a elevada quantidade de informação gerada pelos Testes de Regressão e pelos Testes de Carga nos logs dos servidores, verificou-se a necessidade de encontrar uma solução para encontrar erros de forma fácil e rápida. Assim, com o objectivo de permitir à equipa de QMS uma análise mais fácil e rápida dos erros aplicacionais, instalou-se e configurou-se uma ferramenta de análise gráfica de logs. Esta ferramenta foi seleccionada depois de realizada uma pesquisa sobre ferramentas de logs. Nesta pesquisa, apenas a ferramenta Splunk respondeu aos seguintes requisitos: geração de eventos de modo estatístico, possibilidade de drill-down sobre os erros encontrados, leitura de qualquer formato de ficheiro de log e possibilidade de elaboração de regras de pesquisa para encontrar erros específicos. Outras ferramentas como por exemplo, a ferramenta AWStats, Piwik, Webalizer e Web Log Analyzer Analysis apenas permitem gerar de forma estatística dados e não permitem seleccionar ou visualizar esses dados pormenorizadamente. Assim, para atingir os objectivos, propostos no âmbito deste Estágio, definiu-se que a ferramenta a utilizar iria ser a ferramenta Splunk. A versão utilizada é a versão freeware que apresenta apenas restrições ao nível da quantidade de informação indexada. 6.2 Estrutura do Servidor Para a instalação ferramenta Splunk foi instalado um servidor Linux Red Hat, e definida uma estrutura dentro desse servidor para copiar os logs dos servidores em teste para dentro dessa estrutura. Assim, definiu-se a seguinte estrutura: /work/<nome da aplicação>/<nome do servidor>. O funcionamento da cópia de logs, assemelha-se a um sensor que periodicamente executa uma tarefa. Assim, criaram-se mecanismos para que o servidor de 5 em 5 minutos efectuasse uma cópia dos logs do servidor aplicacional para a estrutura definida. A Figura 6.1 ilustra a forma de funcionamento da estrutura implementada. Quando é efectuada uma cópia de logs de um servidor aplicacional, o Splunk analisa automaticamente se existem alterações nos logs dentro da estrutura implementada. O princípio de funcionamento da ferramenta consiste em ler os dados copiados para a estrutura, indexar esses dados, comparar se existem alterações em relação à última indexação e 62 apresentar os dados de forma estatística tendo em conta a regra definida para pesquisar nos logs (ver Secção 6.3). Figura 6.1. Estrutura Servidor Splunk. 6.3 Funcionalidades da Ferramenta Splunk As características que se destacam nesta ferramenta são a indexação e análise de qualquer tipo de log em tempo real. Além disso, esta ferramenta permite realizar pesquisas dentro dos logs indexados, assim como realizar Drill-Down sobre os erros. A Figura 6.2 ilustra como se pode criar uma regra para realizar uma pesquisa na ferramenta Splunk. 63 Figura 6.2. Definir Pesquisa no Splunk. Na opção Manager da ferramenta, como se apresenta na Figura 6.3, é o local onde se encontram as várias opções para realizar as configurações possíveis da ferramenta. No entanto, as duas opções mais importantes são a opção de definição do caminho dos logs e a opção de definição do tamanho do ficheiro dos dados indexados. Figura 6.3. Opções disponibilizadas pela ferramenta. Para se definir o local onde se encontram os logs na estrutura do servidor é utilizada a opção Data Inputs, como se apresenta na Figura 6.4. 64 Figura 6.4. Opção Data Inputs. No Splunk, para se realizar a gestão do tamanho dos dados a indexar, selecciona-se a opção main, como apresenta a Figura 6.5. Esta funcionalidade é importante porque permite que se controle o tamanho do ficheiro de indexação, podendo-se ajustar o tamanho do ficheiro conforme as limitações do servidor no qual a ferramenta é instalada. Figura 6.5. Opção main. Caso de pretenda guardar mais do que um ficheiro de dados de indexação, a Figura 6.6 ilustra as opções para realizar essa configuração. 65 Figura 6.6. Opção Indexes. 6.4 DashBoard QMSAnalyser O DashBoard utilizado para exemplo nesta secção, apresenta dois gráficos, um corresponde aos logs do servidor do Site CPM e outro aos logs de Middleware TIBCO. O Middleware é a designação genérica utilizada para referir aos sistemas de software que se executam entre aplicações e sistemas operativos. O nome TIBCO é o nome designado pela empresa TIBCO Software Inc. que implementou o Middleware TIBCO. Assim, o Middleware TIBCO é utilizado para mover ou transportar dados entre programas que utilizam diferentes protocolos de comunicação, plataformas e dependências do sistema operativo. Foram escolhidos estes dois produtos uma vez que se encontravam em fase de testes no período da realização deste Estágio. Os eventos mostrados na Figura 6.7 são as ocorrências resultantes da pesquisa das seguintes strings: “error”, “exception”, “runtime” e “ora”. Também foi definido que o intervalo temporal a apresentar é de 24 horas, ou seja, são apenas apresentados os eventos gerados nas últimas 24 horas. 66 Figura 6.7. DashBoard QMSAnalyser. 6.5 Demonstração da utilidade da Ferramenta Na Figura 6.8 pode-se verificar que existe um período de tempo em que não ocorrem erros, depois de se efectuar uma análise através da ferramenta verificou-se que o servidor do Site CPM estava em baixo. Figura 6.8. DashBoard QMSAnalyser – Problema 1. Outra situação é apresentada na Figura 6.9 onde se pode visualizar que ocorreu um elevado número de erros num determinado horário. Neste caso, foi um erro gerado pela própria aplicação às 5:00 AM. 67 Figura 6.9. DashBoard QMSAnalyser – Problema 2. Por último é apresentada na Figura 6.10 a situação em que o servidor esteve desligado até as 8:00 AM (selecção A). Expõe-se ainda o resultado do DashBoard quando não são encontrados dados novos indexados nas últimas 24 horas. A B Figura 6.10. DashBoard QMSAnalyser – Problema 3. Esta ferramenta demonstrou muita utilidade para a equipa de QMS e para outras equipas como por exemplo a Equipa de Manutenção. As suas funcionalidades e a forma simples de utilizar foram factores fundamentais para que outras equipas passassem a utilizar esta ferramenta de forma intensiva. 68 7 Conclusão A realização deste Estágio proporcionou uma oportunidade excepcional para colocar em prática conhecimentos e experiências adquiridos ao nível académico, no âmbito da Licenciatura em Engenharia Electrotécnica e do Mestrado em Automação e Comunicações em Sistemas de Energia do Instituto Superior de Engenharia de Coimbra. Por outro lado, proporcionou a aquisição de novos conhecimentos ao nível do Projecto de Software dos Testes de Software e das Ferramentas de Automatização de Casos de Teste. Inicialmente, foram encontradas algumas dificuldades, principalmente na interligação da ferramenta QTP com as bases de dados e na adaptação à linguagem específica relacionada com os processos de negócio utilizados na empresa Optimus. Surgiram também alguns problemas devido ao facto de se estarem a utilizar ferramentas sem existir experiência anterior, como o caso do QTP e Loadrunner. No entanto, existiu uma fase de adaptação progressiva às ferramentas que tornou possível uma relativa naturalidade e confiança quando da automatização dos casos de teste. Outra dificuldade, dado que apenas existiam os conhecimentos e experiência académicos, foi a utilização do Linux. As dificuldades revelaram-se principalmente ao nível da instalação da ferramenta Splunk, assim como na implementação da metodologia necessária para que o servidor onde é instalado o Splunk possa obter os ficheiros de log de outros servidores da empresa Optimus. Todos os problemas que foram surgindo ao longo do Estágio foram solucionados da melhor forma, através de pesquisa individual e apoio de outros elementos da Equipa QMS, o que tornou a experiência mais enriquecedora, dado o objectivo de encontrar a solução para ultrapassar cada problema específico. Para trabalhos futuros, e como valorização mais imediata do trabalho desenvolvido, propõe-se o desenvolvimento de scripts para testes de regressão que deverão funcionar em vários Browsers, como por exemplo Safari, Opera e Camino. 69 Por fim, conclui-se que os objectivos propostos no âmbito deste Estágio foram alcançados com sucesso. A nível profissional foi uma experiência muito enriquecedora, pela integração numa realidade empresarial e pela exposição a conceitos não utilizados anteriormente. Em termos pessoais foi uma experiência também bastante positiva devido ao ambiente muito saudável e de cooperação existente na equipa de QMS da empresa Optimus. 70 Referências [Almeida, 2010 ] "Teste de Software Limitações e Benefícios". Disponível em http://www.spinsp.org.br/apresentacao/57teste_de_software.pdf, visitado a última vez em 3 de junho de 2010 [Andrew, 2005] Andrew Stellman&Jennifer Greene, “Applied Software Project Management”, O’REILLY , 2005 [Aniela, 2010] Aniela Cole, "Automatização de testes".Disponível em http://anielacole.wordpress.com/tag/scripts/, visitado a última vez 19 de Novembro de 2010 [Azevedo, 2008] Samanta Pinto De Azevedo, “MODELO DE AVALIAÇÃO DA QUALIDADE FUNCIONAL DE SOFTWARE BASEADO NA NORMA NBR ISO/IEC 9126”. Disponível em http://tconline.feevale.br/tc/files/0002_1582.pdf , visitado a última vez 19 de Fevereiro de 2010 [Beizer, 1995] Beizer, B., “Black-Box Testing: techniques for funcional testing of software and system”, Wiley,New York, 1995 [Bastos, 2007] Bastos, Anderson.”Base de conhecimento em teste de software“, 2007 [Caetano, 2009] "Engenharia de Software Magazine – Gestão de Testes". Disponível em http://vqv.com.br/es/esm03_GestaoDeTestes.pdf, visitado a última vez 22 de Março [Celapar, 2009] "Evolução de Software". Disponível em http://www.batebyte.pr.gov.br/modules/conteudo/conteudo.php?conteudo=299, visitado a última vez 22 de Março de 2010 [Cem at al, 2001] Cem Kaner, James Bach, Bret Pettichord, “Lessons Learned in Software Testing”, John Wiley & Sons, Ins, 2001 [Ciclos, 2010] "Modelos ciclo de vida" . Disponível em http://pt.wikipedia.org/wiki/Modelos_ciclo_de_vida, visitado a última vez em 3 de junho de 2010 [Correia et al, 2004] Simone Antunes Correia, Alberto Rodrigues da Silva , Artigo “Técnicas para Construção de Testes Funcionais Automáticos” , 2004. [Fantinato at al, 2008] Marcelo Fantinato, Adriano C. R. da Cunha, Sindo V. Dias, Sueli A.Mizuno, Cleida A. Q. Cunha, "AutoTest – Um Framework Reutilizável para a Automação de Teste Funcional de Software". Disponível em http://www.cpqd.com.br/file.upload/08_artigoforum_automacao-testes-boss.pdf, visitado a última vez em 5 de Novembro de 2010 [Ferramentas, 2010] “Qualidade Software”. Disponível em http://blog.prasabermais.com/2010/02/15/histrico-da-evoluo-das-ferramentas-para-testes-e-qualidade-desoftware/, visitado a última vez 15 de Fevereiro de 2010 [Fewster at al , 1999] M.Fewster e D.Grahm, “Software Test Automation”, Addison-Wesley, 1999. [Horch, 1996] Horch, J., “Practical Guide to Software Quality Management”, Artech House Publishers, London, 1996 71 [IEEE, 1990] IEEE. Ieee standard glossary of software engineering terminology. Standard 610.12, IEEE Press, 1990 [Ireland, 1991] Ireland, L., “Quality Management for Projects & Programs”, Project Management Institute, Inc, 1991 [Jack, 1999] Jack Falk, Cem Kaner, Hung Quoc Nguyen, “Testing Computer Software”, Jonh Wiley & Sons,Inc, 1999 [Jenner, 1995] Michael G. Jenner, “Software Quality Management and IS0 9001”, Jonh Wiley & Sons,Inc, 1995 [Macoratti, 2008] "Um esboço sobre o processo de Testes de Software". Disponível em http://www.macoratti.net/08/08/tst_sw2.htm, visitado a última vez 22 de Março de 2010 [Mariana, 2010] "TESTES DE SOFTWARE NO WEBPOSGRAD NTI/UFPB". Disponível em http://www.di.ufpb.br/~alan/disciplinas/estagio/relatorios/Mariana.pdf, visitado a última vez 22 de Março de 2010 [Martha, 2008] Maria Martha, "A importância dos testes automatizados".Disponível em http://marthahuback.wordpress.com/2008/12/10/a-importancia-dos-testes-automatizados/, visitado a última vez 19 de Novembro de 2010 [Manutenibilidade, 2010] “Manutenibilidade”. Disponível em http://pt.wikipedia.org/wiki/Manutenibilidade, visitado a última vez em 7 de dezembro de 2010 [Miguel, 2003] Antonio Miguel, “Gestão de Projectos de Software”, FCA, 2003 [Miguel, 2004] Antonio Miguel, “Gestão Moderna de Projectos”, FCA, 2004 [Myers et al, 2004] MYERS, Glenford J., John Wiley & Sons, The Art of Software Testing, 2, 2004 [Nina, 2007] Nina S. Godbole, “Software Quality Assurence Principles and Practice”, Alpha Science, 2007 [Optimus, 2010] “Sobre a Optimus”. Disponível em www.optimus.pt, visitado a última vez em 2010 [Pfleeger, 2004] PFLEEGER, Shari Lawrence. “Engenharia de Software: Teoria e Prática”, Pearson Brasil, 2004 [Prass, 2010] Fernando Prass, "Engenharia de Software". Disponível em http://www.fp2.com.br/fernando/engenharia/Aula02-CicloDeVida_6s.pdf, visitado a última vez em 3 de junho de 2010 [Pressmann, 1995] Pressmann, Roger S.” Engenharia de Software”,Pearson Makron Books, 1995 [Pushtotest, 2009] “Testmaker”, Disponível em http://www.pushtotest.com/help-and-reference/introductionto-pushtotest-testmaker -methodology, visitado a última vez em 2010 [Qualidade, 2010] “Qualidade de Software”. Disponível em http://pt.wikipedia.org/wiki/Qualidade_de_software, visitado a última vez em 5 de outubro de 2010 [Rocha et al,2001] Rocha, Ana Regina, Maldonado, José, Weber, Kival. “Qualidade de Software: teoria e prática”. Prentice Hall, 2001 72 [Ron, 2005] Ron Patton, “Software Testing”, Sams Publishing, 2005 [Ruby, 2010] “Linguagem-Ruby”. Disponível em http://www.devmedia.com.br/post-8226-Conhecendo-aLinguagem-Ruby.html, visitado a última vez em 2010 [Sommerville, 2000] Sommerville. “Software Engineering”, Addison-Wesley, 2000 [Sonaecom, 2010] “ÁREAS DE 0EGÓCIO”. Disponível em www.sonaecom.pt, visitado a última vez em 2010 [Teste, 2010] “Teste de Software”, http://pt.wikipedia.org/wiki/Teste_de_software, visitado a última vez em 12 de dezembro de 2010 [Testexpert, 2009] “Testes de Software”, Disponível em http://www.testexpert.com.br/?q=node/171 , visitado a última vez em 2009 [Tozelli, 2008] Paulo Tozelli, "Processo de Teste de Software". Disponível em http://www.artigonal.com/programacao-artigos/processo-de-teste-de-software-505672.html , visitado a última vez 19 de Fevereiro de 2010 [Travassos at al, 2007] "Teste de Software". Disponível em http://lens.cos.ufrj.br:8080/portalESE/cos722/testes, visitado a última vez 22 de Março [Vinicius, 2008] Vinicius Sabadoti, "Histórico sobre Testes de Software". Disponível em http://viniciussabadoti.wordpress.com/2010/08/03/historico-sobre-testes-de-software/, visitado a última vez em 5 de Novembro de 2010 [William, 2000] William E. Lewis, “Software Testing and Continuous Quality Improvement”, Auerbach, 2000 [Wintrust, 2006] "Melhoria de Conhecimentos em Garantia de Qualidade no Software". Disponível em http://www.wintrust.pt/portal/page/portal/WINTRUST/PUBLICACOES/DOCUMENTOS_TECNICOS/200 6_0719_Tipos_de_teste.pdf, visitado a última vez 22 de Março [Kon at al, 2008] Paulo Cheque Bernardo e Fabio Kon, "A Importância dos Testes Automatizados". Disponível em http://www.ime.usp.br/~kon/papers/EngSoftMagazine-IntroducaoTestes.pdf , visitado a última vez 19 de Novembro de 2010 73 74 Anexo I – Exemplo de Caso de Teste Exemplo Caso de Teste – Site CPM Especificação de Teste Automático Script!ame CPM_ADD_REMOVE_OCCS_QTP Descrição do script Adição de OCCs a um contracto no CPM Produtos envolvidos CPM Acções do script Abrir o browser, colocar o link identidificado nas variáveis, user e password. Carregar no botão “SonaeCom”. (*1) Colocar o parâmetro IDConta no campo Conta, carregar no botão Procurar, seleccionar na árvore o msisdn identificado no campo MSISDN, escolher o menu Descontos e Créditos, escolher o submenu que tenha o texto identificado no parâmetro Action. No caso de ser escolhida a opção “Atribuição de OCCs” é seleccionado o serviço identificado no parâmetro Action e escolhido o rádio button “Débito, a favor da SonaeCom “ ou “Crédito, a favor do Cliente “ consuante o valor do parametro DebitoCredito seja D ou C. De seguida o valor do parâmetro Quantia é colocado no campo Quantia. O primeiro valor da listbox da esquerda é escolhido e carregado na seta para a direita verde, passando o valor escolhido para a listbox da direita. No fim é carregado no botão Confirmar. No caso de ser escolhida a opção “Remoção de OCCs” é escolhida a primeira linha para o MSISDN em causa e escolhido o botão “Remover”. De seguida escolhe-se o link “Voltar à janela principal”. Caso existam mais interacções serão executadas neste ponto, retomando o local (*1). Deverá ser depois feito o logout carregando no botão “Sair CPM”. Wink http://webdav.optimus.pt/public/COMMON_TST/WS_R1_0/TestAutomation/TAF/CPM/CPM_AD D_REMOVE_OCCS_QTP/Add_OCCs.htm http://webdav.optimus.pt/public/COMMON_TST/WS_R1_0/TestAutomation/TAF/CPM/CPM_AD D_REMOVE_OCCS_QTP/Remove_OCCs.htm Variáveis a utilizar pelo script Link: http://lx3qmsrhcpm02/ User: QMS8 Pass: 75 Input Data do script Ordem Campo 1 2 IDConta MSISDN 3 Action 4 Servico 5 DebitoCredito 6 Quantia Descrição ID da conta a pesquisar MSISDN a seleccionar na arvore Texto do menu pretendido “Atribuicao de OCCs” ou “Remocao de OCCs” Serviço seleccionado (apenas usado no caso de Atribuição de OCCs) Indicação se é a débito ou a crédito (apenas usado no caso de Atribuição de OCCs) Quantia em euros (apenas usado no caso de atribuição de OCCs) Query de input data SELECT cus.custcode IDConta ,a.dn_num MSISDN ,'Atribuição de OCCs' Action ,'Acerto de Bónus' Servico ,'D' DebitoCredito ,'121.00' Quantia ,cus.customer_id ,SYSDATE from directory_number a, contr_services_cap b, contract_all c, curr_co_status d, customer_all cus where c.tmcode=123 and not exists ( select '1' from CUST_BCH_PROCESS CBP where cbp.customer_id =c.customer_id ) and c.co_id=d.co_id and d.ch_status='a' and b.co_id=c.co_id and b.cs_deactiv_date is null and a.dn_id=b.dn_id and cus.customer_id=c.customer_id and c.tmcode in (select tmcode from opclass_rate_plan where upper(consume_des) like 'OPTIMUS') and not exists (select 1 from fees f where f.customer_id=cus.customer_id and username='QMS8') and cus.customer_id>10000 and rownum<=2 Query de validação select TSTAUTO_CPM_ADD_REMOVE_OCCS_1(<<param5>>,<<param4>>,'QMS8') RES from dual CREATE OR REPLACE FUNCTION tstauto_cpm_add_remove_occs_1 (acc IN String, amt IN String, iuser IN String) RETURN Number IS lonres Number; ccid number; aa number; BEGIN --ccid:=0; lonres:=0; aa:=10; ccid:=acc; aa:=20; select count(*) into lonres from fees where customer_id=ccid and amount=to_number(amt) and username=iuser; aa:=30; if nvl(lonres, 0) >= 1 then return 1; end if; 76 return 0; Exception When NO_DATA_FOUND Then return aa+1; When Others Then return aa+2; end; 77 Anexo II - Exemplos de Automatismos Exemplo Script Quality Center – Site CPM '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' CONFIGURACOES TD '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Qc_Startup_Vars "CPM_ADD_REMOVE_OCCS_TST","CPM","CPM_EXPECTED","Action1 [CPM_LOGIN]","Action1 [CPM_LOGOUT]" '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' ACÇÃO PRINCIPAL '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' RunAction "Action1 [CPM_ADD_REMOVE_OCCS_TEST] [2]", oneIteration Exemplo Script Controlo ou Principal – Site CPM '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' KILL PROCESSES START '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' SystemUtil.CloseProcessByName("IEXPLORE.EXE") SystemUtil.CloseProcessByName("CLOCK.EXE") ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' START init ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' RunAction "Action1 [init]", oneIteration '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' START MNEMONIC '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' iniMnemonica "Task0", "mnemonicaTask0", "CPM_TST_AVAILABILITY" iniMnemonica "Login", "mnemonicaLogin", "CPM_QTP_LOGIN" iniMnemonica "Task1", "mnemonicaTask1", "CPM_TST_PESQUISA_CONTA" iniMnemonica "Task2", "mnemonicaTask2", "CPM_TST_SELECCIONAR_DESCONTOS_CREDITOS" iniMnemonica "Task3", "mnemonicaTask3", "CPM_TST_ALTERAR_DADOS_CONTA" iniMnemonica "Task4", "mnemonicaTask4", "CPM_TST_VOLTAR_JANELA_PRINCIPAL" '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''AVAILABILITY & LOGIN ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' accao.runEval Environment.Value("actionLogin"), Environment.Value("actionLogout") 'RunAction "Action1 [CPM_LOGIN]", oneIteration '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' START Get TestData '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'Obter TestData getTestDataConfig IdTestData,Parametros,valorarray ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' START TASKS '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' RunAction "Action1 [CPM_ADD_REMOVE_OCCS_TST] [2]", allIterations ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''''' LOGOUT ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' RunAction "Action1 [CPM_LOGOUT] [2]", oneIteration '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' KILL PROCESSES END 78 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' SystemUtil.CloseProcessByName("IEXPLORE.EXE") SystemUtil.CloseProcessByName("CLOCK.EXE") Exemplo Script Suporte – Site CPM ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''' START TASK 1 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Dim ArrayQuery ArrayQuery = Array("MSISDN","DESCBASE","AGENTE","CUSTID","ESCOLHA_MENU") For jArray=0 to ubound(ArrayQuery) Environment.Value(""& ArrayQuery(jArray)&"")=DataTable.GetSheet("Action1 ["&Environment.Value("NAME_SUBSCRIPT")&"]").GetParameter("Col_"&jArray&"").Value Next If environment("ESCOLHA_MENU")="DD" Then Environment.Value("selectOptions")="Descontos_Creditos/DescontosDirectos" else Environment.Value("selectOptions")="Descontos_Creditos/Atribuicao_de_Descontos_Sobre_Mensalidades" End If writeTD 0,"Key test data","Values:"&Environment.Value("MSISDN")&"; "&Environment.Value("DESCBASE")&"; "&Environment.Value("AGENTE") ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''' START TASK 1 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' iniTransaccao "Procurar MSISDN", environment.Value("mnemonicaTask1"), 3, "Task1Error", False RunAction "Action1 [PesquisaMSISDN] [CPM_COMMON]", oneIteration ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''' START TASK 2 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' iniTransaccao "Seleccionar Servios", environment.Value("mnemonicaTask2"), 4, "Task2Error", False RunAction "Action1 [SeleccionarOpcoesCPM] [CPM_COMMON]", oneIteration ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''' START TASK 3 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' iniTransaccao "Preencher dados", environment.Value("mnemonicaTask3"), 5, "Task3Error", False Environment.Value("DESCBASE")=replace(Environment.Value("DESCBASE"),"0","") checkPathObject Browser("Customer Process Management").Page("Customer Process Management").Frame("main_5").WebList("cboNewRate"),"WebList(cboNewRate) - Exist " Browser("Customer Process Management").Page("Customer Process Management").Frame("main_5").WebList("cboNewRate").Select Environment.Value("DESCBASE") checkPathObject Browser("Customer Process Management").Page("Customer Process Management").Frame("main_5").WebList("cbDealers"),"WebList(cbDealers) - Exist " Browser("Customer Process Management").Page("Customer Process Management").Frame("main_5").WebList("cbDealers").Select Environment.Value("AGENTE") checkPathObject Browser("Customer Process Management").Page("Customer Process Management").Frame("main_5").WebButton("Validar Dealer"),"WebButton(Validar Dealer) - Exist " Browser("Customer Process Management").Page("Customer Process Management").Frame("main_5").WebButton("Validar Dealer").Click ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''' START TASK 5 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' iniTransaccao "Confirmar Alteracao de Servios", environment.Value("mnemonicaTask5"), 7, "Task5Error", False If Environment.value("intrusivo")=False Then RunAction "Action1 [ClickCancelarLimpar] [CPM_COMMON]", oneIteration else RunAction "Action1 [ClickConfirmar] [CPM_COMMON]", oneIteration 79 ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''' START TASK 6 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' iniTransaccao "Voltar Janela Principal", environment.Value("mnemonicaTask6"), 8, "Task6Error", False RunAction "Action1 [VoltarJanelaPrincipal] [CPM_COMMON]", oneIteration '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' START VALIDATION ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' checkValitation end if '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' END TASKS '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Exemplo Script Suporte – Login Site CPM iniTransaccao "Acesso", environment.Value("mnemonicaTask0"), 1, "Availability Error", False initVars writeTD 0,"Key config","Login:"&Environment.Value("url")&"; "&Environment.Value("userName") environment.Value("rc") = initBrowser () 'Regista Transacao environment.Value("transaccaoActual").regista MercuryTimers("Timer1").ElapsedTime, "WebEdit Username - Exist", "Action1 [CPM_LOGOUT]" '''''''''''''''''''''''''''''''''''''''' ''' LOGIN '''''''''''''''''''''''''''''''''''''''' iniTransaccao "Acesso", environment.Value("mnemonicaLogin"), 2, "Login Error", False environment.Value("rc")=Browser("Credits Login Page").Page("Credits Login Page_3").WebEdit("txtUser").Exist(Environment.Value("WaitTime")) checkAction "WebEdit username - Exist" Browser("Credits Login Page").Page("Credits Login Page_3").WebEdit("txtUser").Set(Environment.Value("userName") environment.Value("rc")=Browser("Credits Login Page").Page("Credits Login Page_3").WebEdit("txtPasswd").Exist Environment.Value("WaitTime")) checkAction "WebEdit - pwd - Exist" Browser("Credits Login Page").Page("Credits Login Page_3").WebEdit("txtPasswd").Set(Environment.Value("passWord")) '==>> BUTTON environment.Value("rc")=Browser("Credits Login Page").Page("Credits Login Page_2").WebButton("LOGIN").Exist (Environment.Value("WaitTime")) checkAction "Image - Entrar - Exists" Browser("Credits Login Page").Page("Credits Login Page_2").WebButton("LOGIN").Click cmd_timer "Start", environment.Value("transaccaoActual").mnemonica 'inicia contagem environment.Value("rc")= Browser("Credits Login Page").Page("Customer Process Management").Frame("fraSearch").WebButton("Procurar").Exist(Environment.Value("WaitTime")) cmd_timer "Stop", environment.Value("transaccaoActual").mnemonica 'termina contagem Environment.Value("accessTime") = MercuryTimers("Timer1").ElapsedTime checkAction " Page - Customer Process Management - Exist" environment.Value("transaccaoActual").regista MercuryTimers("Timer1").ElapsedTime, "Page - Customer Process Management - Exist", "Action1 [CPM_LOGOUT]" 80 Exemplo Script Suporte – Logout Site CPM '''''''''''''''''''''''''''''''''''''''' ''' LOGOUT '''''''''''''''''''''''''''''''''''''''' Browser("Customer Process Management").Page("Customer Process Management").Frame("rSide").Link("Sair do CPM").Click Browser("Customer Process Management").Page("Credits Login Page").Sync Browser("Customer Process Management").Close Exemplo Script Controlo ou Principal – Site Optimus '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' START init ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' RunAction "Action1 [init]", oneIteration ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''Get Values from F_CONFIG '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' getConfig "peakTimeEnd", "PEAK_TIME_END_INT_1" getConfig "peakTimeBegin", "PEAK_TIME_BEGIN_INT_1" getConfig "userName", "USER" getConfig "passWord", "PASSWORD" getConfig "url", "SOPT_URL" ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' START MNEMONIC ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' iniMnemonica "Task0", "mnemonicaTask0", "SOPT_TST_AVAILABILITY" iniMnemonica "Login", "mnemonicaLogin", "SOPT_QTP_LOGIN" iniMnemonica "Task1", "mnemonicaTask1", "SOPT_QTP_GESTAO_CONTA" iniMnemonica "Task2", "mnemonicaTask2", "SOPT_QTP_EMPRESAS_PROFISSIONAIS" iniMnemonica "Task3", "mnemonicaTask3", "SOPT_QTP_EMPRESAS_PROFISSIONAIS" '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' START Get TestData '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'Obter Test Data getTestData IdTestData,Parametros,valorarray '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' ACTIONS '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' call RunAction ("Action1 ["&Environment.Value("NAME_SUBSCRIPT")&"]", allIterations ) Exemplo Script Suporte – Site Optimus ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'Produtos envolvidos: STOPTIMUS 'Versão em que foi implementado: WS_R.1.15 'TestData: ver definição de váriaveis em baixo 'Validações efectuadas pelo script: O script tem por objectivo efectuar o envio de MMS através da Gestão de Conta, devem ser efectuados check points de sucesso de envio ' validamos também as mensagens de erro caso a imagem seja maior que o valor máximo ou que o ficheiro não seja do tipo imagem. ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''' START TASK 1 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Dim ArrayQuery ArrayQuery = Array("p_msisdn "," p_password "," p_assunto_mms " p_assunto_mms " p_ficheiro_mms "," p_texto_mms ",” p_msisdn_destino”,” p_ficheiro_mms_grande”,” p_ficheiro_mms_exe”,” validaTarifario_TestData”) 81 For jArray=0 to ubound(ArrayQuery) Environment.Value(""& ArrayQuery(jArray)&"")=DataTable.GetSheet("Action1 ["&Environment.Value("NAME_SUBSCRIPT")&"]").GetParameter("Col_"&jArray&"").Value Next writeTD 0,"Key test data","Values:"& Environment("p_msisdn")&"; "&Environment("p_password") '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''AVAILABILITY & LOGIN ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' RunAction "OPT_Login [OPT_COMMON_ACTIONS] [2]", oneIteration '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''' START TASK 1 ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' iniTransaccao "Procurar Rede", environment.Value("mnemonicaTask1"), 3, "Task1Error", False environment.Value("rc")=Browser("OPTIMUS Particulares").Page("OPTIMUS Particulares").Link("Gestão de Conta").Exist (Environment.Value("WaitTime")) checkAction "Link(Gestão de Conta) - Exist" Browser("OPTIMUS Particulares").Page("OPTIMUS Particulares").Link("Gestão de Conta").Click RunAction "Check_URL [OPT_COMMON_ACTIONS]", oneIteration ' Inicio de novo código environment.Value("rc")= Browser("OPTIMUS Particulares").Page("particulares » Optimus").Link("Enviar SMS e MMS").Exist (Environment.Value("WaitTime")) checkAction "Link(Enviar SMS e MMS) - Exist" Browser("OPTIMUS Particulares").Page("particulares » Optimus").Link("Enviar SMS e MMS").Click 'Envio de SMS com sucesso environment.Value("rc")=Browser("OPTIMUS Particulares").Page("particulares » Optimus_2").Link("MMS").Exist (Environment.Value("WaitTime")) checkAction "Link(MMS) - Exist" Browser("OPTIMUS Particulares").Page("particulares » Optimus_2").Link("MMS").Click environment.Value("rc")=Browser("OPTIMUS Particulares").Page("particulares » ... » Enviar").WebEdit("ctl00$MainContentPlaceHolder$t").Exist (Environment.Value("WaitTime")) checkAction "WebEdit - Exist" Browser("OPTIMUS Particulares").Page("particulares » ... » Enviar").WebEdit("ctl00$MainContentPlaceHolder$t").Set Environment ("p_assunto_mms") environment.Value("rc")=Browser("OPTIMUS Particulares").Page("particulares » ... » Enviar").WebFile("ctl00$MainContentPlaceHolder$f").Exist (Environment.Value("WaitTime")) checkAction "WebEdit - Exist" Browser("OPTIMUS Particulares").Page("particulares » ... » Enviar").WebFile("ctl00$MainContentPlaceHolder$f").Set Environment("p_ficheiro_mms") environment.Value("rc")=Browser("OPTIMUS Particulares").Page("particulares » ... » Enviar").WebEdit("ctl00$MainContentPlaceHolder$t_2").Exist (Environment.Value("WaitTime")) checkAction "WebEdit - Exist" Browser("OPTIMUS Particulares").Page("particulares » ... » Enviar").WebEdit("ctl00$MainContentPlaceHolder$t_2").Set Environment ("p_texto_mms") environment.Value("rc")=Browser("OPTIMUS Particulares").Page("particulares » ... » Enviar").WebEdit("ctl00$MainContentPlaceHolder$t_3").Exist (Environment.Value("WaitTime")) checkAction "WebEdit - Exist" rowser("OPTIMUS Particulares").Page("particulares » ... » Enviar").WebEdit("ctl00$MainContentPlaceHolder$t_3").Set Environment ("p_msisdn_destino") 'Browser("OPTIMUS Particulares").Page("particulares » ... » Enviar_3").Link("Lista de contactos").Click ‘ Executa se for Intrusivo If environment.value("intrusivo")=true Then environment.Value("rc")=Browser("OPTIMUS Particulares").Page("particulares » ... » Enviar").Image("Enviar").Exist (Environment.Value("WaitTime")) checkAction "Image(Enviar) - Exist" Browser("OPTIMUS Particulares").Page("particulares » ... » Enviar").Image("Enviar").Click ' COLOCAR check point de validação de sucesso ' Validação de tamanho de ficheiro environment.Value("rc")=Browser("OPTIMUS Particulares").Page("particulares » ... » Enviar_2").WebFile("ctl00$MainContentPlaceHolder$f").Exist (Environment.Value("WaitTime")) checkAction "WebEdit - Exist" Browser("OPTIMUS Particulares").Page("particulares » ... » Enviar_2").WebFile("ctl00$MainContentPlaceHolder$f").Set Environment ("p_ficheiro_mms_grande") 82 environment.Value("rc")=Browser("OPTIMUS Particulares").Page("particulares » ... » Enviar_2").Image("Enviar").Exist (Environment.Value("WaitTime")) checkAction "WebEdit - Exist" Browser("OPTIMUS Particulares").Page("particulares » ... » Enviar_2").Image("Enviar").Click Browser("OPTIMUS Particulares").Page("particulares » ... » Enviar_2").WebElement("A imagem seleccionada").Check CheckPoint("A imagem seleccionada excede o tamanho máximo de 300 KB!") ' Validação de tipo de ficheiro environment.Value("rc")=Browser("OPTIMUS Particulares").Page("particulares » ... » Enviar_2").WebFile("ctl00$MainContentPlaceHolder$f").Exist (Environment.Value("WaitTime")) checkAction "WebEdit - Exist" Browser("OPTIMUS Particulares").Page("particulares » ... » Enviar_2").WebFile("ctl00$MainContentPlaceHolder$f").Set Environment("p_ficheiro_mms_exe") environment.Value("rc")=Browser("OPTIMUS Particulares").Page("particulares » ... » Enviar_2").Image("Enviar").Exist (Environment.Value("WaitTime")) checkAction "Image(Enviar) - Exist" Browser("OPTIMUS Particulares").Page("particulares » ... » Enviar_2").Image("Enviar").Click Browser("OPTIMUS Particulares").Page("particulares » ... » Enviar_2").WebElement("O ficheiro seleccionado").Check CheckPoint("O ficheiro seleccionado não é do tipo imagem!") end if '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''' LOGOUT ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' RunAction "OPT_Logout [OPT_COMMON_ACTIONS] [2]", oneIteration Exemplo Script Suporte – Login Site Optimus '''''''''''''''''''''''''''''''''''''''' ''' LOGIN '''''''''''''''''''''''''''''''''''''''' iniTransaccao "Acesso", environment.Value("mnemonicaLogin"), 2, "Login Error", False environment.Value("rc")=Browser("OPTIMUS Particulares").Page("OPTIMUS Particulares").Link("login").Exist (Environment.Value("WaitTime")) checkAction "Link(login) - Exist" Browser("OPTIMUS Particulares").Page("OPTIMUS Particulares").Link("login").Click environment.Value("rc")=Browser("OPTIMUS Particulares").Page("particulares » Optimus").WebEdit("ctl00$MainContentPlaceHolder$T").Exist (Environment.Value("WaitTime")) checkAction "WebEdit Msisdn - Exist" Browser("OPTIMUS Particulares").Page("particulares » Optimus_2").WebEdit("ctl00$MainContentPlaceHolder$T").Set Environment("p_msisdn") environment.Value("rc")=Browser("OPTIMUS Particulares").Page("particulares » Optimus").WebEdit("ctl00$MainContentPlaceHolder$T_2").Exist (Environment.Value("WaitTime")) checkAction "WebEdit - pwd - Exist" Browser("OPTIMUS Particulares").Page("particulares » Optimus_2").WebEdit("ctl00$MainContentPlaceHolder$T_2").Set Environment("p_password") '==>> BUTTON environment.Value("rc")=Browser("OPTIMUS Particulares").Page("particulares » Optimus").Image("Login").Exist (Environment.Value("WaitTime")) checkAction "Image - Entrar - Exists" Browser("OPTIMUS Particulares").Page("particulares » Optimus").Image("Login").Click cmd_timer "Start", environment.Value("transaccaoActual").mnemonica 'inicia contagem Browser("OPTIMUS Particulares").Sync environment.Value("rc")= Browser("OPTIMUS Particulares").Page("OPTIMUS Particulares_2").Link("logout").Exist(Environment.Value("waitTimeLogin")) cmd_timer "Stop", environment.Value("transaccaoActual").mnemonica 'termina contagem Environment.Value("accessTime") = MercuryTimers("Timer1").ElapsedTime checkAction " Link(logout) - Exist" environment.Value("transaccaoActual").regista MercuryTimers("Timer1").ElapsedTime, "Link(logout) - Exist", "OPT_Logout [OPT_COMMON_ACTIONS]" 83 Exemplo Script Suporte – Logout Site Optimus '''''''''''''''''''''''''''''''''''''''' ''' LOGOUT '''''''''''''''''''''''''''''''''''''''' ' Acção comum de Logout no Site Optimus como cliente particular. ' Para invocar esta acção, o script deve estar numa página principal onde exista o link geral de logout. ' Click na opção de Logout Environment.Value("rc")=Browser("OPTIMUS Particulares").Page("OPTIMUS Particulares").Link("logout").Exist (Environment.Value("WaitTime")) checkAction "Link(Logout) - Exist" Browser("OPTIMUS Particulares").Page("OPTIMUS Particulares").Link("logout").Click Environment.Value("rc")=Browser("OPTIMUS Particulares").Page("OPTIMUS Particulares_2").Link("login").Exist (Environment.Value("WaitTime")) checkAction "Link(Efectuou Logout) - Exist" WebUtil.DeleteCookies Exemplo Script Controlo ou Principal – Site Kanguru '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' START init ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' RunAction "Action1 [init]", oneIteration ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' START Mnemonic ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' iniMnemonica "Task0", "mnemonicaTask0", "STOPT_TST_AVAILABILITY" iniMnemonica "Login", "mnemonicaLogin", "STOPT_QTP_LOGIN" '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' START Get TestData '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Inicializar Test Data e Variáveis da Config getTestData_Config valorarray, numLn, numCol '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' START Script Navigation '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' RunAction "Action1 [SOPT_KANG_GESTCONTA_TST] [2]", oneIteration Exemplo Script Suporte – Site Kanguru ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' READ TESTDATA '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Environment("p_msisdn")=DataTable.GetSheet("Action1 ["&Environment.Value("NAME_SUBSCRIPT")&"]").GetParameter("Col_0").Value Environment("p_password")=DataTable.GetSheet("Action1 ["&Environment.Value("NAME_SUBSCRIPT")&"]").GetParameter("Col_1").Value Environment("valitation_Tarifario")=DataTable.GetSheet("Action1 ["&Environment.Value("NAME_SUBSCRIPT")&"]").GetParameter("Col_2").Value writeTD 0,"Key test data","Values: "&Environment("p_msisdn")&"; "&Environment("p_password")&"; "&Environment("valitation_Tarifario") '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''AVAILABILITY & LOGIN ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' RunAction Environment.Value("actionLogin"), oneIteration ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''''' Click Gestão de Conta ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' RunAction "Click_Gestao_Conta [OPT_COMMON_ACTIONS] [2]", oneIteration 'Browser("OPTIMUS Particulares").Page("particulares » Kanguru").Sync 84 'Browser("OPTIMUS Particulares").Page("particulares » Kanguru").WebElement("Kanguru Portátil Basic").Output CheckPoint("Kanguru Portátil Basic CC") Browser("OPTIMUS Particulares").Page("particulares » Kanguru_2").Sync Browser("OPTIMUS Particulares").Page("particulares » Kanguru_2").Output CheckPoint("particulares » Kanguru » Gestão de Conta") If environment.Value("check_Tarifario_Kanguru")=Environment("valitation_Tarifario") then writeTD 0,"Tarifário Kanguru Portátil Basic CC ", " Tarifario "&environment.Value("check_Tarifario_Kanguru") else writeTD 1,"Erro: Tarifário Incorrecto ", " Tarifario "&environment.Value("check_Tarifario_Kanguru") Environment.Value("rc")=False checkAction "Tarifário Incorrecto" end if 85 Anexo III – Exemplos de Relatórios Exemplo de 0ewsLetter da Equipa de QMS 86 Exemplo de Email de Execução de Testes de Carga 87