Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
Teste Estrutural
2
Teste estrutural
• Teste baseado na estrutura do código
• Mais precisamente,
– Critério de adequação baseia-se no código!
3
Teste estrutural
• Estrutura de um programa é um grafo
• Exemplos:
– Organização em árvore de pacotes e classes
– Parser gera uma AST
– Fluxo de controle de um método define CFG
– Fluxo de chamada de métodos define CG
4
Control-Flow Graph (CFG)
stmt0;
while (condA){
if (condB){
stmt1; stmt2;
}
stmt3;
}
stmt4
5
CFG
stmt0;
while (condA){
if (condB){
stmt1; stmt2;
}
stmt3;
}
stmt4
stmt0
condA
stmt1;
stmt2;
stmt3
condB
stmt4
6
Simplificação didática
• Testar a estrutura de um programa
equivale a testar um grafo
• O que é um teste? (Para um grafo)
7
Simplificação didática
• Testar a estrutura de um programa
equivale a testar um grafo
• O que é um teste para um grafo?
– Sequência de transiçoes a partir do nó inicial
que termina em uma folha
8
Simplificação didática
• Testar a estrutura de um programa
equivale a testar um grafo
Model checkers de programas (ferramentas que geram sistematicamente testes) usam o mesmo princípio. Exemplos: Java PathFinder (Java), Verisoft (C), Spin (Promela).
Cobertura de Grafos
9
b
c
a
f
d
e
t0
t1 t6
t2
t3
t4
t5
stmt0
condA
stmt1;
stmt2;
stmt3
condB
stmt4
10
Cobertura de Grafos
• Exemplo de teste
– t0, t6
10
b
c
a
f
d
e
t0
t1 t6
t2
t3
t4
t5
11
Critérios de adequação de grafo
• Nó
• Transição
• Caminho
12
Critérios de adequação de grafo
• Nó
– Teste suíte TS é adequada a nó se para cada nó
n no grafo G existe ao menos um teste t em TS
que cobre n
• Transição
• Caminho
13
Critérios de adequação de grafo
• Nó
– Teste suíte TS é adequada a nó se para cada nó
n no grafo G existe ao menos um teste t em TS
que cobre n
• Transição
• Caminho
Grafo com ciclo possui número infinito de caminhos
14
Ciclos
• Problema:
– Como medir cobertura de caminho?
• Grafo com ciclos contém infinidade de caminhos
• Solução comum:
– Limitar o número de iterações!
• Transforma um grafo em uma árvore
15
Exercício
• Reporte suíte de teste adequada a nó
• Reporte suíte de teste adequada a transição
• Existe suíte de teste adequada a caminho?
• Existe suíte de teste adequada a caminho de
até N transições?
15
b
c
a
f
d
e
t0
t1 t6
t2
t3
t4
t5
Caminhos inalcançáveis
16
Há caminhos inalcançáveis no programa:
não há execução que o visite.
Caminhos inalcançáveis
17
if (a < 0) {
a = 0;
}
if (a > 10) {
a = 10;
}
skip();
a < 0
a = 0
a > 10
a = 10
skip
18
Caminhos inalcançáveis
• Enumere os caminhos do grafo
a < 0
a = 0
a > 10
a = 10
skip
19
Caminhos inalcançáveis
• Enumere os caminhos do grafo
a < 0
a = 0
a > 10
a = 10
skip
20
Caminhos inalcançáveis
• Todos estes caminhos são
alcancáveis?
if (a < 0) {
a = 0;
}
if (a > 10) {
a = 10;
}
skip();
21
Caminhos inalcançáveis
if (a < 0) {
a = 0;
}
if (a > 10) {
a = 10;
}
skip();
a < 0 => NOT(a > 10)
• Estes caminhos são alcancáveis?
22
Lista incompleta de critérios de
adequação estruturais para programa • Statement
• Basic-Block
• Branch
• Basic condition
• Compound condition
• MC/DC
• Path
• Boundary-Interior
• Loop boundary
• Call
• …
23
Lista incompleta de critérios de
adequação estruturais para programa • Statement
• Basic-Block
• Branch
• Basic condition
• Compound condition
• MC/DC
• Path
• Boundary-Interior
• Loop boundary
• Call
• …
Basic-block subsumes Statement
Branch subsumes Basic-block
24
Cobertura baseada em Condições
Lógicas
• Terminologia
– Condições básicas e compostas
• Exemplo: (((a || b) && c) || d) && e
– a, b, c, d, e são condições básicas
– (a || b) é uma condição composta
25
Cobertura baseada em Condições
Lógicas
• Basic condition
– Requer que toda condição básica seja satisfeita pela execução de algum teste
• Compound Condition
– Requer que toda condição composta seja satisfeita pela execuçao de algum teste
• MC/DC
– Requer que para cada condição básica C tenham-se 2 casos de teste que fixem o valor de todas as outras condições básicas. Os testes devem variar o resultado de C e o resultado de toda expressão.
RTCA/DO-178B, EUROCAE ED-12b
MC/DC
• Objetivo é isolar efeito de cada condição
básica no resultado de toda expressão
26
27
Exercício
• Gerar suíte de teste adequada a (i) basic
condition, (ii) compound condition, e (iii)
MC/DC para o bloco abaixo
{
if((((a||b)&&c)||d)&&e){…}else{…}
}
Solução
• ((((a || b) && c) || d) && e)
28
a b c d e T
0 0 1 0 1 0
1 0 1 0 1 1
0 0 1 0 1 0
0 1 1 0 1 1
1 0 0 0 1 0
1 0 1 0 1 1
0 0 0 0 1 0
0 0 0 1 1 1
0 0 0 1 0 0
0 0 0 1 1 1
a b c d e T
0 0 1 0 1 0
1 0 1 0 1 1
0 0 1 0 1 0
0 1 1 0 1 1
1 0 0 0 1 0
1 0 1 0 1 1
0 0 0 0 1 0
0 0 0 1 1 1
0 0 0 1 0 0
0 0 0 1 1 1
Resumo
• Várias formas de se medir cobertura de
código
• Ciclos
• Caminhos inalcançáveis
29
EXERCÍCIO – MONTAR A SUITE DE TESTE PARA CALCULO DV CPF
Fatorial public int fatorial(int valor){
int fat=1; if (valor<0){ System.out.println("Valor Negativo!!! Não é válido!!!"); fat=-1; } else { if (valor==0 || valor==1) return fat; else while (valor>0){ fat+=(fat*valor); valor--; } return fat;
}
• Caminhos Básicos
1. 1, 2, 9
2. 1, 3, 5, 9
3. 1, 3, 4, 5, 9
4. 1, 3, 4, 6, 9
5. 1, 3, 4, 6, 7, 8, ..., 6, 9
public int fatorial(int valor){ int fat=1; if (valor<0){ System.out.println("Valor Negativo!!! Não é válido!!!"); fat=-1; } else { if (valor==0 || valor==1) return fat; else while (valor>0){ fat+=(fat*valor); valor--; } return fat;
}
• Entradas
1. valor = -2 -> -1 "Valor Negativo!!! Não é válido!!!"
2. valor = 0 -> 1
3. valor = 1 -> 1
4. Inválido. Deveria entrar no “while”
5. valor = 5 -> 120
public int fatorial(int valor){ int fat=1; if (valor<0){ System.out.println("Valor Negativo!!! Não é válido!!!"); fat=-1; } else { if (valor==0 || valor==1) return fat; else while (valor>0){ fat+=(fat*valor); valor--; } return fat;
}
• Caminhos Básicos
1. 1, 2, 9
2. 1, 3, 5, 9
3. 1, 3, 4, 5, 9
4. 1, 3, 4, 6, 9
5. 1, 3, 4, 6, 7, 8, ..., 6, 9
Exercício: Calculo DV CPF public class ValidaCPF { public static boolean isCPFValido(String CPF) { // considera-se erro CPF's formados por uma sequencia de numeros iguais if (CPF.equals("00000000000") || CPF.equals("11111111111") || CPF.equals("22222222222") || CPF.equals("33333333333") || CPF.equals("44444444444") || CPF.equals("55555555555") || CPF.equals("66666666666") || CPF.equals("77777777777") || CPF.equals("88888888888") || CPF.equals("99999999999") || (CPF.length() != 11)) return(false); char dig10, dig11; int sm, i, r, num, peso; // "try" - protege o codigo para eventuais erros de conversao de tipo (int) try {
Calculo DV CPF try { // Calculo do 1o. Digito Verificador sm = 0; peso = 10; for (i=0; i<9; i++) { // converte o i-esimo caractere do CPF em um numero: // por exemplo, transforma o caractere '0' no inteiro 0 // (48 eh a posicao de '0' na tabela ASCII) num = (int)(CPF.charAt(i) - 48); sm = sm + (num * peso); peso = peso - 1; } r = 11 - (sm % 11); if ((r == 10) || (r == 11)) dig10 = '0'; else dig10 = (char)(r + 48); // converte no respectivo caractere numerico
Calculo DV CPF // Calculo do 2o. Digito Verificador sm = 0; peso = 11; for(i=0; i<10; i++) { num = (int)(CPF.charAt(i) - 48); sm = sm + (num * peso); peso = peso - 1; } r = 11 - (sm % 11); if ((r == 10) || (r == 11)) dig11 = '0'; else dig11 = (char)(r + 48); // Verifica se os digitos calculados conferem com os digitos informados. if ((dig10 == CPF.charAt(9)) && (dig11 == CPF.charAt(10))) return(true); else return(false); } catch (InputMismatchException erro) { return(false); } }
Calculo DV CPF // Verifica se os digitos calculados conferem com os digitos informados. if ((dig10 == CPF.charAt(9)) && (dig11 == CPF.charAt(10))) return(true); else return(false); } catch (InputMismatchException erro) { return(false); } }