Você está na página 1de 4

Teste de Fluxo de Dados

Tcnicas de Teste Estrutural


Teste de Fluxo de Dados
Anlise de Mutantes

Gera casos de teste analisando o


comportamento das variveis do
programa.
Procura cobrir caminhos do grafo que
correspondam a diferentes
combinaes de estados e usos das
variveis.
Conceitos chave:
Definio de uma varivel
Uso de uma varivel

Teste de Fluxo de Dados


Um nodo n em G(P) um nodo
definio de uma varivel v em V se v
recebe um valor no comando
representado por n e denotamos esse
fato por def(v,n).
Um nodo n em G(P) um nodo uso de
uma varivel v em V se o valor de v
usado (referenciado) no comando
representado por n e denotamos esse
fato por use(v,n).

Teste de Fluxo de Dados


So nodos de definio:
Comandos de atribuio.
Comandos de entrada.
Parmetros por referncia que so
alterados no corpo da rotina.

So nodos de uso:
Comandos condicionais.
Comandos de sada.
Parmetros por valor ou parmetros por
referncia que no so alterados no corpo
da rotina.

Nodos hbridos:
i := i + 1;

Teste de fluxo de Dados


Classificao dos nodos uso:
Uso-P: um nodo uso n em relao a
uma varivel v um nodo uso-P (uso
em predicado) se o comando
correspondente a n uma condio (o
nodo origem de mais de uma aresta).
Uso-C: um nodo uso n em relao a
uma varivel v um nodo uso-C (uso
em computao) se o comando
correspondente a n no uma
condio (ou seja, se o nodo origem
de no mximo uma aresta).

Teste de Fluxo de Dados


O teste de fluxo de dados exige a
cobertura de caminhos que podem
no ser exigidos pelo teste de
fluxo de controle.
2
No exemplo ao lado, para
satisfazer cobertura de condio
basta cobrir os caminhos:
1,2,4,5,7 e 1,3,4,6,7
5
Se 2 for um nodo definio para v
e 6 um nodo uso para v, este
caminho no ser testado.

1
3
4
6
7

Teste de Fluxo de Dados


No teste de fluxo de controle
consideram-se apenas caminhos
completos (do nodo inicial ao final).
No teste de fluxo de dados os subcaminhos se tornam importantes.
Consideram-se os caminhos que
ligam um nodo definio a um nodo
uso.

Teste de Fluxo de Dados


Caminhos-d-u que no so caminhos
d-c so caminhos onde a varivel
inicializada duas vezes antes de ser
usada.
Nodos uso que no pertencem a
nenhum caminho-d-u correspondem a
variveis usadas sem terem sido
previamente inicializadas.

Teste de Fluxo de Dados


Tipos de sub-caminhos:
Caminho-d-u: (definition-use) em relao
a uma varivel v em um grafo de
programa G(P) um sub-caminho de G
tal que o nodo inicial m do caminho um
nodo definio de v e o nodo final n um
nodo uso de v (use(v,n)).
Caminho-d-c: (definition-clear) em
relao a uma varivel v em um grafo de
programa G(P) um caminho-d-u tal que
no existe outro nodo definio de v no
caminho alm do nodo inicial m.

Critrios de cobertura
Critrios de cobertura de fluxo de
dados:
Cobertura de todas as definies (alldefs): para cada nodo definio de
cada varivel de P, cobre-se pelo
menos um caminho-d-c para algum
nodo uso.

Nodos definio que no pertencem a


nenhum caminho-d-c correspondem a
variveis inicializadas mas no usadas.

Cobertura de todos os usos (all-uses):


para cada varivel v de P cobre-se pelo
menos um caminho-d-c de cada nodo
definio de v para cada nodo uso de v
e cada nodo sucessor deste nodo uso.

Critrios de cobertura

Critrios de cobertura

Cobertura de todos os usos-P (all-Puses): para cada varivel v de P cobrese pelo menos um caminho-d-c de cada
nodo definio de v para cada nodo
uso-P de v e cada nodo sucessor deste
nodo uso.

Cobertura de todos os usos-P/alguns


usos C (all-p-uses.some-C-uses): para
cada varivel v de P cobre-se pelo
menos um caminho-d-c de cada nodo
definio de v para cada nodo uso-P de
v ou para pelo menos um uso-C, caso v
no tenha nenhum uso-P.

Cobertura de todos usos-C (all-Cuses): para cada varivel v de P cobrese pelo menos um caminho-d-c de cada
nodo definio de v para cada nodo de
uso-C de v e cada nodo sucessor deste
nodo uso.

Critrios de cobertura

Critrios de cobertura

Cobertura de todos os usos-C/alguns


usos-P (all-C-uses.some-P-uses): para
cada varivel v de P cobre-se pelo
menos um caminho-d-c de cada nodo
definio de v para cada nodo uso-C de
v ou pelo menos um uso-P, caso v no
tenha nenhum uso-C.

Cobertura de todos os caminhos-d-u


(all-DU-paths): para cada varivel v de
P cobre-se todos os caminhos-d-c
acclicos ou que percorrem cada ciclo
no mximo uma vez, de cada nodo
definio de v para cada nodo uso de v
e cada nodo sucessor deste nodo uso.

Cobertura all-uses:

Exemplo
1.
2.

typedef struct { char num, code[ 20 ]; } node;


static node tab[] = {
{'0', "aeiouhywAEIOUHYW"},
{'1', "bpfvBPFV"},
{'2', "cskgjqxzCSKGJQXZ"},
{'3', "dtDT"},{'4', "lL"},
{'5', "mnMN"}, {'6', "rR"}};
3. char groupfor(char t){
4.
int i = 0;
5.
while(i < 7){
6.
if (strchr(tab[i].code,t))
7.
return tab[ i ].num;
8.
i++;
9.
}
10.
printf("Not found: %c\n",t);
11.
return '0';
12. }

Conjunto de variveis de P = {tab,t,i}


Nodos definio e uso:
varivel

definio

Uso

tab

6,7

6,10

4, 8

5,6,7,8

Cobertura all-defs:
Varivel

caminho

Hiptese do programador competente: a


maioria dos erros cometidos em programas
so relativos a detalhes (operador errado,
confuso com nome de variveis etc)
Hiptese do acoplamento: um conjunto de
casos de teste capaz de detectar erros
relativos a detalhes ser capaz de detectar
erros mais complexos.

caminho

tab

2-3-4-5-6

tab

2-3-4-5-6-8

tab

2-3-4-5-6-7

tab

2-3-4-5-6-7-12

3-4-5-6

3-4-5-6-7

3-4-5-6-8

3-4-5-10

3-4-5-10-11

4-5

4-5-6

4-5-10

4-5-6-7
4-5-6-8

tab

2-3-4-5-6

3-4-5-6

4-5-6-7-12

4-5

8-5

8-5

8-5-6

8-5-10

8-5-6-7

8-5-6-8

8-5-6-7-12

Anlise de Mutantes
Tambm conhecida como teste baseado
em erros.
uma forma de avaliar a qualidade de um
conjunto de casos de teste.
Baseia-se na anlise do cdigo fonte.
Hipteses:

Varivel

Anlise de Mutantes
Idia bsica:
a partir do programa original geram-se
programas com pequenas falhas e
criam-se casos de teste capaz de
detecta-las.
Para verificar se um teste detecta a
existncia de falhas introduzidas,
compara-se o comportamento do
mutante com o do programa original.

Anlise de mutantes

Anlise de Mutantes

Conceitos:

Processo de teste de mutao:

Mutante: dado um programa P, um


mutante de P um programa P
sintaticamente correto obtido a partir
de uma alterao no cdigo fonte
definida por um operador prestabelecido chamado operador de
mutao.
Morte de mutantes: Um teste T mata
um mutante P se o resultado da
execuo de P para T diferente do
resultado da execuo de P para T.

Iniciar com o programa P a ser testado e um


conjunto de testes T (possivelmente vazio);
Gerar um conjunto M de mutantes de P,
atravs de operadores de mutao
(pequenas alteraes sintaticamente
corretas) no programa original;
Verificar se os testes em T matam todos os
mutantes em M;
Se todos os mutantes foram mortos, o
conjunto T adequado, e o processo
encerrado.
Seno, acrescenta-se um teste para cada
mutante M sobrevivente, at que o conjunto
T seja adequado.

Anlise de Mutantes

Exemplo

Exemplos de operadores de mutao:


substituio de uma varivel por outra;
substituio de uma varivel escalar
por um vetor;
substituio de um vetor por uma
varivel escalar;
substituio de operador relacional;
substituio de operador aritmtico;
etc.

int max(int* input, int size){


int j, result;
result = 0;
for (j =1; j < size; j++) {
if (input[j] > input[result])
result = j;
}
return result;
teste
input[0]
}
}
1
1

input[1]

input[2]

size

Result.
Esp.

Exemplo
Conjunto inicial:

int max(int* input, int size){


int j, result;
#
result = 0;
1
for (j =1; j < size; j++) {
if (input[j] >= input[result]) 2
result = j;
3
}
return result;
}
Conjunto
}

input[0]

input[1]

input[2]

size

Result.

esperado

Result.

obtido

que mata o mutante:

input[0]

input[1]

input[2]

size

Result.

esperado

Result.

obtido