• Nenhum resultado encontrado

SSC5877 – Validação Verificação e Teste de Software - USP

N/A
N/A
Protected

Academic year: 2023

Share "SSC5877 – Validação Verificação e Teste de Software - USP"

Copied!
37
0
0

Texto

(1)

SSC5877 – Validação Verificação e Teste de Software

Teste Estrutural – GFC

Prof. Marcio E. Delamaro

[email protected]

(2)

Relembrando

Teste estrutural utiliza o código do programa para

derivar requisitos de teste

(3)

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

(4)

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

(5)

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

(6)

Tipos de critérios

Baseados na complexidade No fluxo de controle

No fluxo de dados

(7)

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

(8)

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

(9)

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)

(10)

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 ;

}

(11)

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 ;

}

(12)

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

(13)

Alguns elementos do GFC

(14)

Alguns elementos do GFC

Sequence

(15)

Alguns elementos do GFC

Sequence If

(16)

Alguns elementos do GFC

Sequence If While-Do

(17)

Alguns elementos do GFC

Sequence If While-Do Do-While

(18)

Alguns elementos do GFC

Sequence If While-Do Do-While Case

(19)

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

(20)

Modelo de fluxo de controle – exemplo

if ( a > b || c < d) S1;

S2;

(21)

Modelo de fluxo de controle – exemplo

if ( a > b || c < d) S1;

S2;

(22)

Modelo de fluxo de controle – exemplo

if ( a > b || c < d) S1;

S2;

(23)

Modelo de fluxo de controle – exemplo(2)

while (true) { if ( a > b)

S1;

else

break;

S2;

}

S3;

(24)

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 }

(25)

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

(26)

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 }

(27)

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

(28)

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

(29)

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 }

(30)

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 }

(31)

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 }

(32)

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

(33)

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

(34)

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

(35)

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

(36)

Solução (4)

void m(int a, int b) { int i = 0;

while (i < a + b) { if ( i % 2 == 0 )

i++;

else

i += 3;

f(i);

} }

void m(int a, int b) { int i = 0;

while (i < a + b) { if ( i % 2 == 0 )

i++;

else

continue;

f(i);

} }

(A) (B)

(37)

Solução (4)

void m(int a, int b) { int i = 0;

while (i < a + b) { if ( i % 2 == 0 )

i++;

else

break;

f(i);

} }

void m(int a, int b) { int i = 0, j = 0;

loop1:

while (i < a + b) {

while ( j < a + b) { if ( i + j > a )

continue loop1;

j++;

} i++

}

return;

}

(C) (D)

Referências

Documentos relacionados