Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Estas transparencias están basadas en las desarrolladas por Ammann & Offutt como acompañamiento de
su libro Introduction to Software Testing (2nd Edition)
ORIENTACIÓN A OBJETOS Y DISEÑOS
A
• Es el tipo de grafo más común para testear el diseño
estructural.
B C D
• Nodos: Unidades (en Java, métodos).
• Aristas: Llamadas a unidades.
E F
• Node coverage: Llamar a cada unidad al menos una vez
(cobertura de métodos).
Ejemplo de grafo
• Edge coverage: Ejecutar cada llamada al menos una vez
de llamadas
(cobertura de llamadas).
GRAFO DE LLAMADAS SOBRE CLASES
A Llamador
B (x)
Parámetro real
end A
interfaz
B (Y) Llamador
end B Parámetro
formal
INTER- PROCEDIMIENTO DE A PARES
Callee
G (a) print (a)
first-use
DU pair
b = 42
last-def
return (b)
EJEMPLO DE INTER- PROCEDIMIENTO DE A
PARES
10 B (int y)
1 x=5
11 Z = y 12 T=y
2 x=4
13 print (y)
3 x=3
Last Defs
4 B (x) 2, 3
First Uses
11, 12
DU Pairs
(A, x, 2)—(B, y, 11)
(A, x, 2)—(B, y, 12)
(A, x, 3)—(B, y, 11)
(A, x, 3)—(B, y, 12)
EJEMPLO - CUADRÁTICA
1 // Programa para calcular la raíz cuadrática para dos 25 ok = Root (X,Y, Z);
números 26 if (ok)
2 import java.lang.Math; 27 System.out.println
3 28 (“Quadratic: ” + Root1 + Root2);
4 class Quadratic 29 else
5{ 30 System.out.println (“No Solution.”);
6 private static float Root1, Root2; 31 }
7 32
8 public static void main (String[] argv) 33 // Tres enteros positivos, encuentra raíz cuadrática
9 { 34 private static boolean Root (int A, int B, int C)
10 int X,Y, Z; 35 {
11 boolean ok; 36 double D;
12 int controlFlag = Integer.parseInt (argv[0]); 37 boolean Result;
13 if (controlFlag == 1) 38 D = (double) (B*B) - (double) (4.0*A*C );
14 { 39 if (D < 0.0)
15 X = Integer.parseInt (argv[1]); 40 {
16 Y = Integer.parseInt (argv[2]); 41 Result = false;
17 Z = Integer.parseInt (argv[3]);
18 } 42 return (Result);
19 else 43 }
20 { 44 Root1 = (double) ((-B + Math.sqrt(D))/(2.0*A));
45 Root2 = (double) ((-B – Math.sqrt(D))/(2.0*A));
21 X = 10; 46 Result = true;
22 Y = 9; 47 return (Result);
23 Z = 12; 48 } // End method Root
24 } 49 } // End class Quadratic
1 // Programa para calcular la raíz cuadrática para dos números
2 import java.lang.Math;
3
4 class Quadratic
5{
6 private static float Root1, Root2; Variables
7 compartidas
8 public static void main (String[] argv)
9 {
10 int X, Y, Z;
11 boolean ok;
12 int controlFlag = Integer.parseInt (argv [0]);
13 if (controlFlag == 1)
14 {
15 X = Integer.parseInt (argv [1]);
last-defs 16 Y = Integer.parseInt (argv [2]);
17 Z = Integer.parseInt (argv [3]);
18 }
19 else
20 {
21 X = 10;
22 Y = 9;
23 Z = 12;
24 }
25 ok = Root (X, Y, Z);
first-use 26 if (ok)
27 System.out.println
28 (“Quadratic: ” + Root1 + Root2);
29 else
30 System.out.println (“No Solution.”);
31 }
32
33 // Tres enteros positivos, encuentra raíz cuadrática
34 private static boolean Root (int A, int B, int C)
first-use 35 {
36 double D;
37 boolean Result;
38 D = (double) (B*B) - (double) (4.0*A*C);
39 if (D < 0.0)
40 {
last-def 41 Result = false;
42 return (Result);
43 }
44 Root1 = (double) ((-B + Math.sqrt (D)) / (2.0*A));
last-defs 45 Root2 = (double) ((-B – Math.sqrt (D)) / (2.0*A));
46 Result = true;
47 return (Result);
48 } / /End method Root
49 } // End class Quadratic
CUADRATICA – ACOPLAMIENTO DE A PARES
• El control adicional y las conexiones de datos hacen que el análisis del flujo de
datos sea más complejo
• Las unidades de definición y uso pueden estar en diferentes jerarquías de
llamada
• Cuando se utilizan jerarquías de herencia, una definición en una unidad podría
alcanzar usos en cualquier clase de la jerarquía de herencia
• Con el enlace dinámico, la misma ubicación puede alcanzar diferentes usos
dependiendo del tipo actual del objeto usando.
• ¡La misma ubicación puede tener diferentes definiciones o usos en diferentes
puntos de la ejecución!
DEFINICIONES ADICIONALES
def
def last-def
A () A ()
use
Flujo de datos
B () first-use interprocedimentales
A () use B ()
Flujo de datos intra-
procedimiento total acoplada
(dentro de la misma unidad)
def
A() M () A() def
A()
M() A()
def use
A() B()
• Los gráficos de llamadas son formas comunes y muy útiles de diseñar pruebas
de integración
• El flujo de datos entre procedimientos es relativamente fácil de calcular y da
como resultado pruebas de integración efectivas
• Las ideas para el software OO y las aplicaciones web son preliminares y no se
han utilizado mucho en la práctica.