SSC5877 – Validação Verificação e Teste de Software
Teste Estrutural – GFC
Prof. Marcio E. Delamaro
[email protected]
Relembrando
Teste estrutural utiliza o código do programa para
derivar requisitos de teste
Relembrando
Teste estrutural utiliza o código do programa para derivar requisitos de teste
Por isso requer conhecimento da linguagem de
programação e obviamente do programa implementado
Relembrando
Teste estrutural utiliza o código do programa para derivar requisitos de teste
Por isso requer conhecimento da linguagem de
programação e obviamente do programa implementado
De qualquer forma, o conhecimento da especificação é
utilizado
Relembrando
Teste estrutural utiliza o código do programa para derivar requisitos de teste
Por isso requer conhecimento da linguagem de
programação e obviamente do programa implementado De qualquer forma, o conhecimento da especificação é utilizado
Apropriado principalmente para o teste de unidade
Tipos de critérios
Baseados na complexidade No fluxo de controle
No fluxo de dados
Grafo de fluxo de controle (GFC)
Grafo de programa
É uma forma de abstrair a estrutura de uma unidade do programa
Uma função, procedimento ou método
Grafo: vértices e arestas
GFC – definição
Vértices são formados por blocos indivisíveis de código Cada instrução é executada em seqüência. Uma vez que a primeira instrução seja executada, todas as
demais são executadas também. Não existe, desvio para o meio do bloco.
Arestas representam a possível transferência da execução entre um bloco e outro.
Existem um único nó que é chamado de nó de entrada, que corresponde ao bloco da primeira instrução da
unidade
Podem existir diversos nós de saída, ou seja, nós que
não têm sucessores
GFC – exemplo
O programa identifier determina se um dado identificador é válido ou não. Um identificador válido inicia com uma letra e contém apenas letras e dígitos. Além disso possui no
mínimo um e no máximo seis caracteres de tamanho.
Exemplos de identificadores:
abc12 (valid);
cont*1 (invalid); 1soma (invalid); a123456 (invalid)
GFC – exemplo
p u b l i c boolean v a l i d a t e I d e n t i f i e r ( S t r i n g s ) { char achar ;
boolean v a l i d _ i d = f a l s e ; i f ( s . l e n g t h ( ) > 0 ) {
achar = s . c h a r A t ( 0 ) ;
v a l i d _ i d = v a l i d _ s ( achar ) ; i f ( s . l e n g t h ( ) > 1 ) {
achar = s . c h a r A t ( 1 ) ; i n t i = 1 ;
while ( i < s . l e n g t h ( ) − 1 ) { achar = s . c h a r A t ( i ) ;
i f ( ! v a l i d _ f ( achar ) ) v a l i d _ i d = f a l s e ; i ++;
} } }
i f ( v a l i d _ i d && ( s . l e n g t h ( ) >= 1 ) && ( s . l e n g t h ( ) < 6 ) ) r e t u r n t r u e ;
el se
r e t u r n f a l s e ;
}
GFC – blocos
p u b l i c boolean v a l i d a t e I d e n t i f i e r ( S t r i n g s ) { char achar ;
/ ∗ 01 ∗ / boolean v a l i d _ i d = f a l s e ; / ∗ 01 ∗ / i f ( s . l e n g t h ( ) > 0 ) {
/ ∗ 02 ∗ / achar = s . c h a r A t ( 0 ) ;
/ ∗ 02 ∗ / v a l i d _ i d = v a l i d _ s ( achar ) ; / ∗ 02 ∗ / i f ( s . l e n g t h ( ) > 1 ) {
/ ∗ 03 ∗ / achar = s . c h a r A t ( 1 ) ;
/ ∗ 03 ∗ / i n t i = 1 ;
/ ∗ 04 ∗ / while ( i < s . l e n g t h ( ) − 1 ) { / ∗ 05 ∗ / achar = s . c h a r A t ( i ) ;
/ ∗ 05 ∗ / i f ( ! v a l i d _ f ( achar ) )
/ ∗ 06 ∗ / v a l i d _ i d = f a l s e ;
/ ∗ 07 ∗ / i ++;
} }
} / ∗ 08 ∗ / / ∗ 09 ∗ / / ∗ 10 ∗ /
i f ( v a l i d _ i d && ( s . l e n g t h ( ) >= 1 ) && ( s . l e n g t h ( ) < 6 ) ) / ∗ 11 ∗ / r e t u r n t r u e ;
el se
/ ∗ 12 ∗ / r e t u r n f a l s e ;
}
GFC – o grafo
p u b l i c boolean v a l i d a t e I d e n t i f i e r ( S t r i n g s ) { char achar ;
/ ∗ 01 ∗ / boolean v a l i d _ i d = f a l s e ; / ∗ 01 ∗ / i f ( s . l e n g t h ( ) > 0 ) { / ∗ 02 ∗ / achar = s . c h a r A t ( 0 ) ;
/ ∗ 02 ∗ / v a l i d _ i d = v a l i d _ s ( achar ) ; / ∗ 02 ∗ / i f ( s . l e n g t h ( ) > 1 ) {
/ ∗ 03 ∗ / achar = s . c h a r A t ( 1 ) ;
/ ∗ 03 ∗ / i n t i = 1 ;
/ ∗ 04 ∗ / while ( i < s . l e n g t h ( ) − 1 ) { / ∗ 05 ∗ / achar = s . c h a r A t ( i ) ;
/ ∗ 05 ∗ / i f ( ! v a l i d _ f ( achar ) ) / ∗ 06 ∗ / v a l i d _ i d = f a l s e ;
/ ∗ 07 ∗ / i ++;
} }
} / ∗ 08 ∗ / / ∗ 09 ∗ / / ∗ 10 ∗ /
i f ( v a l i d _ i d && ( s . l e n g t h ( ) >= 1 ) && ( s . l e n g t h ( ) < 6 ) ) / ∗ 11 ∗ / r e t u r n t r u e ;
else
/ ∗ 12 ∗ / r e t u r n f a l s e ; }
1
2
8 3
9
12 4
5
6
7 10
11
Alguns elementos do GFC
Alguns elementos do GFC
Sequence
Alguns elementos do GFC
Sequence If
Alguns elementos do GFC
Sequence If While-Do
Alguns elementos do GFC
Sequence If While-Do Do-While
Alguns elementos do GFC
Sequence If While-Do Do-While Case
Modelo de fluxo de controle
Nem sempre é fácil construir o GFC
Não existe apenas uma maneira correta
É preciso decidir qual modelo de fluxo será utilizado
Cada modelo pode ter consequências no resultado da
aplicação da técnica
Modelo de fluxo de controle – exemplo
if ( a > b || c < d) S1;
S2;
Modelo de fluxo de controle – exemplo
if ( a > b || c < d) S1;
S2;
Modelo de fluxo de controle – exemplo
if ( a > b || c < d) S1;
S2;
Modelo de fluxo de controle – exemplo(2)
while (true) { if ( a > b)
S1;
else
break;
S2;
}
S3;
Mais exemplo
1 q = 1 ;
2 b = 2 ;
3 c = 3 ;
4 i f ( a ==2) {
5 x = x + 2 ;
6 } else {
7 x = x / 2 ;
8 }
9 p = q / r ;
10 i f ( b / c >3) {
11 z = x + y ;
12 }
Mais exemplo
1 q = 1 ;
2 b = 2 ;
3 c = 3 ;
4 i f ( a ==2) {
5 x = x + 2 ;
6 } else {
7 x = x / 2 ;
8 }
9 p = q / r ;
10 i f ( b / c >3) {
11 z = x + y ;
12 }
q = 1 b = 2 c = 3 if (a ==2)
x = x + 2 true
x = x / 2 false
p = q / r;
if (b/c>3)
z = x + y true
false
Mais exemplo – Bubble Sort
1 p u b l i c class S o r t {
2 p u b l i c void bolha ( i n t [ ] a , i n t s i z e ) {
3 i n t i , j , aux ;
4 f o r ( i = 0 ; i < s i z e ; i ++) {
5 f o r ( j = s i z e − 1 ; j > i ; j −− ) {
6 i f ( a [ j − 1 ] > a [ j ] ) {
7 aux = a [ j − 1 ] ;
8 a [ j − 1 ] = a [ j ] ;
9 a [ j ] = aux ;
10 }
11 }
12 }
Mais exemplo – Bubble Sort
1 p u b l i c class S o r t {
2 p u b l i c void bolha ( i n t [ ] a , i n t s i z e ) {
3 i n t i , j , aux ;
4 f o r ( i = 0 ; i < s i z e ; i ++) {
5 f o r ( j = s i z e − 1 ; j > i ; j −− ) {
6 i f ( a [ j − 1 ] > a [ j ] ) {
7 aux = a [ j − 1 ] ;
8 a [ j − 1 ] = a [ j ] ;
9 a [ j ] = aux ;
10 }
11 }
12 }
3, 4.1
4.2
5.1 13
5.2
6 4.3
7, 8, 9
5.3
Algumas definições
Caminho: seqüência de vértices conectados por arestas
Caminho completo: caminho que inicia no nó de entrada e termina em um nó de saída
Representa uma execução da unidade
Caminho livre de laço: caminho em que um nó não se repete
Caminho simples: caminho em que um nó não se
repete, exceto possivelmente o primeiro e último
Exercícios (1)
15 void i n s e r c a o ( i n t a [ ] , i n t s i z e ) {
16 i n t i , j , aux ;
17 f o r ( i = 1 ; i < s i z e ; i ++) {
18 aux = a [ i ] ;
19 j = i − 1 ;
20 while ( j >= 0 && a [ j ] >= aux ) {
21 a [ j + 1 ] = a [ j ] ;
22 j −− ;
23 }
24 a [ j + 1 ] = aux ;
25 }
26 }
Exercícios (2)
28 p u b l i c s t a t i c void h e a p s o r t ( i n t n , double r a [ ] ) {
29 i n t l , j , i r , i ;
30 double r r a ;
31
32 l = ( n >> 1 ) + 1 ;
33 i r = n ;
34 f o r ( ; ; ) {
35 i f ( l > 1 ) {
36 r r a = r a[ −− l ] ;
37 } e l s e {
38 r r a = r a [ i r ] ;
39 r a [ i r ] = r a [ 1 ] ;
40 i f ( −− i r == 1 ) {
41 r a [ 1 ] = r r a ;
42 r e t u r n ;
43 }
44 }
45 i = l ;
46 j = l << 1 ;
47 while ( j <= i r ) {
48 i f ( j < i r && r a [ j ] < r a [ j + 1 ] ) {
49 ++ j ;
50 }
51 i f ( r r a < r a [ j ] ) {
52 r a [ i ] = r a [ j ] ;
53 j += ( i = j ) ;
54 } e l s e {
55 j = i r + 1 ;
56 }
57 }
58 r a [ i ] = r r a ;
59 }
60 }
Exercícios (3)
62 void q u i c k s o r t ( i n t a [ ] , i n t l o 0 , i n t h i 0 ) {
63 i n t l o = l o 0 ;
64 i n t h i = h i 0 ;
65 i n t mid ;
66
67 / / pause f o r redraw
68 i f ( h i 0 > l o 0 ) {
69 mid = a [ ( l o 0 + h i 0 ) / 2 ] ;
70
71 while ( l o <= h i ) {
72 while ( ( l o < h i 0 ) && ( a [ l o ] < mid ) )
73 ++ l o ;
74
75 while ( ( h i > l o 0 ) && ( a [ h i ] > mid ) )
76 − − h i ;
77
78 i f ( l o <= h i ) {
79 swap ( a , l o , h i ) ;
80 ++ l o ;
81 − − h i ;
82 }
83 }
84
85 i f ( l o 0 < h i )
86 q u i c k s o r t ( a , l o 0 , h i ) ;
87
88 i f ( l o < h i 0 )
89 q u i c k s o r t ( a , l o , h i 0 ) ;
90
91 }
92 }
Exercícios (4)
(A)
1
2
3 7
4 5
6
(B)
1
2
3 7
4 5
6
(C)
1
2
3
7
4 5
6
(D)
1
2
3 8
4 7
5 6
Solução (1)
15 void i n s e r c a o ( i n t a [ ] , i n t s i z e ) {
16 i n t i , j , aux ;
17 f o r ( i = 1 ; i < s i z e ; i ++) {
18 aux = a [ i ] ;
19 j = i − 1 ;
20 while ( j >= 0 && a [ j ] >= aux ) {
21 a [ j + 1 ] = a [ j ] ;
22 j −− ;
23 }
24 a [ j + 1 ] = aux ;
25 }
26 }
0
56
61 5
31
36
45
18
Solução (2)
28 p u b l i c s t a t i c void h e a p s o r t ( i n t n , double r a [ ] ) {
29 i n t l , j , i r , i ;
30 double r r a ;
31
32 l = ( n >> 1 ) + 1 ;
33 i r = n ;
34 f o r ( ; ; ) {
35 i f ( l > 1 ) {
36 r r a = r a[ −− l ] ;
37 } e l s e {
38 r r a = r a [ i r ] ;
39 r a [ i r ] = r a [ 1 ] ;
40 i f ( −− i r == 1 ) {
41 r a [ 1 ] = r r a ;
42 r e t u r n ;
43 }
44 }
45 i = l ;
46 j = l << 1 ;
47 while ( j <= i r ) {
48 i f ( j < i r && r a [ j ] < r a [ j + 1 ] ) {
49 ++ j ;
50 }
51 i f ( r r a < r a [ j ] ) {
52 r a [ i ] = r a [ j ] ;
53 j += ( i = j ) ;
54 } e l s e {
55 j = i r + 1 ;
56 }
57 }
58 r a [ i ] = r r a ;
59 }
60 }
0
9
14 25
53 47
115
121 63
69
84 81
93 110
Solução (3)
62 void q u i c k s o r t ( i n t a [ ] , i n t l o 0 , i n t h i 0 ) {
63 i n t l o = l o 0 ;
64 i n t h i = h i 0 ;
65 i n t mid ;
66
67 / / pause f o r redraw
68 i f ( h i 0 > l o 0 ) {
69 mid = a [ ( l o 0 + h i 0 ) / 2 ] ;
70
71 while ( l o <= h i ) {
72 while ( ( l o < h i 0 ) && ( a [ l o ] < mid ) )
73 ++ l o ;
74
75 while ( ( h i > l o 0 ) && ( a [ h i ] > mid ) )
76 − − h i ;
77
78 i f ( l o <= h i ) {
79 swap ( a , l o , h i ) ;
80 ++ l o ;
81 − − h i ;
82 }
83 }
84
85 i f ( l o 0 < h i )
86 q u i c k s o r t ( a , l o 0 , h i ) ;
87
88 i f ( l o < h i 0 )
89 q u i c k s o r t ( a , l o , h i 0 ) ;
90
91 }
92 }
0
11
122 87
94 29
100
108 35
50
114 26
56
65 47
72