You are on page 1of 27

Teste estrutural

Teste funcional

Usa como entrada a especificao funcional.


Procura verificar se todas as funcionalidades previstas
foram implementadas e se respondem como esperado.
Incapaz de verificar funcionalidades ou comportamentos
extras no especificados.

Teste estrutural

Usa como ponto de entrada o cdigo fonte.


Mais propenso a automao.
Procura exercitar o maior nmero possvel de
possibilidades de execuo do programa, de acordo com
algum critrio pr-definido
No teste estrutural a especificao funcional usada
apenas como orculo.

Teste estrutural
Grafo de programa:
Grafo dirigido onde os nodos representam comandos e os arcos
representam o fluxo de execuo
Existe um arco de um nodo i para um nodo j se e somente se j pode
ser executado imediatamente aps i
Quais comandos representar?
Dependente do paradigma e da linguagem
Normalmente no se representam as declaraes de variveis porque no
correspondem a comandos executveis.

Todo grafo de programa tem um nico nodo inicial e um nodo final


Para tornar o grafo fortemente conexo temos de acrescentar uma
aresta conectando o nodo final ao inicial.

Teste estrutural

1.
2.
3.
4.
5.
6.
7.
8.

a = Convert.ToInt32(args[0]);
b = Convert.ToInt32 (args[1]);
while (this.F1(a)){
if (this.F2(b)){
a = b + 1;
}else b = a + 1;
}
c = a + b;

4
5

6
7

Teste estrutural
Anlise dinmica
Execuo monitorada do programa
Pode exigir instrumentao de cdigo
Abordagens:
Anlise de cobertura
Teste de fluxo de controle
Teste de fluxo de dados
Anlise de mutantes

Teste estrutural
Anlise dinmica:
Anlise de cobertura
Dado um conjunto de execues do programa, quanto do cdigo fonte foi
exercitado (coberto)?

Gerao de casos de teste


Cria-se os casos de teste com o objetivo de atingir um determinado valor
de cobertura
Mtricas:
Fluxo de controle
Fluxo de dados

Grafo de programa:
Define uma relao entre o caso de teste e a parte do programa
exercitada por ele.
Um caso de teste:
Corresponde a um caminho no grafo.
Corresponde a uma execuo completa: do nodo inicial at o final.

Fluxo de controle
Cada caso de teste corresponde a um caminho
no grafo.
Etapas:
Construir o grafo de programa.
Determinar os caminhos factveis.
Selecionar um conjunto de caminhos factveis
para teste.
Gerar as entradas e os resultados esperados para
os casos de teste correspondentes.

Fluxo de controle
1.
2.
3.
4.
5.
6.
7.
8.

9.
10.
11.
12.
13.
14.

public Triangulo(string args[ ]){


int a,b,c;
string resp = null;
a = Convert.ToInt32(args[0]);
b = Convert.ToInt32 (args[1]);
c = Convert.ToInt32 (args[2]);
if ((a==b)&&(b==c))
resp = equilatero;
if (((a==b)&&(b!=c))||((b==c)&&(a!=b))||((a==c)&&(c!=b))
resp = isoceles;
if ((a!=b)&&(b!=c))
resp = escaleno;
Console.WriteLine(Tipo de triangulo:+resp);
}

Caminhos possveis:

4-5-6-7-9-11-13

4-5-6-7-8-9-11-13

4-5-6-7-9-10-11-13

4-5-6-7-8-9-10-11-13

4-5-6-7-9-11-12-13

4-5-6-7-8-9-11-12-13

4-5-6-7-9-10-11-12-13

4-5-6-7-8-9-10-11-12-13

4
5
6
7

8
9
10
11
11
13

Fluxo de controle
Existem caminhos factveis.
Ex: caminhos 1,2,3 e 5.

Existem caminhos no factveis.


Ex: caminhos 4,6,7 e 8.

A existncia de caminhos no factveis indica


que talvez a lgica pudesse ser escrita de
outra maneira.

Fluxo de controle
Objetivos do teste de fluxo de controle:
Exercitar um mnimo aceitvel de caminhos factveis.
O que determina o que um mnimo aceitvel so
as mtricas de cobertura:

Cobertura de comando
Cobertura de deciso
Cobertura de condio
Cobertura de condio/deciso
Cobertura de condio mltipla (variante: MC/DC)
Cobertura de repetio

Cobertura de comando
Definir casos de teste que executem todos os
comandos pelo menos uma vez (passa por todos
os nodos do grafo).
Mtrica: percentual de nodos cobertos.
Fcil de satisfazer:
Para o problema do tringulo bastam 3 casos de teste
(caminhos 2,3 e 5)

No garante muita coisa:


No testa o caso em que a entrada no um tringulo
No detectaria o seguinte bug:
If (((a==b)&&(b!=c))||((b==c)&&(a!=b))&&((a==c)&&(c!-b)) ...

Cobertura de comando

1. a = Convert.ToInt32 (args[0]);
2. b = Convert.ToInt32t(args[1]);
3. while(a < 0){
4.
if (b < 0){
5.
b = b + 2;
}
7.
a = a + 1;
8. }
9. c = a + b;

-1

-1

3
4

Cobertura de deciso
Os testes devem cobrir cada sada possvel de
um nodo que tenha uma condio.
Mtrica: percentual de arcos cobertos.
Cobertura de deciso implica em cobertura de
comando, mas o inverso nem sempre
verdade.

Cobertura de deciso
1. a = Convert.ToInt32 (args[0]);
2. b = Convert.ToInt32t(args[1]);
3. while(a < 0){
4.
if (b < 0){
5.
b = b + 2;
}
7.
a = a + 1;
8. }
a
b
9. c = a + b;

-1

-1

-2

-1

3
4

Cobertura de condio
Para cada condio deve-se cobrir os dois
resultados possveis.
Ex: if ((A>0) or (B<10)) ...
Exemplos de casos de teste:
A = 3 e B = 20 (A verdade e B Falso)
A = 0 e B = 5 (A falso e B verdade)

Cobertura de condio/deciso:
Combinao de CC e CD
Teste de Software Prof. Bernardo
Copstein PUCRS, FACIN

Cobertura de condio mltipla


Necessidade de verificar melhor os nodos que
tem condies mltiplas.
Cria-se uma tabela verdade para cada nodo
desses e gera-se um caso de teste para cada
entrada da tabela.
Resulta em diferentes entradas para alguns
caminhos que vo se repetir.

Condio/deciso modificada (MC/DC):


elimina combinaes redundantes

Cobertura de cond. multipla


1. a = Convert.ToInt32 (args[0]);
2. b = Convert.ToInt32t(args[1]);
3. while((a < 0) || (b < 0)){
4.
if (b < 0){
5.
b = b + 2;
}
7.
a = a + 1;
a
b
8. }
9. c = a + b;
-1 (V)

1 (F)

0 (F)

1 (F)

-1 (V)

-3 (V)

0 (F)

-3 (V)

3
4

Cobertura de repetio
Gerar casos de teste de maneira que cada
repetio seja exercitada pelo menos k vezes.
Deve ser usada em combinao com a
cobertura de condio.
Pode-se aplicar tcnicas de valor limite nos
laos.

Teste de Fluxo de Dados


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 nodo onde a varivel
recebe um valor (ex. atribuio)
Uso de uma varivel nodo onde a varivel
referenciada (ex. Expresso)

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.
No exemplo ao lado, para satisfazer cobertura de
condio basta cobrir os caminhos: 1,2,4,5,7 e
1,3,4,6,7
Se 2 for um nodo definio para v e 6 um nodo
uso para v, este caminho no ser testado.
No teste de fluxo de controle consideram-se
apenas caminhos completos (do nodo inicial ao
final). No teste de fluxo de dados os sub-caminhos
se tornam importantes.
Consideram-se os caminhos que ligam um nodo
definio a um nodo uso.

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.

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.
Nodos definio que no pertencem a nenhum
caminho-d-c correspondem a variveis
inicializadas mas no usadas.

Teste de Fluxo de Dados


Critrios de cobertura de fluxo de dados:
Cobertura de todas as definies (all-defs):
para cada nodo definio de cada varivel de P,
cobre-se pelo menos um caminho-d-c para
algum nodo uso.
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.

Cobertura de Fluxo de Dados


1. class Tabela {
2.
class Node{
public int Num { get; set; }
public string Code { get; set; }
}
3.
public int GroupFor(char t) {
4.
int i = 0;
5.
while (i < Count) {
6.
if (items[i].Code.Contains(t)){
7.
return items[i].num;}
8.
i++;
9.
}
10.
return -1;
11. }
12. }

Cobertura de Fluxo de Dados


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

Nodos definio e uso:


varivel

definio

Uso

items

6,7

Cobertura all-uses:
Varivel

caminho

3-4-5-6

3-4-5-6-7

3-4-5-6-8

3-4-5-6-7-11

4-5

Cobertura all-defs:

4-5-6

Varivel

caminho

4-5-6-7

4-5-6-8

3-4-5-6
i

4-5-6-7-11

4-5
i

8-5

8-5

8-5-6

8-5-6-7

8-5-6-8

8-5-6-7-11

4, 8

5,6,7,8

Anlise de mutantes
Avalia a capacidade de relevar defeitos de um
conjunto de casos de teste (no gera casos de
teste).
Consiste em produzir cpias do cdigo a ser
testado, injetando pequenas falhas nas cpias
(chamadas mutantes).
Uma suite de teste elimina (kill) um mutante
se consegue distinguir o comportamento do
mutante do comportamento do cdigo
original

Anlise de mutantes
1. a = Convert.ToInt32 (args[0]);

1. a = Convert.ToInt32 (args[0]);

2. b = Convert.ToInt32t(args[1]);
3. while(a < 0){
4. if (b < 0){
b = b + 2;
}
5.
a = a + 1;
8. }
9. c = a + b;

2. b = Convert.ToInt32t(args[1]);
3. while(a < 0){
4. if (b < 0){
b = b - 2;
}
5.
a = a + 1;
8. }
9. c = a + b;

C
(resultado)

-1

-1

-1

Este elimina o mutante

Anlise de mutantes
Operadores de mutao:

Troca de operador (aritmtico, relacional etc.)


Troca de variveis
Troca de tipo de variveis
Etc. (depende da linguagem)

Cada operador gera um mutante


No vale mutantes que no compilam (j nascem
mortos
Ex. Proteum

You might also like