Testes – visão geral Vanilson Burégio Roteiro Introdução a testes de Software Tipos de teste; Técnicas de teste; Plano de Teste; Casos de teste; Revisões formais. Introdução a Testes de Software O que é testar? Introdução “O desenvolvimento de sistemas de software envolve uma série de atividades de produção onde oportunidades para injeção de falhas humanas são enormes” [Pressman, 2007] Enquanto existir software existirá erro Testar um software nada mais é do que descobrir, de forma sistemática, erros embutidos durante a construção deste software O que é testar? Teste de software é o processo de execução de um produto para determinar se ele atingiu suas especificações e funcionou corretamente no ambiente para o qual foi projetado Objetivo Revelar falhas em um produto, para que as causas dessas falhas sejam identificadas e possam ser corrigidas pela equipe de desenvolvimento antes da entrega final Testar é um processo de execução de um programa com a intenção de encontrar um erro Um bom caso de teste é aquele que possui uma alta probabilidade de encontrar erros ainda não descobertos Um teste bem sucedido é aquele que realmente descobre um erro ainda não conhecido Então... Se eu testei um software e não encontrei erros significa que meu software está correto, ou seja, livre erros! Verdadeiro ou Falso? Conceitos Básicos Caso de Teste: descreve uma condição particular a ser testada e é composto por valores de entrada, restrições para a sua execução e um resultado ou comportamento esperado Procedimento de Teste: é uma descrição dos passos necessários para executar um caso (ou um grupo de casos) de teste Critério de Teste: serve para selecionar e avaliar casos de teste de forma a aumentar as possibilidades de provocar falhas ou, quando isso não ocorre, estabelecer um nível elevado de confiança na correção do produto – Critério de Cobertura dos Testes: permitem a identificação de partes do programa que devem ser executadas para garantir a qualidade do software e indicar quando o mesmo foi suficientemente testado – Critério de Adequação de Casos de Teste: avalia se os casos de teste definidos são suficientes ou não para avaliação de um produto ou uma função – Critério de Geração de Casos de Teste: define as regras e diretrizes para geração dos casos de teste de um produto que esteja de acordo com o critério de adequação definido anteriormente Defeitos no desenvolvimento de Software Os defeitos normalmente são introduzidos na transformação de informações entre as diferentes fases do ciclo de desenvolvimento de um software Defeitos no desenvolvimento de Software Os defeitos normalmente são introduzidos na transformação de informações entre as diferentes fases do ciclo de desenvolvimento de um software Defeitos no desenvolvimento de Software Os defeitos normalmente são introduzidos na transformação de informações entre as diferentes fases do ciclo de desenvolvimento de um software Defeitos no desenvolvimento de Software Os defeitos normalmente são introduzidos na transformação de informações entre as diferentes fases do ciclo de desenvolvimento de um software Defeitos no desenvolvimento de Software Os defeitos normalmente são introduzidos na transformação de informações entre as diferentes fases do ciclo de desenvolvimento de um software Defeitos no desenvolvimento de Software Os defeitos normalmente são introduzidos na transformação de informações entre as diferentes fases do ciclo de desenvolvimento de um software Tipos de Teste de Software Tipos de teste de software O planejamento dos testes deve ocorrer em diferentes níveis e em paralelo ao desenvolvimento do software Tipos de teste de software O planejamento dos testes deve ocorrer em diferentes níveis e em paralelo ao desenvolvimento do software Tipos de teste de software O planejamento dos testes deve ocorrer em diferentes níveis e em paralelo ao desenvolvimento do software Tipos de teste de software O planejamento dos testes deve ocorrer em diferentes níveis e em paralelo ao desenvolvimento do software Tipos de teste de software Teste de Unidade (testes unitários). Tem por objetivo explorar a menor unidade do projeto, procurando provocar falhas ocasionadas por defeitos de lógica e de implementação em cada módulo, separadamente. O universo alvo desse tipo de teste são os métodos dos objetos ou mesmo pequenos trechos de código Teste de Integração: visa provocar falhas associadas às interfaces entre os módulos quando esses são integrados para construir a estrutura do software que foi estabelecida na fase de projeto Teste de Sistema: avalia o software em busca de falhas por meio da utilização do mesmo, como se fosse um usuário final. Dessa maneira, os testes são executados nos mesmos ambientes, com as mesmas condições e com os mesmos dados de entrada que um usuário utilizaria no seu dia-a-dia de manipulação do software. Verifica se o produto satisfaz seus requisitos Tipos de teste de software Teste de Aceitação: são realizados geralmente por um restrito grupo de usuários finais do sistema. Esses simulam operações de rotina do sistema de modo a verificar se seu comportamento está de acordo com o solicitado. Teste de Regressão: Teste de regressão não corresponde a um nível de teste, mas é uma estratégia importante para redução de “efeitos colaterais” – Consiste em se aplicar, a cada nova versão do software ou a cada ciclo, todos os testes que já foram aplicados nas versões ou ciclos de teste anteriores do sistema. – Pode ser aplicado em qualquer nível de teste Técnicas de Teste de Software Técnicas de teste de software Atualmente existem muitas maneiras de se testar um software Existem as técnicas que sempre foram muito utilizadas em sistemas desenvolvidos sobre linguagens estruturadas que ainda hoje têm grande valia para os sistemas orientados a objeto Apesar de os paradigmas de desenvolvimento serem diferentes, o objetivo principal destas técnicas continua a ser o mesmo: encontrar falhas no software. As técnicas de teste são classificadas de acordo com a origem das informações utilizadas para estabelecer os requisitos de teste. As técnicas existentes são: – Técnica funcional (Caixa preta) – Técnica estrutural (Caixa branca) Técnicas de teste de software Teste Estrutural Caixa-branca – avalia o comportamento interno do componente de software – trabalha diretamente sobre o código fonte do componente de software • • • • • teste de condição; teste de fluxo de dados; teste de ciclos; teste de caminhos lógicos Complexidade ciclomática – exemplo bem prático desta técnica: uso da ferramenta livre JUnit Técnicas de testes caixa-branca Testes de caminhos lógicos – – – – Notação de grafo de fluxo Complexidade ciclomática Derivando casos de teste Matriz de grafo Testes de estrutura de controle – Teste de condição – Teste de fluxo de dados – Teste de loops Técnicas de teste de software Teste Funcional Caixa-preta – o componente de software a ser testado é abordado como se fosse uma caixa-preta – não se considera o comportamento interno do mesmo – dados de entrada são fornecidos, o teste é executado e o resultado obtido é comparado a um resultado esperado previamente conhecido – o componente de software a ser testado pode ser: um método, uma função interna, um programa, um componente, um conjunto de programas e/ou componentes ou mesmo uma funcionalidade Técnicas de teste de software Outras técnicas – Outras técnicas de teste podem e devem ser utilizadas de acordo com necessidades de negócio ou restrições tecnológicas • • • • • • teste de desempenho teste de usabilidade teste de carga teste de stress teste de confiabilidade teste de recuperação. Plano de Testes Processo de teste Exemplo baseado no RUP (Rational Unified Process) Nosso foco agora! Plano de testes Objetivo – identificar e descrever os testes que serão executados e implementados – plano de testes possuirá os requisitos para o teste e as estratégias de teste O projetista de teste é o responsável pelo planejamento dos testes Planejar testes Técnicas que asseguram o levantamento adequado de informações desta atividade – entrevistas – questionários – monitoramento de funções Planejar testes Atividades: – – – – – – – – Selecionar requisitos a testar Definir prioridades Planejar testes de regressão Definir estratégia dos testes Definir o registro dos resultados dos testes e defeitos descobertos Definir recursos humanos Definir cronograma de testes Realizar checklist Plano de Testes (ver exemplo de modelo) Casos de Teste (Projetar Testes) Processo de teste Exemplo baseado no RUP (Rational Unified Process) Nosso foco agora! Projetar testes Objetivo – Detalhar o projeto dos casos de testes o suficiente para que não haja dúvida ou ambigüidade, de modo que possa ser feitas a implementação e posterior execução Planejar testes Artefatos de entrada Documento de Requisitos Especificação de Casos de Uso Plano de Testes Lições aprendidas Artefatos de saída Modelo de testes Casos de teste Procedimentos de teste Projetar testes Passos: – – – – Identificar casos de teste Descrever casos de teste Identificar casos de teste a serem automatizados Definir massa de dados Casos de teste Identificar casos de teste – Além dos requisitos que serão testados, deve-se definir também quais testes serão realizados para os requisitos selecionados (casos de teste) – A identificação dos casos de teste é feita por meio da análise dos fluxos de eventos dos diferentes cenários possíveis para os casos de uso • Para cada cenário deve-se ter, no mínimo, um caso de teste correspondente. • A análise dos requisitos não-funcionais também deve gerar casos de testes Projetar testes Descrever casos de teste – Este passo tem como objetivo descrever os casos de testes identificados na fase de planejamento. Essa descrição deve conter: Condição inicial para execução: Descrever qual a configuração do ambiente em que esse caso de teste será executado e qual o estado inicial do sistema para que possa ser executado corretamente e outras pré-condições, como "deve existir um cliente cadastrado na base de dados". Passos específicos do teste a ser executado: Passos que devem ser executados para a correta execução do caso de teste. Pode incluir referências a rotinas comuns ou outros casos de teste. Projetar testes Descrever casos de teste – Essa descrição deve conter ainda: Resultados esperados: Quais os critérios de sucesso do teste (pode ser um valor específico ou algo mais genérico, como "Observar que a aplicação montou uma tela contendo a mensagem 'Cadastro realizado com sucesso' e que o banco foi alterado"). Condição final de execução: O estado que o sistema deve estar ao término da execução. Por exemplo, "a execução deste caso de teste deve manter a base de dados inalterada". Documento de casos de teste (Ver exemplo de modelo) Revisões formais Custo de desenvolvimento / Esforço Motivação Qualidade Tempo / Produtividade Quando artefatos defeituosos são produzidos.... – Geramos retrabalho para corrigir defeitos – custo de retrabalho para correção de defeitos aumenta na medida que o processo de desenvolvimento progride Iniciativas devem ser realizadas no sentido de encontrar e corrigir defeitos tão logo sejam introduzidos Uma abordagem que tem se mostrado eficiente nesse sentido: revisão dos artefatos produzidos ao longo do processo de desenvolvimento de software Inspeção de Software Inspeção de software é um tipo particular de revisão que pode ser aplicado a todos os artefatos de software e possui um processo de detecção de defeitos rigoroso e bem definido Inspeções de Software nos Diferentes Artefatos Inspeção de Software Processo tradicional de inspeção envolve: – – – – planejamento da inspeção indivíduos revisando um determinado artefato um encontro em equipe para discutir e registrar os defeitos a passagem dos defeitos para o autor do artefato para que possam ser corrigidos – uma avaliação final sobre a necessidade de uma nova inspeção Exemplo de questão