Professional Documents
Culture Documents
Información
Pruebas del Software
1
3.01.3 Método ASTOOT ................................................................. 21
3.01.4 Obtención automática de especificaciones algebraicas....... 24
3.02 Pruebas a partir de modelos ....................................................... 25
3.02.1 Diagramas de clases UML ................................................... 25
3.02.2 Criterios de cobertura de pruebas para diseños UML.......... 28
3.02.3 Diagramas de estados ......................................................... 29
3.02.4 En otros diagramas .............................................................. 29
3.03 Pruebas de componentes ........................................................... 31
3.03.1 Uso de BIT wrappers ........................................................... 31
3.03.2 Mutación de interfaces ......................................................... 33
4. Resultados experimentales ................................................................ 34
5. Referencias ........................................................................................ 36
2
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
1. INTRODUCCIÓN
La fase de pruebas es una de las más costosas del ciclo de vida software.
En sentido estricto, deben realizarse pruebas de todos los artefactos generados
durante la construcción de un producto, lo que incluye especificaciones de re-
quisitos, casos de uso, diagramas de diversos tipos y, por supuesto, el código
fuente y el resto de productos que forman parte de la aplicación (p.ej., la base
de datos). Obviamente, se aplican diferentes técnicas de prueba a cada tipo de
producto software.
3
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
Pruebas de
Requisitos
aceptación
Diseño de Pruebas de
alto nivel sistema
Diseño de Pruebas de
bajo nivel integración
Pruebas
Código
unitarias
Figura 1. Modelo en V
4
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
Las actividades que proponen (Bashir and Goel 2000) para este tipo de
pruebas se muestran en la Figura 2.
5
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
Particionar
requisitos
Seleccionar
siguiente conjunto
de requisitos
Revisar
diagramas
Construir
prototipo
6
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
7
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
- Encontrar fragmentos del programa que no son ejecutados por los ca-
sos de prueba.
- Crear casos de prueba adicionales que incrementen la cobertura.
- Determinar un valor cuantitativo de la cobertura (que es, de manera
indirecta, una medida de la calidad del programa).
Adicionalmente, el análisis de cobertura también permite la identificación de
casos de prueba redundantes, que no incrementan la cobertura.
8
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
9
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
grama han sido llamadas, mientras que la cobertura de llamadas cuenta cuán-
tas de las llamadas a funciones que hay en el programa se han ejecutado.
Un mutante que produce que produce la misma salida que el programa ori-
ginal se dice que está vivo, y muerto si su salida es diferente. Cuantos más mu-
10
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
11
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
Ejecutar T sobre
Definir umbral cada mutante
vivo
No
Eliminar los
¿Se alcanzó casos de prueba
Corregir P
el umbral? ineficientes
Sí
No
¿P(T) es
correcta?
Sí
Fin
Operador Descripción
ABS Sustituir una variable por el valor absoluto de dicha variable
ACR Sustituir una referencia variable a un array por una constante
AOR Sustitución de un operador aritmético
CRP Sustitución del valor de una constante
ROR Sustitución de un operador relacional
RSR Sustitución de la instrucción Return
SDL Eliminación de una sentencia
UOI Inserción de operador unario (p.ej.: en lugar de x, poner –x)
Tabla 2. Algunos operadores de mutación clásicos
12
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
Operador Descripción
AMC (Access Modifier Reemplazo del modificador de acceso (por ejemplo: ponemos private
Change) en lugar de public)
AOC (Argument Order Cambio del orden de los argumentos pasados en la llamada a un mé-
Change) todo (p.ej.: en lugar de Persona p=new Persona(“Paco”, “Pil”) poner
Persona p=new Persona(“Pil”, “Paco”)
CRT (Compatible Ref- Sustituir una referencia a una instancia de una clase por una referen-
erence Type Replace- cia a una instancia de una clase compatible (p.ej.: en vez de poner
ment) Persona p=new Empleado(), poner Persona p=new Estudiante()).
EHC (Exception Han- Cambiar una instrucción de manejo de excepciones (try...catch) por un
dling Change) sentencia que propague la excepción (throw), y viceversa
EHR (Exception Eliminación de una instrucción de manejo de excepciones
Handgling Removal)
HFA (Hiding Field vari- Añadir en la subclase una variable con el mismo nombre que una
able Addition) variable de su superclase
MIR (Method Invoca- Reemplazar una llamada a un método por una llamada a otra versión
tion Replacement) del mismo método
OMR (Overriding Eliminar en la subclase la redefinición de un método definido en una
Method Removal) superclase
POC (Parameter Order Cambiar el orden de los parámetros en la declaración de un método
Change) (p.ej.: poner Persona(String apellidos, String nombre) en vez de Per-
sona(String nombre, String apellidos)
SMC (Static Modifier Añadir o eliminar el modificador static
Change)
Tabla 3. Algunos operadores de mutación para orientación a objetos
Los operadores de mutación deben ser aplicados según el contexto del lu-
gar del código fuente en el que se vaya a realizar la mutación. Si esto no se
hiciera así, podrían generarse multitud de mutantes funcionalmente equivalen-
tes al programa original, otros que ni siquiera compilarían, etc.
13
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
14
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
15
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
16
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
1. Crear CDGPaths
2. Crear e inicializar Scoreboard
3. Generar CurPopulation
4. while haya requisitos de prueba no marcados and se está en tiempo
5. seleccionar un requisito de prueba r del conjunto TestReq
6. while r no esté marcado and no se supere el máximo de intentos
7. calcular el fitness de de CurPopulation usando CDGPaths
8. ordenar CurPopulation según su fitness
9. seleccionar los padres para crear la NewPopulation
10. generar NewPopulation
11. ejecutar el programa con cada elemento de NewPopulation
12. actualizar Scoreboard y marcar aquellos requisitos que se hayan satisfecho
13. endwhile
14. endwhile
15. final = conjunto de casos de prueba que satisfacen TestReq
16. devolver (TestReq, final)
17
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
métodos públicos de una clase pueden ser invocados. De acuerdo con estos
autores, una de las aplicaciones de las secuencias es la prueba de clases a
partir de su especificación como una máquina de estados.
m3
m3 s3
m1 m2
s0 s1 s2 m4 m3
m4
s4
m4
18
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
La Figura 7 muestra las dos capas de una clase Account, que podría repre-
sentar una cuenta bancaria, con un determinado lenguaje de especificación
(aunque lo cierto es que existen muchos más para representar lo mismo, como
se verá más adelante en, por ejemplo, la Figura 9).
Capa funcional de una clase Capa de objeto de la misma clase
module ACCOUNT is class Account is
including MONEY . based on sort AccountSort .
sort AccountSort .
invariant {balance(self) >= - creditLimit} .
var X : AccountSort .
var M : Money . constructor Account()
var N : Money . ensure {balance(result) == balance(empty)} .
19
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
20
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
Puesto que el valor de creditLimit es –1000, los estados concretos son los
siguientes (nótese la adición de un estado inicial adicional, en el que el objeto
se encuentra antes de ser creado; igualmente podrían crearse estados finales
si la clase tuviera destructores):
S0= { no creado }; S1= { b==1000 }; S2= { -1000<b<0}; S3= { b==0}; S4={ b>0}
Obtenidos los estados, se genera el conjunto de transiciones, formadas por
una llamada a un método y una posible condición de guarda, obtenida de las
precondiciones del método. De este modo, del anterior conjunto de estados y
del ejemplo de la Figura 7 se obtiene la máquina de estados mostrada en la
Figura 8.
t0= Account()
t1= credit(m) {0 < m < 1000}
t2= credit(m) {m == 1000}
t3= credit(m) {1000 < m}
t4 = credit(m) {0 < m < 1000 and b + m == 0}
t5 = credit(m)
{(0 < m < 1000 and 0 < b + m) or 1000 = m}
t6 = credit(m) {0 < m < 1000 and -1000 < b + m < 0}
t7 = credit(m) {0 < m}
t8 = credit(m) {0 < m}
t9 = debit(m) {1000 < m and b - m == -1000}
t10 = debit(m) {0 < m and -1000 < b - m < 0}
t11 = debit(m) {0 < m and b - m == 0}
t12 = debit(m) {0 < m and 0 < b - m}
t13 = debit(m) {0 < m < 1000}
t14 = debit(m) {m == 1000}
t15 = debit(m)
{(200 £ m < 990 and b - m == -990) or
(0 < m < 200 and b - 1.05 * m == -1000)}
t16 = debit(m)
{(200 =m < 990 and -990 < b - m < 10) or
(0 < m < 200 and -1000 < b - 1.05 * m < 0)}
t17 = findBalance()
t18 = findBalance()
t19 = findBalance()
t20 = findBalance()
21
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
22
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
23
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
24
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
Muchos de los axiomas generados son redundantes, por lo que con poste-
rioridad se detectan y se eliminan aplicando reglas de reescritura, para lo que
primero deben identificarse éstas de entre el conjunto de axiomas. Se conside-
ra que un axioma es una regla de reescritura si: (1) el lado izquierdo y el dere-
cho tienen diferente longitud; y (2) las variables libres que aparecen en lado
más corto son un subconjunto de las variables libres que aparecen en el lado
derecho.
3.02 Pruebas a partir de modelos
25
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
cial porque tal vez no llegue físicamente a producirse en la ejecución del siste-
ma].
Interacción entre objetos (interacción real): siendo A, B dos clases, ocu-
rre si y sólo si (1) A Ri B y B Ri A, siendo i distinto de j, y (2) Ri y Rj son relacio-
nes transitivas reales. [La interacción es real porque se produce la interacción
entre ambos objetos en la ejecución del sistema obtenido del diseño].
El criterio de prueba propuesto es el siguiente: para cada interacción entre
clases, o bien se obtiene un caso que prueba la interacción entre objetos, o
bien se obtiene un informe mostrando que tal interacción no es factible.
Puesto que la tarea de producir casos de prueba o informes es imposible si
el número de interacciones es muy alto, es preciso obtener diseños que dismi-
nuyan el número de interacciones, de modo que se haga factible así la prueba
completa del diseño de clases.
Antes de someterlo al criterio de pruebas, el diseño de clases debe ser eva-
luado para conocer el número de interacciones entre clases, modificándolo si
es muy alto y tal mejora es posible, o rechazándolo directamente en otro caso.
La mejora del diseño puede lograrse reduciendo el acoplamiento o anotándolo
con restricciones que eviten la codificación de interacciones entre objetos pro-
pensas a error. Los autores proponen la anotación utilizando los estereotipos
<<create>> (para indicar que la clase A crea instancias de la clase B),
<<use_consult>> (para indicar que la clase A sólo utiliza métodos tipo get de B)
y <<use_def>> (para indicar que la clase A modifica el estado de las instancias
de B). Estos estereotipos se utilizan en el proceso de construcción del Grafo de
Dependencias de Clases (en inglés Class Dependency Graph, o CDG), que
representa las relaciones transitivas entre clases junto a las relaciones de
herencia e implementación. La siguiente figura muestra algunos ejemplos sobre
la obtención del CDG, en la que aparecen algunas etiquetas añadidas a los
nodos del CDG para representar el tipo de relación existente.
26
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
Figura 12. Algunos ejemplos de obtención del CDG, tomada de (Baudry, Traon et al.
2002)
27
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
28
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
29
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
30
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
31
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
del componente, se ejecutan las operaciones de éste a través del BIT wrapper,
que posee funcionalidades como la comprobación de las precondiciones de la
operación antes de llamar a la operación real, y la comprobación de las post-
condiciones tras su ejecución. Además, el BIT wrapper puede mantenerse para
que capture las llamadas que los clientes hacen a las operaciones del compo-
nente (Figura 14).
Figura 14. Ubicación del BIT wrapper alrededor del componente. Figura tomada de
(Edwards 2001)
32
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
33
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
Interfaz
Cliente Servidor
mutada
4. RESULTADOS EXPERIMENTALES
(Juristo, Moreno et al. 2002) han analizado los resultados experimentales
de diferentes técnicas de prueba extraídas de la literatura, de acuerdo con la
siguiente clasificación:
- Familia de técnicas aleatorias, en las que los casos de prueba son
generados aleatoriamente, sin seguir ninguna pauta preestablecida.
- Familia de técnicas funcionales, que utilizan la especificación del
programa para generar casos de prueba de caja negra.
- Familia de técnicas de flujo de control, que requieren el conoci-
miento del código fuente para seleccionar una serie de caminos a lo
largo del programa, de modo que se ejecute su modelo de control.
34
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
35
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
que les llevará más tiempo. Por el contrario, si se está trabajando con sujetos
sin experiencia y no se tiene tiempo, es mejor usar cobertura de sentencias”.
Otras conclusiones son que “es preferible usar análisis de valores límite frente
a cobertura de condición”. Todas estas conclusiones se encuentran a nivel 2.
De manera general, las autoras destacan la ubicación en nivel 2 de la ma-
yoría de las técnicas, lo que indica que hay aún mucha investigación que reali-
zar.
5. REFERENCIAS
Andrews, A., R. France, et al. (2003). "Test adequacy criteria for UML design
models." Software Testing, Verification and Reliability(13): 95-127.
Basanieri, F., A. Bertolino, et al. (2002). The Cow_Suite Approach to Planning
and Deriving Test Suites in UML Projects. 5th International Conference
on The Unified Modeling Language, Springer-Verlag. LNCS.
Bashir, I. and A. L. Goel (2000). Testing Object-Oriented Software. Life Cycle
Solutions. New-York, Springer-Verlag.
Baudry, B., Y. L. Traon, et al. (2002). Testability Analysis of a UML Class Dia-
gram. 8th IEEE Symposium on Software Metrics.
Burton, S., J. Clark, et al. (2001). Automatic generation of tests from statecharts
specifications. Formal Approaches to Testing of Software, Aalborg,
Denmark, BRICS.
Cornett, S. (2002). Code Coverage Analysis.
Díaz, E., J. Tuya, et al. (2003). Pruebas automáticas de cobertura de software
mediante una herramienta basada en Búsqueda Tabú. VIII Jornadas de
Ingeniería del Software y Bases de Datos, Alicante, Spain.
Doong, R. K. and P. G. Frankl (1994). "The ASTOOT approach to testing ob-
ject-oriented programs." ACM Transactions on Software Engineering and
Methodology 3(2): 101-130.
Edwards, S. H. (2001). "A framework for practical, automated black-box testing
of component-based software." Software Testing, Verification and Reli-
ability(11): 97-111.
Edwards, S. H. (2001). "A framework for practiucal, automated black-box testing
of component-based software." Software Testing, Verification and Reli-
ability(11): 97-111.
Fox, C. (1998). Java Code Inspection Checklist.
Ghosh, S. and A. P. Mathur (2001). "Interface mutation." Software Testing, Veri-
fication and Reliability(11): 227-247.
Henkel, J. and A. Diwan (2003). Discovering Algebraic Specifications from Java
Classes. 17th European Conference on Object-Oriented Programming
(ECOOP), Springer.
Hong, H. S., I. Lee, et al. (2001). Automatic test generation from statecharts
using model checking. Formal Approaches to Testing of Software, Aal-
borg, Denmark, BRICS.
36
Mantenimiento Avanzado de Sistemas de Información – Pruebas del software
37