Sumário
Processo de teste Fundamentos de teste Estratégias de teste caixa preta caixa branca Níveis de teste Depuração Princípios de testeEstratégias de testes caixa branca
Conceito de grafo de programa
Critério de adequação de teste
Testes caixa branca
teste caixa branca, ou teste estrutural
testador possui conhecimento da estrutura interna do software a ser testado
este conhecimento se torna disponível ao
testador enquanto o código do software estiver sendo desenvolvido
útil para testar componentes pequenos
Grafo de programa/ fluxo de controle
Uma notação para representar o fluxo de controle. Cada construção estruturada tem um símbolo de grafo
correspondente.
nodos representam comandos
Exemplo
1 soma_vetor (a, num_elementos, soma)
2 soma = 0
3 i = 1
4 while (i <= num_elementos) 5 if a[i] > 0
6 soma = soma + a[i]
endif 7 i = i + 1 end while 8 end soma_vetor falso verdadeiro 1,2,3 4 verdadeiro 5 6 7 falso
Caminhos do grafo de programa
Um caminho é uma sequência de nodos
começando do nodo de entrada do grafo e chegando ao nodo de saída
Exercício: Encontre caminhos no grafo anterior.
Exercício: A sequência 1,2,3,4,5,6,7,8 é um caminho factível?
Critério de adequação de teste
também chamado de critério de cobertura de teste
uma regra de parada de execução de testes já foram executados testes suficientes?
critérios mínimos de teste de um programa
Um programa é dito estar adequadamente testado com relação a um determinado critério se todos os elementos estruturais alvo foram exercitados
segundo o critério
Um conjunto de casos de teste é dito adequado para testar um programa de acordo com o critério de
comandos se ele exercitar todos os comandos ou seja, causar todos os comandos serem executados.
Critérios de cobertura de teste
Critérios de adequação/cobertura
comandos (statements)
desvios ou decisões (branches)
condições compostas
caminhos
caminhos específicos
Alguns critérios possuem uma habilidade de detecção de defeitos maior do que outros
Grau de cobertura
Em algumas condições o grau de cobertura pode ser menor do que 100% devido a:
alguns comandos podem ser inatingíveis
falta de recursos (tempo, testadores, ferramentas)
Boa prática de cobertura
A criação de um conjunto de testes:
maximizar a cobertura
os testes devem explorar o maior número de possibilidades
minimizar o tempo
deve-se buscar executar o menor número possível de testes
Tipos de cobertura
cobertura de código
objetivo é cobrir possíveis maneiras em que o código é executado
cobertura de dados
objetivo é cobrir as possíveis combinações de dados
Cobertura de comandos (statements)
objetivo é executar todos os comandos das linhas de código pelo menos uma vez
é a abordagem mais simples
em termos do grafo de fluxo de controle consiste em garantir que todos os nodos
serão exercitados pelo menos uma vez pelo conjunto de testes
Cobertura de comandos (statements)
não é capaz de detectar diversos tipos de defeito
if (a > 0) onde deveria ser if (a >= 0)
basta executar um comando de repetição uma única vez
condições compostas não são testadas
ifs sem elses são particularmente vulneráveis
se houver um defeito na condição e esta for sempre
verdadeira, como não existe comando a ser testado no else este defeito não é descoberto usando cobertura de
Cobertura de comandos (statements)
public int thisHasAnError(int x, int y ) { String c; if (x == y) { c = new String; } return c.length(); }
92
Exercício: cobertura de comandos
1 public int determinaTipo (int a,b,c ) { 2 int tipo = ESCALENO;
3 if (a <= 0 || b <= 0 || c <= 0) { 4 tipo = INEXISTENTE;
} else
5 if (! (a + b > c && a + c > b && b + c > a)) { 6 tipo = INEXISTENTE; } else 7 if (a == b){ 8 tipo = ISOSCELES; 9 if (b == c) { 10 tipo = EQUILATERO; } } else 11 if (b == c || a == c) { 12 tipo = ISOSCELES; } Exercício: Determine um conjunto de casos de teste que garanta cobertura de comandos para o seguinte programa. Use o grafo de programa.
Solução:
grafo de programa
F 1,2 3 V 4 5 F V 6 7 F V 8 11 9 F V 10 F V 12Solução: casos de teste
cobertura de comandos: todos os nodos do grafo devem ser exercitados
entrada 0,0,0 saída INEXISTENTE
caminho 1,2,3,4,13
entrada 1,2,3 saída INEXISTENTE
caminho 1,2,3,5,6,13
entrada 1,1,1 saída EQUILÁTERO
caminho 1,2,3,5,7,8,9,10,13
entrada 1,2,2 saída ISÓSCELES
Cobertura de desvios (branches)
Cada desvio ou decisão consiste em uma condição (simples ou composta) que deve ser avaliada pelo menos uma vez como
verdadeira e uma como falsa
para n condições, exige no máximo n+1 casos de teste
em termos do grafo de fluxo de controle consiste em garantir que todos as arestas serão exercitados pelo menos uma vez pelo
Cobertura de desvios (branches)
resolve alguns problemas da cobertura por comandos, mas não todos
condições compostas podem não ser testadas
podem haver caminhos não testados
comandos de repetição só necessitam ser executados uma vez apesar da condição de repetição ter de ser testada duas vezes
ou seja, apenas o caminho de comprimento um foi testado
Cobertura de desvios
public int testThis(int i) { if (a == b) ++i;
if (x == y) –-i; return i;
}
(4 caminhos possíveis, apenas 2 precisam ser testados para garantir cobertura de desvios)
98
Exercício: cobertura de desvios
1 public int determinaTipo (int a,b,c ) { 2 int tipo = ESCALENO;
3 if (a <= 0 || b <= 0 || c <= 0) { 4 tipo = INEXISTENTE;
} else
5 if (! (a + b > c && a + c > b && b + c > a)) { 6 tipo = INEXISTENTE; } else 7 if (a == b){ 8 tipo = ISOSCELES; 9 if (b == c) { 10 tipo = EQUILATERO; } } else 11 if (b == c || a == c) { 12 tipo = ISOSCELES; } Exercício: Determine um conjunto de casos de teste que garanta cobertura de desvios para o seguinte programa. Use o grafo de programa.
Solução: casos de teste
cobertura de desvios: todas as arestas do grafo devem ser exercitadas
entrada 0,0,0 saída INEXISTENTE
caminho 1,2,3,4,13
entrada 1,2,3 saída INEXISTENTE
caminho 1,2,3,5,6,13
entrada 1,1,1 saída EQUILÁTERO
caminho 1,2,3,5,7,8,9,10,13
entrada 1,2,2 saída ISÓSCELES
caminho 1,2,3,5,7,11,12,13
entrada 2,2,1 saída ISÓSCELES
Comparação
Cobertura de comandos
Cobertura de desvios
as arestas em destaque não foram exercitadas na cobertura de comandos
isso sugere que a
cobertura de desvios é melhor que a cobertura de comandos F 1,2 3 V 4 5 F V 6 7 F V 8 11 9 F V 10 F V 12
Cobertura de condições
Cada parte de uma condição deve ser testada pelo menos uma vez como verdadeira e uma vez como falsa
não requer testar todas as possibilidades
Não requer que todos os desvios sejam cobertos
o desvio pode ser sempre falso, por exemplo, mas cada parte da condição foi testada como V e F
pode-se combiná-la com a cobertura de desvios
Cobertura de múltiplas condições
Todas as combinações de V ou F de cada condição devem ser testadas
uma condição composta de n partes deverá ter 2n combinações
Cobre todos os comandos, desvios e condições
Cobertura de caminhos
Deve-se cobrir todos os caminhos possíveis da entrada até a saída
O número de caminhos pode chegar a 2n
para n condições
No caso de comandos de repetição, o
número de caminhos é muito grande e pode ser infinito
Em geral, o custo desse tipo de cobertura é proibitivo
Orientação a objetos
Ao testar programas orientados a objetos é preciso tomar atenção especial com
chamadas polimórficas
Cada chamada polimórfica deve ser
considerada como um desvio condicional com tantos pontos de entrada quantos
Cobertura de fluxo de dados
Uma análise do padrão de fluxo de dados para
variáveis específicas é útil na detecção de defeitos uso de variáveis sem serem definidas indica um defeito no
código – variável sem inicialização
Todas as definições de variáveis devem ser exercitadas pelo menos uma vez
uma variável é definida em um comando quando seu valor é atribuído ou alterado
Todos os usos de variáveis devem ser exercitadas pelo menos uma vez
O que testar, então?
Testar o funcionamento típico
No mínimo, conseguir cobertura de comandos
Testar dois valores em cada borda
Testar casos de erro prováveis
Testar os seus erros mais frequentes
manter uma checklist com os seus bugs pessoais
o uso de checklists personalizadas reduz o número de bugs em até 75%