Teste de Software Parte 3 Ricardo de Almeida Falbo Tópicos Especiais – Qualidade de Software 2008/2 Departamento de Informática Universidade Federal do Espírito Santo Agenda Teste Funcional Teste Estrutural Tópicos Especiais - Qualidade de Software 2008/2 2 Teste Funcional Técnica de projeto de casos de teste na qual o programa ou sistema é considerado uma caixapreta. Para testá-lo, são fornecidas entradas e avaliadas as saídas geradas para verificar se estão em conformidade com os objetivos especificados. Estabelece critérios para particionar o domínio de entrada em subdomínios, a partir dos quais serão definidos os casos de teste (Delamaro et al., 2007). Tópicos Especiais - Qualidade de Software 2008/2 3 Teste Funcional Alguns critérios: Particionamento de Equivalência Análise de Valor Limite Teste Funcional Sistemático Todos os critérios das técnicas funcionais baseiam-se apenas na especificação do produto testado e, portanto, o teste funcional depende fortemente da qualidade da especificação de requisitos. Podem ser aplicados em todas as fases de teste e são independentes de paradigma, pois não levam em consideração a implementação. Tópicos Especiais - Qualidade de Software 2008/2 4 Particionamento de Equivalência Divide o domínio de entrada em classes de equivalência, de acordo com a especificação do programa. Uma classe de equivalência representa um conjunto de estados válidos ou inválidos para as condições de entrada. Caso as classes de equivalência se sobreponham ou os elementos de uma mesma classe não se comportem da mesma maneira, elas devem ser revistas, a fim de torná-las distintas (Delamaro et al., 2007). Tópicos Especiais - Qualidade de Software 2008/2 5 Particionamento de Equivalência Uma vez identificadas as classes de equivalência, devem-se definir os casos de teste, escolhendo um elemento de cada classe. Qualquer elemento da classe pode ser considerado um representante desta e, portanto, basta ter definir um caso de teste por classe de equivalência (Delamaro et al., 2007). Tópicos Especiais - Qualidade de Software 2008/2 6 Particionamento de Equivalência Passos: Identificar as classes de equivalência, tomando por base a especificação e, sobretudo, as entradas e as saídas; Gerar casos de teste selecionando um elemento de cada classe, de modo a ter o menor número possível de casos de teste (Delamaro et al., 2007). Tópicos Especiais - Qualidade de Software 2008/2 7 Exemplo 1: Programa Cadeia de Caracteres Especificação: Curso Normal: O usuário informa uma cadeia de caracteres contendo de 1 a 20 caracteres e um caractere a ser procurado. O sistema informa a posição na cadeia em que o caractere foi encontrado pela primeira vez. Curso Alternativo: O caractere informado não está presente na cadeia previamente informada. Curso de Exceção: A cadeia informada está vazia ou seu tamanho é maior do que 20. Uma mensagem é exibida informando que o caractere não pertence à cadeia informada. Uma mensagem de erro é exibida indicando que a cadeia de caracteres deve ter tamanho de 1 a 20. Curso de Exceção: Não é informado um caractere a ser procurado ou é informado mais de um caractere. Uma mensagem de erro é exibida indicando que um caractere a ser procurado deve ser informado. Tópicos Especiais - Qualidade de Software 2008/2 8 Exemplo 1: Programa Cadeia de Caracteres Entradas: Cadeia de caracteres Caractere a ser procurado Saídas possíveis: A posição da primeira ocorrência do caractere a ser procurado na cadeia. Mensagem informando que o caractere não pertence à cadeia informada. Mensagem de erro informando que a cadeia é inválida. Mensagem de erro informando que o caractere a ser procurado é inválido. Tópicos Especiais - Qualidade de Software 2008/2 9 Exemplo 1: Programa Cadeia de Caracteres Classes de Equivalência: Entrada Classes de Equivalência Válidas Classes de Equivalência Inválidas Cadeia de caracteres Qualquer cadeia de tamanho T, tal que 1 T 20. Qualquer cadeia de tamanho T, tal que T < 1 e T > 20. Caractere a Caractere que ser procurado pertence à cadeia. Caractere que não pertence à cadeia. Caractere não informado. Mais de um caractere é informado. Tópicos Especiais - Qualidade de Software 2008/2 10 Exemplo 1: Programa Cadeia de Caracteres Casos de Teste: Cadeia de Caracteres Caractere a ser Saída Esperada procurado abc b 2 abc d O caractere não pertence à cadeia informada. abcdefghijklm nopqrstuvxyz <<qualquer>> Erro: Cadeia inválida. abc xyz Erro: Mais de um caractere informado. abc <<caractere não Erro: Nenhum caractere informado>> informado. Tópicos Especiais - Qualidade de Software 2008/2 11 Exemplo 2: Programa Fibonacci Especificação: Curso Normal: O usuário informa um número n, inteiro maior do que zero. O enésimo termo da série de Fibonacci é calculado e apresentado. A série de Fibonacci tem a seguinte formação: Curso de Exceção: O número informado é menor do que 1. O dois primeiros termos da série são iguais a 1. O enésimo termo (n > 2) é calculado da seguinte forma: Fn = Fn-1 + Fn-2. Portanto, a série de Fibonacci tem a seguinte forma: 1,1,2,3,5,8,13,21,34... Uma mensagem de erro é exibida indicando que o número deve ser maior do que 0. Curso de Exceção: O valor informado não é um número inteiro. Uma mensagem de erro é exibida indicando que um número inteiro positivo deve ser informado. Tópicos Especiais - Qualidade de Software 2008/2 12 Exemplo 2: Programa Fibonacci Entrada: Número inteiro n. Saídas possíveis: Enésimo termo da série de Fibonacci. Mensagem de erro informando que n deve ser maior do que 0. Mensagem de erro informando que o valor informado deve ser um número inteiro positivo. Tópicos Especiais - Qualidade de Software 2008/2 13 Exemplo 2: Programa Fibonacci Classes de Equivalência: Entrada Classes de Equivalência Válidas n n é um número inteiro positivo. Classes de Equivalência Inválidas n é um número inteiro menor ou igual a 0. n não é um número inteiro. Tópicos Especiais - Qualidade de Software 2008/2 14 Exemplo 2: Programa Fibonacci Casos de Teste: n Saída Esperada 6 8 -2 Erro: n deve ser maior do que 0. a Erro: Entre com um número inteiro positivo. Tópicos Especiais - Qualidade de Software 2008/2 15 Avaliação do Critério Possibilita uma boa redução do tamanho do domínio de entrada. É especialmente adequado para aplicações em que as variáveis de entrada podem ser facilmente identificadas e assumem valores específicos. Não é tão facilmente aplicável quando o domínio de entrada é simples, mas o processamento é complexo. Nestes casos, a especificação pode sugerir que um grupo de dados seja processado de forma idêntica, mas isso pode não ocorrer na prática. Tópicos Especiais - Qualidade de Software 2008/2 16 Análise de Valor Limite Critério usado em conjunto com o particionamento de equivalência. Premissa: casos de teste que exploram condições limites têm maior probabilidade de encontrar defeitos. Tais condições estão exatamente sobre ou imediatamente acima ou abaixo dos limitantes das classes de equivalência (Delamaro et al., 2007). Tópicos Especiais - Qualidade de Software 2008/2 17 Análise de Valor Limite Recomendações: Condição de entrada especificando um intervalo de valores: definir casos de teste para os limites desse intervalo e para valores imediatamente subseqüentes, acima e abaixo, que explorem as classes vizinhas. Condição de entrada especificando uma quantidade de valores: definir casos de teste com nenhum valor de entrada, somente um valor, com a quantidade máxima de valores e com a quantidade máxima de valores + 1. Aplicar as recomendações acima para condições de saída, quando couber. Se a entrada ou a saída for um conjunto ordenado, deve ser dada atenção especial aos primeiro e último elementos desse conjunto. Tópicos Especiais - Qualidade de Software 2008/2 18 Exemplo 1: Programa Cadeia de Caracteres Casos de Teste adicionais: Cadeia de Caracteres Caractere a ser Saída Esperada procurado <<qualquer>> Erro: Cadeia inválida. Entre com uma cadeia contendo de 1 a 20 caracteres. abcdefghijklm nopqrstu <<qualquer>> Erro: Cadeia inválida. Entre com uma cadeia contendo de 1 a 20 caracteres. a a 1 a x O caractere não pertence à cadeia informada. Tópicos Especiais - Qualidade de Software 2008/2 19 Exemplo 1: Programa Cadeia de Caracteres Casos de Teste: Cadeia de Caracteres Caractere a ser Saída Esperada procurado abcdefghijklm nopqrst a 1 abcdefghijklm nopqrst t 20 abc xy Erro: Mais de um caractere informado. Tópicos Especiais - Qualidade de Software 2008/2 20 Exemplo 2: Programa Fibonacci Casos de Teste adicionais: n Saída Esperada 1 1 2 1 0 Erro: n deve ser maior do que 0. Tópicos Especiais - Qualidade de Software 2008/2 21 Avaliação do Critério As vantagens e desvantagens deste critério são as mesmas do critério Particionamento de Equivalência. Tópicos Especiais - Qualidade de Software 2008/2 22 Teste Funcional Sistemático Combina os critérios de Particionamento de Equivalência e Análise de Valor Limite. Uma vez que os domínios de entrada e de saída tenham sido particionados, este critério requer ao menos dois casos de teste de cada partição para minimizar o problema de defeitos coincidentes que mascaram falhas (Delamaro et al., 2007). Tópicos Especiais - Qualidade de Software 2008/2 23 Teste Funcional Sistemático Algumas diretrizes adicionais: Valores numéricos – Domínio de Entrada Valores numéricos – Domínio de Saída Discretos: testar todos os valores Intervalo de valores: testar os extremos e um valor no interior do intervalo Discretos: gerar cada um dos valores Intervalo de valores: gerar cada um dos extremos e ao menos um valor no interior do intervalo Valores ilegais: também devem ser incluídos nos casos de teste para se verificar se o software os rejeita. Diretrizes do critério de análise de valor limite devem ser empregadas. Tópicos Especiais - Qualidade de Software 2008/2 24 Teste Funcional Sistemático Algumas diretrizes adicionais: Tipos de valores diferentes Explorar tipos ilegais que podem ser interpretados como valores válidos (p.ex., valor real para um campo inteiro). Explorar entradas válidas, mas que podem ser interpretadas como tipos ilegais (p.ex., números em campos que requerem caracteres). Explorar limites da representação binária dos dados (p.ex., para campos inteiros de 16 bits, selecionar os valores -32768 e +32767). Testar ao menos dois elementos de uma mesma classe de equivalência para minimizar o problema de defeitos coincidentes que mascaram falhas. Tópicos Especiais - Qualidade de Software 2008/2 25 Exemplo 1: Programa Cadeia de Caracteres Casos de Teste adicionais: Cadeia de Caracteres Caractere a ser Saída Esperada procurado ! `´ O caractere não pertence à cadeia informada. !”#$%&()*+´ /01234567 ! 1 & 6 ´ 11 6 19 7 20 Tópicos Especiais - Qualidade de Software 2008/2 26 Exemplo 2: Programa Fibonacci Casos de Teste: n Saída Esperada 1.0 Erro: Entre com um número inteiro positivo. -1 Erro: n deve ser maior do que 0. xyz Erro: Entre com um número inteiro positivo. 23 28657 24 46368 11 89 Tópicos Especiais - Qualidade de Software 2008/2 27 Avaliação do Critério Por ser baseado nos critérios Particionamento de Equivalência e Análise de Valor Limite, apresenta os mesmos problemas que estes. Para tratar o problema da correção coincidente, enfatiza a seleção de mais de um caso de teste por partição ou limite, aumentando, assim, a chance de revelar defeitos (Delamaro et al., 2007). Tópicos Especiais - Qualidade de Software 2008/2 28 Teste Funcional: Considerações Finais Como os critérios funcionais se baseiam apenas na especificação, não podem assegurar que partes críticas e essenciais do código tenham sido cobertas. Além disso, os próprios critérios apresentam limitações. Assim, é fundamental que outras técnicas sejam aplicadas em conjunto, para que o software seja explorado por diferentes pontos de vista (Delamaro et al., 2007). Tópicos Especiais - Qualidade de Software 2008/2 29 Teste Estrutural Baseia-se no conhecimento da estrutura interna do programa. Caminhos lógicos são testados, estabelecendo casos de teste que põem à prova condições, laços, definições e usos de variáveis. Principais critérios: Critérios baseados na complexidade Critérios baseados no fluxo de controle Critérios baseados no fluxo de dados (Delamaro et al., 2007). Tópicos Especiais - Qualidade de Software 2008/2 30 Teste Estrutural A maioria dos critérios estruturais utiliza uma representação de Grafo de Fluxo de Controle (GFC) ou Grafo de Programa, no qual blocos disjuntos de comandos são considerados nós. A execução do primeiro comando do bloco acarreta a execução de todos os outros comandos desse bloco, na ordem dada. Todos os comandos em um bloco têm um único predecessor (possivelmente com exceção do primeiro) e um único sucessor (possivelmente com exceção do último) (Delamaro et al., 2007). Tópicos Especiais - Qualidade de Software 2008/2 31 Teste Estrutural A representação de um programa como um GFC estabelece uma correspondência entre nós e blocos de comandos e indica possíveis fluxos de controle entre blocos por meio de arcos. Um GFC é um grafo orientado com um único nó de entrada e um único nó de saída. Cada nó representa um bloco indivisível (seqüencial) de comandos e cada arco representa um possível desvio de um bloco para outro. A partir do GFC, podem ser escolhidos os elementos que devem ser executados (Delamaro et al., 2007). Tópicos Especiais - Qualidade de Software 2008/2 32 Exemplo: Programa Fibonacci public class Fibonacci { public long fibonacci (int n) { 1 2 3 int i = int a = int b = 1; 0; 1; 4 5 6 7 8 9 10 11 12 if (n > 1) { while (i < n) { long temp = b = b + a; a = temp; i = i + 1; } } return (b); b; } } Tópicos Especiais - Qualidade de Software 2008/2 33 Exemplo: Programa Fibonacci public class Fibonacci { public long fibonacci (int n) { 1 2 3 int i = int a = int b = 1; 0; 1; 4 5 6 7 8 9 10 11 12 if (n > 1) { while (i < n) { long temp = b = b + a; a = temp; i = i + 1; } } return (b); Nó b; Bloco de Comandos 1 1a4 2 5 3 6 a 10 4 11 e 12 } } Tópicos Especiais - Qualidade de Software 2008/2 34 Exemplo: Programa Fibonacci Grafo de Fluxo de Controle 1 2 4 3 Tópicos Especiais - Qualidade de Software 2008/2 35 Critérios Baseados na Complexidade Utilizam informações sobre a complexidade do programa para derivar casos de teste. O Critério de McCabe ou Teste de Caminho Básico é o critério baseado em complexidade mais conhecido. Tópicos Especiais - Qualidade de Software 2008/2 36 Critério de Teste de Caminho Básico Utiliza a medida de complexidade ciclomática para derivar requisitos de teste. Complexidade ciclomática: número de caminhos linearmente independentes do conjunto básico de um programa, indicando um limite máximo para o número de casos de teste que devem ser executados para garantir que todas as instruções do programa sejam exercitadas pelo menos uma vez (Delamaro et al., 2007). Tópicos Especiais - Qualidade de Software 2008/2 37 Critério de Teste de Caminho Básico Caminho linearmente independente: qualquer caminho que introduza pelo menos um novo conjunto de instruções ou uma nova condição, ou seja, que introduza pelo menos um arco que não tenha sido atravessado. Caminhos linearmente independentes estabelecem um conjunto básico para o GFC. Se os casos de teste puderem ser projetados de modo a forçar a execução desses caminhos (conjunto básico): cada instrução terá sido executada pelo menos uma vez cada condição terá sido executada com V e F Tópicos Especiais - Qualidade de Software 2008/2 38 Critério de Teste de Caminho Básico O conjunto básico não é único. De fato, diferentes conjuntos básicos podem ser derivados para um GFC. O tamanho do conjunto (número de caminhos) é dado pela complexidade ciclomática, que pode ser calculada de três formas (Delamaro et al., 2007): Número de regiões em um GFC, uma região corresponde a uma área incluída no plano do grafo. O número de regiões é computado contando-se todas as áreas delimitadas e a área não delimitada fora do grafo noArcos – noNos + 2 Número de nós predicativos + 1 Tópicos Especiais - Qualidade de Software 2008/2 39 Exemplo: Programa Fibonacci 1 public class Fibonacci { Nó public long fibonacci (int n) { 1 2 3 int i = int a = int b = 4 5 6 7 8 9 10 11 12 if (n > 1) { while (i < n) { long temp = b = b + a; a = temp; i = i + 1; } } return (b); } 1; 0; 1; b; Bloco de Comandos 1 1a4 2 5 3 6 a 10 4 11 e 12 1 2 4 } 3 Tópicos Especiais - Qualidade de Software 2008/2 40 Exemplo: Programa Fibonacci 1 CC = ? Casos de Teste: ? Programa está correto? Tópicos Especiais - Qualidade de Software 2008/2 41 Exemplo: Programa Fibonacci 2 public class Fibonacci { public long fibonacci (int n) { 1 if (n == 1) 2 return 1; 3 else 4 return fibonacci(n-1)+ fibonacci(n-2); } } CC = ? Casos de Teste: ? Programa está correto? Tópicos Especiais - Qualidade de Software 2008/2 42 Critérios Baseados no Fluxo de Controle Utilizam apenas características de controle da execução do programa (comandos, desvios, laços) para derivar casos de teste. Principais Critérios: Todos-Nós: requer que cada nó do grafo (e por conseguinte cada comando do programa) seja executado pelo menos uma vez (mínimo esperado de uma boa atividade de teste). Todos-Arcos: requer que cada arco do grafo (cada desvio de fluxo de controle) seja exercitado pelo menos uma vez. Todos-Caminhos: requer que todos os caminhos possíveis no programa sejam exercitados (pode ser impraticável). Tópicos Especiais - Qualidade de Software 2008/2 43 Exemplo: Programa Fibonacci 1 public class Fibonacci { Nó public long fibonacci (int n) { 1 2 3 int i = int a = int b = 4 5 6 7 8 9 10 11 12 if (n > 1) { while (i < n) { long temp = b = b + a; a = temp; i = i + 1; } } return (b); } 1; 0; 1; b; Bloco de Comandos 1 1a4 2 5 3 6 a 10 4 11 e 12 1 2 4 } 3 Tópicos Especiais - Qualidade de Software 2008/2 44 Exemplo: Programa Fibonacci 1 Todos-Nós 1 2 4 3 Casos de Teste ? n=2 Tópicos Especiais - Qualidade de Software 2008/2 45 Exemplo: Programa Fibonacci 1 Todos-Arcos 1 2 4 3 Casos de Teste ? n = 1; n = 2 Tópicos Especiais - Qualidade de Software 2008/2 46 Exemplo: Programa Fibonacci 1 Todos-Caminhos 1 2 4 3 Casos de Teste ? Infinitos... Tópicos Especiais - Qualidade de Software 2008/2 47 Critérios Baseados no Fluxo de Dados Baseiam-se nas associações entre a definição de uma variável e seus possíveis usos subseqüentes para derivar casos de teste. Visam testar as interações que envolvem definições de variáveis e subseqüentes referências a essas definições. Premissa: Comandos que têm uma relação de fluxo de dados são provavelmente parte de uma mesma função e, portanto, devem ser exercitados juntos. Tópicos Especiais - Qualidade de Software 2008/2 48 Critérios Baseados no Fluxo de Dados Principais Critérios: Todas-Definições: requer que cada definição de variável seja exercitada pelo menos uma vez. Todos-Usos: requer que todas as associações entre uma definição de variável e seus subseqüentes usos sejam exercitadas pelo menos uma vez, em um caminho em que não há redefinição da variável (caminho livre de definição). Todos-DU-Caminhos: requer que toda associação entre uma definição de variável e seus subseqüentes usos seja exercitada por todos os caminhos livres de definição e livres de laço que cubram essa associação. Tópicos Especiais - Qualidade de Software 2008/2 49 Exemplo: Programa Fibonacci 1 public class Fibonacci { Nó public long fibonacci (int n) { 1 2 3 int i = int a = int b = 4 5 6 7 8 9 10 11 12 if (n > 1) { while (i < n) { long temp = b = b + a; a = temp; i = i + 1; } } return (b); } 1; 0; 1; b; Bloco de Comandos 1 1a4 2 5 3 6 a 10 4 11 e 12 1 2 4 } 3 Tópicos Especiais - Qualidade de Software 2008/2 50 Exemplo: Programa Fibonacci 1 Todas-Definições Todos-Usos Blocos a Exercitar ? Casos de Teste ? Blocos a Exercitar ? Casos de Teste ? Todos-DU-Caminhos Blocos a Exercitar ? Casos de Teste ? Tópicos Especiais - Qualidade de Software 2008/2 51 Teste Estrutural: Considerações Finais Foco Principal: teste de unidade Alguns elementos requeridos podem não ser executáveis. Se um programa não implementa uma função, não existirá um caminho que corresponda a ela e nenhum dado de teste será requerido para exercitá-la. Essa técnica é vista como complementar às demais, uma vez que cobre classes distintas de defeitos. Estratégia de Teste: aplicar inicialmente critérios mais fracos e talvez menos eficazes, porém menos custosos (Delamaro et al., 2007). Tópicos Especiais - Qualidade de Software 2008/2 52 Aplicando Técnicas de Teste Uma boa abordagem para a introdução de práticas mais sistemáticas de teste em uma organização consiste em aplicar inicialmente critérios mais fracos, e talvez menos eficazes, porém menos custosos. Em função da disponibilidade de orçamento e de tempo, da criticidade de um programa e da maturidade da organização, aplicar critérios mais fortes, e eventualmente mais eficazes, porém mais caros. Tópicos Especiais - Qualidade de Software 2008/2 53 Abordagem Incremental de Aplicação de Técnicas de Teste 1. 2. 3. 4. 5. Elaborar um conjunto de testes funcionais (Tf), utilizando um critério funcional ou uma combinação deles. Avaliar a cobertura de Tf em relação aos critérios de teste estruturais. Evoluir Tf até obter um conjunto de teste Tn adequado ao critério Todos-Nós. Avaliar a cobertura de Tn em relação aos demais critérios de teste estruturais. Evoluir Tn até obter um conjunto de teste Ta adequado ao critério Todos-Arcos. Tópicos Especiais - Qualidade de Software 2008/2 54 Abordagem Incremental de Aplicação de Técnicas de Teste 6. 7. Avaliar a cobertura de Ta em relação aos demais critérios de teste estruturais. Evoluir Ta até obter um conjunto de teste Tu adequado ao critério Todos-Usos. Tópicos Especiais - Qualidade de Software 2008/2 55 Referências Delamaro, M.E., Maldonado, J.C., Jino, M., Introdução ao Teste de Software, Série Campus – SBC, Editora Campus, 2007. Tópicos Especiais - Qualidade de Software 2008/2 56