Introdução a Testes de Software Ricardo Argenton Ramos ricargentonramos@gmail.com
Agenda da Aula Introdução sobre Testes; Testes Funcionais de software; Testes Estruturais de Software;
Teste de Software Processo para descobrir a existência de defeitos em um software. Um defeito pode ser introduzido em qualquer fase de desenvolvimento ou manutenção como resultado de um ou mais bugs imprecisão, desentendimentos, omissões e direcionamento a soluções particulares, inconsistências, incompletude. Debugging Processo de encontrar bugs associados a um defeito. Objetivos: Mostrar que a aplicação faz o esperado Mostrar que a aplicação não faz mais do que o esperado Teste é um processo referencial: É necessário existir uma definição precisa do que se quer verificar e quais os resultados esperados.
Teste de Software Cont. Todas as representações de um software podem e devem ser testados. Teste não implica em garantia de qualidade: é necessário ter um conjunto de métodos para a prevenção e remoção de defeitos. Nenhuma quantidade absurda de testes pode melhorar a qualidade de um software: teste ajuda a identificar problemas que poderíamos ter evitado. Garantia de qualidade requer processos além da execução de testes. Entretanto, processos de planejamento e especificação de testes executados mais cedo podem contribuir nesta direção.
Fases de Teste As fases de teste são independentes do paradigma de desenvolvimento de software utilizado, seja ele procedimental ou orientado a objetos. Teste de Unidade Teste de Integração Teste de Sistema Teste de Aceitação
Características de um bom Teste Um bom teste tem alta probabilidade de encontrar um erro; Um bom teste não é redundante; Um bom teste não deve ser muito simples nem muito complexo;
Técnicas de Testes Teste Funcional (Caixa Preta); Teste Funcional Teste Estrutural(Caixa Branca); Teste Estrutural
Teste Funcional Teste Funcional - Definição São técnicas de teste que são apenas consideradas as entradas e as saídas para verificar se em conformidade com os objetivos especificados. Em princípio, o teste funcional pode detectar todos os defeitos, submetendo o programa a todas as possíveis entradas (teste exaustivos). Se o domínio da entrada for muito grande pode ser inviável fazer este teste. É necessário utilizar um critério
Teste Funcional Critérios Funcionais O testador deverá encontrar um subconjunto de todas as possíveis entradas do programa e este subconjunto deve ter grande probabilidade de encontrar defeitos Particionamento de Classes de Equivalência Análise do Valor Limite
Teste Funcional Particionamento de Equivalência Para aplicar este critério de teste na aplicação a ser testada, deve-se seguir o seguinte roteiro: 1. Estabelecer as classes válidas (valores permitidos para o atributo) e as inválidas (valores proibidos), para cada atributo do software. 2. Gerar casos de teste selecionando um elemento de cada classe, de forma a ter o menor número de casos de testes possível.
Teste Funcional Exemplo de Elementos Requeridos do critério Particionamento em Classes de Equivalência para o Cadastro de Crianças Variável de Entrada Classes de Equivalência válidas Classes de Equivalência inválidas Variáveis de Entrada Saída Esperada Saída Obtida Peso Criança (P) da P>0 P<=0 1) 2,4 kg 2) 0 kg 3) -2,5 kg 1) OK 2) ERRO 3) ERRO 1) OK 2) ERRO 3) ERRO Data Nascimento (DN) de nasc <= sysdate nasc > sysdate 4) 21/03/2014 5) 22/03/2014 6) 23/03/2014 4) OK 5) OK 6) ERRO 4) OK 5) OK 6) ERRO Como o testador lê o caso de teste 1 2 3 Dentro da classe de equivalência válidas P>0 Digita no programa a entrada planejada no caso de teste 2,4 kg Executa a operação e verifica se a saída do programa é a mesma esperada no caso de teste OK 4 Caso a saída obtida seja a mesma da saída esperada o teste é feito para a próxima variável de entrada
Teste Funcional Análise do Valor Limite Em vez de se concentrar somente nas condições de entrada, a análise de valor limite deriva os casos de teste também do domínio de saída. Para aplicar este critério, deve-se seguir o seguinte roteiro: 1. Estabelecer as classes válidas e as inválidas para cada atributo do software (caso o critério descrito anteriormente tenha sido aplicado, essa etapa não precisa ser repetida). 2. Definir os limites dos atributos, ou seja, selecionar dados com um valor inferior, igual e outro superior ao limite.
Teste Funcional Exemplo de elemento requerido do critério Análise dos Valores Limites para o Cadastro de Crianças Variável de Entrada Entrada Saída Esperada Saída Obtida Data de Nascimento (DN) 1) 00 2) 01 3) 02 4) 30 5) 31 6) 32 7)11 8)12 9)13 10) ano atual-1 11) ano atual 12) ano atual+1 1- ERRO 2- OK 3- OK 4- OK 5- OK 6- ERRO 7- OK 8- OK 9- ERRO 10- OK 11- OK 12- ERRO 1- ERRO 2- OK 3- OK 4- OK 5- OK 6- ERRO 7- OK 8- OK 9- ERRO 10- OK 11- OK 12- ERRO Peso da Criança (P) 13) P=-1 14) P=0 15) P=1 13- ERRO 14- ERRO 15- OK 13- ERRO 14- ERRO 15- OK
Teste Funcional Teste Sistemático Combina os critérios Particionamentos de Equivalência e Análise do Valor Limite Variável de Entrada Classes de Equivalência válidas Classes de Equivalência inválidas Variáveis de Entrada Saída Esperada Saída Obtida Data Nascimento (DN) de nasc <= sysdate nasc > sysdate 1) 21/03/2014 2) 22/03/2014 3) 23/03/2014 1) OK 2) OK 3) ERRO 1) OK 2) OK 3) ERRO
Teste Funcional Outras Técnicas Error Guessing abordagem ad-hoc na qual o testador pratica, inconscientemente, uma técnica para projetar os casos de teste, supondo por intuição e experiência alguns tipos prováveis de erros. Grafo Causa-Efeito Ajuda na definição de um conjunto de casos de teste que exploram ambiguidade e incompletude nas especificações.
Teste Estrutural Teste Estrutural - Definição É um método de projeto de testes que usa a estrutura de controle do projeto procedimental para derivar casos de teste; Baseia-se num minucioso exame dos detalhes procedimentais; Caminhos lógicos de código do software são testados; Não é viável testar todos os caminhos lógicos de um programa (teste exaustivo).
Teste Estrutural Vamos Imaginar a Seguinte Situação Programa Pascal com 100 linhas e dois ciclos aninhados que executam entre 1 e 20 vezes cada um dependendo do dado da entrada. Dentro do ciclo interior 4 construções seentão-senão. 10 14 caminhos possíveis de execução Se cada caso de teste for executado por um processador mágico de testes em 1 mseg Vai levar 3170 anos para completar os testes.
Teste Estrutural Casos de Testes Estruturais Devem garantir que todos os caminhos independentes de um módulo tenham sido exercitados pelo menos uma vez; Todas as decisões lógicas em seus lados verdadeiro e falso devem ser executadas; Todos os laços de repetição nos seus limites e dentro de seus intervalos operacionais devem ser executados; As estruturas de dados internas devem ser executadas.
Teste Estrutural Geração de um Grafo Nós: blocos indivisíveis Não existe desvio para o meio do bloco; Uma vez que o primeiro comando do bloco é executado, os demais comandos são executados sequencialmente; Arestas ou Arcos: representam o fluxo de controle entre os nós Vamos a um exemplo!
Identifier.c (função main) 01 Teste Estrutural /* 01 */ { /* 01 */ char achar; /* 01 */ int length, valid_id; /* 01 */ length = 0; /* 01 */ printf ( Identificador: ); /* 01 */ achar = fgetc (stdin); /* 01 */ valid_id = valid_s(achar); /* 01 */ if (valid_id) /* 02 */ length = 1; /* 03 */ achar = fgetc (stdin); 05 /* 04 */ while (achar!= '\n') /* 05 */ { /* 05 */ if (!(valid_f(achar))) 06 /* 06 */ valid_id = 0; /* 07 */ length++; /* 07 */ achar = fgetc (stdin); 07 /* 07 */ } /* 08 */ if (valid_id && (length >= 1) && (length < 6) ) /* 09 */ printf ( Valido\n ); /* 10 */ else /* 10 */ printf ( Invalido\n ); /* 11 */ } 02 03 04 08 09 10 11
Detalhes Considerados no Teste Estrutural nó arco caminho simples (1,2,3,4,5,6,7) Completo Grafo (1,2,3,4,5,6,7,4,8,9,11) (1,2,3,4,5,6,7,4,8,10,11) fluxo de controle 05 06 07 01 02 03 04 08 09 10 11
Teste Estrutural Técnica Baseada em Erros Os requisitos de teste são derivados a partir dos erros mais frequentes cometidos durante o processo de desenvolvimento do software;
Teste Estrutural Teste de Mutação Hipótese do Programador Competente Programadores experientes escrevem programas corretos ou muito próximos do correto. Efeito de Acoplamento Casos de teste capazes de revelar erros simples são tão sensíveis que, implicitamente, também são capazes de revelar erros mais complexos.
Teste Estrutural Teste de Mutação [2] Passos da Análise de Mutantes 1- Geração de Mutantes Para modelar os desvios sintáticos mais comuns, operadores de mutação são aplicados a um programa, transformandoo em programas similares: mutantes.
length = 5 Saída = Valido Código Original length = 6 Saída = Invalido if ( (length >= 1) && (length < 6) ) printf ("Valido\n"); else printf ("Invalido\n"); Teste de Mutação - Exemplo Mutante 01 Teste Estrutural O mutante é eliminado quando as mesmas entradas, do código original e do mutante, geram saídas diferentes length = 5 Saída = Valido length = 6 Saída = Valido length = 5 Saída = Valido length = 6 Saída = Valido Mutante 02 if ( (length >= 1) (length < 6) ) printf ("Valido\n"); else printf ("Invalido\n"); if ((length >= 1) && (length <= 6) ) printf ("Valido\n"); else printf ("Invalido\n");
Exercício 1. Derive o grafo de fluxo do código a seguir
Resposta