UMA ABORDAGEM SOBRE TESTES AUTOMATIZADO DE SOFTWARES EM AMBIENTES DE DESENVOLVIMENTO Robson L. Nascimento 1, Késsia R. C. Marchi¹ 1 Universidade Paranaense (UNIPAR) Paranavaí-PR-Brasil robsonluisn@yahoo.com.br, kessia@unipar.br Resumo. Um software computacional independente de sua área de atuação deve no mínimo atender as necessidades para o qual foi desenvolvido. Garantir que este funcione de tal maneira, que satisfaça a solicitação do cliente não é uma tarefa fácil. Para isto existem técnicas de desenvolvimento que auxiliam na busca pela qualidade deste produto. Os testes são fundamentais para se chegar a este objetivo. A informação pode existir de diversas formas, mas é preferível não tê-la, a usá-la de maneira incorreta ou desatualizada. Este artigo é constituído de informações referentes a testes automatizados de software cujo objetivo é enfatizar as informações referente a esses testes. 1. Introdução Ter um produto computacional pronto, nos dias atuais, não é garantia de que esse esteja de acordo com as especificações solicitadas, nem que o mesmo possui a qualidade em seu trabalho quando for executado. Qualidade compreende o grau de atendimento (ou conformidade) de um produto, processo, serviço ou ainda um profissional com requisitos mínimos estabelecidos em normas ou regulamentos técnicos. Ou seja, atender as especificações solicitadas, de tal forma que atenda a necessidade satisfazendo o cliente ou superando as expectativas do mesmo. (INMETRO - 2013). Para Cheque e Kon [2008] não é uma tarefa fácil alcançar uma boa qualidade em um software, pois os mesmos são complexos, e envolvem problemas no processo de desenvolvimento como decisões, questões humanas, técnicas, burocráticas de negócio e políticas. Para garantir que a qualidade exista em um software, a Quality Assurance QA (garantia de qualidade), envolve muito mais do que teste (funcionais, unitários, regressão, performance), deve se gerar artefatos que documentem, acompanham e comprovem que seu software possua um nível 'x' de qualidade, mas não acrescenta qualidade ao produto apenas evidencia a qualidade que ele já tem. Estas informações podem revelar, por exemplo, a quantidade de defeitos encontrados por características e requisitos funcionais ou não-funcionais. [HENDRICKSON 2007]. Em muitos casos, os testes são realizados apenas no final do projeto o que pode agravar o custo do produto, pois quando os problemas são encontrados somente no final, será necessário reavaliar toda a estrutura produzida e verificar se estes estão de acordo tornando-se uma atividade cara, pois
agregará mais investimento em mão de obra qualificada e especializada, ferramentas e ambientes apropriados para a execução das atividade, além da elaboração, execução e avaliação dos resultados. [LUDMILA 2011]. Os testes é a melhor maneira de avaliação para obtenção da documentação e entendimento sobre o nível de qualidade do software produzido para este procedimento foram criadas diversas ferramentas que trabalham lado a lado com desenvolvedores e gerentes de projeto. Estas ferramentas dão a equipe de desenvolvimento mais agilidade na obtenção de resultados de testes. Estes são chamados de testes automatizados trazendo funcionalidades extremamente importante para obtenção dos resultados produzidos e esperados pela equipe, durante a construção do produto. Este artigo é composto por informações referentes aos testes automatizados de softwares. Nele poderá encontrar-se um conceito básico de implementação de teste de software automatizado utilizando a ferramenta JUint, além de conhecer algumas ferramentas que possam auxiliar na execução deste processo. 2. Testes de Software e a Automatização dos Processos de Teste Pressman [2006] afirma que o teste de software é um fator decisivo para garantir a qualidade de um programa fazendo então, com que esses sejam feitos por ferramentas e não mais por mão de obra humana. Uma boa referência para construção de projetos de software poderia ser a engenharia aeronáutica, na qual, para se chegar a construção de uma aeronave, todos seus componentes são testados, isoladamente, até a exaustão e após estes, cada etapa de integração é testada e homologada. Testes automatizados são programas ou scripts que exercitam funcionalidades do sistema possibilitando que a cada mudança no código do programa os testes possam ser novamente executados. Muitos engenheiros pensam ainda que ferramentas de automação farão toda a execução dos testes, desde o planejamento, execução e métricas. [NOGUEIRA 2010]. Quando na verdade este processo depende do empenho de toda a equipe, pois as ferramentas auxiliam em um feedback mais rápido, dando a oportunidade de correção momentânea. Apesar de não existir uma categoria para as ferramentas de testes, Cristiano Caetano, aponta 8 áreas distintas sendo elas: Ferramentas de automação de testes de regressão, ferramentas para gestão de defeitos, ferramentas para testes de performance/estresse, ferramentas manuais, ferramentas de rastreabilidade, ferramentas de cobertura de código, ferramentas para gestão de testes, ferramentas de apoio à execução dos testes. [CAETANO 2007]. Estas ferramentas, trazem consigo inúmeras vantagens, pois mudanças no sistema podem ser feitas com segurança, o que aumenta a vida útil do produto, verificando cada parte do sistema. Destacam-se algumas das ferramentas mais utilizadas pelas empresas que buscam atingir um nível de qualidade condizente com o mercado, são elas: Testes funcionais Selenium, soapui, BadBoy, Quick Test Pro Teste Unitário Junit, TestNG,NUnit Teste de Performance Jmeter, Performance Tester, LoadRunner Teste de Segurança - appscan, Acunetix
O modo convencional de desenvolvimento de uma funcionalidade é estudar o problema, pensar em uma solução e, em seguida, implementá-la. Após esses três passos, o desenvolvedor faz testes manuais para verificar se está tudo funcionando como o esperado. É normal que defeitos sejam detectados ao longo do processo de desenvolvimento, então os desenvolvedores precisam encontrar o defeito, corrigi-lo e refazer o conjunto de testes manuais. [BERNARDO 2008] Na necessidade de garantir que um produto funcione corretamente, foi criado por Kent Beck o desenvolvimento guiado por testes (TDD). Uma técnica de desenvolvimento que auxilia o programador a ter um melhor designe do código. No TDD é construída uma série de testes de cada peça da aplicação antes do desenvolvimento desta peça, para garantir que a mesma funcione corretamente como um todo. [LOPES 2012] As ferramentas são um auxílio indispensável. Os testes podem ser repetidos inúmeras vezes em um curto espaço de tempo, estes podem conter regras de testes diferentes como gravação de dados, atualização exclusão, acesso permitido, classes de negócios, dentre muitos outros. Os testes podem ser realizados em partes, alguns exemplos de estratégia de testes são destacados por Palma [2012]: Teste de Unidade - Teste em um nível de componente ou classe. É o teste cujo objetivo é um verificar um pedaço do código. Teste de Integração - Garante que um ou mais componentes combinados (unidades) funcionam. Podemos dizer que um teste de integração é composto por diversos testes de unidade. Teste de regressão - Toda vez que algo for mudado, deve ser testada toda a aplicação novamente. Teste de caixa-preta - Testar todas as entradas e saídas desejadas. Não se está preocupado com o código, cada saída indesejada é vista como um erro. Teste caixa-branca - O objetivo é testar o código. Às vezes, existem partes do código que nunca foram testadas. Teste Funcional - Testar as funcionalidades, requerimentos, regras de negócio presentes na documentação. Validar as funcionalidades descritas na documentação (pode acontecer de a documentação estar inválida). Teste de Performance - Verificar se o tempo de resposta é o desejado para o momento de utilização da aplicação. Teste de carga - Verifica o funcionamento da aplicação com a utilização de uma quantidade grande de usuários simultâneos. Testes de Segurança - Testar a segurança da aplicação das mais diversas formas. Utilizar os diversos papéis, perfis, permissões, para navegar no sistema. Seguindo as especificações citadas, a possibilidade de encontrar problemas é muito grande, e estas verificações mínimas dão um nível de qualidade do software que foi produzido. Se estas verificações forem realizadas durante a fase de construção do projeto o custo para esta abordagem é relativamente menor do que adotar as verificações na fase de implantação e homologação. Na grande maioria das vezes, os testes automatizados são escritos programaticamente, por isso é necessário conhecimento de programação. Nas seções seguintes, são exibidos alguns exemplos de código de testes automatizados que utilizam algumas ferramentas.
3. Exemplo de Teste Automatizado de Unidade Para se colocar em prática a automação de testes o primeiro passo que se utilizará será o testes de unidade, que verifica as classes unitariamente. Ou seja uma a uma. O teste de unidade é focado em trechos do código, encapsulado por uma unidade que garantirá o que está sendo reproduzido com o esperado, [BERNARDO 2008]. Com o auxílio da versão 4 da framework JUnit. A estrutura de uma classe de testes do JUnit segue as seguintes especificações citadas por Firmino [2013]: setuptest(): método que é executado antes do teste. Este método deve vir acompanhado da anotação @BeforeClass. teardowntest(): método que, ao final de todos os testes, é executado para encerrar uma instância do navegador, fechar uma conexão com um banco de dados etc. Esse método deve vir acompanhado da anotação @AfterClass. Através dos métodos assert, analisamos os dados de entrada e de saída de um sistema. Para fins de estudo a classe principal Calculadora (figura 1) executa algumas operações matemáticas, cujo objetivo é verificar se estas operações retornam aos valores esperados, executando os testes pela classe junit CaluladoraSoma (figura 2), as figuras 1 e 2 seguindo os exemplos citados pelo autor. Figura 1 Classe Principal Calculadora Figura 2 Método de Teste O resultado esperado são confirmado pela ferramenta como exibe a figura 3, executando 3 testes seguidos em menos de um segundo. Figura 3 Resultado do Teste
Metodologia Para produção deste documento, foram realizadas pesquisas em sites especializados no assunto e artigos científicos de profissionais atuantes na área de testes de softwares automatizados, seguida pelo desenvolvimento de uma aplicação prática de teste que completa este artigo. Conclusão Torna-se indispensável nos dias atuais, em que as tecnologias evoluem de um dia para o outro garantir que os produtos ofertados funcionem de acordo com o especificado. Para se chegar a uma qualidade satisfatória os testes são fundamentais nos feedback da funcionalidade dos produtos ofertados. Automatização deste processo é uma maneira eficaz de passar para o computador funcionalidades que as vezes passam despercebido a olhos humanos. Não é necessário reinventar a roda, empresas mais competitivas são as empresas que trabalham sob a ótica da melhoria contínua dos processos. [CAETANO 2007]. Utilizar-se de ferramentas já existentes cuja eficiência em ação é confirmada, é uma boa maneira de evitar desperdício de tempo e recursos para que a prática deste trabalho entre em ação. Referencias Bernardo, P. (2008) A Importância dos Testes Automatizados http://www.devmedia.com.br/artigo-engenharia-de-software-3-a-importancia-dostestes-automatizados/9532#ixzz2z4n2nk00. Acessado em 15/07/2013. Caetano, C. (2008) Automação e Gerenciamento de Testes: Aumentando a Produtividade com as Principais Soluções Open Source e Gratuitas: http://www.testexpert.com.br/?q=blog/2. Acessado em 25/07/2013. Firmino B. (2013) Introdução aos Testes Funcionais Automatizados com JUnit e Selenium WebDriver http://www.devmedia.com.br/introducao-aos-testesfuncionais-automatizados-com-junit-e-selenium-webdriver/28037#ixzz2z8guoiui Hendrickson, E. (2007) - O papel de "Quality Assurance" em projetos ágeis http://blog.improveit.com.br/articles/2007/01/11/o-papel-de-quality-assurance-emprojetos-ageis. Acessado em 10/07/2013 Inmetro Qualidade - Avaliação da Conformidade: Disponível em http://www.inmetro.gov.br/qualidade/ Acessado em 10/06/2013. Ana Ludmila - 2011: Testes de software: Objetivos http://bugbox.com.br/compartilhar/219#more-219. Acessado em 10/6/2013. Ana Ludmila - 2011: Custo do defeito do software http://bugbox.com.br/compartilhar/405#more-405, Acessado em 10/6/2013. Palma F. (2012) Tipos de teste http://testesdesoftware.blogspot.com.br/ Acessado em 10/07/2013. Pressman, R. S.(2006): Engenharia de Software - 6ª Ed. Lopes C. 2012 Princípios do Test Driven Development (TDD) http://imaster.com.br/artigo/24242/desenvolvimento/principios-de-test-drivendevelopment-tdd/ Acessado em 04/08/2013.