Baixe o app para aproveitar ainda mais
Prévia do material em texto
Testes de Software INF-0524 Prof. Jose Guilherme 2011.1 Técnicas de Teste de SW – Projeto de casos de teste: qualquer produto pode ser testado de duas maneiras: • Conhecendo-se a função específica que um produto projetado deve executar, testes podem ser realizados para demonstrar que cada função é totalmente operacional (teste de caixa preta - “black box”) • Conhecendo-se o funcionamento interno de um produto, testes podem ser realizados para garantir que “todas as engrenagens”, ou seja, que a operação interna de um produto tem um desempenho de acordo com as especificações e que os componentes internos foram adequadamente postos à prova (teste de caixa branca - “white box”) Projeto de casos de teste – Teste de caixa preta refere-se aos testes realizados nas interfaces do SW (a entrada é adequadamente aceita e a saída é corretamente produzida e que a integridade das informações externas é mantida). – Teste de caixa branca baseia-se num minucioso exame dos detalhes procedimentais, através da definição de todos os caminhos lógicos possíveis. Infelizmente estes testes apresentam problemas logísticos, uma vez que o número destes possíveis caminhos lógicos pode ser muito grande, o que levaria a um tempo infinito. Entretanto este tipo de teste não pode ser desprezado como pouco prático, podendo-se optar por um número limitado de opções. – Os atributos de ambos os testes podem ser combinados para oferecer uma abordagem que valide a interface com o SW e garanta seletivamente que o funcionamento interno do SW esteja correto. Técnicas de Teste de SW • Teste de caixa branca: usa a estrutura de controle do projeto procedimental para derivar casos de teste, podendo derivar casos de teste que: – garantam que todos os caminhos independentes dentro de um módulo tenham sido exercitados pelo menos uma vez; – exercitem todas as decisões lógicas para valores falsos ou verdadeiros; – executem todos os laços em suas fronteiras e dentro de seus limites operacionais; e – exercitem as estruturas de dados internas para garantir a sua validade. Teste de caixa branca • Teste de caminho básico: é uma técnica de teste de caixa branca que possibilita que o projetista do caso de teste derive uma medida de complexidade lógica de um projeto procedimental e use essa medida como guia para definir um conjunto básico de caminhos de execução. Os casos de teste derivados para exercitarem o conjunto básico tem a garantia de executar cada instrução do programa pelo menos uma vez durante a atividade de teste. – Notação de grafo de fluxo: é uma notação simples para a representação do fluxo de controle, que descreve o fluxo lógico: Sequência IF WHILE CASE Seqüência If while case Notação de grafo de fluxo Teste de Caminho Básico • Possibilita que o projetista do caso de teste derive uma medida da complexidade lógica do projeto procedimental. • Usa essa medida como guia para definir um conjunto básico de caminhos de execução. • Os casos de teste derivados para exercitarem o conjunto básico têm a garantia de executar cada instrução do programa pelo menos uma vez durante a atividade de teste. Complexidade Ciclomática (CC) • 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 um limite máximo para o número de testes que deve ser executado para garantir que todas as instruções sejam executadas pelo menos uma vez. Complexidade Ciclomática (CC) • A idéia é basicamente é contar o número de caminhos diferentes que um método pode ter. • A CC (também chamada de complexidade condicional) é uma métrica para determinar o quão complexo é um programa. • Encontrar o nº de caminhos não é tão fácil, um algoritmo muito conhecido é a Complexidade de McCabe - Complexidade Ciclomática - foi definida por Thomas McCabe (1975 / 1976). • Esta, basicamente, conta o número de vezes que um for, while, instruções if, case (do switch), catch, &&, || ou aparecem. • Além disso, todo método tem seu contador já inicializado com 1 !!!! • Afinal, todo método tem pelo menos um caminho. • Não há um número ideal para a complexidade de um método. • Mas, uma CC de 20 ou 30 já é alta e esse método deve ser reescrito Complexidade Ciclomática (CC) • A Complexidade Ciclomática há duas formas de se calcular: • Pela construção do grafo do algoritmo; e • Pela contagem de condicionais e loops Complexidade Classificação Entre 1 e 10 Baixa complexidade. Fácil entender e testar. Entre 11 e 20 Média complexidade. Relativamente difícil entender e testar. Entre 21 e 50 Alta complexidade. Difícil entender e testar. Maior que 51 Altíssima complexidade. Impossível entender e testar. CC Probabilidade de efeitos colaterais 1-10 5% 20-30 20% >50 40% aprox. 100 60% Complexidade Ciclomática (CC) • A CC define-se como o somatório de todas as decisões acrescido de 1. • Complexidade Ciclomática Extendida ���� CC2 • A CC2 não é mais que a extensão da CC por adição dos operadores booleanos. • CC2 = CC + Número de operadores booleanos • Entenda-se por decisão todas operações condicionais: Operação Efeito no CC if +1 else if +1 else 0 select case +1 para cada caso select default 0 for/foreach +1 do while +1 do 0 while +1 catch +1 Complexidade Ciclomática (CC) Complexidade Ciclomática (CC) Complexidade Ciclomática (CC) Complexidade Ciclomática (CC) 1 2,3 6 7 8 9 4,5 10 11 nó ramo R1 R2R3 R4 Região Complexidade Ciclomática Teste do Caminho Básico Complexidade Ciclomática • Um caminho independente é qualquer caminho através do programa que introduza pelo menos um novo conjunto de instruções de processamento ou uma nova condição. Quando estabelecido em termos de um grafo de fluxo, um caminho independente deve incluir pelo menos um ramo que não tenha sido atravessado antes que o caminho seja definido. Por exemplo, um conjunto de caminhos independentes, referentes à figura anterior: •caminho 1: 1-11 •caminho 2: 1-2-3-4-5-10-1-11 •caminho 3: 1-2-3-6-8-9-10-1-11 •caminho 4: 1-2-3-6-7-9-10-1-11 Notação de Grafo de Fluxo Exemplo: Segmento de linguagem de projeto e seu correspondente grafo de fluxo. procedure:sort do while records remain read record; if record field1 = 0 then process record; store in buffer; increment counter; elseif record field2 = 0 then reset counter; else process record; store in file; endif enddo end •1: •2: •3: •4: •5: •6: •7a: •7b: •8: 1 2 4 6 5 7a 3 7b 8 Condições Compostas: um ou mais operadores booleanos (OR, AND, etc) estão presentes numa instrução condicional. IF a OR b then procedure x else procedure y ENDIF � Um nó separado para cada condição a, b da declaração composta constitui um NÓ PREDICATIVO: contém uma condição e é caracterizado por 2 ou + ramos saindo dele. Nó predicativo X X Y B A Notação de Grafo de Fluxo Complexidade Ciclomática � A complexidade ciclomática, V(G), pode ser computada através de uma das 3 seguintes formas: 1. V(G) = Número de regiões do grafo de fluxo 2. V(G) = E – N + 2, onde E = qt. Ramos do grafo de fluxo N = qt. Nós do grafo de fluxo 3. V(G) = P + 1, onde P = qt. Nós predicativos V(G) oferece um limite máximo para o número de caminhos independentes que constitui o conjunto básico e, portanto, um limite máximo de número de testes que deve ser projetado e executado.1 2,3 6 7 8 9 4,5 10 11 nó ramo R1 R2R3 R4 Região Exemplo: 1. V(G) = 4 regiões 2. V(G) = 11 ramos – 9 nós + 2 = 4 3. V(G) = 3 nós predicativos + 1 = 4 Complexidade Ciclomática PROCEDURE média; * Este procedimento calcula a média de 100 números ou menos que se situem entre valores- limite; ele também calcula a soma e o total de números válidos. INTERFACE RETORNA média, total.entradas, total.validas; INTERFACE ACEITA valor, mínimo, máximo; TIPO valor[1:100] É VETOR DE ESCALA; TIPO média, total.entradas, total.válidas; mínimo, máximo, soma é ESCALA; TIPO i É INTEIRO; i = 1; total.entradas = total.válidas = 0; soma=0; DO WHILE valor[i] <> -999 and total.entradas < 100 incremente total.entradas de 1; IF valor[i] >= mínimo AND valor[i] <=máximo THEN incremento total.validas de 1; soma = soma + valor[i] ELSE pule ENDIF incremente i de 1; ENDDO IF total.validas>0 THEN média = soma /total.validas; ELSE média = -999; ENDIF END média Complexidade Ciclomática Derivando Casos de Teste PROCEDURE média; INTERFACE RETORNA média, total.entradas, total.validas; INTERFACE ACEITA valor, mínimo, máximo; TIPO valor[1:100] É VETOR DE ESCALA; TIPO média, total.entradas, total.válidas; mínimo, máximo, soma é ESCALA; TIPO i É INTEIRO; i = 1; total.entradas = total.válidas = 0; soma=0; DO WHILE valor[i] <> -999 AND total.entradas < 100 incremente total.entradas de 1; IF valor[i] >= mínimo AND valor[i] <=máximo THEN incremento total.validas de 1; soma = soma + valor[i] ELSE pule ENDIF incremente i de 1; ENDDO IF total.validas>0 THEN média = soma /total.validas; ELSE média = -999; ENDIF END média 1 2 3 4 5 6 7 8 910 1112 13 1 2 3 4 5 6 78 9 10 1112 13 Usando o projeto ou código como base, trace um grafo de fluxo correspondente. 2. Determine a complexidade ciclomática do grafo do fluxo resultante. V(G) = 6 regiões V(G) = 17 ramos – 13 nós + 2 = 6 V(G) = 5 nós predicativos + 1 = 6 1 2 3 4 5 6 78 9 10 1112 13 r1 r2 r3 r4 r5 r6 Derivando Casos de Teste 3. Determine um conjunto básico de caminhos linearmente independentes. O valor de V(G) fornece o número de Caminhos linearmente independentes. Caminho 1: 1-2-10-11-13 Caminho 2: 1-2-10-12-13 Caminho 3: 1-2-3-10-11-13 Caminho 4: 1-2-3-4-7-8-9-2... Caminho 5: 1-2-3-4-5-7-8-9-2... Caminho 6: 1-2-3-4-5-6-8-9-2... � (...) qualquer caminho ao longo do restante da Estrutura de controle é aceitável. � Nós predicativos auxiliam na derivação dos Casos de teste (2,3,4,5,10). 1 2 3 4 5 6 78 9 10 1112 13 r1 r2 r3 r4 r5 r6 Derivando Casos de Teste Derivando Casos de Teste 4. Prepare os casos de teste que forcem a execução de cada caminho no conjunto básico. Caminho 1: 1-2-10-11-13 Casos de Teste valor(i) = entrada válida, i< -999 Resultados Esperados: médias corretas baseadas em i valores e totais apropriados. * Devem ser testados como parte dos testes dos caminhos 4, 5, 6. Não podem ser testados isoladamente! PROCEDURE média; INTERFACE RETORNA média, total.entradas, total.validas; INTERFACE ACEITA valor, mínimo, máximo; TIPO valor[1:100] É VETOR DE ESCALA; TIPO média, total.entradas, total.válidas; mínimo, máximo, soma é ESCALA; TIPO i É INTEIRO; i = 1; total.entradas = total.válidas = 0; soma=0; DO WHILE valor[i] <> -999 AND total.entradas < 100 incremente total.entradas de 1; IF valor[i] >= mínimo AND valor[i] <=máximo THEN incremento total.validas de 1; soma = soma + valor[i] ELSE pule ENDIF incremente i de 1; ENDDO IF total.validas>0 THEN média = soma /total.validas; ELSE média = -999; ENDIF END média 1 2 3 4 5 6 7 8 9 10 11 12 13 Caminho 2: 1-2-10-12-13 Casos de Teste valor(1) = - 999 Resultados Esperados: média = - 999 Caminho 3: 1-2-3-10-11-13 Casos de Teste Tente processar 101 ou mais valores Primeiros 100 valores devem ser válidos. Resultados Esperados: idem 1 Derivando Casos de Teste PROCEDURE média; INTERFACE RETORNA média, total.entradas, total.validas; INTERFACE ACEITA valor, mínimo, máximo; TIPO valor[1:100] É VETOR DE ESCALA; TIPO média, total.entradas, total.válidas; mínimo, máximo, soma é ESCALA; TIPO i É INTEIRO; i = 1; total.entradas = total.válidas = 0; soma=0; DO WHILE valor[i] <> -999 AND total.entradas < 100 incremente total.entradas de 1; IF valor[i] >= mínimo AND valor[i] <=máximo THEN incremento total.validas de 1; soma = soma + valor[i] ELSE pule ENDIF incremente i de 1; ENDDO IF total.validas>0 THEN média = soma /total.validas; ELSE média = -999; ENDIF END média 1 2 3 4 5 6 7 8 910 11 12 13 Caminho 4: 1-2-3-4-7-8-9-2... Casos de Teste valor(i) = entrada válida, i < 100 valor(i) < minimum Resultados Esperados: média correta baseada em i valores e totais apropriados. Caminho 5: 1-2-3-4-5-7-8-9-2... Casos de Teste valor(i) = entrada válida, i < 100 valor(i) >= minimum valor(i) > maximum Resultados Esperados: média correta baseada em i valores e totais apropriados. Derivando Casos de Teste PROCEDURE média; INTERFACE RETORNA média, total.entradas, total.validas; INTERFACE ACEITA valor, mínimo, máximo; TIPO valor[1:100] É VETOR DE ESCALA; TIPO média, total.entradas, total.válidas; mínimo, máximo, soma é ESCALA; TIPO i É INTEIRO; i = 1; total.entradas = total.válidas = 0; soma=0; DO WHILE valor[i] <> -999 AND total.entradas < 100 incremente total.entradas de 1; IF valor[i] >= mínimo AND valor[i] <=máximo THEN incremento total.validas de 1; soma = soma + valor[i] ELSE pule ENDIF incremente i de 1; ENDDO IF total.validas>0 THEN média = soma /total.validas; ELSE média = -999; ENDIF END média 1 2 3 4 5 6 7 8 9 10 11 12 13 Caminho 6: 1-2-3-4-5-6-8-9-2... Casos de Teste valor(i) = entrada válida, i < 100 Resultados Esperados: média correta baseada em i valores e totais apropriados. Derivando Casos de Teste PROCEDURE média; INTERFACE RETORNA média, total.entradas, total.validas; INTERFACE ACEITA valor, mínimo, máximo; TIPO valor[1:100] É VETOR DE ESCALA; TIPO média, total.entradas, total.válidas; mínimo, máximo, soma é ESCALA; TIPO i É INTEIRO; i = 1; total.entradas = total.válidas = 0; soma=0; DO WHILE valor[i] <> -999 AND total.entradas < 100 incremente total.entradas de 1; IF valor[i] >= mínimo AND valor[i] <=máximo THEN incremento total.validas de 1; soma = soma + valor[i] ELSE pule ENDIF incremente i de 1; ENDDO IF total.validas>0 THEN média = soma /total.validas; ELSE média = -999; ENDIF END média 1 2 3 4 5 6 7 8 9 10 11 12 13
Compartilhar