UNIVERSIDADE DO SUL DE SANTA CATARINA FERNANDO SANTIAGO INTEGRAÇÃO DA AUTOMAÇÃO DE TESTES DE INTERFACE NO CICLO DE DESENVOLVIMENTO CORRETIVO Florianópolis 2015 FERNANDO SANTIAGO INTEGRAÇÃO DA AUTOMAÇÃO DE TESTES DE INTERFACE NO CICLO DE DESENVOLVIMENTO CORRETIVO Trabalho de conclusão de curso apresentado ao curso de Especialização em Engenharia de Projetos de Software da Universidade do Sul de Santa Catarina, como requisito parcial para a obtenção do título de Especialista. Orientador: Prof. Vera Rejane Niedersberg Schuhmacher, Dr. Co-orientador: Prof. Jan Charles Gross Florianópolis 2015 FERNANDO SANTIAGO INTEGRAÇÃO DA AUTOMAÇÃO DE TESTES DE INTERFACE NO CICLO DE DESENVOLVIMENTO CORRETIVO Este Trabalho de Conclusão de Curso foi julgado adequado à obtenção do título de Especialista e aprovado em sua forma final pelo Curso de Especialização em Engenharia de Projetos de Software da Universidade do Sul de Santa Catarina. Florianópolis,____ de_______________ de______ _____________________________________________________ Prof. e orientador Vera Rejane Niedersberg Schuhmacher, Dr. Universidade do Sul de Santa Catarina _____________________________________________________ Prof. e co-orientador Jan Charles Gross Universidade do Sul de Santa Catarina _____________________________________________________ Prof. Maria Inés Castiñeira, Dr. Universidade do Sul de Santa Catarina Dedico este trabalho aos meus queridos amigos que muito me incentivaram e apoiaram na realização deste curso. AGRADECIMENTOS A empresa Softplan pelo incentivo de aprendizagem oferecido ao colaborador. A Prof. Dr. Vera Rejane Niedersberg Schuhmacher e ao Prof. Jan Charles Gross, por toda confiança que depositaram em mim, pelas diversas oportunidades profissionais e acadêmicas proporcionadas, pela paciência e pelo incentivo durante os momentos difíceis, alem de serem grandes exemplos de competência e disciplina. Aos amigos do GUTS-RS - Grupo de Usuários de Testes de Software do Rio Grande do Sul - pelos anos de amizade, compartilhamento de materiais didáticos, palestras, processos e ferramentas de testes de software. De modo geral, a todos que direta ou indiretamente contribuíram e apoiaram para a realização deste trabalho. "A definição de insanidade é fazer a mesma coisa repetidamente e esperar resultados diferentes." (RITA M. BROW, 1983) RESUMO Este trabalho de conclusão de curso aborda um estudo sobre testes de software, seus paradigmas e a aplicação da automação de testes em um sistema legado. Para a aplicação da metodologia de testes apresentada, foi utilizado como estudo de caso o sistema Sienge, sistema de gestão voltado a Indústria da Construção, desenvolvido em ambiente web. Este estudo apresenta e aplica técnicas de testes relacionadas a sistemas isentos de padrões que impedem a garantia da qualidade do sistema ao todo. Entretanto, o trabalho visa compreender como inserir as práticas de testes automatizados no ciclo de vida de desenvolvimento de um software utilizando uma abordagem pragmática. Palavras-chave: Testes de software. Sistema legado. LISTA DE ABREVIATURAS API Application Programming Interface (Interface de Programação de Aplicativos) CLI Command Line Interface (Interface da Linha de Comando) ERP Enterprise Resource Planning (Planejamento de Recurso Corporativo) IEEE Institute of Electrical and Electronics Engineers (Instituto de Engenheiros Eletricistas e Eletrônicos) QA Quality Assurance (Analistas de Qualidade) RUP Rational Unified Process (Processo Unificado Rational) TI Tecnologia da Informação UCP Unidade Central de Processamento XP EXtreme Programming (Programação Extrema) LISTA DE TABELAS Tabela 1 – Erros por funcionalidade.................................................................................... 32 LISTA DE ILUSTRAÇÕES Figura 1 – Formulário eletrônico de entrada de dados........................................................ 34 Figura 2 – Relatório Extrato de Cliente............................................................................... 35 Figura 3 – Evidência de falha.............................................................................................. 36 Figura 4 – Relatório de execução de testes.......................................................................... 37 LISTA DE GRÁFICOS Gráfico 1 – Defeitos prevenidos........................................................................................... 38 Gráfico 2 – Porcentagem dos defeitos detectados pela automação de testes........................ 39 Gráfico 3 – Estoque de erros................................................................................................. 40 SUMÁRIO 1 INTRODUÇÃO ................................................................................................................ 12 1.1 PROPOSTA ................................................................................................................... 12 1.2 OBJETIVO .................................................................................................................... 12 1.3 METODOLOGIA .......................................................................................................... 12 2 SISTEMAS LEGADOS .................................................................................................... 14 2.1 QUALIDADE DE SISTEMAS LEGADOS ................................................................. 14 2.2 O PROCESSO DE AUTOMAÇÃO DE TESTES ........................................................ 15 2.2.1 Definições da automação de testes ............................................................................ 15 2.2.3 Ferramentas para automação de testes ....................................................................... 16 2.2.4 Automação de testes no processo de desenvolvimento ............................................. 17 2.2.5 Acompanhamento e analise dos resultados ............................................................... 18 3 TESTES AUTOMATIZADOS DE SOFTWARE ............................................................ 20 3.1 PARADIGMAS DE TESTES DE SOFTWARES ........................................................ 21 3.2 TIPOS DE TESTES AUTOMATIZADOS ................................................................... 22 3.2.1 Testes de unidade ....................................................................................................... 23 3.2.2 Testes de integração ................................................................................................... 23 3.2.3 Testes de interface ..................................................................................................... 24 3.2.4 Testes de leiaute ......................................................................................................... 24 3.2.5 Testes de aceitação ..................................................................................................... 24 3.2.6 Testes de desempenho ............................................................................................... 25 3.2.7 Testes de carga ........................................................................................................... 25 3.2.8 Testes de estresse ....................................................................................................... 26 4 TÉCNICAS DE TESTES DE SOFTWARE ..................................................................... 27 4.1 TESTES ALEATÓRIOS ............................................................................................... 27 4.2 TESTES DE FUMAÇA ................................................................................................ 28 4.3 TESTES DE SANIDADE ............................................................................................. 28 5 MÉTODOS AGEIS DE DESENVOLVIMENTO DE SOFTWARE ............................... 30 5.1 CENÁRIOS DE DESENVOLVIMENTO COM TESTES ................................................ 30 6 6.1 CENÁRIOS ....................................................................................................................... 32 PLANEJAMENTO DE TESTES .................................................................................. 32 6.2 FORMULÁRIO DE ENTRADA DE DADOS ............................................................. 34 6.3 TESTE PARA COMPARAÇÃO DE RELATÓRIOS .................................................. 35 6.4 EVIDÊNCIA DE FALHAS .......................................................................................... 35 6.5 RELATÓRIO DE EXECUÇÃO DE TESTES .............................................................. 36 6.6 RESULTADOS ............................................................................................................. 37 7 CONCLUSÃO .................................................................................................................. 41 REFERÊNCIAS ....................................................................................................................... 42 12 1 INTRODUÇÃO Sistemas legados são aplicativos computacionais que, mesmo fabricados no passado, continuam em produção e se mantém funcionais. Estes sistemas podem apresentar problemas de qualidade por diversos fatores, dentre eles, a fraca experiência do profissional que o desenvolveu, o uso de uma metodologia antiquada e fora do padrão e outros problemas que possam impedir sua evolução ou até gerar graves falhas após uma simples alteração. Por diversas razões os sistemas legados não podem ser substituídos, tornando-os caros quanto à manutenção e com grandes riscos no momento de sua evolução. Devido estes problemas torna-se necessário melhorar a qualidade desses sistemas, podendo ser uma forma interessante de mantê-los ativos, tornando-os mais produtivos e permitindo que melhorias e evoluções sejam implementadas com menos riscos. Consequentemente é obtida uma maior confiabilidade e segurança a cada manutenção que se faça necessária. O incremento de novas funcionalidades nos sistemas legados com maior qualidade permite que o fabricante tenha vantagens competitivas sem grandes investimentos de novos desenvolvimentos, gerando lucros e permitindo a integração com novos sistemas (CRISPIN, 2009). 1.1 PROPOSTA Trata-se de um estudo de caso, onde, em um ambiente corporativo será implantada uma metodologia de testes de software para ajudar na garantia da qualidade de entrega de versões de um sistema de gestão especializado na Indústria da Construção, gerando assim, maior confiabilidade e versões livre de falhas. 1.2 OBJETIVO Aplicar uma metodologia de testes de software que possa ser vinculado a qualquer processo de manutenção em sistemas legados, visando melhorar a qualidade do ambiente de desenvolvimento corretivo, garantindo maior segurança no processo de implementação e evitando prejuízos consideráveis a empresa. 1.3 METODOLOGIA Para a elaboração deste trabalho, foram realizadas pesquisas bibliográficas em diversos materiais, livros e os materiais distribuídos ao longo da disciplina referente testes de 13 software e a partir desse referencial teórico foi desenvolvida a proposta tema desta monografia. 14 2 SISTEMAS LEGADOS Sistemas legados são definidos como sistemas de TI (Tecnologia da Informação) ativos e que tiveram seu desenvolvimento inicializado no passado. Softwares legados e demais aplicativos são muitas vezes considerados os destaques da organização, geralmente gerando altos lucros por excederem o valor necessário para a manutenção, e o excedente, muitas vezes, mantido pela empresa com o objetivo de financiar outros projetos estratégicos (HORCH, 2003). Outra definição para software legado diz que sistemas legados foram desenvolvidos décadas atrás e constantemente são modificados para satisfazer as mudanças nos requisitos de negócio e nas plataformas de computação. O aumento da distribuição destes sistemas causa inúmeros problemas para grandes organizações que os consideram dispendiosos de manter e arriscados de evoluir (PRESSMAN, 2010). Entretanto, Pressman aponta outra citação que complementa a anterior alegando que muitos sistemas legados permanecem dando suporte a funções importantes e indispensáveis do negócio. Podemos concluir que um sistema legado é qualquer sistema que tenha sido implantado e está em uso atualmente. É possível deduzir também que se estes sistemas ainda estão em uso, significa que são operações vitais para a empresa no qual o custo da migração para metodologias e tecnologias atuais seria muito alto. 2.1 QUALIDADE DE SISTEMAS LEGADOS Infelizmente existe uma característica adicional que pode estar presente no software legado, a má qualidade. Sistemas legados, algumas vezes, são projetos não extensíveis, com códigos complicados, documentação pobre ou inexistente, com casos de teste e resultados que nunca foram executados e um histórico de modificações mal gerido. Essa lista de problemas pode ser maior do que se espera (PRESSMAN, 2010). É possível acreditar que existam muitos sistemas que em sua época de criação utilizaram métodos, hoje considerados inadequados para o desenvolvimento de software, desta forma estes métodos são considerados ruins na atualidade gerando a fama de que software legado não tem qualidade. Independentemente da metodologia utilizada na criação de softwares legados serem ultrapassadas, existem os softwares desenvolvidos com uma qualidade inferior devido a pouca experiência e conhecimento de padrões de programação das equipes de desenvolvimento. Este quadro se agrava quando o sistema evolui sendo alterado por muitos desenvolvedores e cada um efetuando as modificações da forma que achar melhor (KOSCIANSKI, 2007). 15 2.2 O PROCESSO DE AUTOMAÇÃO DE TESTES A automação de testes pode parecer simples, o que não podemos esquecer é que alguns dos problemas dos testes automatizados são intrínsecos de cada tipo de teste. Entretanto, outras dificuldades podem ser causadas pelo desconhecimento de boas práticas de organização de um projeto com automação de testes. Por isso, essa seção discute e recomenda formas de se trabalhar para aumentar a produtividade. 2.2.1 Definições da automação de testes A automação de testes esta aplicada diretamente a boa qualidade dos sistemas de software, sendo assim, agregam valor ao produto finalizado, mesmo contendo alterações e melhorias que não sejam visíveis aos usuários finais do sistema. Mas, como qualquer artefato, o código fonte dos testes automatizados e os documentos e relatórios gerados requerem qualidade e capricho para que a evolução e manutenção sejam viáveis, com custo de trabalho linear ou mesmo constante, ou seja, que não aumente radicalmente sua complexidade à medida que o projeto evolua. Torna-se primordial a existência da preocupação de testes com código-fonte de qualidade, pois eles também estão sujeitos a problemas similares que podem ocorrer com o software em teste. Consequentemente, diversas tarefas de manutenção de código do sistema também são aplicadas ao dos testes, tais como evolução, refatoração e otimização. Tudo isso para obter e manter a correção, legibilidade e desempenho, que são algumas das características básicas para uma boa bateria de testes automatizados. Entretanto, o principal aspecto que traz coerência para a prática de testes automatizados é a simplicidade: testes automatizados devem possuir um código fonte trivial, que seja fácil de implementar e de entender. Dessa forma, a chance de introduzir erros é relativamente pequena. Outro aspecto complementar é que um erro introduzido nos testes geralmente é fácil de ser identificado em tempo de implementação, pois a execução do teste tende a falhar, se ele não falhar é porque houve uma replicação do erro no código do sistema. Essa redundância de trabalho entre código do sistema e código dos testes cria duas frentes de busca de erros e traz mais segurança para escrita do sistema e dos testes (GRAHAM, 2012). 16 2.2.3 Ferramentas para automação de testes A escolha do aplicativo de testes é de grande importância, mas apenas conhecer uma variedade de ferramentas disponíveis para a execução de testes não é o suficiente para manter a qualidade de testes automatizados. É necessário atrelar à escolha da ferramenta as condições do ambiente computacional, aos processos de desenvolvimento utilizado, as condições das equipes de desenvolvimento e testes e a empresa. Se a única ferramenta encontrada foi uma aplicação com um custo inacessível não pode ser considerada uma boa solução, desta forma é necessário o vinculo entre a expectativa da empresa, os recursos disponíveis para a automação e uma ferramenta que atenda esta realidade. Algumas sugestões podem ser interessantes para auxiliar na avaliação de uma ferramenta: Um sistema que apresente uma CLI (Command Line Interface) ou uma API (Application Program Interface) apresenta um ambiente simples para serem testados a partir de ferramentas xUnit. As xUnit são ferramentas interessantes para se fazer testes unitários e de integração, mas podem ser utilizadas para testes de sistema se o sistema possuir uma destas interfaces. Testes de estresse, carga e outros testes não funcionais do sistema são testes específicos e que normalmente necessitam de um ambiente similar ao de produção, desta forma estes testes são normalmente gerados utilizando um sistema de record&playback somado a alguns scripts que recebem dados de uma listagem separada, simulando o mais próximo possível uma situação real (MYERS, 2011). Sistemas antigos, que possuem uma interface bem definida e que provavelmente não terão uma modificação na interface são fortes candidatos a terem testes de sistema desenvolvidos a partir de ferramentas de record&playback devido à facilidade de criação e reprodução dos testes. A escolha da ferramenta de automação de teste depende muito a situação da empresa e dos recursos disponíveis para que os testes sejam efetuados, desta forma, uma pesquisa entre as ferramentas avaliadas no mercado é interessante para chegar a uma ferramenta adequada as possibilidades da empresa. Neste caso, a escolha de ferramentas para automação dos testes em um sistema legado é muito parecida com a escolha de ferramentas para automação de testes em um sistema que está em fase inicial de desenvolvimento, a diferença está na avaliação, que deve ser efetuada com base no sistema existente. Esta posição apresenta mais uma vez a importância do conhecimento do sistema legado. É interessante que ao escolher a ferramenta 17 para automação dos testes, que o responsável já tenha em mente uma periodicidade para a execução automática dos testes. É muito comum as empresas executarem os testes automatizados semanalmente ou até diariamente, isto varia dependendo da estratégia de teste que foi adotada e da quantidade de testes que estão sendo executados (MOLINARI, 2011). 2.2.4 Automação de testes no processo de desenvolvimento Quando o item de trabalho já foi planejado, e a escolha da ferramenta de automação já foi efetuada, é o momento de implementar o projeto de automação e depois definir como a automação de testes é disponibilizada para integração com o processo de desenvolvimento.O item trabalhado é registrado e incluído como um projeto em qualquer processo de desenvolvimento, desta forma, este item ganha um escopo e um prazo bem definidos gerando um trabalho planejado que pode ter seu resultado avaliado no final do projeto. Este projeto deve ser regido pelas regras de projetos do sistema legado utilizado na empresa. Após a conclusão do projeto, se a automação dos testes do sistema legado ficar limitada aos projetos de automação desenvolvidos, o sistema continuará a evoluir e após algum tempo, mesmo que sejam gerados sempre mais projetos para automação de testes, o sistema legado não conseguirá manter seu conteúdo de testes automatizados atualizado, tornando os esforços de automação menos eficientes e provavelmente perdendo a sua credibilidade. Para evitar este tipo de problema, é necessário que as regras e padrões de automação de testes gerados a partir deste projeto, sejam inclusos nos passos do processo de desenvolvimento utilizado pela empresa, garantindo que as modificações geradas no sistema legado avaliem a possibilidade de automação dos testes desta melhoria. Por exemplo, um primeiro projeto abrange uma parte crítica do sistema e teve seus casos de teste automatizado através de uma ferramenta de record&playback, no momento da conclusão do projeto, a empresa passa a ter um conhecimento específico sobre esta estratégia e técnica de teste utilizada, conhecimento este que pode ser replicado para o processo de desenvolvimento. Desta forma, a empresa pode incluir em seu processo de desenvolvimento um passo de análise que avalia se um determinado projeto do sistema legado tem condições de ser testado de forma automatizada através da técnica conhecida. Se houver a possibilidade, este próximo projeto deve conter também o passo que irá criar os casos de teste a serem automatizados para este projeto (ENGEBRETSON, 2011). Outro caso onde a empresa pode incluir este passo é no processo de correção de erros, onde cada erro encontrado e corrigido deve ser avaliado quanto a possibilidade de 18 automação do teste. Este processo possibilita que o erro sempre seja verificado e impede um retorno deste mesmo erro num momento futuro. A inclusão destes passos no processo de desenvolvimento garante a evolução dos testes automáticos de forma que com o passar do tempo o sistema garante uma maior cobertura dos testes. Ao trabalhar com projetos de automação de teste ao invés de implantá-los diretamente no processo de desenvolvimento, a empresa emprega um esforço calculado para uma iniciativa que irá afetar todo o processo de desenvolvimento, desta forma a empresa acumula experiência em relação a automação de teste antes de arriscar uma modificação no processo de desenvolvimento. Os outros projetos de automação de teste são necessários para definir as melhores estratégias e técnicas de teste a serem utilizadas em cada parte do sistema, gerando de forma gradual todos os testes necessários para a segurança do sistema legado. Há a possibilidade de que o projeto de automação de teste falhe, neste momento é importante avaliar o que ocorreu com o projeto para validar em que passo do processo houve uma falha, se foi no levantamento inicial das prioridades, se foi na análise dos testes a serem efetuados, se foi na escolha da ferramenta de automação ou se foi um erro na implementação do projeto. Descobrir este erro e aprender com ele fará com que outros projetos de automação não falhem, gerando uma maior confiabilidade no processo, o fato de um projeto de automação ter falhado também significa que a empresa investiu menos recursos do que se tivesse tentado implementar esta automação diretamente no processo de desenvolvimento de sistemas, poupando assim desenvolvedores, testadores e todos aqueles que teriam de conviver com a mudança referente a automação de testes no seu dia a dia. Isto também faz com que a equipe envolvida no projeto ganhe experiência em relação ao processo de automação de testes, podendo auxiliar no aprendizado de outras equipes que serão envolvidas nas automações de teste dos próximos projetos (CRISPIN, 2009). 2.2.5 Acompanhamento e analise dos resultados Após implementado o primeiro projeto de automação de testes, é necessário haver um acompanhamento da execução destes testes automatizados de acordo com a periodicidade com que eles ocorrem. Este acompanhamento permite saber se alguma modificação no sistema gerou falha em parte do sistema que foi testada, desta forma é possível encontrar e solucionar a causa do problema antes que este seja entregue numa versão ou pacote de atualização, além de permitir um acompanhamento da evolução da automação dos testes que estão sendo gerados. 19 As métricas de qualidade são uma boa forma de acompanhar e analisar se os testes automatizados estão gerando resultado, melhorando assim a qualidade geral do produto. A análise e divulgação destes indicadores são importantes para gerar credibilidade ao processo de automação dos testes e para validar se as estratégias adotadas estão sendo realmente efetivas. Sistemas que possuem um build automatizado e/ou processo de Integração contínua automatizada auxiliam e favorecem o acompanhamento e divulgação dos testes entre os desenvolvedores e equipes de teste (BINDER, 1999). 20 3 TESTES AUTOMATIZADOS DE SOFTWARE A implementação de testes automatizados é a prática de tornar os testes de software independentes da intervenção humana, ou seja, não é preciso disponibilizar de pessoas para realizar os roteiros de testes. Testar é uma prática essencial ao desenvolvimento de sistemas, mas os testes de software só começaram a se tornar uma área de estudo da engenharia de software a partir da década de 70 e, desde então, têm ganhado cada vez mais importância (MOLINARI, 2011). Atualmente, existem grandes comunidades de profissionais especializados, conhecidos como testadores, analistas de testes ou QA (Quality Assurance), e diversos estudos e cursos com ênfase nessa prática. Muitas empresas possuem grandes setores dedicados exclusivamente ao controle e garantia de qualidade. Assim como os testes manuais, os testes automatizados têm como objetivo melhorar a qualidade de sistemas através da verificação e validação de atributos processados a partir de regras. Essa automação dos testes expande a área de estudo de testes de software e muda os paradigmas de implementação, manutenção e execução dos testes. A automação de testes requer do uso de ferramentas específicas e de linguagens de programação de alto nível, portanto, é necessário um sólido conhecimento de técnicas de testes e ciência da computação para a elaboração de roteiros de testes com qualidade. Como veremos no Capítulo 4, existem técnicas de escrita de testes automatizados que mudam completamente a maneira que programadores programam um software. Os testes automatizados também podem ser aproveitados para outros fins. Por exemplo, é possível utilizá-los para conhecer os impactos de ferramentas externas e a estrutura das funcionalidades do sistema. Já os testes de interface de usuário e de aceitação podem ser utilizados para demonstrações do software ou mesmo como um manual de aceite do usuário final (GRAHAM, 2012). Ainda, relatórios gerados a partir dos casos de testes podem ser utilizados como documentação dos requisitos e do sistema. Molinari salienta que este tipo de documentação é dinâmica, pois pode ser gerada automaticamente e sem esforço sempre que os roteiros de testes forem executados. Um benefício desse tipo de documentação é que ela dificilmente se tornará obsoleta, já que ela se autoverifica toda vez que os testes são executados, isto é, se algum teste falhar, o relatório indica que aquele requisito não é mais satisfeito. O principal objetivo dos testes automatizados é melhorar a qualidade do software, mas qualidade é um termo muito amplo, podendo indicar uma infinidade de aspectos em um contexto específico, como, por exemplo, desempenho, segurança, flexibilidade, estruturação 21 interna do código, usabilidade, entre outros. Apesar de a qualidade ser um conceito elusivo e difícil de ser medido, os testes automatizados podem contribuir para melhoria dos sistemas (KOSCIANSKI, 2007). 3.1 PARADIGMAS DE TESTES DE SOFTWARES Inúmeras metodologias de desenvolvimento recomendam que todas as pessoas envolvidas em um projeto atuem controlando a qualidade do produto, pois sabemos que prevenir defeitos é mais fácil e barato que identificá-los e corrigi-los em fases próximas a entrega ao cliente (PRESSMAN, 2010). Os testes automatizados são ou roteiros de scripts escritos a partir critérios de aceite que exercitam as funcionalidades do sistema em teste e fazem verificações automáticas nos resultados obtidos. A independência da intervenção humana na execução dos roteiros de testes permite o uso dos benefícios de um computador, como a velocidade de execução dos testes, a possibilidade de execução paralela de testes, flexibilidade na quantidade e momento das execuções dos testes e a facilidade da criação de casos de testes. Uma das grandes vantagens dessa abordagem é que os casos de teste podem ser facilmente e rapidamente repetidos a qualquer momento e com pouco esforço. 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 e facilitando a identificação de um possível comportamento não desejado (MOLINARI, 2011). Além disso, como os casos de testes são descritos através de um código interpretado por um computador, é possível criar situações de testes mais complexas do que as realizadas no processo manual, possibilitando várias combinações de comandos e operações. Ainda, o objetivo dos testes pode também facilmente ser alterado. Por exemplo, é fácil simular centenas de usuários acessando um sistema ou inserir milhares de registros em uma base de dados, o que o tornaria custoso e demorado se este teste fosse realizado manualmente. Todas essas características ajudam a solucionar os problemas encontrados nos testes manuais, contribuindo para diminuir a quantidade de erros e aumentar a qualidade do software. Como se torna fácil executar todos os testes, alterações no sistema podem ser feitas com segurança, o que ajuda a aumentar a vida útil do produto, afirma Molinari. Muitos dos testes automatizados são escritos por linhas de código, por isso é necessário conhecimento básico de programação. Existem também diversas ferramentas gráficas que escondem os detalhes de programação e possibilitam que usuários do sistema e 22 outros profissionais sem conhecimento em programação consigam criar seus próprios testes. Ainda existem as ferramentas que separam a descrição do cenário de teste da sua implementação. Dessa forma, os clientes podem descrever o que se espera da funcionalidade do sistema enquanto os desenvolvedores implementam trechos de código que ligam os critérios de aceite do cliente ao sistema em teste (GOUCHER, 2009). 3.2 TIPOS DE TESTES AUTOMATIZADOS Devido a popularização dos computadores e do fácil acesso a dados pela Internet, o número de sistemas de softwares vem crescendo cada vez mais, incluindo o número de usuários. As empresas estão cada vez mais dependentes destes sistemas, utilizados cada vez mais para gerenciar processos, dentre eles, gerenciais com larga escala de dados e indicadores. Por isso, a exigência de qualidade é de suma importância, entretanto, algumas falhas de software estão cada vez mais em evidência, como problemas de usabilidade, segurança e desempenho, além de diversos outros que podem ser desde enganos por desatenção do desenvolvedor até mau entendimento dos requisitos da funcionalidade solicitada pelo cliente (MYERS, 2011). Para muitos tipos de erros existem testes específicos, que verificam premissas e padrões. Por isso, é fundamental organizar os casos de teste por tipo relativo a várias razões: Facilitar a manutenção e a adição de novos cenários para a cobertura de testes para todas as funcionalidades do sistema; Utilizar ferramentas próprias e seguir metodologias de testes; O tempo de execução pode ser variado, então a execução de testes lentos não afetarão o feedback rápido que as baterias de testes velozes proporcionam; Facilitar a coleta das métricas por execução de teste, esse indicadores são úteis para identificar pontos de verificação que precisam ser melhorados. Existem ferramentas especializadas para cada tipo de teste, elas facilitam a escrita e tornar o código mais enxuto e legível, logo, mais fácil de manter. Um erro comum é exercitar ou utilizar uma ferramenta de um tipo de teste específico para objetivos que não são de sua responsabilidade natural, o que pode levar à criação de testes de baixa qualidade. Portanto, é necessário conhecer as ferramentas para optar pelas mais apropriadas para o que se está querendo verificar. 23 Também é importante notar que alguns tipos de testes só fazem sentido com o auxílio da automação, devido principalmente a sua complexidade de implementar ou de executar os testes, tais como os de desempenho, carga e longevidade. Os testes de unidade também são mais interessantes quando automatizados, apesar da fácil implementação e execução, eles geralmente não possuem interface de usuário intuitiva para possibilitar os testes manuais (MYERS, 2011). 3.2.1 Testes de unidade Originalmente o termo Teste Unitário é definido como um teste capaz de analisar uma unidade de trabalho, que a IEEE (Institute of Electrical and Electronics Engineers) define como: "Atividade capaz de testar unidades de hardware ou software ou grupo de unidades relacionadas". Este tipo de teste esta associado a funções para linguagens procedimentais e métodos em linguagens orientadas a objetos. O Teste Unitário é o teste responsável por testar os menores trechos de código de um sistema que possui um comportamento definido e nomeado (BINDER, 1999). 3.2.2 Testes de integração O Teste de Integração representa a busca de erros de relacionamento entre quaisquer módulos de um software, incluindo integração de pequenas unidades até a integração de bibliotecas das quais um sistema depende, servidores e gerenciadores de banco de dados. Uma funcionalidade ou módulo do sistema pode estar correto, mas não há garantias de que outros módulos, que fazem chamadas a essa funcionalidade, estão implementadas corretamente (FOWLER, 1999). Os erros de integração são frequentes, principalmente quando não existe uma documentação apresentando pontos de impactos relevantes a funcionalidade alterada. Além disso, quanto mais complexa for a arquitetura do sistema, maior a chance de existirem erros de integração, já que aumenta a quantidade de troca de mensagens entre os módulos. Em sistemas pobres de documentação e mal modelados, a situação fica ainda mais crítica. Falhas de design entre objetos e o excesso de itens em um único módulo do sistema tornam o software difícil de entender e manter, portanto ele fica muito suscetível a presença de erros de integração (GRAHAM, 2012). 24 3.2.3 Testes de interface Testar a interface de um sistema tem um foco bem diferente de testar classes e métodos, a interface é o que mantém contato direto com os usuários finais e é a partir dela que o usuário normalmente conclui se o software atende seus requisitos com qualidade. Por isso, qualquer não conformidade dessa camada pode ofuscar todo interior do sistema, podendo ser de boa qualidade (MYERS, 2011). Os testes automatizados de interface verificam a funcionalidade por meio da simulação de eventos de usuários, como se uma pessoa estivesse controlando dispositivos de entrada do computador e adicionando valores a serem processados. A partir dos efeitos colaterais dos eventos, são feitas verificações na interface e em outras camadas para se certificar que a interface está funcionando apropriadamente, salienta Myers. Como a interface de usuário é a parte visual do programa, não basta apenas ela estar correta, é necessário que ela seja organizada, atraente e que permita que diferentes grupos de usuários consigam utilizá-la, por isso é importante os testes de leiaute, usabilidade e acessibilidade. 3.2.4 Testes de leiaute Os Testes de Leiaute buscam validar a integridade da interface, assim como verificar a presença de falhas, que são erros difíceis de identificar com testes comuns de interface. Por exemplo, um Teste de Interface básico pode facilmente verificar que um módulo da interface foi carregado corretamente, mas não é garantido que o módulo está bem desenhado ou mesmo visível para o usuário final. O leiaute do sistema pode variar significativamente entre diversas plataformas, tais como em diferentes gerenciadores de janelas e navegadores web. Cada plataforma possui suas particularidades, já que as funcionalidades e algoritmos de renderização variam consideravelmente, por isso uma bateria de testes de leiaute também é importante para verificar a portabilidade do sistema (KOSCIANSKI, 2007). 3.2.5 Testes de aceitação Conhecidos como Teste Funcional, são testes de correção e validação facilmente conectados ao código do sistema para que os comandos e verificações sejam executados no sistema em teste. Eles são especificados por clientes ou usuários finais do sistema para 25 verificar se um módulo funciona como foi especificado. Por isso o termo “aceitação”, pois ele verifica se o cliente aceita as funcionalidades que foram implementadas. Os testes de aceitação devem utilizar uma linguagem próxima da natural para evitar problemas de interpretação e de ambiguidades. Uma história do cliente não é finalizada enquanto os testes de aceitação não certificarem que o sistema atende aos requisitos especificados. Sendo assim, os Testes de Aceitação não só são utilizados para identificar defeitos de programação e interpretação dos requisitos como também para identificar quando uma história foi finalizada (MOLINARI, 2011). 3.2.6 Testes de desempenho O Teste de Desempenho é projetado para testar o desempenho do software durante a execução de um sistema, visando descobrir situações que levem a uma possível falha do software. Ou seja, visa tornar a aplicação estável de modo que o processo de teste definido possa prosseguir sem maiores problemas. Alem disso, ajudam a identificar os gargalos que precisam ser otimizados para diminuir o tempo de resposta para o usuário (MOLINARI, 2011). Testes de Desempenho executam trechos do sistema em teste e armazenam os tempos de duração de cada execução. Os Testes de Desempenho não avaliam a complexidade computacional dos algoritmos, por isso os tempos obtidos estão intimamente relacionados à infraestrutura sobre a qual o teste está sendo executado, podendo variar drasticamente dependendo do hardware, da rede e demais componentes físicos. (MYERS, 2011). 3.2.7 Testes de carga O Teste de Carga exercita o sistema sob condições de uso intenso para avaliar se a infraestrutura é adequada para a expectativa de uso real do sistema. Os casos de testes simulam o acesso de muitos usuários e requisições ao sistema que são executadas simultaneamente ou dentro de um intervalo de tempo para medição de informações de desempenho. Dependendo do sistema e do que o teste irá avaliar, pode ser verificado o tempo de resposta de cada requisição ou informações relativas ao uso de recursos, como uso da UCP (Unidade Central de Processamento), cache, memória física, espaço em disco e banda de rede. Também podem ser observados os programas que se relacionam com o sistema, como gerenciadores de banco de dados, máquinas virtuais e servidores de aplicação. 26 Após o término da execução dos testes, é realizada a tarefa de interpretação subjetiva das informações coletadas, que pode ser feita manualmente ou através de scripts que seguem alguma heurística especializada para um contexto. Essas informações são úteis para identificar módulos do sistema que apresentem mau desempenho sob uso intenso, como, por exemplo, queries que são executadas repetidamente e que poderiam ser inseridas em um sistema de cache. As informações também podem indicar partes do hardware e da infraestrutura que são mais utilizadas pelo software, portanto quais são as mais importantes para a execução satisfatória do sistema (ENGEBRETSON, 2011). Outra conclusão que pode ser obtida com os Testes de Carga é se o sistema e suas dependências são escaláveis. Se a vazão das requisições apresentarem aumento linear com o tempo, significa que o sistema é escalável, portanto, é possível melhorar o desempenho do sistema com o upgrade da infraestrutura. Se a vazão tiver um crescimento exponencial, ou seja, um crescimento relativamente rápido para poucos usuários e requisições, então é uma indicação que alguma configuração ou algoritmo precisa ser melhorado (MOLINARI, 2011). 3.2.8 Testes de estresse Enquanto o Teste de Carga é responsável por avaliar se a infraestrutura é adequada para a utilização do sistema, o Teste de Estresse visa descobrir os limites de uso da infraestrutura, isto é, qual será o maior número de usuários e requisições que o sistema consegue atender corretamente junto ao tempo de execução estimado. A análise dos resultados pode ser feita através de asserções, os valores limites obtidos da simulação de estresse são importantes para o gerenciamento e configuração do hardware e do software. Essa simulação aponta quais são os gargalos de hardware que precisam de upgrade e também orienta a configuração do hardware e do software para melhorar o desempenho ou mesmo para criar barreiras que impeçam que a quantidade máxima de requisições extrapole um limite seguro (ENGEBRETSON, 2011). 27 4 TÉCNICAS DE TESTES DE SOFTWARE Muitas das vezes os testes automatizados em sistemas legados não conseguem provar que todas as funcionalidades estejam livres de falhas, isso porque os testes não conseguem cobrir a grande quantidade de possibilidades de entrada e combinações de resultados a que um software pode estar sujeito. Sendo assim, os testes são realizados até que os membros da equipe, incluindo desenvolvedores e clientes, estejam satisfeitos quanto à qualidade do sistema. Após a execução dos testes e liberação do sistema para o cliente, podem ser executadas outras tarefas para certificar que o software atende às necessidades satisfatórias de aceite, como análises formais e matemáticas ou mesmo a liberação do sistema em versões de testes para testes em ambiente real com usuários reais. Durante a criação dos testes automatizados, a regra utilizada é relacionar blocos de classes de equivalência e dependência de um algoritmo com o objetivo de identificar tanto os casos rotineiros, como as situações excepcionais, e então, elaborar um roteiro de teste para cada uma delas. Entretanto, em alguns roteiros de testes, isso não basta e não garante que esta tudo implementado corretamente, por isso existem outras técnicas de testes que são utilizadas para complementar e reforçar a qualidade do sistema, aumentando as chances de encontrar erros durante a implementação do código, como através de testes aleatórios, fumaça e de sanidade. Esses tipos de testes, também definidos como técnicas de testes, não necessitam prover roteiros exclusivos de casos de testes. Ou seja, não é preciso planejar uma execução com apenas casos de testes de sanidade. De acordo com o histórico de execução de testes e falhas encontradas, podemos seguir outros padrões de execução, tais como desempenho e outras ferramentas específicas de testes. Dessa maneira, podemos complementar as baterias de testes existentes, como a de testes de serviço e unitários (KOSCIANSKI, 2007). 4.1 TESTES ALEATÓRIOS Software legado, pelo tempo de existência, pode não ter suas especificações e regras documentadas, este quadro não permite avaliar todas as combinações de entrada e saída de dados, dessa maneira, fica difícil manter testes que garanta sua total execução. Neste caso, são realizados testes com dados aleatórios para garantir cenários que não foram previamente identificados. Os Testes Aleatórios dependem de geradores de dados de entrada e também um entendimento da lógica de verificação de resultados a partir do oráculo, papel de 28 responsabilidade do analista ou desenvolvedor do sistema com maior experiência do software, que pode repassar comparações flexíveis para garantir a consistência dos testes, ou seja, a aleatoriedade dos dados não deve tornar os testes intermitentes. Testes Aleatórios não precisam ser revisados e na maioria das vezes possuem comportamento alternado dependendo do histórico de falhas da funcionalidade testada. Esta é uma característica fora do padrão de automação e execução de testes rotineiros, dessa maneira, é primordial que exista uma documentação contendo todas as regras de negócio, variáveis e métodos da funcionalidade a ser testada, isso facilita a identificação das falhas, evitando o desperdício com tempo de depuração de falhas (KOSCIANSKI, 2007). 4.2 TESTES DE FUMAÇA Testes de Fumaça ou Smoke Test são pequenos roteiros executados para encontrar possíveis falhas rotineiras que independem de grandes verificações. Os testes de fumaça tendem a ser executados antes de outros roteiros, estes, providos com maior número de verificações, pois se uma falha é encontrada em determinada funcionalidade, todos os outros roteiros também terão problemas em sua execução. Isso pode economizar tempo com a execução de todos os roteiros de testes e tempo com a investigação e causa do problema. Os testes de fumaça, por mais que não sejam de grande complexidade e verificação de dados, apresentam uma cobertura mais abrangente. Alem da rápida programação e execução, são úteis para encontrar erros de configuração e de ambiente que costumam ser identificados após a instalação ou atualização do software para o cliente (KOSCIANSKI 2007). 4.3 TESTES DE SANIDADE Os Testes de Sanidade mantém características similares aos Testes de Fumaça, ou seja, são de rápida execução e menos complexos. Por outro lado, são implementados para testes de cobertura de uma funcionalidade ou módulo específico. Esse tipo de teste esta relacionado a cobertura de regras de negócio que envolvem algoritmos matemáticos, onde podemos relacionar dados de entrada e dados processados de saída. Testes de Sanidade podem sobre escrever Testes Aleatórios, pois executam testes que verificam regras presentes dentro de uma funcionalidade. Basta alterar a utilização de dados aleatórios por dados definidos a partir da especificação de requisitos. A vantagem do Teste de Sanidade em comparação ao Teste Aleatório, é que o roteiro de teste se mantém 29 constantemente em produção, impossibilitando que se torne intermitente, pois existe um melhor controle de dados de entrada e saída (ENGEBRETSON, 2011). 30 5 MÉTODOS AGEIS DE DESENVOLVIMENTO DE SOFTWARE A evolução da engenharia de software deu-se a partir do modelo de cascata que propunha fases e processos para o desenvolvimento de software. Do aprimoramento do modelo de cascata surgiram novos processos, tais como o modelo em espiral e o RUP (Rational Unified Process), todos com grande ênfase na documentação do processo. Devido à grande quantidade de fracassos em projetos de software, nas últimas décadas alguns líderes de projetos adotaram modos de trabalho que se opunham a este modelo tradicional, e tiveram grandes sucessos. Até que em 2001, alguns desses líderes, que possuíam formas de trabalho semelhantes, juntaram-se para debater metodologias de desenvolvimento na tentativa de criar um novo método que agregasse as melhores ideias. No entanto, essa discussão levou à conclusão de que era difícil definir um método perfeito para todas as situações, chegou-se a um consenso de princípios, que foram sintetizados em premissas ágeis. Dentre os métodos ágeis que satisfazem essas premissas, existem os que focam em aspectos mais gerenciais, como Lean e Scrum, e outros que também dão ênfase a práticas de desenvolvimento de software tal como a programação XP (eXtreme Programming). Todos preconizam o controle de qualidade disseminado por toda a equipe e durante todo o desenvolvimento (CRISPIN, 2009). O controle de qualidade no desenvolvimento com métodos ágeis normalmente é associado à automação de testes, já que essa prática surgiu da mesma comunidade. A automação de testes é uma das práticas primárias de XP. As baterias de testes podem ser executadas sem esforço a todo momento, o que possibilita a verificação contínua da qualidade do sistema durante e após a implementação. No entanto, a automação de testes não é exclusiva dos métodos ágeis e nem depende significativamente de outras práticas, por isso é uma técnica de desenvolvimento independente que pode ser empregada por qualquer equipe utilizando qualquer metodologia, mesmo as mais tradicionais. Também é importante ressaltar que os métodos ágeis não se opõem a quaisquer revisões adicionais que sejam feitas para aumentar a qualidade, apenas não é uma prática primária da filosofia (HORCH, 2003). 5.1 CENÁRIOS DE DESENVOLVIMENTO COM TESTES A maneira padrão de implementação de uma funcionalidade é rever o conteúdo especificado e aplicar a solução no defeito existente. Desenvolvida a solução, o programador executa testes manuais para validar o aceite proposto. Neste processo, existe o risco de existir 31 falhas, essas detectadas ao logo do processo de desenvolvimento. Encontrada a falha, o defeito causador deve ser encontrado com técnicas de depuração e, após a correção do erro, os testes manuais devem ser executados novamente. Este processo deve ser repetido até que todos os critérios de aceite sejam executados com resultados positivos e sem falhas de execução. A fim de identificar falhas remanescentes, é comum aplicar o software a um ciclo de testes automatizados para manter a sua qualidade. Este controle é executado com o auxilio de testes de interface automatizados ou testes manuais, de acordo com o método utilizado em produção. Este método é utilizado por empresas que executam cenários de testes mais rígidos, entretanto, sem a total confiança no que esta prestes a ser entregue ao cliente, dessa maneira, o software deve possuir etapas bem definidas, derivadas do modelo de desenvolvimento em cascata. Esta metodologia tende a aparição de falhas recorrentes no desenvolvimento de software, gerando atrasos de entregas ao cliente, erros em escala e dificuldade de manutenção e evolução devido às limitações da execução de testes manuais (CRISPIN, 2009). Um teste manual é rápido e efetivo, mas a execução manual de um grande conjunto de testes torna-se uma tarefa trabalhosa, cansativa e com grande impacto de tempo de execução. Um processo comum e compreensivo é a execução de roteiros de testes mais críticos, sejam eles, executados por desenvolvedores ou testadores, e que esse mesmo caso de teste não seja executado novamente a cada alteração significativa do código, é nesse processo que surgem as principais falhas em sistemas. Falhas estas, responsáveis por prejuízos para as equipes de desenvolvimento, para a empresa e também para o cliente que se depara com constantes atrasos em prazos definidos para a entrega do software. 32 6 CENÁRIOS O desenvolvimento de testes automatizados de interface foi utilizado para a melhoria da qualidade do sistema Sienge, não só para o processo de manutenção, mas para todas as atividades que resultassem em intervenção ao sistema físico em produção. A escolha da metodologia foi absoluta referente a um sistema repleto de não conformidades, tais como: classes e métodos não extensíveis, código-fonte complicado, documentação pobre e um histórico de modificações mal gerido. O Sienge é um sistema de gestão, também chamado de ERP (Enterprise Resource Planning), que permite gerenciar e integrar todas as áreas de uma empresa da Indústria da Construção. Para a elaboração dos cenários de testes automatizados no Sienge, foi desenvolvido um software de execução de testes de interface, o Suricato. O Suricato é um framework desenvolvido em Java que encapsula as bibliotecas da API (Application Programming Interface) Selenium para facilitar a automação de testes. Sendo assim, qualquer pessoa com o mínimo de conhecimento de programação pode criar seus casos de testes a partir de uma especificação com roteiros de testes. 6.1 PLANEJAMENTO DE TESTES O planejamento de testes foi desenvolvido levando em consideração indicadores extraídos de mapas de calor referente falhas reportadas pelo cliente. O Mapa de Calor é uma ferramenta de visualização de dados de densidade de pontos. São utilizados para identificar facilmente aglomerados e encontrar onde existe uma elevada concentração de uma determinada atividade, no caso, a falha reportada pelo cliente em uma determinada funcionalidade do sistema. A Tabela 1 apresenta a quantidade de falhas, separadas por módulos e funcionalidades ordenadas pela posição de item de menu do sistema Sienge. Tabela 1 - Erros por funcionalidade Funcionalidade Módulo - Financeiro Ocorrência de Falhas % de Ocorrências Títulos 30 4,3 Baixa 61 8,7 Entrega de Chaves 11 1,6 33 Repactuação 54 7,7 Geração de arquivo remessa 54 7,7 Leitura de Cobrança Escritural 57 8,2 Relatório de Contas a Receber 25 3,6 Relatório de Contas Recebidas 54 7,7 Relatório Extrato de Cliente 9 1,3 Mala Direta 18 2,6 DIMOB 11 1,6 Relatório de Imposto de Renda 11 1,6 Outros 56 8,0 Atendimentos Módulo - Pró-Vendas 9 1,3 Propostas 29 4,2 Outros 10 1,4 Solicitação de Contratos Módulo - Vendas 18 2,6 Emissão de Contratos 12 1,7 Cancelamento de Contratos 36 5,2 Impressão de Contratos 24 3,4 Relatório de Unidades 16 2,3 Outros 34 4,9 Caixa e Bancos Módulo - Apoio 3 0,4 Notas Fiscais 10 1,4 Locações 10 1,4 Apoio 17 2,4 Apoio (CAD) 19 2,7 Total de Ocorrências 698 Fonte: Documentação interna de testes da empresa Softplan (2014). A prioridade para planejar a ordem de automação de testes para cada funcionalidade foi levantada a partir da porcentagem de ocorrências em relação ao montante de falhas existentes. Visualizando a tabela, podemos constatar que as funcionalidades "Baixa" e 34 "Leitura de Cobrança Escritural" obtiveram grande quantidade de problemas reportados pelos clientes e por esse motivo, a automação de testes teve inicio a partir destas funcionalidades. 6.2 FORMULÁRIO DE ENTRADA DE DADOS O Sienge é um sistema 100% web e sua interface é construída de forma dinâmica, onde regras de tela também são desenvolvidas para clientes diferentes. Nem sempre a mesma funcionalidade é liberada para todos os clientes. Isso obriga a cada teste ter sua estrutura de tela, validando e preenchendo campos a espera do retorno de dados processados. A Figura 1 ilustra o formulário eletrônico de entrada de dados utilizado pelos usuários com a finalidade da consulta de Relatório de Extrato de Cliente do módulo Financeiro. Figura 1 - Formulário eletrônico de entrada de dados Fonte: Documentação interna de testes da empresa Softplan (2014). Após o inicio da execução do testes de interface, o teste acessa o sistema com o login e senha do usuário, percorre o menu a esquerda, acessa a tela com a funcionalidade desejada e preenche os campos de consulta. Realizado o processo, podemos notar que o teste validou o acesso do sistema pelo tipo de usuário, verificou a existência do item de menu desejado e validou a presença dos campos da tela antes da consulta que gerou um relatório contendo dados de um Título pré cadastrado na base de dados, validando todos os valores presentes no relatório referente ao Título. 35 6.3 TESTE PARA COMPARAÇÃO DE RELATÓRIOS Com a finalidade de executar uma validação completa referente os dados existentes nos Títulos dos clientes do Sienge, o Suricato apresenta métodos para a geração e validação de relatórios. Este processo minimiza o tempo de criação de testes para verificar campo a campo de certas funcionalidades. A Figura 2 apresenta o relatório gerado referente os dados de entrada solicitados pelo cliente. Figura 2 - Relatório Extrato de Cliente Fonte: Documentação interna de testes da empresa Softplan (2014). 6.4 EVIDÊNCIA DE FALHAS Quando um teste automatizado, em execução, não consegue dar continuidade ao seu objetivo, significa que uma inconsistência no sistema foi responsável pela parada do teste. Neste momento, a ferramenta tira uma cópia da tela, ainda com a falha, e armazena em um diretório pré estabelecido pelo testador responsável da execução dos testes. Este processo favorece a investigação da falha apresentando o instante que o teste teve sua execução parada, evitando que o roteiro de teste tenha que ser executado manualmente até o momento da falha. 36 Figura 3 - Evidência de falha Fonte: Documentação interna de testes da empresa Softplan (2014). A Figura 3 apresenta um exemplo de evidencia de falha ao cadastrar uma Previsão de Comissão para um Credor do sistema. Onde, era esperada uma mensagem de sucesso no cadastramento da Previsão de Comissão, e como podemos visualizar, uma exceção foi apresentada sem que a Previsão tenha sido cadastrada. 6.5 RELATÓRIO DE EXECUÇÃO DE TESTES Outro ponto referente ao controle e execução dos testes automatizados de interface esta relacionado a ferramenta adotada para o controle de testes. O TestNG é um framework muito simples de implementar e integrar em projetos. Ele propõe um plugin para criar a interface no ambiente de desenvolvimento de acordo com a necessidade dos casos de testes, oferecendo flexibilidade de gravação, organização aberta de testes e funcionalidades avançadas, tal como a generalização, ordenação, dependência e agrupamento dos testes. 37 Figura 4 - Relatório de execução de testes Fonte: Documentação interna de testes da empresa Softplan (2014). A Figura 4 apresenta o relatório da execução de uma bateria de testes executadas em conjunto. O TestNG permite a configuração de uma Suíte de Testes adicionando quais métodos serão executados. No relatório podemos notar que foram executados 41 testes e que apenas 1 obteve falha em sua execução. Logo abaixo, podemos visualizar que a funcionalidade com problemas esta relacionada com a execução do método de teste "fluxoContratoPermissaoDistratoTest" da Classe "FluxoContratoPermissaoDistratoTest". Logo, existe uma falha na funcionalidade de permissão de usuário para o Distrato de um Contrato de cliente. 6.6 RESULTADOS Com a implantação desta metodologia em setembro de 2013, alguns resultados foram observados através da evolução dos indicadores de eficiência, eficácia e efetividade de testes, nas diferentes funcionalidades do sistema. O Gráfico 1 ilustra os indicadores obtidos a partir de falhas encontradas durante a execução de testes automatizados de interface para todas as funcionalidades mencionadas no planejamento dos testes. 38 Gráfico 1 - Defeitos prevenidos 250 Falhas acumuladas Falhas 200 150 100 50 0 set-13 out-13 nov-13 dez-13 jan-14 fev-14 mar-14 abr-14 mai-14 jun-14 jul-14 ago-14 set-14 out-14 nov-14 Fonte: Documentação interna de testes da empresa Softplan (2014). A implantação do processo de testes automatizados de interface provocou uma imediata redução no nível de reclamações e de intervenção por parte dos clientes, provocada pelos grandes níveis observados em todos os indicadores, em especial, no de acumulo das falhas encontradas na execução de testes automatizados. O aprimoramento progressivo do processo de testes nesta equipe resultou no crescimento gradativo de todos os indicadores, no restante do ano. 39 Gráfico 2 - Porcentagem dos defeitos detectados pela automação de testes 45 40 35 30 25 20 15 10 5 0 set-13 out-13 nov-13 dez-13 jan-14 fev-14 mar-14 abr-14 mai-14 jun-14 jul-14 ago-14 set-14 out-14 nov-14 Fonte: Documentação interna de testes da empresa Softplan (2014). O Gráfico 2 apresenta indicadores que comparam a porcentagem das falhas encontradas durante a execução de testes automatizados de interface em relação à quantidade de falhas reportadas pelos clientes do Sienge. Entretanto, podemos concluir que sem a existência dos testes, o numero de falhas reportadas por clientes duplicaria na quantidade. Outro fator positivo são os indicadores mantidos como histórico de erros. Como uma das metas da equipe de desenvolvimento é estipulada a partir da média semanal de falhas reportadas por clientes, obtivemos uma melhoria de 58% em relação ao quadro de falhas existente em setembro de 2013. Em paralelo, o Gráfico 3 apresenta o número de erros em estoque, erros que ainda não foram corrigidos, que baixou 96% dentro do período de 15 meses. O que parecia ser um grande desafio foi sendo minimizado com o passar do tempo, e a uma velocidade extremamente rápida, mesmo a equipe de desenvolvimento não recebendo o reforço de novos desenvolvedores. 40 Gráfico 3 - Estoque de erros 160 140 120 100 80 60 40 20 0 set/13 out/13 nov/13 dez/13 jan/14 fev/14 mar/14 abr/14 mai/14 jun/14 jul/14 ago/14 set/14 out/14 nov/14 Fonte: Documentação interna de testes da empresa Softplan (2014). 41 7 CONCLUSÃO A existência de testes automatizados se tornou uma pratica efetiva pra melhorar a qualidade dos sistemas de software, mas desde que estes testes sejam também de qualidade. O código fonte dos testes precisa ser legível, organizado de acordo com o padrão de código utilizado no projeto e ter um excelente desempenho. Para isso, o teste necessita ser implementado com a mesma atenção e cuidado do sistema principal. A utilização dos testes deve ser prioritária durante o desenvolvimento do sistema. Devem ser implementados o mais breve possível, pois quanto mais rápido for o feedback da execução dos testes, mais rápida e barata será a tarefa de correção. Um projeto para ser de qualidade não deve ser de responsabilidade apenas de alguns desenvolvedores da equipe. A qualidade deve ser disseminada entre todos os indivíduos envolvidos, todos devem ser responsáveis por ajudar no que estiver ao seu alcance para a elaboração de um software de alto nível. Com essa cultura, coordenadores, analistas, programadores, testadores e usuários finais devem contribuir para a elaboração de testes efetivos que validem as regras do negócio do sistema. Quando trabalhamos com a manutenção corretiva de sistemas legados, temos consciência que estamos em ciclos mais curtos para a entrega da versão, e a automação de testes torna-se primordial pra a garantia da qualidade do software. Finalizando, o fato da automação de testes só pode ser obtido a partir de critérios da necessidade do sistema, pois os fatores de funcionalidades influenciam na decisão do tipo de testes a ser utilizado. A intenção deste trabalho foi apresentar os desafios e características voltadas à automação de testes durante o ciclo de manutenção corretiva de sistemas legados, que aponta ser uma das principais tendências na área de testes de software. 42 REFERÊNCIAS BINDER, Robert. Testing Object-Oriented Systems: Models, Patterns, and Tools. Boston: Paperback, 1999. CRISPIN, Lisa, GREGORY, Janet. Agile Testing: A Practical Guide for Testers and Agile Teams. Boston: Addison-Wesley Professional, 2009. ENGEBRETSON, Patrick. The Basics of Hacking and Penetration Testing: Ethical Hacking and Penetration Testing Made Easy. Texas: Syngress, 2011. FOWLER, Martin. et al. Refactoring: Improving the Design of Existing Code. Boston: Addison-Wesley Professional, 1999. GOUCHER, Adam, RILEY Tim. Beautiful Testing: Leading Professionals Reveal How They Improve Software. New York: O'Reilly Media, 2009 GRAHAM, Dorothy, FEWSTER, Mark. Experiences of Test Automation: Case Studies of Software Test Automation. Boston: Addison-Wesley Professional, 2012. HORCH, John W. Practical Guide to Software Quality Management. Massachusetts: Paperback, 2003. KOSCIANSKI, Andre. Qualidade de Software: Aprenda as Metodologias e Técnicas mais Modernas para o Desenvolvimento de Software. 2. ed. São Paulo: Novatec, 2007. MOLINARI, Leonardo. Inovação e automação de testes de software. 2. ed. São Paulo: Érica Ltda., 2011. MYERS, Glenford J. The Art of Software Testing. 3. ed. New Jersey: John Wiley & Sons, Inc., 2011. PRESSMAN, R. S. Software engineering: a practitioner's approach. 7. ed. New York: McGraw-Hill, 2010.