Desenho de casos de teste A função dos casos de teste é fornecer informação rápida e eficientemente Em teoria da informação, define-se informação em termos de redução de incerteza. Se há pouca incerteza, há pouca informação para ser ganha Um caso de teste que não promete obter informação significativa está mal concebido. Um bom caso de teste dá informação valiosa, quer o programa passe o teste quer falhe Universidade Portucalense Engenharia de Software ES05 2014-2015 1
Características de um bom teste Tem uma probabilidade razoável de apanhar um erro Ao procurar ideias para casos de teste, recua-se a partir de uma ideia de como o programa pode falhar. Se o programa poderia falhar desta maneira, como é que vamos apanhar essa situação? Não é redundante É o melhor da família de testes semelhantes Não é demasiado simples nem demasiado complexo Podem-se combinar vários testes num caso, mas sem exageros Torna evidentes as situações de falha Universidade Portucalense Engenharia de Software ES05 2014-2015 2
Qualidade dos testes Objetivos principais (em resumo...) Encontrar erros considerados relevantes por todos Ajudar a corrigir esses erros Um teste é melhor do que outros se for: Mais provável expor um erro, se ele existir Mais provável dar resultados significativos (motivadores) Mais credível (realista, representativo de acontecimentos resultantes da utilização normal do programa) Mais fácil de avaliar (não há dúvidas sobre o resultado) Útil para o diagnóstico (fácil de reproduzir) Mais informativo Adequadamente complexo Universidade Portucalense Engenharia de Software ES05 2014-2015 3
O que é um caso de teste? IEEE standard 610 (1990) Um conjunto de entradas, condições de execução, e resultados esperados desenvolvido para um objetivo particular, tal como exercitar um determinado caminho do programa ou verificar a satisfação de um requisito específico IEEE standard 829-1983 Documentação especificando entradas, resultados esperados, e um conjunto de condições de execução para um item de teste Boris Beizer (1995, p. 3) Uma sequência de um ou mais sub-testes executados em sequência porque o resultado ou estado final de um sub-teste é a entrada ou estado inicial do seguinte. Universidade Portucalense Engenharia de Software ES05 2014-2015 4
Classes de equivalência e valores fronteira Classes de equivalência Se se espera o mesmo resultado de dois testes, então são considerados equivalentes Um grupo de testes forma uma classe de equivalência se entendemos que: Todos testam o mesmo Se um deles encontra um erro, os outros provavelmente também Se um deles não encontra um erro, os outros provavelmente também não Frequentemente um grupo de testes caem na mesma classe de equivalência quando: envolvem as mesmas classes de entrada dão origem às mesmas operações no programa afetam as mesmas variáveis de saída nenhum, ou todos, forçam o programa a fazer tratamento de erros Universidade Portucalense Engenharia de Software ES05 2014-2015 5
Abordagens ao teste Test-to-pass Atitude inicial Para encontrar erros em condições normais de funcionamento Test-to-fail Segunda fase Para encontrar erros em condições anormais de funcionamento Levar o programa ao limite, e mesmo passar o limite Universidade Portucalense Engenharia de Software ES05 2014-2015 6
Condições para deteção de defeitos Alcance Para detetar um defeito, os dados de entrada fornecidos ao programa devem provocar a execução da instrução que contém o erro Necessidade Para detetar um defeito, os dados de entrada fornecidos ao programa devem fazer com que a instrução que contém o erro produza um valor diferente do valor correto Propagação Para detetar um defeito, os resultados internos incorretos produzidos pela instrução que contém o erro devem ser visíveis no resultado do programa Universidade Portucalense Engenharia de Software ES05 2014-2015 7
Um exemplo (1) void check_square(double x) { double y=x; if (x<100) y= x+x ; /* devia ser x*x */ else y= sqrt(x ); if (y>x) System.out.println( verificado ); } Universidade Portucalense Engenharia de Software ES05 2014-2015 8
Um exemplo (2) Alcance x < 100 Necessidade x 2 e x 0 Propagação Requer que (x + x > x) tenha um valor lógico diferente de (x * x > x). Isto é verdade quando 0 < x <= 1 ou x < 0. Para detetar este defeito, os dados de entrada de um caso de teste devem satisfazer as seguintes condições: (x < 100) e (x 2 e x 0) e ((0 < x <= 1) ou (x < 0)) Universidade Portucalense Engenharia de Software ES05 2014-2015 9
Cobertura de linhas Cobertura de linhas Todas as linhas de código têm que ser testadas pelo menos uma vez IF (A > B AND C = 5) THEN do SOMETHING SET D = 5 Neste exemplo há quatro opções: A > B e C = 5 A > B e C 5 A B e C = 5 A B e C 5 O caso 1 testa todas as linhas de código Universidade Portucalense Engenharia de Software ES05 2014-2015 10
Cobertura de ramos Cobertura de ramos Todas as seleções são testadas para cada uma das opções Inclui o teste de todos os ramos e todas as instruções No exemplo anterior, seria necessário testar um caso em que do SOMETHING é executado, e outro em que não é Universidade Portucalense Engenharia de Software ES05 2014-2015 11
Cobertura de condições Cobertura de condições Testa todas as formas pelas quais uma condição pode ser feita verdadeira ou falsa No exemplo, todos os quatro casos Universidade Portucalense Engenharia de Software ES05 2014-2015 12
Teste de caminhos O teste de caminhos não garante que o programa não tem erros Exemplo: INPUT A INPUT B PRINT A / B Funciona com A=1 e B=2, e testa todos os caminhos O teste é completo? O problema não é de caminhos, mas de dados Universidade Portucalense Engenharia de Software ES05 2014-2015 13
Um exemplo A função pos_sum calcula a soma dos elementos positivos do array a; num_of_entries é o número de elementos do array pos_sum(a, num_of_entries) returns integer int sum = 0 int i = 0 while (i < num_of_entries) if a[i] > 0 sum = sum + a[i] endif i = i + 1 end while return sum end pos_sum O array a = [ 1, -45, 3] testa todas as instruções (linhas) e todos os ramos do programa Universidade Portucalense Engenharia de Software ES05 2014-2015 14
Teste de ciclos Muitos defeitos estão associados à utilização de ciclos Se um ciclo pode ter uma gama de 0 a n iterações, devem ser usados casos de teste com: zero iterações uma iteração duas iterações k iterações, onde k < n n-1 iterações n iterações n+1 iterações (se possível) Exemplo: pretende-se somar os primeiros k elementos de um array com 20 elementos (isto é, n = 20) Universidade Portucalense Engenharia de Software ES05 2014-2015 15
Outro exemplo (1) // Return the greatest // common denominator. int euclid (int m, int n) { assert(n > 0); assert(m > 0); int r; if (n > m) { r = m; m = n; n = r; } r = m % n ; while (r! = 0) m = n; n = r; r = m % n ; } return n; } Universidade Portucalense Engenharia de Software ES05 2014-2015 16
Outro exemplo (2) n > m r!= 0 Caso de teste Caminho F F n = 3, m = 9 a c V F n = 9, m = 3 b c V V n = 8, m = 3 b d d d c Uma sugestão para gerar caminhos de teste: 1. Definir um caminho base, o principal do algoritmo 2. Alterar o resultado da primeira condição, tentando manter os resultados das restantes 3. Em seguida alterar o resultado da segunda condição. Repetir este processo para cada condição 4. Considerar o primeiro caminho variante (resultado do ponto 2) como o caminho base, e repetir o processo. 5. Repetir o ponto anterior para cada um dos caminhos alternativos Universidade Portucalense Engenharia de Software ES05 2014-2015 17
Encontrando classes de equivalência (1) Duas pessoas a analisar o mesmo programa encontrarão diferentes classes de equivalência. É um processo subjetivo Isto não significa que todas as soluções são corretas! Compensa olhar para as classes de equivalência encontradas Ajuda a selecionar bem os testes, evitando perder tempo a repetir o que no fundo é o mesmo teste Testa-se um ou alguns dos casos de cada classe de equivalência Universidade Portucalense Engenharia de Software ES05 2014-2015 18
Encontrando classes de equivalência (2) Não esquecer classes de equivalência para entradas inválidas É frequentemente a melhor fonte de erros Exemplo: um programa deve aceitar um número entre 1 e 99 Há pelo menos quatro classes de equivalência: Qualquer número entre 1 e 99 é válido Qualquer número menor que 1 é demasiado pequeno Qualquer número maior que 99 é demasiado grande Se não é um número, não é aceite Universidade Portucalense Engenharia de Software ES05 2014-2015 19
Classes de equivalência - Outlines Organizar as classificações encontradas numa tabela ou outline 1. Fornecer um número 1.1. Caso válido 1.1.1. Entre 1 e 99 1.2. Casos inválidos 1.2.1. 0 1.2.2. > 99 1.2.3. Cálculo cujo resultado é um valor inválido 1.2.4. Números negativos 1.2.5. Letras e outros caracteres não numéricos 1.2.5.1. Letras 1.2.5.2. Operadores aritméticos tais como +, -, *, / 1.2.5.3. Outros caracteres não numéricos 1.2.5.3.1. Com código ASCII menor que o do 0 1.2.5.3.2. Com código ASCII maior que o do 9 Universidade Portucalense Engenharia de Software ES05 2014-2015 20
Domínio de entradas Passo 1 identificar funções testáveis Casos de uso podem ser usados para identificar funções testáveis No caso de POO, cada método público pode ser uma função testável Passo 2 identificar todos os parâmetros que podem influenciar o comportamento de cada função testável Se o método pertence a uma classe com estado interno, este tem que ser incluído como parâmetro Passo 3 - definir os domínios das entradas Abordagem interface-based Considera cada parâmetro individualmente Abordagem functionality-based Considera as características que correspondem à funcionalidade pretendida Universidade Portucalense Engenharia de Software ES05 2014-2015 21
Gamas de valores Procurar gamas de valores Sempre que se encontra uma gama de valores, encontram-se várias classes de equivalência Normalmente três classes inválidas: valores abaixo do limite, valores acima do limite, e valores não numéricos Procurar gamas múltiplas (por exemplo escalões fiscais) Cada sub-gama é uma classe de equivalência A transição entre gamas contíguas é frequentemente fonte de problemas Procurar pertença a um grupo Se uma entrada deve pertencer a um grupo, uma classe de equivalência inclui todos os membros do grupo, e outra tudo o resto Por exemplo, nomes de países Universidade Portucalense Engenharia de Software ES05 2014-2015 22
Listas e menus Analisar respostas a listas e menus Tem que se fornecer um valor de uma lista. O programa responde de forma diferente a cada valor Cada valor possível é uma classe de equivalência Exemplo: Resposta Sim ou Não a Tem a certeza? (Sim/Não) Exemplo: estado civil no impresso do IRS Procurar variáveis que têm que ser iguais Pode escolher qualquer cor desde que seja preto. Exemplo: o produto está esgotado, exceto na cor preta. Escolhas que costumavam ser válidas deixam de o ser; verificar que só é possível escolher essa cor Universidade Portucalense Engenharia de Software ES05 2014-2015 23
Tempo Criar classes de equivalência baseadas no tempo Suponhamos que se prime a tecla de espaço antes, durante, ou depois do carregamento de um programa do disco. Testes deste tipo fazem falhar alguns programas. Classes de equivalência: Tudo que se faz muito antes da operação, tudo que se faz pouco antes da operação, tudo que se faz pouco antes do programa terminar a leitura, etc. Procurar grupos de variáveis que devem dar origem a cálculos com um dado resultado Fornecer os três ângulos de um triângulo; a soma tem que ser 180º Universidade Portucalense Engenharia de Software ES05 2014-2015 24
Baseadas nas saídas Procurar eventos de saída equivalentes Desenhar um segmento de reta Classe de equivalência válida: desde 1 pixel de largura, e até 10cm de comprimento Classes de equivalência inválidas: (1) não é desenhado o segmento, (2) o segmento tem mais de 10cm, (3) é desenhada uma curva A dificuldade está em determinar que entradas se devem dar ao programa para gerar as diferentes saídas Universidade Portucalense Engenharia de Software ES05 2014-2015 25
Fronteiras - gamas de valores Devem-se usar, normalmente, até meia dúzia de casos de cada classe de equivalência Os melhores casos estão nas fronteiras das classes O maior, o menor, o próximo, o mais alto, o mais feio... Para detetar o problema das desigualdades ( < ou?) Normalmente os programas que falham fora das fronteiras também falham nas fronteiras Universidade Portucalense Engenharia de Software ES05 2014-2015 26
Fronteiras - grupos de variáveis Há situações em que em vez de se pensar só numa variável, é necessário pensar em grupos de variáveis Exemplo: Dia do mês, numa data 1-28, 1-29, 1-30, 1-31 Dividem-se os meses em três conjuntos: {Fevereiro} {Abril, Junho, Setembro, Novembro} {Janeiro, Março, Maio, Julho, Agosto, Outubro, Dezembro} Para teste, seleciona-se pelo menos um mês de cada conjunto Universidade Portucalense Engenharia de Software ES05 2014-2015 27
Exemplos Fronteiras - exemplos Se a gama válida é 1 a 99, os casos válidos são 1 a 99. Usar 0 e 100 para testes de valores inválidos Se um programa deve escrever cheques com valores de 1 a 99, aceitará escrever cheques de 0, 100, ou valores negativos? Se o programa espera uma letra maiúscula, testar A e Z. Deve-se testar @ porque é vizinho de A, e [ que é vizinho de Z. Testar também a e z. Se o programa deve desenhar linhas retas de largura superior a 1 pixel, e até 10 cm de comprimento, testar com uma linha de largura 1 pixel e de comprimento 10 cm. Testar com uma linha de 0 pixels de largura. Se a soma das entradas deve ser 180, testar 179, 180 e 181. Se o programa espera um dado número de valores de entrada, fornecer-lhe o valor correto, um a menos e um a mais. Universidade Portucalense Engenharia de Software ES05 2014-2015 28
Exemplo de classes de equivalência (1) A referência dos produtos de uma empresa tem entre 3 e 15 caracteres alfanuméricos, dos quais os 2 primeiros têm que ser letras 1: Número de caracteres entre 3 e 15 2: Têm que ser alfanuméricos 3: Os dois primeiros têm que ser letras 3 classes de equivalência derivam da primeira condição: CE1: menos de 3 caracteres, inválido CE2: entre 3 e 15 caracteres, válido CE3: mais de 15 caracteres, inválido 2 classes de equivalência derivam da segunda condição: CE4: caracteres todos alfanuméricos, válido CE5: algum carácter é não alfanumérico, inválido 2 classes de equivalência derivam da terceira condição: CE6: os dois primeiros caracteres são letras, válido CE7: algum dos dois primeiros caracteres não é uma letra, inválido Universidade Portucalense Engenharia de Software ES05 2014-2015 29
Exemplo de classes de equivalência (2) A tabela de descrição das classes de equivalência poderia ser: Condição Classes de equivalência válidas Classes de equivalência inválidas 1 CE2 CE1, CE3 2 CE4 CE5 3 CE6 CE7 Em seguida devem ser analisados os valores fronteira, ou limite. Por exemplo para o comprimento da referência: 1: Valor imediatamente abaixo do limite inferior (2) 2: Valor no limite inferior (3) 3: Valor imediatamente acima do limite inferior (4) 4: Valor imediatamente abaixo do limite superior (14) 5: Valor no limite superior (15) 6: Valor imediatamente acima do limite superior (16) Universidade Portucalense Engenharia de Software ES05 2014-2015 30
Exemplo de classes de equivalência (3) Exemplo de valores de entradas para contemplar as classes de equivalência e valores fronteira No. Valor de entrada Classes de equivalência válidas 1 abc1 CE2, CE4, CE6, (3) 2 ab1 CE2, CE4, CE6, (2) 3 abcdef123456789 CE2, CE4, CE6, (5) 4 abcde123456789 CE2, CE4, CE6, (4) 5 abc* CE2, CE6 (3) CE5 6 ab CE4, CE6 CE1, (1) 7 abcdefg123456789 CE4, CE6 CE3, (6) 8 a123 CE2, CE4, (3) CE7 9 abcdef123 CE2, CE4, CE6 Classes de equivalência inválidas Universidade Portucalense Engenharia de Software ES05 2014-2015 31
Critérios de combinação de classes (1) Quando há várias classes de equivalência correspondentes a diferentes variáveis, temos necessidade de testar combinações de valores dessas variáveis. Dependendo da situação, podemos elaborar conjuntos de casos de teste mais ou menos exaustivos. Exemplo: três partições com classes [A,B], [1,2,3] e [x,y] Critério: Cobertura de todas as combinações 12 casos: (A,1,x) (A,1,y) (A,2,x) (A,2,y) (A,3,x) (A,3,y) (B,1,x) (B,1,y) (B,2,x) (B,2,y) (B,3,x) (B,3,y) Universidade Portucalense Engenharia de Software ES05 2014-2015 32
Critérios de combinação de classes (2) Critério: Cobertura de um valor de cada classe 3 casos, por exemplo: (A,1,x) (B,2,y) (A,3,x) Outro exemplo para este critério: Suponhamos uma função para classificar um triângulo, dados os comprimentos dos 3 lados. Cada lado pode ter os valores de teste -1, 0, 1, 2, dos quais os dois primeiros correspondem a casos inválidos. Segundo este critério, bastariam os casos (-1,-1,-1) (0,0,0) (1,1,1) (2,2,2) que são claramente insuficientes Universidade Portucalense Engenharia de Software ES05 2014-2015 33
Critérios de combinação de classes (3) Cobertura de pares Um valor de cada classe deve ser combinado com um valor de cada classe de cada uma das outras variáveis Neste exemplo temos 8 casos: (A,1,x) (B,1,y) (A,2,x) (B,2,y) (A,3,x) (B,3,y) (A,-,y) (B,-,x) Cobertura de caso base É escolhido um valor base de cada classe, e é definido um teste com esses valores; outros testes são definidos variando uma variável de cada vez, a partir dos valores base Caso base, por exemplo: (A,1,x) Mais 4 casos, para os valores B, 2, 3 e y que não pertencem ao caso base: (B,1,x) (A,2,x) (A,3,x) (A,1,y) Cobertura de múltiplos casos base Como o anterior, mas com múltiplos casos base Universidade Portucalense Engenharia de Software ES05 2014-2015 34