Engenharia de Software 1
18 - Verifica¸c˜ao e Valida¸c˜ao: Testes estruturais
Alexandre de Andrade Barbosa
Objetivos
Descrever o Teste estrutural como alternativa para gerar casos de teste
Apresentar diferentes crit´
erios de teste estrutural
Introdu¸c˜
ao
Casos de teste podem ser criados com base em diferentes
abordagens:
Teste funcional (ex. particionamento de equivalˆ
encia)
Teste estrutural (ex. caminho b´asico)
Introdu¸c˜
ao
Teste funcional (parti¸c˜ao de equivalˆencia)
Introdu¸c˜
ao
Casos de teste podem ser criados com base em diferentes
abordagens:
Teste funcional (ex. particionamento de equivalˆencia)
Teste estrutural (ex. caminho b´
asico)
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Introdu¸c˜
ao
Um desenvolvedor pode indagar se os casos de teste criados s˜ao
suficientes...
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Introdu¸c˜
ao
Um desenvolvedor pode indagar se os casos de teste criados s˜ao
suficientes...
Se um conjunto de teste n˜ao exercita todos os trechos do
programa, pode-se dizer que novos casos de teste podem ser
criados
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Introdu¸c˜
ao
O teste estrutural ´e uma t´ecnica de teste caixa-branca
Os casos de teste s˜ao gerados com base em algum crit´erio
relacionado com a estrutura do c´odigo
Somente ap´os a cria¸c˜ao do c´odigo ´e poss´ıvel determinar os casos
de teste
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Introdu¸c˜
ao
Os crit´erios funcionais e estruturais s˜ao complementares
Crit´erios estruturais propoem a cria¸c˜ao de casos de teste
explorando o c´odigo fonte
´
util para identificar a completude dos casos de teste em rela¸c˜ao `a
estrutura do c´
odigo
Crit´erios funcionais propoem a cria¸c˜ao de casos de teste baseados
nas especifica¸c˜oes
´
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Grafo de Fluxo de Controle
Modelos s˜ao utilizados como
apoio para verificar se crit´erios
estruturais s˜ao satisfeitos
O Grafo de Fluxo de Controle
(GFC) ´e um modelo que
representa a estrutura interna
de um programa
Grafo de Fluxo de Controle (GFC)
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Grafo de Fluxo de Controle
Um GFC ´e formado por v´ertices (ou n´
os) e arestas:
v´ertices - representam blocos de c´
odigo, se a primeira instru¸c˜ao do
bloco ´e executada todas as outras tamb´em ser˜ao, n˜ao existem
desvios dentro dos blocos;
arestas - correspondem a tranferˆencia de controle na execu¸c˜ao de
um bloco para outro.
Um GFC pode ter um ´
unico n´
o de entrada (primeiro bloco
executado) e ’N’ n´
os de sa´ıda
Para exemplificar a cria¸c˜ao de um GFC ser´a utilizado o programa
”identificador”, apresentado em (Delamaro, 2007)
identificador ´e v´alido se inicia com uma letra e cont´em apenas
letras ou digitos;
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Grafo de Fluxo de Controle - Exemplo
1 main ( ) {
2 c h a r a c h a r ; 3 i n t l e n g t h = 0 4 i n t v a l i d i d = 1 ; 5 p r i n t f ( ” I d e n t i f i c a d o r ” ) ; 6 a c h a r = f g e t c ( s t d i n ) ; 7 v a l i d i d = v a l i d s ( a c h a r ) ; 8 i f ( v a l i d i d ) {
9 l e n g t h = 1 ;
10 }
11 a c h a r = f g e t c ( s t d i n ) ; 12 w h i l e( a c h a r != ’\n ’ ) {
13 i f ( ! ( v a l i d f ( a c h a r ) ) ) {
14 v a l i d i d = 0 ;
15 }
16 l e n g t h ++;
17 a c h a r = f g e c t c ( s t d i n ) ;
18 }
19 i f ( v a l i d i d && ( l e n g t h>= 1 ) && ( l e n g t h<6 ) ) {
20 p r i n t f ( ” V a l i d o \n” ) ; 21 } e l s e {
22 p r i n t f ( ” i n v a l i d o \n” ) ;
23 }
24 }
1 i n t v a l i d s (c h a r ch ) {
2 i f ( ( ( ch>=’A ’ ) && ( ch<=’ Z ’ ) )
| | ( ( ch>=’ a ’ ) && ( ch<=’ z ’ ) ) ) {
3 r e t u r n ( 1 ) ; 4 } e l s e {
5 r e t u r n ( 0 ) ;
6 }
7 }
1 i n t v a l i d f (c h a r ch ) {
2 i f ( ( ( ch>=’A ’ ) && ( ch<=’ Z ’ ) )
| | ( ( ch>=’ a ’ ) && ( ch<=’ z ’ ) ) | | ( ( ch>=’ 0 ’ ) && ( ch<=’ 9 ’ ) ) ) {
3 r e t u r n ( 1 ) ; 4 } e l s e {
5 r e t u r n ( 0 ) ;
6 }
7 }
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Grafo de Fluxo de Controle - Exemplo
1 /∗ 1 ∗/ main ( ) {
2 /∗ 1 ∗/ c h a r a c h a r ; 3 /∗ 1 ∗/ i n t l e n g t h = 0 4 /∗ 1 ∗/ i n t v a l i d i d = 1 ; 5 /∗ 1 ∗/ p r i n t f ( ” I d e n t i f i c a d o r ” ) ; 6 /∗ 1 ∗/ a c h a r = f g e t c ( s t d i n ) ; 7 /∗ 1 ∗/ v a l i d i d = v a l i d s ( a c h a r ) ; 8 /∗ 1 ∗/ i f ( v a l i d i d ) {
9 /∗ ? ∗/ l e n g t h = 1 ; 10 /∗ ? ∗/ }
11 /∗ ? ∗/ a c h a r = f g e t c ( s t d i n ) ; 12 /∗ ? ∗/ w h i l e( a c h a r != ’\n ’ ) {
13 /∗ ? ∗/ i f ( ! ( v a l i d f ( a c h a r ) ) ) {
14 /∗ ? ∗/ v a l i d i d = 0 ; 15 /∗ ? ∗/ }
16 /∗ ? ∗/ l e n g t h ++;
17 /∗ ? ∗/ a c h a r = f g e c t c ( s t d i n ) ; 18 /∗ ? ∗/ }
19 /∗ ? ∗/ i f ( v a l i d i d && ( l e n g t h>= 1 ) && ( l e n g t h<6 ) ) {
20 /∗ ? ∗/ p r i n t f ( ” V a l i d o \n” ) ; 21 /∗ ? ∗/ } e l s e {
22 /∗ ? ∗/ p r i n t f ( ” i n v a l i d o \n” ) ; 23 /∗ ? ∗/ }
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Grafo de Fluxo de Controle - Exemplo
1 /∗ 1 ∗/ main ( ) {
2 /∗ 1 ∗/ c h a r a c h a r ; 3 /∗ 1 ∗/ i n t l e n g t h = 0 4 /∗ 1 ∗/ i n t v a l i d i d = 1 ; 5 /∗ 1 ∗/ p r i n t f ( ” I d e n t i f i c a d o r ” ) ; 6 /∗ 1 ∗/ a c h a r = f g e t c ( s t d i n ) ; 7 /∗ 1 ∗/ v a l i d i d = v a l i d s ( a c h a r ) ; 8 /∗ 1 ∗/ i f ( v a l i d i d ) {
9 /∗ 2 ∗/ l e n g t h = 1 ; 10 /∗ 2 ∗/ }
11 /∗ 3 ∗/ a c h a r = f g e t c ( s t d i n ) ; 12 /∗ ? ∗/ w h i l e( a c h a r != ’\n ’ ) {
13 /∗ ? ∗/ i f ( ! ( v a l i d f ( a c h a r ) ) ) {
14 /∗ ? ∗/ v a l i d i d = 0 ; 15 /∗ ? ∗/ }
16 /∗ ? ∗/ l e n g t h ++;
17 /∗ ? ∗/ a c h a r = f g e c t c ( s t d i n ) ; 18 /∗ ? ∗/ }
19 /∗ ? ∗/ i f ( v a l i d i d && ( l e n g t h>= 1 ) && ( l e n g t h<6 ) ) {
20 /∗ ? ∗/ p r i n t f ( ” V a l i d o \n” ) ; 21 /∗ ? ∗/ } e l s e {
22 /∗ ? ∗/ p r i n t f ( ” i n v a l i d o \n” ) ; 23 /∗ ? ∗/ }
24 /∗ ? ∗/ }
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Grafo de Fluxo de Controle - Exemplo
1 /∗ 1 ∗/ main ( ) {
2 /∗ 1 ∗/ c h a r a c h a r ; 3 /∗ 1 ∗/ i n t l e n g t h = 0 4 /∗ 1 ∗/ i n t v a l i d i d = 1 ; 5 /∗ 1 ∗/ p r i n t f ( ” I d e n t i f i c a d o r ” ) ; 6 /∗ 1 ∗/ a c h a r = f g e t c ( s t d i n ) ; 7 /∗ 1 ∗/ v a l i d i d = v a l i d s ( a c h a r ) ; 8 /∗ 1 ∗/ i f ( v a l i d i d ) {
9 /∗ 2 ∗/ l e n g t h = 1 ; 10 /∗ 2 ∗/ }
11 /∗ 3 ∗/ a c h a r = f g e t c ( s t d i n ) ; 12 /∗ 4 ∗/ w h i l e( a c h a r != ’\n ’ ) {
13 /∗ 5 ∗/ i f ( ! ( v a l i d f ( a c h a r ) ) ) {
14 /∗ 6 ∗/ v a l i d i d = 0 ; 15 /∗ 6 ∗/ }
16 /∗ 7 ∗/ l e n g t h ++;
17 /∗ 7 ∗/ a c h a r = f g e c t c ( s t d i n ) ; 18 /∗ 7 ∗/ }
19 /∗ 8 ∗/ i f ( v a l i d i d && ( l e n g t h>= 1 ) && ( l e n g t h<6 ) ) {
20 /∗ 9 ∗/ p r i n t f ( ” V a l i d o \n” ) ; 21 /∗ 10 ∗/ } e l s e {
22 /∗ 10 ∗/ p r i n t f ( ” i n v a l i d o \n” ) ; 23 /∗ 10 ∗/ }
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Grafo de Fluxo de Controle - Exemplo
1 /∗ 1 ∗/ main ( ) {
2 /∗ 1 ∗/ c h a r a c h a r ; 3 /∗ 1 ∗/ i n t l e n g t h = 0 4 /∗ 1 ∗/ i n t v a l i d i d = 1 ; 5 /∗ 1 ∗/ p r i n t f ( ” I d e n t i f i c a d o r ” ) ; 6 /∗ 1 ∗/ a c h a r = f g e t c ( s t d i n ) ; 7 /∗ 1 ∗/ v a l i d i d = v a l i d s ( a c h a r ) ; 8 /∗ 1 ∗/ i f ( v a l i d i d ) {
9 /∗ 2 ∗/ l e n g t h = 1 ; 10 /∗ 2 ∗/ }
11 /∗ 3 ∗/ a c h a r = f g e t c ( s t d i n ) ; 12 /∗ 4 ∗/ w h i l e( a c h a r != ’\n ’ ) {
13 /∗ 5 ∗/ i f ( ! ( v a l i d f ( a c h a r ) ) ) {
14 /∗ 6 ∗/ v a l i d i d = 0 ; 15 /∗ 6 ∗/ }
16 /∗ 7 ∗/ l e n g t h ++;
17 /∗ 7 ∗/ a c h a r = f g e c t c ( s t d i n ) ; 18 /∗ 7 ∗/ }
19 /∗ 8 ∗/ i f ( v a l i d i d && ( l e n g t h>= 1 ) && ( l e n g t h<6 ) ) {
20 /∗ 9 ∗/ p r i n t f ( ” V a l i d o \n” ) ; 21 /∗ 10 ∗/ } e l s e {
22 /∗ 10 ∗/ p r i n t f ( ” i n v a l i d o \n” ) ; 23 /∗ 10 ∗/ }
24 /∗ 11 ∗/ }
Grafo de Fluxo de Controle (GFC)
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Crit´erios para teste estrutural
O teste estrutural ´e um teste baseado em parti¸c˜oes
Diferentes crit´erios de teste estrutural podem ser utilizados
Crit´erios estruturais podem ser divididos em 3 categorias:
crit´erios baseados na complexidade
crit´erios baseados no fluxo de controle
crit´erios baseados no fluxo de dados
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Teste de caminho b´
asico
O teste de caminho b´asico (ou crit´erio de McCabe) descreve que
todos os caminhos b´asicos do GFC devem ser percorridos
Um caminho b´asico (ou linearmente independente) ´e aquele que
inclui um novo conjunto de instru¸c˜oes ou uma nova condi¸c˜ao
Se todos os caminhos b´asicos de um programa forem percorridos,
ent˜ao todas as instru¸c˜oes ter˜ao sido exercitadas e todas as
condi¸c˜oes ter˜ao sido avaliadas com verdadeiro e falso
O conceito de complexidade ciclom´atica (CC) do GFC ´e usado
para determinar a quantidade de caminhos b´asicos existente em
um GFC
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Teste de caminho b´
asico - Complexidade ciclom´
atica
A CC ´e obtida a partir da representa¸c˜ao do fluxo de controle de
um programa
Atrav´es da CC determina-se o n´
umero de caminhos linearmente
independentes existentes no GFC
Com a CC obtˆem-se o limite m´aximo de casos de teste
necess´arios para exercitar todos os caminhos b´asicos
Complexidade ciclom´
atica
1
corresponde ao n
ode regi˜
oes do GFC, onde uma regi˜
ao ´
e uma ´
area inclu´ıda no
plano do GFC (internas + externa);
2
V(G) = E - N + 2
, onde
E
´
e o N
ode arestas e
N
´
e o N
ode n´
os;
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Teste de caminho b´
asico - Complexidade ciclom´
atica - Exemplo
Grafo de Fluxo de Controle (GFC)
Complexidade ciclom´
atica
1
V(G) = 5 regi˜
oes
2
V(G) = 14 - 11 + 2 = 5
3
V(G) = 4 + 1 = 5
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Teste de caminho b´
asico - Complexidade ciclom´
atica - Exemplo
Grafo de Fluxo de Controle (GFC)
Complexidade ciclom´
atica
1
V(G) = 5 regi˜
oes
2
V(G) = 14 - 11 + 2 = 5
3
V(G) = 4 + 1 = 5
Caminho
Execut´
avel
(1, 2, 3, 4, 8, 9, 11)
Sim
(1, 2, 3, 4, 8, 10, 11)
N˜
ao
(1, 2, 3, 4, 5, 7, 4, ...)
Sim
(1, 2, 3, 4, 5, 6, 7, 4, ...)
Sim
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Teste de comando
O crit´erio de teste de comando descreve que todos os comandos
do programa devem ser executados
Todos os n´
os do GFC ter˜ao sido visitados ao menos uma vez
Teste de comando
C
comando=
node comandos executados
node comandos do programa
Se C
comando= 1, o crit´
erio foi satisfeito
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Teste de comando - Exemplo
Elementos que devem ser testados segundo o crit´
erio ”Todos os comandos”
Tipo
Elemento
N´
os
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
Casos de teste necess´
arios para satisfazer o crit´
erio ”Todos os comandos”
Caminho
Comandos adicionados como executados
(1, 2, 3, 4, 8, 10, 11)
1, 2, 3, 4, 8, 10, 11
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Teste de decis˜
ao
O crit´erio de teste de decis˜ao do descreve que todas as decis˜
oes
do programa devem ser executadas
Todas as arestas do GFC ter˜ao sido visitadas ao menos uma vez
Teste de decis˜
ao
C
decisao=
node decisoes executadas
node decisoes do programa
Se C
decisao= 1, o crit´
erio foi satisfeito
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Teste de decis˜
ao
A cobertura de todos os comandos n˜ao garente a cobertura de
todas as decis˜
oes
Visitar todos os n´
os n˜ao significa que todas as arestas tenham
sido visitadas
Exerc´ıcio
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Teste de decis˜
ao
A cobertura de todos os comandos n˜ao garente a cobertura de
todas as decis˜
oes
Visitar todos os n´
os n˜ao significa que todas as arestas tenham
sido visitadas
Exerc´ıcio
Encontre um caminho no GFC em que todos os comandos sejam executados, mas
nem todas as decis˜
oes tenham sido executadas
Resposta:
Caminho
Ex. de aresta n˜
ao visitada
(1, 3, 4, 8, 10, 11)
(1 - 3)
(1, 2, 3, 4, 5, 6, 7, 4, 8, 9, 11)
(5 - 7)
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Teste de decis˜
ao - Exemplo
Elementos que devem ser testados segundo o crit´
erio ”Todas as decis˜
oes”
Tipo
Elemento
Aresta
(1,2); (1,3); (5,6); (5,7); (8,9) e (8,10)
Casos de teste necess´
arios para satisfazer o crit´
erio ”Todas as decis˜
oes”
Caminho
Arestas executadas
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Teste de decis˜
ao
A cobertura de todas as decis˜
oes garante a cobertura de todos os
comandos
Visitar todas as arestas significa que todas os n´
os tenham sido
visitados
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Teste de condi¸c˜
ao
A avalia¸c˜ao de uma decis˜ao pode n˜ao executar todas as
condi¸c˜oes relacionadas
Exemplo:
1 // Se c o n d i c a A f o r v e r d a d e i r a a c o n d i c a o B pode t e r q u a l q u e r v a l o r l ´o g i c o . . .
2 // mas a d e c i s ˜a o s e r ´a a v a l i a d a como v e r d a d e i r a
3 i f ( c o n d i c a o A | | c o n d i c a o B )
Exemplo:
1 // Se c o n d i c a o A f o r f a l s a a c o n d i c a o B pode t e r q u a l q u e r v a l o r l ´o g i c o . . .
2 // mas a d e c i s ˜a o s e r ´a a v a l i a d a como f a l s a
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Teste de condi¸c˜
ao
O crit´erio de teste de condi¸c˜ao do descreve que todas as
condi¸c˜oes do programa devem ser executadas
Teste de comando
C
condicao=
node valores verdade para todas as condicoes 2×node condicoes do programa
Se C
condicao= 1, o crit´
erio foi satisfeito
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Teste de condi¸c˜
ao
Diferentes formas de aplica¸c˜ao do crit´erio podem ser adotadas,
duas destas s˜ao:
teste de condi¸c˜ao b´asica
teste de condi¸c˜ao modificada e cobertura de decis˜ao (
Modified
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Teste de condi¸c˜
ao
O teste de condi¸c˜ao b´asica requer que cada condi¸c˜ao seja
avaliada uma vez com cada valor verdade
Express˜
ao
(A
||
B) && C
Caso de teste
A
B
C
Avalia¸c˜
ao
(1)
True
True
True
True
(2)
False
False
False
False
Casos de teste necess´arios para satisfazer o teste de condi¸c˜ao b´asica
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Teste de caminho
O crit´erio de teste de caminho do descreve que todos os
caminhos poss´ıveis do programa devem ser executados
Teste de caminho
C
caminho=
node caminhos executados
node caminhos do programa
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Teste de caminho
N´
umeros de caminhos de programas com la¸cos n˜ao ´e limitado
(pode ser muito grande ou indeterminado)
O crit´erio de teste de caminho pode n˜ao ser satisfeito
S˜ao criadas partici¸c˜oes de modo que apenas classes
representativas sejam testadas
ex. apenas a primeira itera¸c˜ao de um la¸co ´e exercitada
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Problemas
A satisfa¸c˜ao dos crit´erios estruturais pode ser n˜ao ocorrer devido
a dois problemas:
Ciclos (repeti¸c˜
oes)
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Problemas - Ciclos (repeti¸c˜
oes)
Se um grafo possui ciclos, existe uma infinidade de caminhos
poss´ıveis
cada itera¸c˜ao corresponde a um novo caminho poss´ıvel
pode existir uma quantidade muito grande de caminhos ou uma
quantidade infinita
Limitar a quantidade de itera¸c˜oes faz com que o crit´erio de
caminho possa ser satisfeito
A representa¸c˜ao do programa no GFC correponde ent˜ao a uma
´arvore
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Problemas - Caminhos n˜
ao alcan¸caveis
Em muitos casos n˜ao ´e poss´ıvel especificar um conjunto de teste
que seja capaz de exercitar um elemento (comando, decis˜ao,
condi¸c˜ao ou caminho)
Exemplo:
1 . . .
2 /∗ 1 ∗/ i f ( a< 0 ) {
3 /∗ 2 ∗/ a = 0 ; 4 /∗ 2 ∗/ }
5 /∗ 3 ∗/ i f ( a> 1 0 ) {
6 /∗ 4 ∗/ a = 1 0 ; 7 /∗ 4 ∗/ }
8 /∗ 5 ∗/ . . . 9 . . .
Verifica¸c˜
ao e Valida¸c˜
ao: Testes estruturais
Problemas - Caminhos n˜
ao alcan¸caveis
Em muitos casos n˜ao ´e poss´ıvel especificar um conjunto de teste
que seja capaz de exercitar um elemento (comando, decis˜ao,
condi¸c˜ao ou caminho)
Exemplo:
1 . . .
2 /∗ 1 ∗/ i f ( a< 0 ) {
3 /∗ 2 ∗/ a = 0 ; 4 /∗ 2 ∗/ }
5 /∗ 3 ∗/ i f ( a> 1 0 ) {
6 /∗ 4 ∗/ a = 1 0 ; 7 /∗ 4 ∗/ }
8 /∗ 5 ∗/
9 . . .
GFC com caminho n˜ao alcan¸cavel
Exerc´ıcio
1