Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
Teste de Software Aula 1: Importância do teste de software Antes de definirmos o que é teste de software vamos definir o conceito de teste: Operação técnica que consiste em determinar se uma ou mais características de um dado produto, processo ou serviço estão de acordo com um procedimento especificado (ISO/IEC 1991). Agora, vamos definir o conceito de teste de software. Existem diversas definições para testes de software: Avaliar se o software está fazendo o que deveria fazer, de acordo com os seus requisitos, e não está fazendo o que não deveria fazer; Processo de executar um programa ou um sistema com a intenção de encontrar defeitos (teste negativo) (Glen Myers – 1979); Qualquer atividade que, a partir da avaliação de um atributo ou capacidade de um programa ou sistema seja possível determinar se ele alcança os resultados desejados. (Bill Hetzel – 1988). Importância do teste de software Segundo Pressman, o teste de software é um conjunto de atividades que podem ser planejadas com antecedência e executadas sistematicamente. Por esta razão deverá ser definido um processo de teste de software e um modelo (template) para o teste. Uma estratégia de teste de software deve acomodar testes de baixo nível, necessários para verificar se um pequeno segmento de código fonte foi implementado corretamente, bem como testes de alto nível, que validam as funções principais do sistema de acordo com os requisitos do cliente. Existem muitas estratégias de teste de software propostas, e todas fornecem um modelo para o teste e têm basicamente as seguintes características genéricas: Para executar um teste eficaz, proceder a revisões técnicas eficazes. Fazendo isso, muitos erros serão eliminados antes do começo do teste; O teste começa no nível do componente e progride em direção à integração do sistema computacional como um todo; Diferentes técnicas de teste são apropriadas para diferentes abordagens de engenharia de software e em diferentes pontos no tempo; O teste é feito pelo desenvolvedor do software e (para grandes projetos) por um grupo independente de teste; O teste e a depuração são atividades diferentes, mas a depuração deve ser associada a alguma estratégia de teste. Uma estratégia de software deverá fornecer diretrizes para o profissional de teste e uma série de metas para o gerente. Emerson Rios nos dá uma visão histórica da execução dos testes de software: Demonstração – década de 70 Garantir que o produto funcione; Testes feitos pelos desenvolvedores; Detecção – década de 80/90 Garantir que o produto atenda aos requisitos; Testes feitos petos desenvolvedores e usuários; Prevenção – década de 90/00 Garantir que o produto funcione, atenda aos requisitos e não tenha defeitos; Testes executados através de processos de teste; Testes feitos pelos desenvolvedores, usuários e testadores. ATENÇÃO Segundo Hallpern e Santhanam, os planejadores de projetos de desenvolvimento de sistemas devem considerar de 50 % a 75% do custo de desenvolvimento para as atividades de garantir que os programas funcionarão satisfatoriamente nos termos de suas especificações funcionais e não funcionais e dentro do ambiente estabelecido na entrega, através do processo apropriado de depuração, testes e atividades de verificação. O Processo de Teste de Software O processo de teste de software deve se basear em uma metodologia aderente ao processo de desenvolvimento, com pessoal técnico qualificado, ambiente e ferramentas adequadas. Esta metodologia de teste deve ser o documento básico para organizar a atividade de testar aplicações no contexto da empresa. Assim como o processo de desenvolvimento de software, o teste de software também possui um ciclo de vida: Planejamento Elaboração e revisão da Estratégia de teste e do plano de teste. Procedimentos Iniciais Consiste na elaboração de documento com o estabelecimento de um acordo entre as partes envolvidas no projeto de teste (usuário, representantes do desenvolvimento, testes e produção) para a definição dos seguintes assuntos: Objetivo do projeto de teste; Pessoal a ser envolvido; As responsabilidades de cada um; O plano preliminar de trabalho; Avaliação dos riscos; Os níveis de serviços acordados e qualquer item considerado irrelevante. Especificação Elaboração e revisão dos casos de teste, “scripts” ( no caso de ferramentas de automação de testes) e dos roteiros de Teste e execução dos testes de verificação da documentação do sistema (testes estáticos). Execução Execução dos testes planejados, conforme os Casos de Teste, “scripts” e dos roteiros de Teste com os correspondentes registros dos resultados obtidos. Entrega Conclusão do processo de testes, com a entrega do sistema para o ambiente de produção. Preparação Preparação do ambiente de teste, incluindo equipamentos, rede, pessoal, software e ferramentas. Revisão das Etapas de Desenvolvimento de um Software Segundo Pressman, um modelo genérico de desenvolvimento de software estabelece cinco atividades metodológicas: Comunicação Início do projeto; Levantamento das necessidades; Planejamento Estimativas; Cronograma; Acompanhamento; Modelagem Análise; Projeto; Construção Entrega; Suporte; Feedback; Entrega Entrega; Suporte; Feedback; Estas atividades podem estar caracterizadas por diferentes fluxos de processo 1 . 1 Como são organizadas as atividades metodológicas, bem como as ações e tarefas que ocorrem dentro de cada atividade em relação à sequência e ao tempo. (Pressman) Como já falamos anteriormente, o processo de teste de software deve se basear em uma metodologia aderente ao processo de desenvolvimento. A imagem abaixo mostra como o ciclo de vida do projeto de teste deve interagir com o ciclo de vida do projeto de desenvolvimento. Verificação Nesta etapa são realizadas inspeções/revisões dos produtos gerados. Teste Unitário São realizados no estágio mais baixo da escala de testes e aplicados nos menores componentes de códigos criados, visando garantir que estes atendam às especificações em termos de garantia e de funcionalidade. Verificam o funcionamento de um pedaço do sistema ou software isoladamente ou que possam ser testados separadamente. Normalmente é feito pelos desenvolvedores. Teste de Integração São executados em uma combinação de componentes para verificar se eles funcionam corretamente juntos, conforme as especificações. Componentes podem ser pedaços de código, módulos, aplicações distintas e clientes servidores. Normalmente é feito pelos desenvolvedores. Teste de Sistema São realizados pela equipe de testes, visando a execução do sistema como um todo ou um subsistema (parte de um sistema), dentro de um ambiente operacional controlado, para validar a exatidão e a perfeição na execução de suas funções. Neste estágio de teste, deve ser simulada a operação normal do sistema, sendo testadas todas as suas funções da forma mais próxima possível do que irá ocorrer no ambiente de produção. Esses testes são feitos pela equipe de teste de software. Teste de Aceitação São os testes finais de execução do sistema realizados pelos usuários, visando verificar se a solução atende aos objetivos do negócio e aos seus requisitos no que diz respeito à funcionalidade e à usabilidade, antes da sua utilização no ambiente de produção. Há muitas estratégias que podem ser utilizadas para testar um software. Uma das estratégias de teste, a preferida pela maioria das equipes, é a visão incremental do teste, começando com o teste das unidades individuais de programa, passando para os testes destinados a facilitar a integração de unidades e culminando com testes que usam o sistema concluído. Ao tratar os testes como um processo organizado e muitas vezes paralelo e integrado ao processo de desenvolvimento, os custos de manutenção serão reduzidos. Segundo Myers, o custo de correção de defeitos tende a aumentar quanto mais tarde o defeito é detectado. Defeitos encontrados durante a produção tendem a custar muito mais do que defeitos encontrados em modelos de dados e em outros documentos do projeto do software. Myers afirma ainda que: Os testes unitários podem remover entre 30% e 50 % dos defeitos dos programas; Os testes de sistemas podem remover entre 30% e 50% dos defeitos remanescentes; Desse modo, os sistemas podem ir para a produção ainda com aproximadamente 49% de defeitos; Por últimos, as revisões de códigos podem reduzir entre 20% e 30% desses defeitos. Tipos de testes de software Apresentamos abaixo uma relação de testes, com suas respectivas definições. Nas próximas aulas iremos estudar alguns testes descritos aqui em detalhes. Vocês irão perceber que alguns tipos de testes se sobrepõem, sendo as próprias definições abrangentes ou específicas, conforme a sua execução: Teste Funcional Verifica a aceitação das funcionalidades (dados, processamento e respostas) e a implementação apropriada das regras de negócio. Este tipo de teste é baseado nas técnicas de caixa-preta. Teste de Volume Submete grandes quantidades de dados ao sistema para determinar quais limites que causam a falha do software são alcançados. Este tipo de teste também identifica a carga ou volume máximo persistente que o sistema pode suportar por um dado período. Teste de Segurança Verifica as restrições de acesso em nível de aplicação e sistema. Teste de Acessibilidade Verifica se a interface do usuário fornece o acesso apropriado às funções do sistema e a navegação adequada. Este teste garante que os objetos dentro da interface do usuário funcionem de acordo com os padrões definidos pelos requisitos. Teste de Usabilidade Verifica a facilidade que o software possui de ser claramente entendido e facilmente operado pelos usuários. Teste de Estresse Verifica o comportamento do sistema durante condições limite ou fora da tolerância esperada. Tipicamente envolve a escassez de recursos ou a concorrência por recursos. Teste de Regressão Verifica se alterações efetuadas em um software geraram alguma inconsistência no aplicativo ou em outros sistemas que se relacionam com ele. Teste de Integridade Avalia a robustez dos componentes do software (resistência a falhas) e a compatibilidade técnica em relação à linguagem, à sintaxe e à utilização de recursos. Esse teste é implementado e executado em vários componentes do software, individualmente e de forma integrada. Teste de Estrutura Avalia a adequação dos componentes do software em relação ao seu design e à sua formação. Em geral, esse teste é realizado em aplicativos habilitados para a Web, garantindo que todos os links estejam conectados, que o conteúdo apropriado seja exibido e que não haja conteúdo órfão. Teste de Desempenho Mede e avalia o tempo de resposta, o número de transações e outros requisitos sensíveis ao tempo, com carga normal e carga limite de trabalho. Teste de Carga Mede e avalia as variações de desempenho e a sua habilidade de continuar funcionando apropriadamente sob cargas de trabalho diferentes. Teste de Contenção Verifica a habilidade de um componente de software em suportar demanda múltipla por um recurso (registros de dados, memória etc.). Teste de Perfil de Desempenho Verifica o perfil de desempenho dos componentes de software, a fim de identificar gargalos de desempenho e processos ineficientes. São monitorados o fluxo de execução, o acesso a dados e as chamadas de função. Teste de Configuração Verifica a operação do sistema em diferentes configurações de software e hardware. As especificações de hardware e software podem mudar e esta mudança pode afetar o sistema. Teste de Instalação Possui dois propósitos: Garantir que o software possa ser instalado (completamente, de forma personalizada ou atualizado) sob condições apropriadas; Verificar que, uma vez instalado, o software funciona corretamente. Plano de Teste Dependendo do tamanho do projeto de desenvolvimento, poderemos ter diversos planos de teste para um mesmo projeto de teste de software. Esses planos podem ser separados por módulos, funcionalidades ou por requisitos, ou por um grupo de cada um destes elementos. Podem ser também classificados por nível de teste: unitário, integração, sistema e aceitação. Segundo a IEEE829, o Plano de teste deve ter os seguintes campos: 1. Introdução 1.1. Identificador do plano de teste 1.2. Escopo 1.3. Referências 1.4. Nível na sequência de teste 1.5. Classe de teste e visão das condições de teste 2. Detalhes para este nível do plano de teste 2.1. Itens de teste e seus identificadores 2.2. Matriz de rastreabilidade do teste 2.3. Funcionalidades a serem testadas 2.4. Funcionalidades que não serão testadas 2.5. Abordagem do teste 2.6. Critérios de liberação/falha dos itens 2.7. Requisitos de suspensão e retomada 2.8. Entregas do teste 3. Gerência de teste 3.1. Tarefas do teste 3.2. Necessidades de ambientes 3.3. Responsabilidades 3.4. Integração entre as partes envolvidas 3.5. Recursos e sua alocação 3.6. Treinamento 3.7. Cronograma, estimativas e custos 3.8. Riscos e contingências 4. Geral 4.1. Procedimentos de garantia de qualidade 4.2. Métricas 4.3. Cobertura do teste 4.4. Glossário 4.5. Procedimentos de alteração do documento e histórico Para detalhamento do Plano de teste proposto pelo IEEE acesse: Plano de teste detalhado. Bugs, Erros e Defeitos. Segundo Pressman, o objetivo geral do controle de qualidade de software e da gestão da qualidade é eliminar problemas de qualidade no software. Tais problemas são conhecidos por diversos nomes: bugs, falhas, erros ou defeitos. Neste contexto, um erro é definido como um problema de qualidade encontrado antes do software ser liberado aos usuários finais. O defeito é um problema de qualidade encontrado depois de o software ter sido liberado aos usuários finais. Porém, na maioria das vezes os termos são utilizados como sinônimos devido à dificuldade de classificação dos termos. A Associação Latino Americana de Testes de Software (ALATS) é uma associação sem fins lucrativos, que busca divulgar as boas práticas em Teste de Software. Temos como propósito suportar a comunidade de testes, valorizando o desenvolvimento técnico e científico de novos métodos e processos, visando aumento na produtividade e a melhoria da qualidade dos produtos desenvolvidos. Buscamos uma maior integração entre as universidades, empresas e profissionais de TI, facilitando o desenvolvimento e aplicação de técnicas para atender a atual demanda e necessidades do mercado de Testes de Software. Com as constantes mudanças que vivemos no mundo atual, devemos ser ágeis, com baixo custo e efetivos em nossos resultados. Visão do ISTQB Continuamente melhorar e avançar a profissão de testes de software definindo e mantendo um corpo de conhecimento que permite que os testadores a serem certificados possuam uma base nas melhores práticas, que une a comunidade de teste de software internacionalmente, e incentivar a pesquisa. Qual é o objetivo do teste de estresse? Verificar o comportamento do sistema durante condições limite ou fora da tolerância esperada. Qual é o objetivo do teste de integração? Verificar se todos os componentes do sistema funcionam corretamente juntos. Qual é o objetivo do teste de regressão? Verificar se alterações efetuadas em um software geraram alguma inconsistência no aplicativo ou em outros sistemas que se relacionem com ele. Aula 2: Teste no projeto de sistema e Teste no programa – Depuração Revisões Técnicas À medida que os softwares são desenvolvidos, é possível que ocorram erros. As revisões técnicas são o mecanismo mais efetivo para descobrir erros antes que sejam passados para os usuários finais. Por isso são utilizadas logo no início do Processo de Gestão De Qualidade. Por que são importantes? Ao se descobrir um erro logo no início do processo, fica menos caro corrigi-lo. Temos que levar em consideração também que os erros podem aumentar à medida que o processo continua. Um erro relativamente insignificante, sem tratamento no início do processo, pode ser ampliado e se transformar em um conjunto de erros graves para a sequência do projeto. As revisões minimizam o tempo devido à redução do número de reformulações que serão necessárias ao longo do projeto. Impacto dos Defeitos de Software nos Custos No contexto de gestão de qualidade, os termos defeito e falha são sinônimos. Ambos implicam em um problema de qualidade que é descoberto depois de o software ter sido liberado para os usuários finais. Muitas vezes o termo erro é utilizado para indicar um problema de qualidade que é descoberto antes do software ser liberado ao usuário final. Utilizamos as revisões técnicas para encontrar erros durante o processo de desenvolvimento, de modo a não se tornarem defeitos depois da liberação do software. A descoberta precoce de erros, evita que sejam propagados para a próxima etapa na gestão da qualidade. Segundo Pressman, diversos estudos e análise sobre o tema indicam que as atividades de projeto introduzem de 50 a 60% de todos os erros durante a gestão da qualidade. Entretanto, técnicas de rescisão demonstraram ser até 75% eficazes na descoberta de falhas no projeto. ATENÇÃO Detectando e eliminando uni grande percentual desses erros, o processo de revisão reduz substancialmente o custo de atividades subsequentes na gestão de qualidade. Revisões Técnicas Formais (RTF) As revisões técnicas devem ser aplicadas com um nível de formalidade apropriado para o produto a ser construído, a cronologia do projeto e as pessoas que estão realizando o trabalho. A formalidade do processo de revisão é relacionada a fatores como a maturidade do processo de desenvolvimento, requisitos legais e reguladores ou a necessidade de acompanhamento de auditoria. O modo como uma revisão é conduzida depende do seu objetivo (ex: encontrar defeitos, obter compreensão, discussão ou decisões por um consenso). A imagem apresenta um modelo de referência para revisões técnicas, onde são identificadas quatro características que contribuem para a formalidade na qual uma revisão é conduzida. As revisões técnicas formais (RTF) são realizadas por engenheiros de software e outros profissionais e tem como objetivo: Descobrir erros na função, lógica ou implementação para qualquer representação de software; Verificar se o software que está sendo revisado atende aos requisitos; Garantir que o software foi representado de acordo com os padrões predefinidos; Obter software que seja desenvolvido de maneira uniforme; Tornar os projetos mais gerenciáveis. Servem ainda como base de treinamento, possibilitando que engenheiros mais novos observem diferentes abordagens para análise, projeto e implementação de software. Regras das Revisões Técnicas Formais Uma revisão formal normalmente tem as seguintes fases principais: Planejamento: Selecionar a equipe, alocar as funções, definir os critérios de entrada e de saída para os diversos tipos de revisão formal (ex: inspeção), e selecionar quais as partes dos documentos serão vistos. Kick-off: Distribuir os documentos, explicar os objetivos, processos e documentos para os participantes; e checar os critérios de entrada (para os diversos tipos de revisão). Preparação individual: Trabalho feito antecipadamente por cada participante da reunião de revisão, tomando nota dos defeitos em potenciais, questões e comentários. Retrabalho: Resolver defeitos encontrados. Atividade tipicamente realizada pelo autor. Acompanhamento: Checar se os defeitos foram encaminhados, obtendo métricas e checando o critério de saída (para certos tipos de revisões formais). Diretrizes das Revisões Técnicas Formais Devem ser estabelecidas previamente diretrizes para a realização das revisões técnicas formais e distribuídas a todos os revisores. Uma revisão não controlada pode ser pior do que não fazer nenhuma revisão. Revisar o produto, não o produtor; Estabelecer uma agenda e mantê-la; Limitar debates e refutação; Enunciar as áreas do problema, mas não tentar resolver todo o problema registrado; Tomar notas; Limitar o número de participantes e insistir na preparação antecipada; Desenvolver uma lista de verificação para cada artefato que provavelmente será revisado; Alocar os recursos e programar o tempo para as RTFs; Realizar treinamento significativo para todos os revisores; Revisar revisões iniciais. Diferentes tipos de revisão podem ser utilizados em um único tipo de documento. Seja uma revisão de acompanhamento (walkthrough), uma revisão técnica ou uma inspeção, cada RTF é realizada como uma reunião e apenas será bem-sucedida se for apropriadamente planejada, controlada e tiver a participação de todos os envolvidos. Cada reunião de revisão deve ser preparada antecipadamente, porém não deve tomar mais que duas horas de trabalho de cada pessoa. Devem estar envolvidas de 3 a 5 pessoas em uma revisão e cada reunião de revisão deve ser pelo menos de duas horas. Durante a RTF, um revisor registra ativamente todos os problemas levantados. Estes são sintetizados no final da reunião de revisão e é produzida uma lista de problemas de revisão, além do relatório sintetizado da revisão técnica formal. Normalmente o relatório sintetizado é um formulário de uma página, cujo anexo é a Lista de problemas de revisão. O relatório sintetizado de revisão deve responder a três questões: Teste No Programa: Processo De Depuração Como já vimos anteriormente, teste de software é um processo que pode ser sistematicamente planejado e especificado. Podem ser projetados casos de tese, uma estratégia pode ser definida e os resultados podem ser avaliados de acordo com as expectativas prescritas. Neste contexto, o processo de depuração frequentemente ocorre em consequência de um teste. Quando um caso de teste descobre um erro, a depuração será o processo que irá resultar na remoção do erro. A depuração começa com a execução de um caso de teste. Os resultados são avaliados e uma falta de correspondência entre o desempenho esperado e o desempenho real é encontrada. Em muitos casos, os dados não correspondentes são um sintoma de uma causa subjacente, embora oculta. O Processo de depuração tenta combinar o sintoma com a causa, Levando assim à correção do erro. Normalmente apresentará um dentre dois resultados: A causa será encontrada e corrigida; A causa não será encontrada. Abordagens de Depuração Independente da abordagem adotada, a depuração tem um objetivo primordial, que é encontrar e corrigir a causa de erro ou defeito, Segundo Delamaro, Maldonado e Gino, vários experimentos foram desenvolvidos com o objetivo de entender o processo de depuração de software e estabelecer um modelo de depuração. Um destes modelos é o modelo genérico de depuração chamado de Hipóteses-Validação. O modelo define a atividade de depuração como um processo interativo de síntese, verificação e refinamento de hipótese. Neste modelo o responsável pela depuração do software estabelece hipóteses com relação à localização do defeito e à modificação para corrigir o programa. O processo de depuração é guiado pela cerificação e pela refutação das hipóteses levantadas, bem como pela geração de novas hipóteses e refinamentos das já existentes. Já segundo Pressman, o objetivo da depuração é alcançado por uma combinação de avaliação sistemática, intuição e sorte, sendo definidas basicamente três estratégias de depuração: Força bruta É o método mais comum e menos eficiente para isolar a causa de um erro de software. Usamos este método quando todas as outras técnicas falharam. A ideia é utilizarmos diferentes ações como, por exemplo, rastreamentos em tempo de execução, para que, com as informações obtidas, consigamos encontrar um indicio que possa levar à causa do erro. Rastreamento (backtracking) Começa no ponto onde o sintoma foi descoberto, o código fonte é investigado retroativamente (manualmente) até que a causa seja encontrada. O problema desta abordagem está no fato de que, à medida que o número de linhas do código fonte aumenta, o número de caminhos retroativos potenciais pode se tornar demasiadamente grande. Eliminação da causa Esta estratégia é realizada através da indução ou dedução e introduz o conceito de particionamento binário. Os dados relacionados com a ocorrência do erro são organizados para isolar as causa em potenciais. E imaginada uma “hipótese de causa” e os dados são usados para provar ou negar a hipótese. Alternativamente é preparada uma lista de todas as causas possíveis e são conduzidos os testes para eliminar cada uma delas. As três estratégias de depuração utilizadas podem ser conduzidas manualmente, mas existem ferramentas de depuração automatizadas que podem tornar o processo muito mais eficaz? Essas ferramentas proporcionam auxilio automático para aqueles que devem depurar problemas de software. O objetivo é fornecer informações que podem ser difíceis de obter se o processo de depuração for abordado manualmente. Muitas ferramentas são específicas quanto à Linguagem de programação e quanto ao ambiente: Borland Gauntlet, www.borland.com ; GNATS, www.gnu.org/software/gnats ; C++Test, www.parasoft.com ; Coverty Prevent SQS,www.coverty.com (java e C++). Considerações Psicológicas É possível observar uma grande variação na habilidade de depuração entre programadores com o mesmo nível de formação e experiência. Parece haver certa evidência de que a destreza na depuração é uma peculiaridade humana inata. O que nos leva a crer que algumas pessoas são boas em depuração e outras não, já que muitas vezes o processo é intuitivo e já que trabalha com hipóteses. Além do aspecto humano, algumas características dos erros também ajudam a dar complexidade ao processo: O sintoma e a causa do defeito podem ser geograficamente remotos. Isto é, o sintoma pode aparecer em uma parte do programa, enquanto a causa pode realmente estar localizada em um ponto muito afastado; O sintoma pode desaparecer (temporariamente) quando outro erro for corrigido; O sintoma pode ser na realidade, causado por não erros (por exemplo, imprecisões de arredondamento); O sintoma pode ser causado por erro humano, que não é facilmente rastreável; O sintoma pode ser um resultado de problemas de temporização e não de problemas de processamento; Pode ser difícil reproduzir com precisão as condições de entrada (por exemplo, uma aplicação em tempo real na qual a ordem das entradas é indeterminada); O sintoma pode ser intermitente. Isso é particularmente comum em sistemas embutidos que acoplam hardware e software inextricavelmente 2 ; O sintoma pode ocorrer devido às causas distribuídas por várias tarefas, executando em diferentes processadores. 2 Que não se pode desenredar ou desemaranhar ou de que não é possível desembaraçar. Fonte: http://www.dicio.com.br Correção do Erro Segundo Pressman, uma vez encontrado o erro, ele precisa ser corrigido. A correção de um defeito pode introduzir outros erros e, portanto, causar mais danos do que trazer benefícios. Segundo Van Vleck, três perguntas devem ser feitas antes de fazer a “correção” que remove a causa de um defeito: A causa do defeito é reproduzida em alguma outra parte do programa? Em muitas situações o defeito de um programa é causado por um padrão incorreto de lógica que pode ser reproduzido em qualquer outro ponto. Qual é o próximo defeito que pode ser introduzido pelo reparo que estou prestes a fazer? Em muitas situações o defeito de um programa é causado por um padrão incorreto de lógica antes de fazer a correção, o código-fonte deverá ser avaliado para verificar acoplamento de lógica e estruturas de dados. Se a correção tem que ser feita em uma parte do programa altamente acoplada, deve ser tomado cuidado especial ao fazer qualquer alteração. A causa do defeito é reproduzida em alguma outra parte do programa? Se você corrige o processo juntamente com o produto, o erro será removido do programa em questão e pode ser eliminado em todos os programas futuros. Qual o objetivo do processo de depuração de software? Localização e remoção de defeitos. Segundo Pressman, quais são as três estratégicas normalmente utilizadas na depuração? Força Bruta, rastreamento e eliminação da causa. Quais as fases do ciclo de vida do software a depuração pode ocorrer? Durante a codificação, depois do teste e durante a manutenção. Aula 3: Teste no programa: Teste de caixa branca e teste da caixa-preta Testes de Caixa branca e preta Os produtos de software podem ser testados através de duas visões: Conhecendo-se a função específica para o qual o produto foi projetado para realizar; Conhecendo-se como é o trabalho interno de um produto; Quando conhecemos a função específica de um software e realizamos teste que demonstrem que cada função está plenamente operacional, e ao mesmo tempo, procurem erros em cada função, dizemos que estamos realizando teste de caixa preta. Este tipo de teste é conduzido na interface do software e examina aspectos fundamentais do sistema, pouco se preocupando com a estrutura interna do software. Quando sabemos como é o trabalho interno do software e realizamos testes para garantir que as operações internas foram adequadamente exercitadas, estamos realizando teste de caixa-branca. Este tipo de teste é baseado em um exame rigoroso do detalhe procedimental e dos caminhos lógicos internos do software. Teste De Caixa-branca O teste de caixa branca, segundo Pressman também chamado de teste de caixa-de-vidro, utiliza a estrutura de controle descrita no programa para derivar os casos teste. São baseados nos elementos internos de um trecho de programa. O objetivo é encontrar o menor número de casos de teste que permita que todos os comandos de um programa sejam executados pelo menos uma vez. Os casos de teste são determinados a partir das estruturas de controle do programa e desta forma forçar que todos os caminhos possíveis do fluxo de controle do programa sejam percorridos durante os testes. Desta forma é possível criar casos de teste que: Garantam que todos os caminhos independentes de um módulo foram exercitados pelo menos uma vez; Exercitam todas as decisões lógicas nos seus estados verdadeiros e falsos; Executam todos os ciclos em seus limites e dentro de suas fronteiras operacionais; Exercitam estruturas de dados internas para assegurar sua validade. Existem diferentes tipos de testes de caixa branca que podem ser subdivididos em: Teste De Caminho Básico O teste de caminho básico permite ao projetista de casos de teste derivar uma medida da complexidade lógica de um projeto procedimental e usar essa medida como guia para definir um conjunto de base de caminhos de execução. O passo inicial é determinar todos os caminhos possíveis. Normalmente utiliza-se um grafo de fluxo de controle do programa. O gráfico permite identificar os caminhos possíveis para que se possa elaborar os casos de uso. Como cada caminho é definido pelas expressões condicionais das estruturas de controle, devem-se determinar os casos de teste escolhendo valores de variáveis para os casos nos quais cada uma das expressões sejam verdadeiras ou não. Os seguintes passos podem ser aplicados: Usando o projeto ou o código como base, desenhar o grafo de fluxo correspondente; Determinar a complexidade ciclomática do diagrama de fluxo resultante; Determinar um conjunto base de caminhos linearmente independentes; Preparar casos de teste que vão forçar a execução de cada caminho do conjunto base. A Complexidade Ciclomática é uma métrica de software que proporciona uma medida quantitativa da complexidade lógica de um programa. Quando usado no contexto do método de teste do caminho básico, o valor computado da complexidade ciclomática define o número de caminhos independentes do conjunto básico de um programa e oferece-nos um limite máximo para o número de testes que deve ser executado para garantir que todas as instruções são executadas pelo menos uma vez. Teste de Condição O teste de condição, segundo Pressman, é um método de projeto de caso de teste que exercita as condições lógicas contidas em um módulo de programa: Uma condição simples é uma variável booleana ou uma expressão relacional, possivelmente precedida por um operador NOT; Uma condição composta é formada por duas ou mais condições simples, operadores booleanos e parênteses. Este tipo de teste foca o teste de cada condição no programa para garantir que ele não contenha erros. Teste De Fluxo de Dados Este método seleciona caminhos de teste de um programa de acordo com as localizações de definições e usos de variáveis no programa. São úteis para selecionar caminhos de teste de um programa que contenha instruções de laços e if aninhadas. Uma vez que as instruções de um programa relacionam-se entre si de acordo com as definições e usos de variáveis, a abordagem de teste de fluxo de dados é eficiente para a proteção contra erros. Teste De Ciclos Este tipo de teste focaliza exclusivamente a validade das construções de ciclo, já que são em sua grande maioria a base da maioria dos algoritmos implementados. Podem ser definidos quatro tipos diferentes de classes de ciclos: Ciclos Simples O seguinte conjunto de testes pode ser aplicado a ciclos simples, onde n é o número máximo de passadas permitidas através do ciclo: Pular o ciclo completamente; Uma passagem pelo ciclo; Duas passagens pelo ciclo; m passagens pelo ciclo em que m < n; n -1, n , n +1 passagens pelo ciclo. Ciclos Aninhados Esta abordagem testa se os ciclos mais internos que são aplicados à abordagem de ciclos simples e os outros ciclos externos permanecem com o valor mínimo. Para evitar que o número de testes cresça geometricamente, deve-se seguir a seguinte abordagem: (PRESSMAN, 2006; BEIZER, 1990). Começar testando o ciclo mais interno, ajustando os outros ciclos para valores mínimos; Trabalhar em direção ao exterior, conduzindo testes para o ciclo seguinte, mas mantendo todos os ciclos externos nos valores mínimos e os internos nos valores “típicos”; Continuar até que todos os ciclos sejam testados. Ciclos Concatenados Ciclos concatenados podem ser testados usando a abordagem definida para ciclos simples se cada ciclo for independente do outro. No entanto, se dois ciclos forem concatenados e a contagem para o ciclo 1 for usado valor individual para o ciclo 2, então os ciclos não são independentes. Quando os ciclos não são independentes, é recomendada a abordagem aplicada a ciclos aninhados. (Pressman, 2011). Ciclos Desestruturados Segundo Pressman, sempre que possível essa classe de ciclos deverá ser redesenhada para refletir o uso das construções de programação estruturada. Embora o teste de caminho básico seja simples e altamente eficaz, ele sozinho não é suficiente. Normalmente utiliza-se uma combinação com os outros testes para ampliar a abrangência do teste e melhorar a qualidade dos testes de caixa branca. Teste De Caixa-preta O teste da caixa preta, também conhecido como teste comportamental, focaliza os requisitos funcionais do software. Este tipo de teste complementa o teste da caixa branca, pois permite descobrir uma classe de erros diferentes daquela obtida com métodos da caixa-branca. Os testes de caixa preta são realizados para responder as seguintes perguntas: Como a validade funcional é testada? Como o comportamento e o desempenho do sistema são testados? Que classes de entrada farão bons casos de teste? O sistema é particularmente sensível a certos valores de entrada? Como as fronteiras de uma classe de dados são isoladas? Que taxas e volumes de dados o sistema pode tolerar? Que efeito combinações específicas de dados terão sobre a operação do sistema? Desta forma o teste de caixa-preta tenta encontrar erros nas seguintes categorias: Funções incorretas ou faltando; Erros de interface; Erros em estruturas de dados ou acesso a bases de dados externas; Erros de comportamento ou de desempenho Erros de inicialização e término. Existem diferentes métodos de testes de caixa-preta que podem ser subdivididos em: Baseado Em Grafo O método de teste com base em grafos, leva em consideração os objetos modelados no software e as relações que unem estes objetos. A ideia é definir uma série de testes que verificam se os objetos têm a relação esperada uns com outros. Um grafo é uma coleção de nós que representam objetos, ligações que representam as relações entre objetos, peso de nó que descrevem as propriedades de um nó e pesos de ligação que descrevem alguma característica de uma ligação. A representação simbólica é mostrada na imagem. Existe uma série de métodos de testes comportamental que utilizam grafos: Modelagem de fluxo de transação: O nós representam passos em alguma transação, e as ligações representam a conexão lógica entre os passos. Modelagem de Estado Finito: Os nós representam diferentes estados observáveis pelo usuário do software e as ligações representam as transições que ocorrem para mover de um estado para outro. Modelagem de Fluxo de Dados: Os nós são objetos de dados e as ligações são as transformações que ocorrem para traduzir um objeto dados em outro. Modelagem de Tempo: São objetos de programa, e as ligações são conexões sequenciais entre aqueles objetos. Pesos de ligação são usados para especificar os tempos de execução necessários enquanto o programa é executado. Particionamento De Equivalência Neste método o domínio de entrada de um programa é divido em classes de dados a partir das quais podem ser criados casos de teste. Um caso de teste ideal descobre sozinho uma classe de erros (por exemplo, processamento incorreto de todos os dados de caracteres) que poderia de outro modo requerer que fossem executados muitos casos de teste até que o erro geral aparecesse. Classes de equivalência podem ser definidas de acordo com as seguintes regras: Se uma condição de entrada especifica um intervalo, são definidas uma classe de equivalência válida e duas classes de equivalência inválidas. Se uma condição de entrada requer um valor específico, são definidas uma classe de equivalência válida e duas classes de equivalência inválidas. Se uma condição de entrada especifica de um membro de um conjunto, são definidas uma classe de equivalência válida e uma classe de equivalência inválida. Se uma condição de entrada for booleana, são definidas uma classe válida e uma classe inválida. EXEMPLO: Um programa valida um campo numérico onde valores inferiores ou iguais a zero são rejeitados, valores entre 1 a 130 são aceitos, e valores maiores ou iguais a 131 são rejeitados. Neste caso: Partição inválida: Os valores abaixo do valor mínimo, ou seja, valores menores ou iguais a zero. Partição válida: Valores entre 1 a 130; Partição inválida: Valores acima do valor máximo, ou seja, valores maiores ou igual a 131; Análise De Valor-limite A análise do valor limite (boundary value analisys – BVA) é uma técnica que complementa o particionamento de equivalência, levando em consideração na construção dos casos de teste os valores limites das condições de entrada e saída. As diretrizes para o teste de análise de valor-limite são muito similares a técnica de particionamento de equivalência: Se uma condição de entrada especifica um intervalo limitado por valores a e b, deverão ser projetados casos de teste com valores a e b imediatamente acima e abaixo de a e b. Se uma condição de entrada especifica um conjunto de valores, deverão ser desenvolvidos casos de teste que usam os números mínimo e máximo. São testados também valores imediatamente acima e abaixo dos valores mínimos e máximos. Aplicar as diretrizes 1 e 2 às condições de saída. Se as estruturas de dados internas do programa prescreverem fronteiras, não esquecer de criar caso de teste para exercitar a estrutura de dados na fronteira. Por exemplo, uma tabela que tem um limite definido de 100 entradas. EXEMPLO: Um campo de entrada (imput field) referente a data do nascimento e que aceita como valores de 1900 até 2011, terá como valores limites: Valor limite mínimo inválido: 1899; Valor limite mínimo válido: 1900; Valor limite máximo válido:2011; Valor limite máximo inválido: 2012. Teste De Matriz Ortogonal O teste de matriz ortogonal pode ser aplicado a problemas nos quais o domínio de entrada é relativamente pequeno, mas muito grande para acomodar um teste exaustivo. O objetivo do teste é a construção de caso de teste com uma visualização geométrica associada aos valores de entrada de uma aplicação. Para ilustrar (Pressman, 2011) vamos considerar a função envie para uma aplicação de fax. Neste exemplo, são passados quatro parâmetros: P1, P2, P3 e P4. Cada parâmetro assume três valores discretos. P1 assume, por exemplo, os valores: P1=1, enviar agora; P1=2, enviar após 1 hora; P1=3, enviar depois da meia-noite; P2, P3 e P4 também assumiriam valores, 1, 2 e 3, significando outras funções de envio. Uma matriz ortogonal para a função envie da aplicação de fax está ilustrada ao lado. Qual é o conceito de teste de caixa-branca? Tem uma visão interna do software, isto é, conhecendo o funcionamento interno do produto. São métodos de teste de caixa-preta: Baseado em Grafo, particionamento de equivalência, análise do valor limite e análise ortogonal. O teste de condição é um teste que: Exercita as condições lógicas contidas em um módulo do programa e é considerado um teste de caixa-branca. Aula 4: Teste no programa: Teste de ambiente Web Conceito de Teste na Web A qualidade, segundo Pressman (2011) é incorporada a uma aplicação Web como consequência de um bom projeto. “Não se pode testar a qualidade. Se ela não estiver lá antes de você começar a testar, não estará lá quando você tiver terminado de testar.” (Pressman). A qualidade é incorporada ao software em todo o processo de engenharia de software. Conteúdo: É avaliado no nível semântico e sintático. No nível sintático examina-se a ortografia, pontuação e gramática. No nível semântico são verificadas a exatidão, consistência e ausência de ambiguidade das informações. Função: É testada para descobrir erros que indicam falta de conformidade com os requisitos do cliente. Estrutura: É avaliada para assegurar o fornecimento apropriado do conteúdo e função da aplicação. Que seja extensível e possa ser mantida à medida que novo conteúdo ou funcionalidade é adicionado. Usabilidade: É testada para garantir que cada categoria de usuário seja suportada pela interface. Navegabilidade: É testada para assegurar que toda a sintaxe e semântica de navegação sejam experimentadas para descobrir quaisquer erros de navegação. Desempenho: É testado sob uma variedade de condições de operação, configuração e carga para assegurar que o sistema responda à interação com o usuário e suporte cargas extremas sem degradação inaceitável de operação. Compatibilidade: É testada executando-se a aplicação em uma variedade de diferentes configurações hospedeiras tanto no lado cliente quanto no lado servidor. Interoperabilidade: É testada para garantir que a aplicação tenha uma interface adequada com outras aplicações e/ou bases de dados. Segurança: É testada para investigar vulnerabilidades potenciais e tentar explorar cada uma delas. Qualquer tentativa bem-sucedida de invasão é considerada falha de segurança. Processo de teste na web O processo de teste da aplicação web começa com testes que verificam o conteúdo e a funcionalidade da interface, posteriormente são verificados aspectos da arquitetura do projeto e da navegação da aplicação e finaliza com os testes que examinam os recursos tecnológicos. Podemos observar melhor o processo de teste na web através da figura abaixo, representado através de uma pirâmide, os elementos que são visíveis ao usuário, são testados em primeiro lugar. O fluxo do nosso processo de teste começa da esquerda para a direita e de cima para baixo, começando pelo teste de conteúdo, teste de interface, teste de navegação, de componente...e finalizando com os testes de configuração, desempenho e segurança. A estratégia para o teste de aplicações Web deve adotar os seguintes passos: O modelo de conteúdo é revisto para descobrir erros; O modelo de interface é revisto para garantir que todos os casos de uso possam ser acomodados; O modelo de projeto da aplicação é revisto para descobrir erros de navegação; A interface com o usuário é testada para descobrir erros nos mecanismos de apresentação e/ou navegação; Os componentes funcionais são submetidos a testes de unidade; É testada a navegação por toda a arquitetura; A aplicação Web é implementada em uma variedade de configurações ambientais diferentes e testada quanto à compatibilidade com cada configuração; São executados testes de segurança na tentativa de explorar vulnerabilidades na Aplicação ou em seu ambiente; São realizados testes de desempenho; A aplicação é testada por uma população de usuários finais controlados e monitorados e os resultados de suas interações com o sistema são avaliados quanto a erros de conteúdo e navegação, usabilidade, compatibilidade, segurança, confiabilidade e desempenho. Teste de Conteúdo O teste de conteúdo tenta descobrir erros antes que sejam encontrados pelos usuários. Ele combina tanto as revisões, já estudadas nas aulas anteriores, quanto à geração de casos de tese executáveis. Os testes de conteúdo têm três importantes objetivos: Descobrir erros de sintaxe; Descobrir erros de semântica; Encontrar erros na organização ou estrutura do conteúdo apresentado ao usuário final. Normalmente são usados verificadores automáticos de ortografia e gramática, porém, como muitos erros fogem à detecção pelas ferramentas, utiliza-se também um revisor humano. O revisor deverá responder as seguintes perguntas: As informações são precisas? As informações são concisas e direcionadas ao assunto? É fácil para o usuário entender o layout do objeto do conteúdo? As informações apresentadas são consistentes internamente e consistentes com as informações apresentadas em outros objetos de conteúdo? Foram fornecidas referências apropriadas para todas as informações derivadas de outras fontes? O conteúdo é ofensivo, confuso ou dá margem a litígio? O conteúdo desrespeita os direitos autorais existentes ou de marcas registradas? O conteúdo contém links que complementam o conteúdo existente? Os links estão corretos? O estilo estético do conteúdo está em conflito com o estilo estético da interface? Teste de interface com o usuário A verificação e a validação de uma interface de usuário ocorrem em três pontos distintos: Durante a análise Garantir que esteja de acordo com os requisitos do cliente; Durante o projeto Garantir que critérios genéricos de qualidade e que tópicos específicos foram tratados; Durante o teste Execução de tópicos específicos relativos à interação como usuário e fornece uma avaliação final da usabilidade. Tem como objetivo descobrir erros relacionados com os mecanismos específicos da interface e descobrir erros na maneira como a interface implementa as semânticas de navegação, as funcionalidades da aplicação ou ainda na exibição do conteúdo. Desta forma podemos distinguir basicamente quatro tipos de testes: Testes de mecanismos de interface: Avalia a interação de cada mecanismo oferecido ao usuário através da interface: Link, formulários, script executado pelo cliente, HTML dinâmico, janelas pop up, scripts CGI, conteúdo encadeado (streaming), cookies e mecanismos de interface específicos de aplicativos. Teste de semântica da interface: Avalia como o projeto se preocupa com os usuários, se oferece diretrizes claras, se fornece realimentação e se a aplicação mantém consistência de linguagem e abordagem através da interface. Teste de usabilidade: Avalia o grau com o qual os usuários podem interagir efetivamente com a aplicação e o grau em que a aplicação dirige as ações do usuário, ou seja, determina o grau com o qual a interface da aplicação facilita a vida do usuário. A imagem mostra um conjunto possível de “graus” de avaliação que podem ser selecionados. Teste de compatibilidade: Diferentes computadores, dispositivos de imagem, sistemas operacionais, navegadores e velocidades de conexão de rede podem ter influência significativa na operação da aplicação Web. Cada configuração de computador pode resultar em diferença nas velocidades de processamento no lado cliente, resoluções de tela e velocidades de conexão. Este tipo de teste procura descobrir possíveis problemas na utilização de diferentes configurações pelos usuários. Normalmente, procura-se utilizar as configurações mais usuais, já que seria muito complexo o teste de todas as configurações possíveis. Teste de Componente O teste de componente, também conhecido como teste de função, tem como objetivo tentar descobrir erros nas funções da aplicação Web. Cada uma destas funções é um componente de software que pode ser implementados através de diferentes linguagens e testados através de teste de caixa-preta ou ainda de caixa-branca, ambos já estudados. Cada caso de teste de componente especifica todos os valores de entrada e saída esperada a ser fornecida pelo componente. Em muitas situações, a execução correta de uma função da aplicação está ligada ao interfaceamento correto com um banco de dados que pode ser externo a aplicação, desta forma, o teste de banco de dados torna-se parte importante do teste de componente. Teste De Navegação O objetivo do teste de navegação é garantir que os mecanismos que permitem ao usuário navegar através da aplicação Web estejam todos em funcionamento e que, cada unidade semântica de navegação (NSU – navigation semantic unit) possa ser alcançada pela categoria apropriada de usuário. Desta forma, este tipo de teste abrange: Teste de sintaxe Segundo Pressman, neste tipo de teste os mecanismos de navegação são verificados para garantir que cada um execute sua função planejada e garantir que os erros sejam encontrados antes que a aplicação entre no ar: Links de navegação Cada link deverá ser testado para assegurar que o conteúdo ou a funcionalidade apropriada seja alcançado quando o Link for escolhido. Redirecionamentos Quando um usuário solicita uma URL não existente ou seleciona um link cujo conteúdo foi removido, é exibida uma mensagem para o usuário e a navegação é redirecionada para outra página. Os redirecionamentos deverão ser testados através de solicitações de Links externos incorretos e avaliando como a aplicação lida com estas solicitações. Mapas do site Como o mapa do site fornece uma tabela completa de conteúdo para todas as páginas da web, cada entrada deverá ser testada. Dispositivos de busca interna Muitas aplicações, devido a quantidade de informações existentes, implementam mecanismos de busca. Deverá ser testado o teste destes mecanismos para validar a precisão e a totalidade da busca. Marcadores de páginas (Booksmarks) Apesar de ser uma função do navegador, deverá ser testado para assegurar que possa ser extraído um título de página com significado quando o marcador for criado. Molduras e conjunto de molduras Cada moldura tem o conteúdo de uma página web específica. Um conjunto de molduras permite que várias páginas sejam exibidas ao mesmo tempo. O conjunto de molduras deverá ser testado quanto ao correto conteúdo, Layout, dimensionamento apropriados e quanto à compatibilidade com o navegador. Teste de semântica A unidade semântica de navegação (NSU) é definida como uma série de informações e estruturas de navegação relacionadas que colabora no atendimento a um subconjunto de requisitos de usuários relacionados. Desta forma, cada NSU pode ser exemplificada por um conjunto de caminhos de navegação que conectam nós de navegação (por exemplo, páginas Web, objetos de conteúdo ou funcionalidade), que permite ao usuário satisfazer requisitos específicos definidos por um ou mais casos de uso para uma categoria de usuário. Neste caso, o teste semântico deverá responder as seguintes perguntas: A NSU é atendida sem erro? Cada nó de navegação é acessível no contexto dos caminhos de navegação definidos para a NSU? Se a NSU pode ser atendida usando mais de um caminho de navegação, todos os caminhos relevantes foram testados? Se forem fornecidas instruções pela interface de usuário para ajudar na navegação, as instruções são corretas e inteligíveis à medida que a navegação ocorre? Existe algum mecanismo para voltar a um nó de navegação anterior e ao início do caminho de navegação? Se uma função é executada em um nó e ocorre um erro no processamento da função, a NSU pode ser completada? Todos os nós podem ser acessados do mapa do site? Os nomes dos nós têm significado para os usuários finais? DICA Os testes de navegação, bem com o teste de interface e de usabilidade, devem ser feitos além dos testados, também por diferentes clientes, sempre que possível! Teste de Configuração O objetivo do teste de configuração (Pressman, 2011) é testar um conjunto de prováveis configurações do cliente e do servidor para assegurar que a experiência do usuário seja a mesma em todos os casos e isolar erros que podem ser específicos a uma determinada configuração. Servidor No lado Servidor, os casos de teste de configuração são projetados para verificar se a configuração do servidor pode suportar a aplicação sem erro. Devem ser respondidas as seguintes perguntas: A aplicação é totalmente compatível com o sistema operacional do servidor? Os arquivos de sistema, diretórios e dados de sistema relacionados são criados corretamente quando a aplicação está operacional? As medidas de segurança permitem que a aplicação seja executada sem a interferência ou degradação do desempenho? A aplicação está adequadamente integrada com o software de banco de dados? Os scripts utilizados pela aplicação executam corretamente? Cliente No lado cliente, o teste de configuração foca a compatibilidade da aplicação com configurações dos seguintes componentes: Hardware: CPU, memória, armazenamento e dispositivo de impressão; Sistemas operacionais: Linux, Macintosh OS, Microsoft; Software Navegador: Firefox, Safari, Internet Explorer, Opera, Chrome; Componentes de interface de usuário: Active X, java Applets; Plug-ins: QuickTime, RealPlayer; Conectividade: Cabo, DSL, modem, WI-FI. Os testes de configuração do cliente devem ser projetados onde cada categoria de usuário será avaliada, para determinar as prováveis configurações que serão encontradas. Teste de Desempenho À medida que aumenta o número de usuários nas aplicações webApp, ocorre um aumento do número de transações online ou na quantidade de dados através das operações de download ou upload. É muito frustrante para um usuário quando uma aplicação leva muitos minutos para carregar o conteúdo ou quando recebe do servidor uma mensagem do tipo “servidor ocupado”. O teste de desempenho é usado para descobrir problemas de desempenho que podem resultar, por exemplo, da falta de recursos no lado do servidor, da largura da banda ou dos recursos de banco de dados inadequados. A intenção é entender como os sistemas respondem quando a carga aumenta e ainda reunir métricas que conduzirão a modificações de projeto para melhorar o desempenho Número de usuários, número de transações ou volume geral de dados. O teste de desempenho irá ajudar, neste caso, a responder as seguintes questões: O tempo de resposta do servidor degrada de forma a tornar-se inaceitável? Em que ponto, sob o ponto de vista dos usuários, transações ou cargas de dados, o desempenho se torna inaceitável? Quais componentes do sistema são responsáveis pela degradação do desempenho? Qual o tempo médio de resposta para usuários sob diferentes condições de carga? A degradação do desempenho tem um impacto sobre a segurança do sistema? A confiabilidade ou precisão da Aplicação é afetada quando a carga no sistema aumenta? O que acontece quando são aplicadas cargas maiores do que a capacidade máxima do servidor? A degradação de desempenho tem impacto sobre os lucros da empresa? ATENÇÃO Para obter respostas para essas perguntas, são feitos dois testes diferentes de desempenho: Teste de carga Teste de esforço (stress) Teste de Carga A finalidade do teste de carga é determinar como a webApp e seu ambiente do lado do servidor responderá a várias condições de carga. Neste tipo de teste são utilizadas como condições de teste as seguintes variáveis: Número de usuários concorrentes (N); Número de transações on-line por usuários por unidade de tempo (T); Carga de dados processados pelo servidor por transação (D). À medida que o teste é feito, são realizadas permutações nas variáveis de acordo com os limites de operação normal do sistema e coletas uma ou mais das seguintes medidas: Resposta média do usuário; Tempo médio para o download de uma unidade padronizada de dados; Tempo médio para processar uma transação O teste de carga também pode ser usado para avaliar a velocidade de conexão recomendada para usuários através da seguinte fórmula: P = N x T X D Por exemplo, (Pressman, 2011) vamos considerar um site de notícias popular. Em um momento, 20 mil usuários concorrentes enviam uma solicitação (uma transação, T) a cada 2 minutos em média. Cada transação requer que a aplicação faça o download de um novo artigo que na média tem um tamanho de 3k bytes: P = [ 20.000 x 0,5 x 3 kb] / 60 = 500 kbytes/segundo = 4 megabits/segundo Desta forma a conexão de rede do servidor teria, portanto, de suportar essa taxa de transferência de dados e deveria ser testada para assegurar que fosse capaz disso. Teste de Esforço (stress) O teste de esforço é uma continuação do teste de carga, e desta forma utilizam as mesmas variáveis: T, N, D, porém com seus limites operacionais excedidos. A finalidade deste teste é responder as seguintes questões: O sistema degrada ou o servidor desliga quando é excedida a capacidade normal de operação? O software servidor gera mensagens “servidor não disponível”? De uma maneira geral os usuários ficam cientes de que não podem acessar o servidor? O servidor coloca as requisições por recursos em fila e esvazia a fila quando a demanda de capacidade diminui? São perdidas transações quando a capacidade é excedida? A integridade dos dados é afetada quando a capacidade é excedida? Quais valores de N, T e D forçam o ambiente servidor a falhar? Como a falha se manifesta? São mandadas notificações automáticas para o pessoal de suporte técnico no local do servidor? Se o sistema falha, quanto tempo demora até que volte a ficar on-line? O objetivo do teste de configuração é testar um conjunto de prováveis configurações ____________ e __________________ para assegurar que a experiência do usuário será a mesma em todos os casos e isolar erros que podem ser específicos a uma determinada configuração. Do cliente - do servidor Para responder a pergunta “O sistema degrada ou o servidor desliga quando é excedida a capacidade normal de operação?” utilizamos que tipo de teste? Teste de esforço (stress). Quais são os quatro tipos de testes aplicados no teste de interface de usuário? Mecanismos de interface, semântica, usabilidade e compatibilidade. Aula 5: Teste na Implantação do Sistema: Teste de Unidade Estratégias para teste de software As estratégias de teste de software fornecem um roteiro que descreve os passos a serem executados corno parte do teste, define também quando esses passos serão planejados e então executados, quanto esforço de trabalho, tempo e recursos serão necessários. Desta forma, qualquer estratégia de teste deve incorporar planejamento dos testes, projeto de casos de teste, execução dos testes, coleta e avaliação dos dados resultantes. Ao desenvolvermos uma estratégia de teste de software desejamos responder as seguintes perguntas: Como conduzir os testes de software? Devemos estabelecer um plano formal para os testes? Devemos testar o programa como um todo ou executar testes somente em urna parte dele? Devemos refazer os testes quando acrescentamos novos componentes ao sistema? Quando devemos envolver o cliente? Quem os realiza? Normalmente, para que o processo de teste transcorra de forma íntegra é comum à utilização de um grupo independente de teste, já que as pessoas que criaram o software não devem ser as que irão realizar os testes. Seria um conflito de interesses, pois foram elas que o desenvolveram. Normalmente este grupo trabalha de forma conjunta e existem testes que somente são conduzidos pelos desenvolvedores, como o teste de unidade que iremos estudar mais adiante. Uma estratégia de teste de software é desenvolvida pelo gerente de projeto, pelos engenheiros de software e pelos especialistas em testes. Existem várias responsabilidades e papéis dentro da equipe de teste: Líder do projeto de testes Responsável pela liderança de um projeto de teste, geralmente relacionado a um sistema em desenvolvimento, seja um projeto novo ou manutenção. Arquiteto Responsável pela montagem da infraestrutura de teste monta o ambiente de teste, escolhe as ferramentas de teste e capacita a equipe para executar seu trabalho neste ambiente. Analista de Teste Responsável pela modelagem e elaboração dos casos de teste e pelos scripts de teste. Em alguns casos, os scripts podem ser elaborados pelos testadores. Testador Responsável pela execução dos casos de teste e scripts. Por que é importante? Muitas vezes o teste requer mais trabalho de projeto do que qualquer outra ação da engenharia de software. Consequentemente caso seja feito casualmente, erros podem passar sem ser detectados. Lembra do teste de software para ambientes críticos? (ex.: controle de voo, monitoramento de reatores nucleares, etc.) ele pode custar de três a cinco vezes mais do que todos os outros passos de engenharia de software combinados. A especificação do teste documenta a abordagem da equipe de software para o teste, que descreve uma estratégia global e um procedimento designando etapas específicas de teste e os tipos de testes que serão feitos. Após a definição da estratégia de testes é necessário criar o ambiente de teste, que não é apenas uma configuração de hardware, mas toda uma estrutura a ser considerada onde o teste será executado. Pessoal: Usuários; Desenvolvedores; Testadores. Hardware: Plataforma; Impressoras; Scanners; Software: Software a ser testado; Sistema operacional; Software de teste, procedimentos. Suprimentos: Papel; Formulários; Cartuchos de Tinta. Rede: Protocolos; Autorizações; Usuários. Documentação: Requisitos; Design; Cartuchos de Tinta. Ambiente físico: Local; Segurança; Estrutura. A criação, pelas equipes de teste, de um ambiente isolado, organizado, representativo e mensurável garante a descoberta de erros reais, que ocorreriam em um ambiente em produção e que não foram descobertos durante o desenvolvimento. Além disso, permite liberar a equipe de desenvolvimento para a produção de novos códigos, e este ambiente ainda possibilita a realização de testes de iteração e de sistema. É preciso que a preparação do ambiente seja discutida o quanto antes, e suas necessidades básicas devem ser identificadas no momento inicial do projeto. Quais são as etapas envolvidas? Conforme a imagem, os testes iniciais, também conhecidos como teste de unidade, focalizam um único componente e se aplicam para descobrir erros nos dados e na lógica de processamento destes componentes. Posteriormente, cada componente testado deve ser integrado. Neste momento ocorre o teste de integração, cuja preocupação é verificar problemas associados à construção do programa. Após esta fase, ocorrem testes de ordem superior, como por exemplo, o teste de validação com o objetivo de garantir que o software satisfaça a todos os requisitos informativos, funcionais, comportamentais e de desempenho. A última etapa de teste de ordem superior é o teste de sistema, que verifica se todos os elementos se combinam corretamente e se a função/desempenho global do sistema é conseguida. Assim como o processo de software, uma estratégia de teste de software também pode ser vista como uma espiral. O processo de software começa com a análise dos requisitos de software, evolui para o projeto e, finalmente, a codificação do software. Já uma estratégia de teste de software percorre a espiral de forma inversa. Começa com o teste de unidade implementado no código fonte, passa pelo teste de integração, em que o foco está no projeto e construção da arquitetura de software, passa pelo teste de validação cujo objetivo é validar os requisitos estabelecidos em relação ao software criado e, finalmente, o teste de sistema, no qual o software e outros elementos são testados como um todo. Teste de unidade O teste de unidade é realizado no estágio mais baixo da escala de teste, isto é, no código do programa, e normalmente é realizado pelo desenvolvedor. Este tipo de teste é aplicado nos menores componentes de código criado, visando garantir que estes atendam as especificações em termos de características e de funcionalidade. O teste de unidade foca na lógica interna de processamento e nas estruturas de dados dentro dos limites de um componente, conforme a imagem. Casos de testes deverão ser projetados para descobrir erros devido a computações errôneas, comparações incorretas ou fluxo controle inadequados. Todos os caminhos de manipulação de erro são testados. Todos os caminhos independentes da estrutura de controle são usados para assegurar que todas as instruções em um módulo tenham sido executadas pelo menos uma vez. As condições limite são testadas para garantir que o módulo opere adequadamente nas fronteiras estabelecidas para restringir ou limitar o processamento. A estrutura de dados local é examinada para garantir que os dados armazenados temporariamente mantenham sua integridade durante todos os passos na execução de um algoritmo. A interface de módulo é testada para assegurar que as informações fluam corretamente para dentro E para fora da unidade do programa que está sendo testada. Procedimentos de teste de unidade O teste de unidade é considerado um auxiliar para a etapa de codificação. Podem ocorrer antes de começar a codificação ou depois que o código-fonte tiver sido gerado. Como cada componente não é um programa independente deve ser construído um pseudocontrolador (driver) e/ou um pseudocontrolado (stub) para cada teste de unidade. Eles irão auxiliar no teste unitário, já que um pseudocontrolador representa o “programa principal” que aceita dados do caso de teste e passa esses dados para o componente a ser testado. Já o pseudocontrolado utiliza a interface dos módulos subordinados e pode fazer uma manipulação de dados mínima através de verificação de entrada e retorno do controle para o módulo que está sendo testado. Vale ressaltar que pseudocontroladores e pseudocontrolado representam despesas indiretas no projeto de desenvolvimento de software, pois são softwares que devem ser escritos e que não serão fornecidos com o produto final. Teste de unidade no contexto de Software orientado a objeto Quando consideramos o software orientado a objeto, o conceito de unidade se modifica. Não podemos mais testar uma única operação isoladamente como no desenvolvimento convencional, mas como parte de uma classe. Neste caso, uma classe encapsulada é usualmente o foco do teste de unidade e as operações (métodos) dentro da classe são as menores unidades testáveis. Uma classe pode conter um conjunto de diferentes operações, e uma operação em particular pode existir como parte de um conjunto de diferentes classes. Assim, o teste de classe para software OO é o equivalente ao teste de unidade para software convencional e foca nas operações encapsuladas na classe e pelo estado de comportamento da classe. Qual a principal diferença entre o teste unitário de software convencional e o teste unitário de software OO? Nos testes para software OO não podemos mais testar uma única operação isoladamente como no desenvolvimento convencional, mas como parte de uma classe. Dizemos que o teste unitário é o teste de mais baixo nível que podemos aplicar. O que isso quer dizer? Que este tipo de teste é aplicado nos menores componentes de código criado, visando garantir que estes atendem as especificações em termos de características e de funcionalidade. Qual o objetivo da definição de uma estratégia de teste? Fornecem um roteiro que descreve os passos a serem executados, quando serão executados e quanto esforço de trabalho, tempo e recursos serão necessários. Aula 6: Teste na Implantação do Sistema: Teste de Integração e Teste de Validação Teste de integração O teste de integração focaliza o pacote de software completo e trata da verificação do programa como um todo. Esse tipo de teste faz uso de técnicas de projeto de casos de teste que enfocam as entradas e saídas, além de exercitar caminhos específicos. Mesmo que todos os módulos estejam funcionando individualmente, não se pode garantir que eles funcionarão em conjunto: Os dados podem ser perdidos na interface; A imprecisão aceitável individualmente de cada módulo pode ser amplificada no funcionamento em conjunto; As estruturas de dados globais podem apresentar problemas. Segundo Pressman, o teste de integração é uma técnica sistemática para construir a arquitetura do software enquanto se conduz testes para descobrir erros associados com as interfaces a partir dos componentes já testados através do teste de unidade. Existem basicamente duas abordagens que podem ser utilizadas: Não Incremental (Big-Bang) Neste tipo de abordagem todos os componentes são combinados com antecedência e o programa inteiro é testado de uma vez. Segundo Pressman, usualmente, o resultado desta abordagem é o caos, pois normalmente são encontrados muitos erros, tornando a correção difícil, pois, fica complicado isolar as causas dos erros. Uma vez corrigidos os erros, novos erros aparecem e o processo parece não ter fim. Incremental Esse tipo de abordagem é a antítese da abordagem big-bang. O programa é construído e testado em pequenos incrementos. Os erros são mais fáceis de isolar e corrigir e pode ser aplicada uma interface sistemática de testes. Nesse contexto, existem várias estratégias incrementais de integração: Integração descendente ou Top-down. Integração ascendente ou Botton-up. Teste de regressão. Teste fumaça. Integração Descendente ou Top-down Os módulos são integrados, movendo-se de cima para baixo na hierarquia de controle. Começa-se pelo módulo de controle principal e os módulos subordinados são incorporados à estrutura de uma de duas maneiras: Primeiro em Profundidade (depth-first): Integra todos os componentes em um caminho de controle principal da estrutura do controle. A seleção do caminho é arbitrária. Por exemplo, poderíamos escolher o caminho da esquerda e neste caso, os componentes M1, M2 e M5 seriam integrados primeiro, posteriormente M8 ou M6. Primeiro em Largura (breadth-first): Incorpora todos os componentes diretamente subordinados em cada nível, movendo-se através da estrutura horizontalmente. Nesse caso, no exemplo abaixo os módulos M2, M3 e M4 seriam integrados primeiro e, em seguida, o próximo nível de controle M5, M6 e M7. Por último, seria integrado o módulo M8. Como funciona a integração Descendente? O módulo de controle principal é usado como pseudocontrolador do teste e os pseudocontroladores substituem todos os componentes diretamente subordinados ao módulo de controle principal. Dependo da abordagem de integração selecionada os pseudocontrolados são substituídos, um de cada vez, pelos componentes reais. Os testes são conduzidos à medida que cada componente é integrado. Ao término de cada conjunto de testes, outro pseudocontrolado é substituído pelo componente real. O teste de regressão pode ser conduzido para garantir que novos erros não tenham sido introduzidos. ATENÇÃO Desvantagem da Integração Descendente O processamento nos níveis baixos da hierarquia pode ser necessário para testar adequadamente os níveis superiores, porém, como são usados pseudocontrolados, nenhum dado significativo flui para cima na estrutura do programa. Para resolver esse tipo de questão, três soluções são possíveis: Adiar alguns testes. Desenvolver pseudocontrolados mais complexos. Integrar o software de baixo para cima: integração ascendente. Integração Ascendente ou Bottom-up Na técnica Botton-up, a integração do sistema começa a partir do nível mais baixo do software, ou seja, o módulo. O módulo é dito como o mais baixo nível se ele não depende de outro módulo. Nesse tipo de teste, assume-se que, previamente, todos os módulos foram individualmente testados. Os módulos são integrados movendo-se de baixo para cima na hierarquia de controle. Como funciona a integração Ascendente? Componentes de baixo nível são combinados em agregados (clusters) que realizam uma subfunção específica. Um pseudocontrolador é escrito para coordenar a entrada e a saída do caso de teste. O agregado é testado. Pseudocontroladores são removidos e agregados são combinados movendo-se para cima na estrutura. Nesse tipo de abordagem, os componentes são combinados para formar os agregados (clusters) 1, 2 e 3, conforme a ilustração abaixo. Cada um dos agregados é testado, usando um pseudocontrolador que, no exemplo abaixo, é demonstrado com linhas tracejadas. Nesse exemplo, os agregados 1 e 2são subordinados a Ma. Após os testes dos agregados 1 e 2, os pseudocontroladores D1 e D2 são removidos e os agregados interfaceados diretamente com Ma. Os testes continuam e os pseucontroladores são removidos a cada integração. A medida que a integração se move para cima, a necessidade de pseudocontroladores de testes separados diminui. Teste de Regressão Os testes de regressão geralmente são executados após a correção de algum defeito ou após a adição de uma nova funcionalidade. Seu objetivo é garantir que nenhum defeito foi acrescentado ao sistema após sua modificação. Toda vez que um novo módulo é adicionado como parte do teste de integração, o software se modifica e, assim, novos caminhos de fluxos de dados são estabelecidos, nova E/S pode ocorrer ou ainda nova lógica de controle pode ser adicionadas. Essas modificações podem causar problemas em funções que, previamente, funcionavam corretamente. Os casos de testes de regressão podem ser de três tipos: Casos de teste que abrangem todas as funcionalidades do sistema. Casos de teste apenas para as funcionalidades que foram modificadas. Novos casos de teste para as funcionalidades que provavelmente foram afetadas pela mudança. O teste de regressão é a re-execução de algum subconjunto de testes que já foi conduzido para garantir que as modificações não introduzam efeitos colaterais indesejáveis. Ele pode ser conduzido manualmente ou usando alguma ferramenta automatizada de captação/re-execução e que iremos estudar posteriormente. A utilização de ferramentas automatizadas irá permitir ao engenheiro de software captar casos de teste e resultados para re-execução e comparação, pois, à medida que o teste de integração prossegue, o número de testes de regressão pode crescer significativamente. Assim, a suíte de testes de integração deve ser projetada para incluir apenas testes que cuidam das principais funções do programa. Teste fumaça Nesse tipo de teste o software é reconstruído e testado diariamente, para dar aos gerentes e desenvolvedores uma avaliação realística do progresso. Como funciona o Teste Fumaça Os componentes de software são integrados em uma “construção”. Essa construção inclui todos os dados, bibliotecas, módulos reusáveis e componentes que são necessários para implementar uma função do produto. Uma série de testes é projetada para expor erros que impeçam a construção de desempenhar adequadamente a sua função. A finalidade deverá ser descobrir erros “bloqueadores” que têm a maior chance de atrasar o cronograma. A construção é integrada com outras construções e o produto inteiro é testado diariamente. A abordagem pode ser descendente ou ascendente. Benefícios do Teste Fumaça O risco de integração é minimizado já que incompatibilidades e outros erros de bloqueio são descobertos logo no início, evitando impactos no cronograma. A qualidade do produto final é aperfeiçoada, pois, tanto erros funcionais quanto defeitos de projeto arquitetural podem ser descobertos. Diagnóstico e correção de erros são simplificados, pois, o software que acabou de ser adicionado às construções é uma causa provável do erro recém-descoberto. O progresso é fácil de avaliar, pois como a cada dia que passa, o teste está mais integrado ao software, demonstrando como ele funciona. Documentação do Teste de Integração O documento de especificação de teste é um produto de trabalho e torna-se parte da configuração de software. Ele especifica os seguintes documentos: Plano de teste global para integração do software. Descrição dos testes específicos. O teste é dividido em fases e construções que tratam de características funcionais e comportamentais específicas do software e está relacionada a um domínio específico dentro da arquitetura do software: Integridade da interface: As interfaces interna e externa são testadas à medida que cada módulo é incorporada a estrutura. Validade funcional: São executados testes destinados a descobrir erros funcionais. Conteúdo de informação: São executados testes para descobrir erros associados com estruturais de dados globais ou locais. Desempenho: São executados testes destinados a verificar os limites de desempenho estabelecidos durante o projeto do software. O plano de teste deve conter: Um cronograma para a integração; Breve descrição do software de uso geral (pseudocontroladores e pseudocontrolados); Descrição do ambiente e recursos do teste; Procedimento detalhado de teste que é necessário para realizar o plano de teste; A ordem de integração e os testes correspondentes em cada etapa de integração; Lista de todos os casos de testes e dos resultados esperados; Teste de integração no contexto de Software Orientado a Objeto No contexto de software orientado a objeto, o teste de integração não apresenta uma estrutura óbvia hierárquica. As estratégias de integração ascendente e descendente perdem o significado, porém há duas estratégias existentes para o contexto OO: Teste baseado no caminho de execução: Integra o conjunto de classes necessárias para responder a uma entrada ou evento do sistema. Teste baseado no uso: Começa a construção do sistema testando as classes que usam poucas (ou nenhuma) classes servidoras. O uso de pseudocontroladores e pseudocontrolados também muda quando é executado o teste de integração de sistemas OO: Pseudocontroladores podem ser usados para testar operações no mais baixo nível e testar grupos inteiros de classes e para substituir a interface com o usuário. Pseudocontrolados podem ser usados em situações nas quais a colaboração entre classes é necessária. Teste de Validação O teste de validação começa quando termina o teste de integração, quando o software está complementarmente montado como um pacote e os erros de interface já foram descobertos e corrigidos. Nesse tipo de teste, a distinção entre software convencional e software orientado a objeto desaparece. Ele focaliza ações visíveis ao usuário e saídas do sistema reconhecíveis pelo usuário, o foco está no nível de requisitos e podem ser divididos em: Teste Alfa Como é praticamente impossível para um desenvolvedor de software prever como o cliente usará um programa de forma que as instruções de uso do programa não sejam mal interpretadas, nem tampouco, que possam ocorrer combinações estranhas de dados que poderão ser usadas regularmente ou ainda que resultados que pareciam claros para o testador e sejam confusos para um usuário, é aplicado o teste alfa. Esse tipo de teste é conduzido na instalação do desenvolvedor por um grupo representativo de usuários finais. O software é utilizado em um cenário natural e realizado em conjunto: desenvolvedores e usuários, registrando os erros e os problemas de uso. Esse tipo de teste normalmente é conduzido em um ambiente controlado. Teste Beta O teste Beta é conduzido nas instalações de um ou mais usuários finais e, nesse tipo de teste, o desenvolvedor não deverá estar presente. O cliente registra todos os problemas encontrados durante o teste e vai relatando para o desenvolvedor em intervalos regulares. Com o resultado do teste beta, os desenvolvedores fazem as modificações necessárias e preparam a liberação do software para todos os clientes. Existem muitas empresas que colocam versões beta de seus softwares na internet para que os usuários possam fazer o teste com o novo produto que neste caso, ainda não foi lançado oficialmente. Critério de teste de validação A validação de software é conseguida através de uma série de testes que demonstram conformidade com os requisitos. Dessa forma, o plano de teste descreve as classes de testes a serem conduzidas e um procedimento de teste define casos de teste específicos destinados a: Garantir que todos os requisitos funcionais sejam satisfeitos; Todas as características comportamentais seja obtidas; Todo o conteúdo seja preciso e adequadamente apresentado; Todos os requisitos de desempenham sejam atendidos; A documentação esteja correta. Após cada caso de teste de validação ter sido conduzido, existe uma entre duas possibilidades: A característica de função ou desempenho está de acordo com a especificação e é aceita. Descobre-se um desvio da especificação e é criada uma lista de deficiência. Os testes alfa e beta são classificados como: Teste de validação. Esse tipo de teste normalmente é executado após a correção de algum defeito ou após a adição de uma nova funcionalidade. A qual tipo de teste estamos nos referindo? Teste de regressão. Esse tipo de teste focaliza o pacote de software completo e trata da verificação do programa como um todo. Estamos nos referindo a que tipo de teste? Teste de integração. Aula 7: Teste na Implantação do Sistema: Teste de Migração Teste de sistema O teste de sistema se refere ao comportamento de todo o sistema / produto definido pelo escopo de um projeto ou programa de desenvolvimento. Neste tipo de teste o ambiente de teste deve corresponder o máximo possível ao objetivo final, ou o ambiente de produção, para minimizar que os riscos de falhas específicas de ambiente não serem encontradas durante o teste. “Não é apenas uma configuração de hardware, mas toda estrutura onde o teste será executado”. Ambiente de desenvolvimento Testes: Unitário e Integração. Ambiente de testes Testes: Integração, Sistema, Regressão, Aceitação. Ambiente de produção Testes: Estresse, Performance. O objetivo do teste de sistema é realizar a execução do sistema como um todo, dentro de um ambiente operacional controlado, para validar a exatidão e perfeição na execução de suas funções, acompanhando cenários sistêmicos elaborados pelo profissional de requisitos do projeto e devem retratar os requisitos funcionais e não-funcionais do sistema. Normalmente este tipo de teste é realizado por uma equipe de teste independente 3 onde o analista de teste irá elaborar os casos de testes, normalmente em conjunto com os desenvolvedores e executando os testes em um ambiente controlado, no caso o ambiente de teste. 3 O papel de um grupo independente de teste é remover os problemas associados ao fato de deixar o desenvolvedor testar o software que ele mesmo criou. O teste independente remove o conflito de interesses que, de outra forma, poderia estar presente. A equipe independente de teste faz parte da equipe de desenvolvimento de software no sentido de que ela se envolve durante a análise, e o projeto e permanece envolvido (planejando e especificando procedimentos de teste) durante o projeto inteiro. É comum em muitos casos a equipe de teste responder a organização de garantia de qualidade de software para, desta forma, obter um grau de independência que poderia não ser possível se fizesse parte da organização de engenharia de software. Existem diferentes possíveis papéis com diferentes reponsabilidade dentro de uma equipe de teste independente: Líder ou Gerente de Teste (LT ou GP) Responsável pela liderança de um projeto de teste específico. Arquiteto de Teste (AT) Responsável pela montagem do ambiente de teste (infraestrutura) e escolha das ferramentas. Analista de Teste (NA) Responsável pela modelagem e elaboração dos casos de testes e scripts de teste. Testador (TE) Responsável pela execução dos casos de teste e scripts de teste. Os testes podem ser baseados em: O teste de sistema é na realidade uma série de diferentes testes cuja finalidade primária é exercitar totalmente o sistema e que apesar de terem finalidades diferentes, todos funcionam no sentido de verificar se os elementos do sistema foram integrados adequadamente e executam as suas funções corretamente: Teste de recuperação O teste de recuperação é um teste de sistema que força o software a falhar de varias formas e verifica se a recuperação é executa corretamente. Se a recuperação for automática, a reinicialização, os mecanismos de verificação, recuperação de dados e reinicio são avaliados quanto a correção. Caso a recuperação requeira a intervenção humana, é avaliado o tempo médio de reparo (mean-time to repair – MTTR) para determinar se esta dentro dos limites aceitáveis. Teste de segurança O teste de segurança tenta verificar se os mecanismos de proteção incorporados ao sistema vão de fato protege-lo contra acesso indevido. A principal meta do teste de segurança é garantir que os dados ou funções de um sistema possam ser acessados apenas por atores autorizados a acessá-las. Durante o teste de segurança, o testador faz o papel do indivíduo que quer invadir o sistema o sistema e desta forma tentará, por exemplo, obter senhas por meios externos, sobrecarregar o sistema ou ainda causar erros propositadamente. Todas as formas de ataque de acesso indevido devem ser simuladas. Os principais objetivos a serem alcançados com este tipo de teste são: Assegurar que os mecanismos de controle contra acessos indevidos foram corretamente implementados. Analisar as ameaças e vulnerabilidades, tanto físicas quanto lógicas. Garantir que os dados do sistema estão protegidos adequadamente. Assegurar que todos os riscos que envolvem os acessos indevidos foram identificados. Teste de desempenho O teste de desempenho ou performance, como também é conhecido, mede e avalia o tempo de resposta, o número de transações e outros requisitos sensíveis ao tempo de resposta do sistema. Este tipo de teste é feito em todas as etapas no processo de teste, inclusive em nível de unidade, já que o desempenho de um módulo individual pode ser avaliado durante o teste. Entretanto o desempenho de um sistema só pode ser avaliado depois que todos os elementos do sistema estiverem totalmente integrado. Os principais objetivos a serem alcançados com este tipo de teste são: Determinar o tempo de resposta das transações. Verificar se os critérios de desempenho estabelecidos estão sendo atendidos. Identificar pontos de gargalo no sistema. Verificar o nível de utilização do hardware e software. Normalmente este tipo de teste requer instrumentação de hardware e software, tendo em vista a necessidade da medição dos recursos utilizados de forma precisa. Nas próximas aulas estudaremos sobre estas ferramentas automatizadas de teste. Teste de disponibilização O teste de disponibilização também conhecido como teste de configuração, exercita o software em cada ambiente no qual deve operar, tendo em vista que muitos softwares operam em uma variedade de plataformas e sob mais de um ambiente de sistema operacional. Este tipo de teste examina todos os procedimentos de instalação e software de instalação que serão utilizados pelos clientes e toda a documentação que será usada para fornecer o software para os usuários finais. Pode inclusive abranger combinações de navegadores com vários sistemas operacionais diferentes. Teste de esforço O teste de esforço também conhecido como teste de estresse colocam os programas em situações anormais. “Até onde podemos forçar o sistema até que falhe?” A principal meta do teste de esforço é entender o comportamento do sistema durante condições-limite de execução ou fora da tolerância esperada. Tipicamente envolve a execução do sistema com baixos recursos de hardware e software, ou a concorrência por estes recursos. Os principais objetivos a serem alcançados neste tipo de teste são: Determinar a que condições-limite de recursos o software é capaz de ser executado. Determinar quais volumes de transação, normais e acima dos normais, podem ser processados num período de tempo esperado. Verificar se o sistema é capaz de garantir tempos adequados de resposta sendo executado em condições-limite. Verificar se há restrições quanto ao ambiente em que o software vai operar. Qual é o teste que também é também conhecido como Teste de Configuração e que exercita o software em cada ambiente no qual deve operar? Teste de disponibilidade. A principal meta deste teste é entender o comportamento do sistema, durante condições-limite de execução ou fora da tolerância esperada. Teste de estresse ou de esforço. Esse tipo de teste mede e avalia o tempo de resposta, o número de transações e outros requisitos sensíveis ao tempo de resposta do sistema. Teste de desempenho. Aula 8: Teste na implantação do sistema: Teste de Migração Teste de migração Independentemente do domínio da aplicação, tamanho ou complexidade, o software continuará a evoluir com o tempo. Após seu desenvolvimento um sistema pode ficar operacional, ou seja, em produção por anos ou até mesmo décadas. Porém durante este período o próprio sistema ou seu ambiente operacional podem ser corrigidos, modificados ou completados. Desta forma os caso de teste de migração de uma plataforma a outra, podem incluir testes operacionais do novo ambiente tanto quanto a mudança de software. Já os testes de migração para retirada de um sistema pode incluir testes de migração de Dados. DICA Processo de migração pode ser fracassado se não for bem planejado e orquestrado. Migração de Dados Migração de Dados é o processo de transferência de Dados entre diferentes tipos ou formato de armazenamento, ou ainda de diferentes sistemas computacionais. É normalmente realizada através de um processo de migração automatizado, consequência de uma troca de sistemas computacionais ou upgrade para novos sistemas. A maioria dos projetos de migração são demorados, requerem o envolvimento de muitos recursos e tem um custo muito elevado. Além de necessitar de recursos eficientes e de um ótimo planejamento é muito importante o uso inteligente de ferramentas de apoio ao projeto e acima de tudo a adoção de um conjunto de testes completo e complexos 4 para garantir o que o projeto seja bem sucedido. 4 Categoria Tipos de Teste Requisitos Funcionalidade Teste Funcional Teste de Volume Teste de Segurança Teste de Acessibilidade Conjunto de Características; Capacidade; Segurança; Usabilidade Teste de Usabilidade Fator humano estético; Consistência da Interface do usuário; Help online e assistente. Confiabilidade Teste de Estresse Teste de Regressão Teste de Integridade Teste de Estrutura Frequência e severidade de falhas; Confiança nos resultados; Recuperação de falhas; Tempo entre falhas (MTBF); Desempenho Teste de Desempenho Teste de Carga Vazão; Eficiência; Os Dados são armazenados em diferentes mídias, normalmente através de arquivos ou bases de Dados. Estes Dados são gerados ou consumidos por aplicações de software que, por sua vez apoiam os processos de negócios das organizações. A necessidade de transferir e/ou converter os Dados normalmente é impulsionado por um requisito de negócio ou uma evolução tecnológica. Existem basicamente quatro tipos possíveis de migração: Migração de mídias de armazenamento Normalmente é motivada pela racionalização dos meios físicos e pela possibilidade de maior vantagem e eficiência da utilização de modernas tecnologias de armazenamento. O que irá resultar no deslocamento blocos físicos de Dados de uma fita ou disco para outra, muitas vezes usando técnicas de virtualização. O formato de Dados e conteúdo geralmente não são alterados neste processo e pode, normalmente, ser alcançado com um mínimo ou nenhum impacto para a camadas acima. Migração de base de dados Em alguns casos pode ser necessário adotar uma nova versão, ou atualização do software de banco de Dados utilizado e até mesmo a mudança de fornecedor de software. Normalmente na atualização do software praticamente não existe migração de Dados, porém podendo ocorrer em grandes atualizações (quando o software está em uma versão muito antiga e troca-se para uma atual). No caso de adoção de uma nova plataforma de banco de Dados pode ser necessária a migração física dos Dados uma vez que o formato da base de Dados podem mudar significativamente. Esta migração pode ou não afetar o comportamento da camada de aplicação, dependendo em grande parte se ocorrerá mudança na linguagem ou protocolo de manipulação de Dados. Vale ressaltar que as aplicações modernas normalmente são desenvolvidas de formas a serem agnósticas(Não saber, ignorar (fonte: Dicionário Houaiss da Língua Portuguesa).) à tecnologia de banco de Dados (Sybase, Mysql, DB2, SQL Server ou Oracle ) para que a mudança de bases de Dados, só exijam um ciclo de teste para validar o aspecto de desempenho dos requisitos funcionais e não- funcionais. Migração de aplicação Ocorre quando a organização decide implementar uma nova aplicação ou mesmo alterar de fornecedor uma aplicação já existente, como por exemplo, uma nova plataforma CRM ou ERP, implica necessariamente em uma transformação substancial de toda aplicação ou conjunto de operações no modelo de Dados do software do novo fornecedor. Com o objetivo de permitir a utilização de seus produtos por um número maior de empresas, normalmente estes pacotes de produtos são configurados para cada cliente utilizando metadados. Migração de processo de negocio Processos de Negócios operam através de uma combinação de ações humanas e de sistemas de aplicação, sendo normalmente orquestrada por ferramentas de gestão de processos de negócios. Neste caso as alterações podem exigir a transferência de Dados de um meio de armazenamento, base de Dados ou aplicação a fim de refletir as alterações da organização e informações sobre os clientes, produtos e as operações. São exemplos deste tipo de migração: Fusões e aquisições de empresas. Otimização dos processos de negócio. A reorganização dos processos como forma de atacar novos mercados ou responder a alguma ameaça competitiva. Fases da migração de Dados Migração de Dados é geralmente o termo utilizado para descrever um projeto em que os Dados serão transferidos ou copiados de um ambiente para outro, e removidos ou desativados na origem. Durante a migração (que podem realizar-se ao longo de meses ou mesmo anos), os Dados podem ser migrados em múltipla direções e lugares simultaneamente. O projeto de migração é normalmente dividido nas seguintes etapas ou fases: Projeto/Design Nesta etapa são levantadas as funcionalidades de software e hardware, se for o caso, e identificados os Dados que serão migrados. Neste momento podemos ter duas situações de mapeamento dos Dados: Onde o layout da origem e o destino layout são os mesmos. Onde os layouts da origem e o destino são diferentes. Embora o mapeamento de mesmo layout na origem e destino apresente uma migração mais simples, é muito comum as equipes responsáveis enxergarem este momento como uma ótima oportunidade para consolidar e/ou otimizar o desempenho e/ou a capacidade de utilização dos Dados. Quando o mapeamento é realizado com layouts diferentes está cenário já é o comum. Extração Esta fase envolve a extração dos Dados dos diferentes sistemas de origem. Cada sistema separadamente pode utilizar um formato e organização diferente de Dados. O objetivo desta fase é converter os Dados em um formato único adequado para o processo de transformação. Uma parte intrínseca na envolve a análise de Dados extraídos, resultando na verificação se os Dados satisfazem um padrão esperado ou estrutura. Caso não satisfaçam devem ser rejeitado totalmente ou em parte. Limpeza Um processo de limpeza de Dados manual ou automatizada é comumente realizada na migração para melhorar a qualidade dos Dados, eliminar informações redundantes ou obsoletas, e a adaptação às exigências do novo sistema. Carga A fase de carga carrega os Dados para um destino específico. Em função dos requisitos da organização, este processo varia muito. Em alguns casos os Dados podem sobrepor os Dados existentes com informações acumulativas, frequentemente a atualização de extração de Dados é realizada diariamente, semanal ou mensal. Em outros caso poderá ser necessário acrescentar novos Dados. O escopo e a periodicidade para substituí-la ou inclusão dependem do tempo disponível e da necessidade do negócio. Outra opção é a utilização de uma fase de pré-carga, através do estabelecimento de um conjunto mínimo de Dados com os requisitos necessários para a carga no sistema novo. Este processo de validação é aplicado quando deseja-se garantir que o destino realmente possui os critérios de ambiente e as especificações de arquivo pré-definidos e antes do processo de carga total. Uma estratégia alternativa pode ser também a utilização de uma validação denominada de on-the-fly, utilizada com o objetivo de reportar os erros de rejeição enquanto a carga avança. Verificação Após o carregamento para o novo sistema, os resultados são submetidos a uma etapa de verificação dos Dados para determinar se os Dados foram corretamente migrados, se ocorreu de forma está completa. Durante a verificação pode ser necessário um execução de processo de execução em paralelo de ambos os sistemas para identificar áreas de disparidade e evitar erros perda de Dados. ATENÇÃO Para aplicações de moderada ou alta complexidade as fase de migração de Dados são normalmente repetidas várias vezes antes do novo sistema ser implantado. Verificação dos procedimentos operacionais e legais para a migração Uma importante etapa no processo de migração é a preparação prévia dos procedimentos operacionais a serem adotados. Esta etapa deve considerar a simulação e a verificação dos procedimentos operacionais, financeiros e legais usados no sistema antigo e seu rebatimento no novo sistema. Outro aspecto importante a considerarmos nesta etapa é a concordância do usuário gestor, face a questão básica da manutenção do negócio, ou seja, mudar para melhor dentro dos requisitos de negócio estabelecido. Validação do novo formato dos Dados Para alcançar um efetivo processo de migração de Dados, os Dados sobre o sistema antigo devem ser mapeados para o novo sistema através do levantamento dos requerimentos e formatos dos Dados antigos para o novo sistema, sendo realizado através de dois momentos: Extração de Dados, onde os Dados são lidos a partir do sistema antigo. Carga dos Dados, onde os Dados são escritos no novo sistema. Nesta fase procedimentos de controle devem ser definidos para garantir que todos os Dados de entrada sejam completa e precisamente convertidos. Esses procedimentos podem consistir em uma verificação manual de todos ou de uma amostra dos Dados antes e depois da conversão ou ainda através da verificação manual dos relatórios criados a partir dos Dados. Exatidão dos Dados Após a migração dos Dados, os Dados resultantes podem nem sempre precisar ser completamente exatos, uma vez que a exatidão completa pode ser pouco econômica ou impossível. Desta forma é necessário definir o nível de exatidão aceitável no contexto organizacional. Teste de migração dos Dados É importante observarmos a importância de se elaborar o novo formato do banco de dados para o novo sistema com base no formato do banco de dados do antigo sistema de forma a facilitar a migração dos dados. Para os novos campos de dados no sistema novo que não existem no banco de dados antigo, deverá ser elaborada uma estratégia de povoamento desses campos. É recomendável a utilização de equipes de teste com perfis distintos para elaboração, execução e validação das etapas de migração: Equipe de teste de aceitação. Equipe de teste operacional. Equipe de teste de legado. Equipes de teste As equipes de teste de aceitação e operacional irão realizar o teste de concepção e execução em paralelo em duas plataformas completamente diferentes e com objetivos e propósitos diferentes. Já a equipe de teste de legado irá trabalhar com cada um dos outros grupos separadamente. Equipe de teste de aceitação A principal tarefa do grupo de teste de aceitação é a definição, execução e análise dos resultados de todos os casos de teste de negócio possíveis. Embora possa parece uma tarefa trivial, ela não é, pois existe um grande desafio na elaboração dos testes de migração, já que os cenários de negócio são novos para os testadores e será a primeira vez que irão utilizá-los. Uma vez que os resultados dos cenários de negócio são muito importantes e devem ser exatos, quase não existe tolerância a ocorrência de um erro. A equipe de teste de legado deverá trabalhar em estreita colaboração com a equipe de aceitação. Na prática a equipe de legado deverá aprovar ou não cada resultado de caso de teste que a equipe de aceitação irá executar e produzir. Sem estas aprovações o sistema será considerado como não migrado. As equipes de aceitação e legado irão verificar os resultados dos cenários de negócios a nível de bits e bytes, ou seja, quanto a exatidão dos valores, dados, relatórios, cálculos, estruturas de arquivos, botões de trabalho, arquivos de entrada e etc. Equipe de teste operacional É composta de usuários que irão utilizar o sistema. O grupo operacional irá realizar testes em paralelo com a equipe de aceitação mas com um objetivo completamente diferente. Este grupo irá trabalhar na futura plataforma e no ambiente sob todos os aspectos que não sejam sob o ponto de vista do negócio, ou seja, de conectividade e interoperabilidade. Irá testar interfaces, desempenho, sistema de back-ups e demais elementos da nova plataforma. Uma vez que a equipe de legado tem o conhecimento das características internas e externas e o comportamento geral do sistema antigo, eles poderão comparar e aprovar os resultados produzidos pela equipe operacional. Equipe de teste de legado É composta por pessoas da área de negócio que estão familiarizadas com o sistema antigo. Esta equipe irá trabalhar com cada um dos outros grupos separadamente, ou seja, 50% com a equipe de teste de aceitação e 50% com a equipe Operacional. Você sabia? Nesta etapa a equipe de testes dependendo da situação deverá escolher e aplicar os tipos de testes já estudados nas aulas anteriores. O grau de validação requerido depende do quão críticos são os dados a serem convertidos. Teste de migração de uma plataforma a outra pode incluir testes operacionais do novo ambiente tanto quanto a mudança de software. Simulação do novo sistema em substituição ao sistema antigo Nesta etapa do processo deverá realizada um simulado do novo sistema em condições reais de funcionamento em paralelo ao antigo sistema de forma que o usuário gestor possa avaliar possíveis necessidades de ajustes do fluxo operacional e computacional de forma a trazer benefícios com a instalação do novo sistema. Deve ser dada uma atenção especial aos dados migrados automaticamente para garantir que não haja erros no software de migração. Os dados migrados devem ser verificados para garantir que um nível de exatidão apropriado tenha sido alcançado. Quando os resultados ultrapassarem o limite de exatidão aceitável, devem ser identificadas as causas e aplicado procedimentos corretivos, como por exemplo: As correções requeridas nos dados de origem e a execução novamente da conversão. Identificação das correções para o software de conversão de dados automatizado (normalmente através da criação de um Controle de Mudança), e a execução novamente da conversão, tendo em vista a correção do software. A observação dos erros de dados para a correção manual no novo sistema. Quais as fases do processo de migração de dados? Design, extração, limpeza, carga, e verificação. Em que consiste a migração dos dados: Termo utilizado para descrever um projeto em que os dados serão transferidos ou copiados de um ambiente para outro, e removidos ou desativados na origem. O que a equipe deve fazer após a etapa de carga dos dados? Os resultados deverão ser submetidos a uma etapa de verificação. Aula 9: Teste de software: Sistema em produção Introdução A partir deste texto introdutório, você será capaz de entender melhor os conceitos estudados nesta aula, sendo capaz de relacionar o conteúdo que será aprendido ao contexto em que está inserido. Nesta aula iremos estudar os testes de manutenção (corretiva, perfectiva, adaptativa e preventiva) que um sistema em produção poderá sofrer. É importante ressaltar que estes tipos de testes de software aplicados na manutenção de sistemas em produção, demandam cuidados adicionais, notadamente quanto à corretitude e ao tempo reduzido para realizar os testes, depurar os erros e validar os resultados - uma vez que os sistemas são ativos da empresa e suas interrupções possam causar danos e prejuízos à ela. Iremos aprender também sobre a importância da medida de confiabilidade e da disponibilidade de um software. Veremos o conceito de confiabilidade, fazendo uma comparação ao conceito de disponibilidade. Estudaremos a medida de confiabilidade de software. Confiabilidade Baseia-se na execução do sistema em determinada unidade de tempo sem falhas. Disponibilidade Baseia-se na oferta do software em determinada unidade de tempo, considerando-se, proporcionalmente, o tempo útil de uso e o tempo de reparo de falhas. Tipos de manutenção Independentemente do domínio da aplicação, tamanho ou complexidade, o software continuará a evoluir com o tempo. Após seu desenvolvimento um sistema pode ficar operacional, ou seja, em produção por anos ou até mesmo décadas. Porém durante este período o próprio sistema ou seu ambiente operacional podem ser corrigidos, modificados ou completados. Diferentes causas geram manutenções de tipos diferentes em um software em produção, e podem ser classificadas em: Manutenção Corretiva Irá identificar e corrigir defeitos (erros latentes). Manutenção Adaptativa Irá adaptar o software a novas tecnologias, metodologias, modelos de gestão, legislação. Manutenção Perfectiva Irá incluir novas funções no software em produção, como: atender pedidos do usuário para modificar funções existentes e efetuar melhoramentos gerais. Manutenção Preventiva Irá melhorar a manutenibilidade ou a confiabilidade futura. Teste em manutenção de software O teste de manutenção (Sylabbus,2007) é iniciado por: Modificações no software Migrações Retiradas de software ou sistemas Como já estudamos, essas modificações podem ser inclusões de melhorias planejadas, ou seja, uma nova versão do software, podem ser mudanças corretivas e emergenciais ou, ainda, mudanças de ambiente, como atualização em sistema operacional ou banco de dados e correções (“patches”) para expor e encontrar vulnerabilidades do sistema operacional. Além de testar o que foi alterado, o teste de manutenção inclui também um teste de regressão massivo para as partes do sistema que não foram testadas. Teste de Regressão O teste de regressão é um teste seletivo, de um software que foi modificado ou já passou por iterações anteriores. Tem como propósito garantir que as falhas tenham sido reparadas e que as operações que funcionavam anteriormente não apresentem falhas após os reparos, ou seja, que as novas características adicionadas não tenham criado problemas ou incompatibilidades em relação as versões anteriores ou com outros sistemas. O objetivo desse tipo de teste é verificar se as alterações realizadas geraram alguma inconsistência no aplicativo ou em outros sistemas. Nesse caso, aplicam-se as mesmas técnicas de testes já utilizados em testes, anteriormente, e que são executados, progressivamente, para verificar se alguma falha foi introduzida após as mudanças. Teste em manutenção de software O escopo do teste de manutenção está relacionado ao risco da mudança, o tamanho do sistema existente e o tamanho da mudança. Dependendo da mudança, o teste de manutenção pode ser feito em todos ou apenas em alguns módulos do sistema e podem ser aplicados em todos ou alguns tipos de testes. A determinação de como um sistema pode ser afetado por mudanças é chamada de análise de impacto e pode ser usada para ajudar a decidir quantos testes de regressão serão realizados. ATENÇÃO Os testes de manutenção podem se tornar uma tarefa complicada, se as especificações do software estiverem desatualizadas ou incompletas. Teste em manutenção de software Dependendo do tipo de manutenção podemos ter os seguintes tipos de teste: Teste em manutenção corretiva Os testes de manutenção corretiva de um software em produção são os mais exigidos, uma vez que se trabalha sobre um produto com vícios de construção, o que pode demandar esforço significativo para identificação e correção adequada do erro. Nesse caso, é indispensável a aplicação dos testes de validação de forma a evitar possível propagação ou derivação de erro pela correção realizada e levando em consideração que tudo isso deverá ocorrer em diminuto espaço de tempo. Teste em manutenção perfectiva Se assemelham ao teste na construção do software, pois, testam-se novas funções, incluídas pelo usuário, que serão iniciadas nos sistemas, podendo ser planejadas. Teste em manutenção adaptativa Por validar impositivas, quer legais, quer tecnologias, mesmo com tempo limitado, são previsíveis, podendo assim, como a perfectiva e a preventiva, ser planejado, o que facilita a atividade de teste de software. Teste em manutenção preventiva São os mais previsíveis, pois, buscam identificar, antecipadamente, possíveis erros ou falhas no aplicativo que esta sendo usado na empresa. Vale ressaltar que esse tipo de teste não é muito usual. Confiabilidade e disponibilidade de software Com o constante desenvolvimento da tecnologia, os sistemas computacionais têm sido requisitados em quase todas as áreas da atividade humana. Essa crescente dependência em relação ao software tem conscientizado os usuários, que cada vez mais exigem softwares confiáveis. Por conta disso, o software constitui a parte mais dispendiosa para a solução de um problema que envolve um computador. Consequentemente, desenvolver um software com qualidade tem exigido um enorme esforço na atividade de teste. Os problemas de confiabilidade e disponibilidade podem, quase sempre, ser associados a defeitos de projeto ou de implementação. Antes de estudarmos sobre a confiabilidade e disponibilidade de um software, precisamos compreender o conceito de falha. Mais o que é falha? Segundo Pressman (2011), falha é a falta de conformidade com os requisitos de software. Vamos relembrar o que são requisitos de software? Existem diferentes tipos de falhas que podem ser problemáticas ou catastróficas. Enquanto uma determinada falha pode ser corrigida em segundos, outras necessitarão de horas ou até mesmo meses para serem corrigidas. É importante considerar, também, que, às vezes, a correção de uma falha pode resultar na introdução de outros erros que resultarão em outras falhas. Hardware Erros de fabricação. Final de sua vida útil. Software Enganos na especificação, projeto ou implementação. Operadores humanos. Falha ao operar o sistema. Requisitos de um software Os requisitos de um software são sentenças que expressam as necessidades dos clientes e que condicionam a qualidade do software. Podem ser classificados em: Requisitos Funcionais: Estão diretamente ligados a funcionalidade do software. Requisitos Não Funcionais: Expressam restrições que o software deve atender ou qualidades específicas que o software deve ter. Requisitos Inversos: Estabelecem condições que nunca podem ocorrer. Requisitos Não funcionais Dimensões da confiança de um software A confiança de um sistema, segundo Sommerville (2003) , é uma propriedade do sistema que equivale a sua integridade, ou seja, é o grau de confiança dos usuários de que o sistema operará como eles esperam e não “falhará” em uso normal. Existem quatro dimensões principais de confiança: Disponibilidade A disponibilidade de um software se baseia na oferta do software em determinada unidade de tempo, considerando-se, proporcionalmente, o tempo útil de uso e o tempo de reparo de falhas. Disponibilidade de software é a probabilidade de um sistema, em determinado instante, ser operacional e fornecer os serviços requeridos. A disponibilidade não depende do sistema em si, mas do tempo necessário para reparar os defeitos que tornam o sistema indisponível. Confiabilidade de Software O conceito de confiabilidade de software se baseia na execução do sistema em determinar unidade de tempo, sem falhas. A confiabilidade do produto de software é influenciada pelo processo de software utilizado para desenvolver o produto. Um processo orientado no sentido de evitar defeitos poderá desenvolver um sistema confiável. Você sabia que diferentemente de outros fatores a qualidade a: Em termos estatísticos, a confiabilidade de software é definida como: “...a probabilidade de operação livre de falhas de um programa de computador num ambiente específico durante determinado tempo” (Musa et al, 1987, in Pressman (1995). Segurança A segurança de um sistema é um atributo que reflete a capacidade do sistema de operar normal e anormalmente, sem ameaçar as pessoas ou o ambiente. Proteção A proteção de um sistema é uma avaliação do ponto em que o sistema protege a si mesmo de ataques externos. Erros no desenvolvimento de um sistema podem levar a falhas de proteção. Sem um nível razoável de proteção, a disponibilidade, a confiabilidade e a segurança do sistema poderão ser comprometidas, se ataques externos provocarem algum dado ao sistema. Medida de confiabilidade de software Um meio simples de se medir a confiabilidade de um software é observar o tempo para a ocorrência da próxima falha. Métricas que podem ser utilizadas para medir a confiabilidade de um software: O tempo médio entre falhas, MTBF (mean time between failure), representa o tempo esperado para a ocorrência da próxima falha, ou seja, é o tempo durante o qual o software funciona sem falhas (Delamare&Maldonado&Jino, 2007). O tempo médio é calculado, considerando-se a soma de duas medidas diretas: MTTF (mean time to failure) Tempo médio de uso até a falha do software e MTTR (mean time to repair) Tempo médio de reparo da falha no software. Portanto, quanto maior for o MTBF e o MTTF em relação ao MTTR, mais tempo o sistema ficou operativo. Medida de disponibilidade de software Através de exemplo, mostrar que a medida de disponibilidade de software considera as medidas MTTF e MTTR, sendo mais sensível ao MTTR ou seja, tempo de correção da falha, pois, a disponibilidade é obtida através de: Quanto mais próximo de 1 for a disponibilidade, mais produtivo foi o software no período. Engenharia de confiabilidade de software Software tem sido companheiro meu, seu e de quase todas as pessoas em uma gama enorme de produtos. Em nosso cotidiano, podemos encontrar software embutido em forno micro-ondas, nos jogos de computador bem como no controle de aeronaves e sistemas de telecomunicações, só para citar alguns exemplos. Associado ao software, há um atributo de qualidade de suma importância para qualquer produto: confiabilidade. A confiabilidade de software é, geralmente, definida como a probabilidade do software operar sem ocorrência de falhas durante um período especificado de tempo em um determinado ambiente. Num contexto mais amplo, a qualidade de software é uma propriedade multidimensional que inclui, além da confiabilidade, outros fatores de satisfação do cliente como funcionalidade, usabilidade, desempenho, habilidade de prestação de serviço, manutenibilidade e documentação. Todavia, a confiabilidade de software é, comumente, aceita como um fator chave da qualidade de software, uma vez que a confiabilidade de software pode quantificar as falhas de software. Disponibilidade é um outro atributo importante de sistemas que têm software como componente. Disponibilidade é a probabilidade, em qualquer instante de tempo, de um sistema funcionar satisfatoriamente em um determinado ambiente. Em outras palavras, é a probabilidade de um sistema está disponível quando necessário. Disponibilidade pode ser determinada pela relação: Disponibilidade = ((MTTF)/(MTTF + MTTR)).100% onde: MTTF (Mean Time to Failure) é o tempo médio até a ocorrência de falha. MTTR (Mean Time to Repair) é o tempo médio de reparo. Esses dois atributos, confiabilidade e disponibilidade compreendem a base da engenharia de confiabilidade de software (ECS) que é definida como o estudo quantitativo do comportamento operacional de sistemas de software com base nos requisitos de usuários relativo a confiabilidade. Engenharia de confiabilidade de software inclui: Medição de confiabilidade de software, a qual inclui estimação e previsão com o uso de modelos de confiabilidade de software. Atributos e métricas de projeto de produtos, processo de desenvolvimento, arquitetura de sistema, ambiente operacional do software e suas implicações sobre a confiabilidade. Aplicação deste conhecimento na especificação e projeto da arquitetura de software do sistema, desenvolvimento, testes, uso e manutenção. Para tanto, torna-se necessário a coleta de dados de falhas. Esses dados são coletados para se fazer a medição da confiabilidade de software. Essa coleta compreende: (a) contagem de falhas – esse tipo de dado faz o rastreamento da quantidade de falhas detectadas por unidade de tempo; (b) tempo médio entre falhas. Esse tipo de dado faz o rastreamento dos intervalos entre falhas consecutivas. Além disso, ECS requer a medição de confiabilidade de software que envolve duas atividades: estimação e previsão de confiabilidade. A atividade de estimação determina a confiabilidade de software atual aplicando técnicas estatísticas de inferência aos dados de falhas obtidos durante o teste do sistema ou durante a operação do sistema. Esta é uma medida que considera a confiabilidade obtida desde um instante passado até o instante atual. Seu principal objetivo é avaliar a confiabilidade atual e determinar se o modelo de confiabilidade está bem calibrado. Já a atividade de previsão determina a confiabilidade de software futura baseada em métricas de software e medidas disponíveis. Dependendo do estágio de desenvolvimento, a previsão pode envolver diferentes técnicas como: Quando os dados de falhas estão disponíveis – Por exemplo, o software encontra-se em testes ou no estágio operacional. Neste caso, as técnicas de estimação podem ser usadas para parametrizar e verificar os modelos de confiabilidade de software, os quais realizam previsão de confiabilidade de software futura. Quando os dados de falhas não estão disponíveis – Por exemplo, quando o software ainda encontra-se na fase de projeto ou implementação. Neste caso, as métricas obtidas do processo de desenvolvimento de software e as características do produto resultante podem ser utilizadas para determinar a confiabilidade de software durante testes. As dimensões de confiança de um software são classificadas em: Confiabilidade, disponibilidade, segurança, proteção. A manutenção adaptativa irá: Adaptar o software a novas tecnologias (TI/SI), metodologias, modelos de gestão, legislação. A probabilidade de um sistema, em determinado instante, ser operacional e fornecer os serviços requeridos, refere-se ao conceito de: Disponibilidade. Aula 10: Ferramentas de Teste de Software Automação de teste de Software A diferença entre testes e automação de testes, é que no primeiro você realiza a tarefa de testar, e no segundo você usa um software que imita a interação com a aplicação no que se refere ao teste tal qual um ser humano faria (Graham e Fewster,1999). Basicamente os testes de software podem ocorrer de duas formas, através de testes manuais ou testes automatizados. O conceito de testes manuais é a utilização de recursos humanos para realizar todos os procedimentos de testes especificados. Este tipo de teste requer um número muito grande de profissionais e um controle eficiente de documentos em circulação. O risco inerente a esse tipo de teste é a grande incidência de erros humanos no processo devido a: Não-execução dos procedimentos na ordem estabelecida A valores digitados erradamente. Os testes automatizados utilizam ferramentas de testes que possibilitem simular usuários ou atividades humanas de forma a não requere procedimentos manuais no processo de execução dos testes. Entretanto requerem profissionais especializados e tempo no desenvolvimento da automação dos testes. Tipos de Testes Automatizados (Progressivos e Regressivos) A automação de teste deve ser vista: Técnicas de teste automatizado Para agilizar e automatizar o processo de teste a maioria das ferramentas de automação de testes apresentam como principais características: Gravador ou Recorde Quase todas as ferramentas possuem de alguma forma um gravador que, uma vez acionado, grava, na forma de uma linguagem interna (seja visual ou não) tudo que o usuário fizer, ficando armazenado no script de teste. Script de teste Uma vez acionado pelo executor de testes, o script entra em execução, pois o que foi gravado vai sendo repetido. Executor de teste e playback Recurso da ferramenta que executa o que foi gravado ou registrado no script de teste. Cada ferramenta implementa este recurso de uma forma, porém todas fazem a mesma coisa. Data-driven teste ou teste dirigido a dados Consiste em criar um script e depois fazer isso de uma massa de dados que será executada no script, dirigindo a forma como será executado assim como a quantidade de vezes que ele será executado. Segundo Graham e Fewster (1999), existem diferentes estratégias consideradas ao se projetar e escrever scripts de testes: Scripts Lineares É uma técnica que faz gravação ou replicação direta das ações do teste sem nada acrescentar. Esta técnica consiste em gravar as ações executadas por um usuário sobre a interface gráfica de uma aplicação e converter estas ações em scripts de teste que podem ser executadas quantas vezes for necessário. Scripts estruturados ou scripts compartilhados A técnica de script estruturado aciona mais de um comando simulando a execução em paralelo de diversas ações. Já na técnica de scripts compartilhados os scripts podem ser utilizados em mais de uma caso de teste e tendem a ser scripts genéricos como login e logout, por exemplo. Ambas as técnicas são uma extensão da técnica de scripts lineares possibilitando que os scripts de teste gravados sejam, alterados para que desempenhem um comportamento diferente. Data-driven scripts (técnica orientada a dados) É uma técnica que separa os dados usados pelo script do script em si. Consiste em extrair dos scripts de teste os dados de teste e armazená- los em arquivos separados da lógica de execução devido ao alto volume de dados. Uma das vantagens na utilização desta técnica é a possibilidade da utilização do mesmo script com diferentes arquivos de dados, em diferentes formatos. Keyword-driven scripts (técnica orientada a palavras chave) Técnica muito semelhante ao data-driven script, porém neste caso utiliza palavras-chaves ou ações específicas que são usadas constantemente em mais de um script. Consiste em extrair dos scripts de teste, o procedimento de teste que representa a lógica de execução. Ferramentas de teste automatizado de software As revisões e testes são instrumentos de controle de qualidade de um projeto. Existem diversas ferramentas de apoio a tais atividades, que variam tanto quanto a parâmetros como técnicas implementadas e linguagens suportadas:. Para um bom desempenho do processo de automatização estas ferramentas devem ser integradas entre si: Ferramentas de Modelagem e Automação As ferramentas de modelagem auxiliam no processo de construção e documentação de como serão testados todos os requisitos de negócio, possibilitando registrar todos os procedimentos de teste a cada cenário estabelecido e ainda o processo de conferência dos dados. Estas ferramentas possibilitam o desenvolvimento de scripts automatizados. As principais características destas ferramentas são a modelagem de testes, gerador de massa de dados e automatizados de scripts. A modelagem de testes auxilia nos processos de planejamento e construção dos testes, identificado os diversos cenários estabelecidos para cada requisito a ser testado. Determina as informações que devem ser empregadas em cada procedimento de teste, atingindo o menor nível de detalhamento. Vale ressaltar que a modelagem dos testes é um processo mental, assim nenhuma ferramenta substituirá a experiência e abstração de um bom analista de testes, porém estas ferramentas auxiliam na estruturação das ideias. A geração de massa de dados possibilita a geração automática de massa de dados baseada no planejamento dos testes e critérios estabelecidos de forma a garantir uma massa diferenciada e nas circunstâncias desejadas. A automação de scripts possibilita a interação entre as rotinas automatizadas e os softwares a serem testados através da captura de valores em telas, arquivos, relatórios ou mesmo em banco de dados. Permitem automatizar não somente as atividades de entrada de informações, como o processo de conferência (análise da saída das informações). Ferramentas de execução e Conferência As ferramentas de execução e conferência possibilitam o gerenciamento e o controle do processo de execução, re-execução e medição dos testes planejados. Possibilitam integração entre as demais fases, de forma a executar os testes selecionados no planejamento. As principais características destas ferramentas são a: análise de cobertura, executor de scripts, simuladores de performance e testadores de memória. Executor de scripts: Como as ferramentas de execução e conferência são normalmente integradas aos softwares de planejamento de testes e desenvolvimento de scripts, o executor de scripts permite executar os procedimentos na ordem e frequências preestabelecidas. Permite também a gestão do ciclo de testes como um todo, com o controle de execução de cada caso de testes, o controle da re-execução dos testes e os desvios de testes provocados por erros inesperados. Simuladores e medidores de performance: Estão diretamente ligadas aos testes de sistema, como os testes de carga, volume e performance, já que nessa categoria é impossível conceber a ideia de realizar testes sem empregar ferramentas específicas. Testadores de memória: Auxiliam no processo de detecção de problemas em relação ao uso e alocação de memória pela aplicação. Sendo assim devem ser específicas para cada linguagem e ambiente. Análise de cobertura: possibilita estabelecer uma métrica de cobertura do teste através do monitoramento das linhas de código executadas. Os testes de caixa branca requerem esse tipo de ferramenta, pois possibilita visualizar áreas do código não cobertas pelos testes em execução. Ferramentas de Revisões e Inspeções Estas ferramentas auxiliam nas revisões de documentos e inspeções técnicas que podem ser aplicadas em todas as etapas do processo de desenvolvimento. Suas principais características são a análise de complexidade, a compreensão do código e a análise sintática de semântica. A análise de complexidade auxilia a identificar onde estão as áreas mais complexas e quais possuem maior risco de introduzir novos erros, além de quantificar o esforço e os custos dos testes a serem empregados. A compreensão de código auxilia a inspecionar os códigos-fontes, possibilitando avaliar a aderência a padrões de programação estabelecidos pela organização, como por exemplo: Padrão de nome, Utilização de rotinas corporativas, Variáveis não utilizadas, sub-rotinas internas não acionadas, APIs incompatíveis com determinados sistemas operacionais. A análise sintática e de semântica localiza erros na sintaxe e na semântica dos comandos empregados no código, os quais o compilador não acusaria, sendo possível detectar defeitos antes de os testes formais serem iniciados. Ferramentas de Planejamento de Testes Esta categoria de ferramenta apoia o processo de planejamento dos trabalhos de testes, definindo escopos, abordagens, agendando reuniões e programando atividades. Auxiliam no processo de documentação inicial, possibilitando gerar planejamentos padronizados e na elaboração de estimativas de tempo e custo, além de dimensionar as equipes de acordo com o tempo disponível. Estas informações são geradas a partir da coleta inicial de requisitos de software que irão possibilitar dimensionar o esforço e complexidade envolvida no processo de desenvolvimento. As principais características destas ferramentas são a análise de criticidade e a geração de documentos. A análise de criticidade permite direcionar esforços de forma eficiente, através da priorização dos sistemas, indicando quais sistemas devem ser testados inicialmente. Permite também estimar tempo, custos e equipes através da análise da complexidade de cada software, baseando-se nos requisitos a serem cumpridos. A geração de documentos facilita o processo de documentação, através da utilização de parametrizações e modelos de documentos. Permitem também gerenciar as versões dos modelos e ainda possibilitam organizar work-flow de preparação, elaboração, inspeção e aceite dos documentos. Ferramentas de suporte aos testes Estas ferramentas apoiam atividades que não estão diretamente ligadas ao processo de testes, porém garantem que determinados itens fundamentais desse processo estão sendo bem gerenciados. As principais características destas ferramentas são: Gerenciamento de defeitos e gerenciamento de configurações. O gerenciamento de defeitos tem como objetivo acompanhar e controlar os defeitos identificados durante o ciclo de vida do software e monitorá-los até a sua solução final, através da produção de um grande número de indicadores de qualidade. Permite parametrizações de forma a customizar um workflow de resolução de problemas, para melhor adapta-se a estrutura da empresa. Também é conhecido por: Gerenciamento de erros, gerenciamento de problemas, Registro de ocorrências, controle de incidências. O gerenciamento de configurações permite controlar e coordenar as mudanças efetuadas em documentações, fontes e ambientes físicos. Estabelece a relação entre os artefatos de software e identifica-los através de um único controle de versão enquanto ocorrem modificações de fontes de uma versão anterior. Qual ferramenta utilizar? Nesta aula iremos conhecer de uma forma resumida alguma das principais ferramentas utilizadas no mercado para testes automáticos de software: JUnit Framework de código aberto que tem o objetivo de facilitar a automatização de testes unitários em aplicações que utilizam a linguagem Java e possui integração com várias IDES. Para acessar maiores informações: http:// www.junit.org/index.htm A IDE (Integrated Development Environment ou Ambiente Integrado de Desenvolvimento), é um programa de computador que reúne uma série de características e ferramentas de apoio ao desenvolvimento de software com o objetivo de agilizar este processo. As IDE s disponíveis para desenvolvimento em Java são: Código aberto: Eclipse, NetBeans, VIM, jEdit, BlueJ Código proprietário: JCreator, Borland JBuiLder, lntellij Idea, Sun Studio Creator, OracleJdeveloper. JMeter Ferramenta de código aberto para aplicações Java projetada inicialmente para testes funcionais e de performance para aplicações web. RFT (IBM Rational Functional Tester) Ferramenta de propriedade da empresa IBM para automação de teste de regressão, funcional, de interface gráfica (GUI) e data driven. Mercury Quality Center Conjunto de ferramentas de propriedade da empresa HP que abrange diferentes tipos de testes, linguagens e arquitetura. Possui uma interface integrada baseada na Web para teste e gerenciamento de qualidade de software em diversos ambientes de aplicação. JaBUTi (Java Bytecode Understanding na Testing) Ferramenta de suporte ao teste estrutural para programas Java, desenvolvida pela USP. O seu diferencial entre as outras ferramentas existentes com a mesma função de teste é que toda a análise estática necessária para a realização do teste é feita sobre o programa objeto, ou seja, sobre o bytecode Java e não sobre o programa fonte. Projeto de automação de teste Um projeto de automação de teste é um investimento alto e de longa duração, e por isso mesmo os dirigentes das organizações obviamente tem expectativas em relação a custos e aos benefícios trazidos pela sua implementação. Por isso um projeto de automação de testes deve ser cercado de alguns cuidados: Ferramenta: Seleção da ferramenta certa, adequada à tecnologia usada e que possa integrar com as metodologias de desenvolvimento e teste. Metodologia: Existência de metodologias de desenvolvimento e testes consolidadas e usadas, que possam se integrar com a ferramenta escolhida. Infraestrutura: Disponibilidade de máquina e seus recursos, um projeto em desenvolvimento (em fase de testes) dedicado para o projeto de automação de testes. Recursos: Garantia por parte dos dirigentes da organização quanto à disponibilidade de recursos humanos capacitados e financeiros para o projeto, apoio para as mudanças requeridas nos processos de desenvolvimento e testes, assim como nas ferramentas de desenvolvimento. Quais casos de testes são candidatos a automatização? A cada nova versão de um software torna-se necessário realizar um novo conjunto de teste, visando ampliar as melhorias implementadas. Desta forma também é necessário reexecutar um conjunto de casos de testes (todos ou partes) de forma a avaliar se as mudanças realizadas danificaram outras partes do software que já funcionava. Os custos relativos à execução dos testes de progressão não são importantes. Porém são importantes os custos de execução dos testes de regressão, pois estes devem ser reexecutados ao longo do ciclo de vida do software. Desta forma devemos considerar que os testes automatizados visam a otimização da execução dos testes, mas deve ser feito, preventivamente, um estudo de viabilidade técnica e um estudo de custo beneficio para sua utilização ou não. Os testes automatizados não substituem os testes manuais, eles são complementares e para isso devemos levar em consideração que todo caso de teste é naturalmente candidato à automação, mas naturalmente nem todos são recomendáveis para automação: Se o caso de teste for algo pontual e específico de alguma versão do software e não se espera que seja testado em versões futuras, não é candidato à automação. Se o caso de teste tiver características de uso de uma grande massa de dados, indica ser um data-driven test que precisará provavelmente ser automatizado. Não existe tempo hábil para automatizar o teste desejado devido ao cronograma, então ele não será momentaneamente um teste a ser automatizado. O termo automação de teste de software significa a utilização: De um software que imita a interação com a aplicação no que se refere ao teste tal qual um ser humano faria. Para a implementação de um projeto de automatização de teste precisamos de: Recurso, infraestrutura, ferramenta e metodologia. O gerenciamento de defeitos e o gerenciamento de configuração são características de qual tipo de ferramenta? Ferramentas de Suporte aos Testes.