Documentos de Académico
Documentos de Profesional
Documentos de Cultura
23 PRUEBAS ORIENTADAS
A OBJETOS
E
L objetivo de las pruebas, expresado de forma sencilla, es encontrar el mayor número
posible de errores con una cantidad razonable de esfuerzo, aplicado sobre un lapso de
tiempo realista. A pesar de que este objetivo fundamental permanece inalterado para el
software orientado a objetos, la naturaleza de los programas O 0 cambian las estrategias y las
tácticas de prueba.
Puede argumentarse que, conforme el A 0 0 y el DO0 maduran, una mayor reutilización de
patrones de diseño mitigarán la necesidad de pruebas intensivas en los sistemas OO. La verdad
es justo lo contrario. Binder [BIN94b] lo analiza, cuando afirma que:
Cada reutilización es un nuevo contexto de uso y es prudente repetir las pruebas. Parece probable que
se necesitarán menos pruebas para obtener una alta fiabilidad en sistemas orientados a objetos.
La prueba de los sistemas O 0 presentan un nuevo conjunto de retos al ingeniero del soft-
ware. La definición de pruebas debe ser ampliada para incluir técnicas que descubran errores
(revisiones técnicas formales), aplicadas para los modelos de A 0 0 y DOO. La integridad, com-
pleción y consistencia de las representaciones O 0 deben ser evaluadas conforme se constru-
yen. Las pruebas de unidad pierden mucho de su significado, y las estrategias de integración
cambian de modo significativo. En resumen, las estrategias y tácticas de prueba deben tomar-
se en cuenta para las características propias del software OO.
407
INGENlERfA DEL SOFTWARE. UN ENFOQUE PRACTICO
La construcción del software orientado a objetos 3. El comportamiento del sistema o sus clases pueden
comienza con la creación de los modelos de análisis caracterizarse inadecuadamente, para alojar el atri-
y diseño (Capítulos 21 y 22). Debido a la naturaleza buto irrelevante.
evolutiva del paradigma de ingeniería de software 00,
estos modelos comienzan como representaciones, rela- Si el error no se descubre durante el análisis y se pro-
tivamente informales, de los requisitos del sistema, y paga más allá, los siguientes problemas pueden ocurrir
evolucionan en modelos detallados de clases, cone- (y tendrán que evitarse con una nueva revisión) duran-
xiones y relaciones de clases, el diseño del sistema y te el diseño:
el diseño de objetos (incorporando un modelo de 1. La localización impropia de la clase a un subsistema
conectividad de objetos por medio de mensajes). En y/o tareas puede ocurrir durante el diseño del sis-
cada etapa, los modelos pueden probarse, en un inten- tema.
to de descubrir errores, antes de su propagación a la
siguiente iteración. 2. El trabajo del diseño innecesario tendrá que ser recu-
perado, para crear el diseño procedimental, para las
operaciones que afecten al atributo innecesario.
3. El modelo de mensajes (mensajería) será incorrecto
(debido a que deben diseñarse mensajes para las ope-
raciones innecesarias).
,
Si el error permanece sin detectarse durante el diseño
y pasa a la actividad de codificación, se gastará un
esfuerzo considerable para generar el código que imple-
menta un atributo innecesario, dos operaciones innece-
Puede argumentarse que la revisión de los mode- sarias, mensajes que controlan comunicaciones entre
los de análisis y diseño O 0 son especialmente útiles, objetos, y muchos otros aspectos relacionados. Además,
ya que las mismas estructuras semánticas (por ejem- la prueba de la clase absorberá más tiempo del necesa-
plo, clases, atributos, operaciones, mensajes), apare- rio. Una vez que se encuentra el problema en su totali-
cen en los niveles de análisis, diseño y codificación. dad, debe llevarse a cabo la modificación del sistema,
Por consiguiente, un problema en la definición de los teniendo siempre presentes los posibles efectos colate-
atributos de las clases que se descubren durante el rales producidos por el cambio.
análisis evitará efectos laterales que pueden ocurrir
si el problema no se descubriera hasta el diseño o
implementación (o incluso la siguiente iteración del
análisis).
Por ejemplo, considérese una clase en la que el núme- Existe un viejo dicho que dice ((cortar por lo sono)).
ro de atributos se definen durante la primera iteración Si pierde tiempo revisando los modelos de A00
del AOO. Un atributo externo (extraño), se agrega a la y 000, después lo gonorá.
clase (debido al malentendido del dominio de proble-
ma). Se especifican dos operaciones para manipular el
atributo. Se realiza una revisión y un experto en el domi- Durante las etapas finales de su desarrollo, los mode-
nio señala el error. Eliminando el atributo irrelevante los de A 0 0 y de D O 0 proporcionan información subs-
en esta etapa, los problemas y esfuerzos innecesarios se tancial acerca de la estructura y comportamiento del
evitan durante el análisis: sistema. Por esta razón, estos modelos deben estar some-
tidos a una revisión rigurosa, antes de la generación de
1. Pueden haberse generado subclases especiales para código.
adoptar (alojar) el atributo innecesario o excepcio- Todos los modelos orientados a objetos deben ser
nes a él. El trabajo involucrado en la creación de sub- probados (en este contexto, el término «prueba» se uti-
clases no necesarias se ha evitado. liza para incorporar revisiones técnicas formales), para
2. Una mala interpretación de la definición de la clase asegurar la exactitud, compleción y consistencia
puede conducir a relaciones de clases incorrectas o [MGR94], dentro del contexto de la sintaxis, semánti-
irrelevantes. ca y pragmática del modelo [LIN94].
408
CAPfTULO 23 PRUEBAS ORIENTADAS A OBIETOS
Los modelos de análisis y diseño no pueden probarse en gráfica de las conexiones entre clases. Toda esta infor-
el sentido convencional, ya que no pueden ejecutarse. Sin mación se puede obtener del modelo de A 0 0 (Capítu-
embargo, se pueden utilizar las revisiones técnicas for- lo 21).
males (Capítulo 8) para examinar la exactitud y consis-
tencia de ambos modelos de análisis y diseño.
409
INGENlERíA DEL SOFTWARE. U N ENFOQUE PRACTICO
I 11 Vendedor
Modelos de DO0
FIGURA 23.1. Un ejemplo de tarjeta índice CRC usada para El diseño de sistema se revisa examinando el mode-
revisión. lo objeto-comportamientodesarrollado durante el AOO,
y la correspondencia necesaria del comportamiento del
4. Utilizando las conexiones invertidas, ya examina- sistema, frente a los subsistemas diseñados para lograr
das en el paso 3, determinar si otras clases se requie- este comportamiento.
ren y si las responsabilidades se han repartido La concurrencia y asignación de tareas también se
adecuadamente entre las clases. revisan dentro del contexto del comportamiento del sis-
tema. Los estados de comportamiento del sistema se eva-
5. Determine si las responsabilidades muy solicita- lúan para determinar cuáles existen concurrentemente.
das, deben combinarse en una sola responsabili- Los escenarios o situaciones de los casos de uso se uti-
dad. Por ejemplo, leer tarjeta de crédito y obtener lizan para validar el diseño de la interfaz de usuario.
autorización ocurren en cada situación. Por consi- El modelado de objetos debe probarse frente a la red
guiente, se pueden combinar en la responsabilidad objeto-relación, para asegurarse de que todos los obje-
validar petición de crédito, que incorpora obtener tos de diseño contienen los atributos y operaciones nece-
el número de tarjeta de crédito, y conseguir la auto- sarias y para implementar las colaboraciones que se
rización. definieron para cada tarjeta CRC. Además, la especifi-
6. Se aplican iterativamente los pasos 1 a 5 para cada cación detallada de las operaciones (por ejemplo, los
clase, y durante cada evolución del modelo de algoritmos que implementan a las operaciones), se revi-
AOO. san usando técnicas de inspección convencionales.
2 1 . .
La estrategia clásica para la prueba de software de orde- último, el sistema se comprueba como un todo para ase-
nador, comienza con «probar lo pequeño» y funciona gurarse de que se descubren los errores en requisitos.
hacia fuera haciendo «probar lo grande». Siguiendo la
jerga de la prueba de software (Capítulo 1 S), se comien-
za con las pruebas de unidad, después se progresa hacia
las pruebas de integración y se culmina con las pruebas
de validación del sistema. En aplicaciones convencio-
nales, las pruebas de unidad se centran en las unidades
de programa compilables más pequeñas -1 subpro-
grama (por ejemplo, módulo, subrutina, procedimiento,
23.3.1. Las pruebas de unidad en el contexto
componente)-. Una vez que cada una de estas unida-
des han sido probadas individualmente, se integran en de la O0
una estructura de programa, mientras que se ejecutan Cuando se considera el software orientado a objetos, el
una serie de pruebas de regresión para descubrir errores, concepto de unidad cambia. La encapsulación conduce
debidos a las interfaces entre los módulos y los efectos a la definición de clases y objetos. Esto significa que
colaterales producidos por añadir nuevas unidades. Por cada clase y cada instancia de una clase (objeto), envuel-
410
CAP1TULO 23 PRUEBAS ORIENTADAS A OBJETOS
ven atributos (datos) y operaciones (también conoci- ro, las pruebas basadas en hilos, integran el conjunto
dos como métodos o servicios), que manipulan estos de clases requeridas, para responder una entrada o suce-
datos. En vez de probar un módulo individual, la uni- so al sistema. Cada hilo se integra y prueba individual-
dad más pequeña comprobable es la clase u objeto mente. Las pruebas de regresión se aplican para asegurar
encapsulado. Ya que una clase puede contener un núme- que no ocurran efectos laterales. La segunda aproxi-
ro de operaciones diferentes, y una operación particu- mación de integración, la prueba basada en el uso,
lar debe existir como parte de un número de clases comienza la construcción del sistema probando aque-
diferentes, el significado de la unidad de prueba cam- llas clases (llamadas clases independientes), que utili-
bia drásticamente. zan muy pocas (o ninguna) clases servidoras. Después
No se puede probar más de una operación a la vez de que las clases independientes se prueban, esta secuen-
(la visión convencional de la unidad de prueba), pero sí cia de pruebas por capas de clases dependientes conti-
como parte de una clase. Para ilustrar esto, considére- núa hasta que se construye el sistema completo. A
se una jerarquía.de clases, en la cual la operación X se diferencia de la integración convencional, el uso de dri-
define para la superclase y se hereda por algunas sub- vers y stubs como operaciones de reemplazo, debe evi-
clases. Cada subclase utiliza la operación X, pero se tarse siempre que sea posible.
aplica en el contexto de los atributos y operaciones pri-
vadas que han sido definidas para la subclase. Ya que el
contexto en el que la operación X se utiliza varía de
manera sutil, es necesario para probar la operación X c VE
en el contexto de estas subclases. Esto significa que pro- l a estrategia de integración de pruebas O0 se centra
bar la operación X en vacío (la aproximación de la prue- en grupos de clases que colaboran o se comunican
ba de unidades tradicionales) es inefectiva en el contexto de la misma manera.
orientado a objetos.
La prueba de agrupamiento [MGR94] es una fase
en las pruebas de integración de software OO. Aquí, un
8% agrupamiento de clases colaboradoras (determinadas
CLAVE por la revisión de los modelos CRC y objeto-relación),
l a prueba de software O0 es equivalente a1 módulo se prueba diseñando los casos de prueba, que intentan
de pruebas unitarias para el software convencional. revelar errores en las colaboraciones.
No es recomendable comprobar operaciones por separado.
23.3.3. Pruebas de validación en un contexto O 0
La prueba de clases para el software O 0 es el equiva-
lente de las pruebas de unidad para el software conven- Al nivel de sistema o de validación, los detalles de
cional*.A diferencia de las pruebas de unidad del software conexiones de clases desaparecen. Así como la vali-
convencional que tienden a centrarse en el detalle algo- dación convencional, la validación del software O 0
ntmico de un módulo y de los datos que fluyen a través se centra en las acciones visibles al usuario y salidas
de la interfaz del módulo, la prueba de clases para el soft- reconocibles desde el sistema. Para ayudar en la cons-
ware O 0 se conduce mediante las operaciones encapsu- trucción de las pruebas de validación, el probador debe
ladas por la clase y el comportamiento de la clase. utilizar los casos de uso (Capítulo 20), que son parte
del modelo de análisis. Los casos de uso proporcionan
un escenario, que tiene una gran similitud de errores
23.3.2. Las pruebas de integración con los revelados en los requisitos de interacción del
en el contexto O0 usuario.
Ya que el software orientado a objetos no tiene una
estructura de control jerárquico, las estrategias con-
vencionales de integración descendente (top-down) y Aparentemente, todos los métodas de pruebas
ascendente (bottom-up) tienen muy poco significado. de coja negm r i i ~ ~ en
o sel Capftula 17
En suma, la integración de operaciones una por una en son aplicablesa la OO.
una clase (la aproximación de la integración incremen-
tal convencional), a menudo es imposible por la «inte- Los métodos de prueba convencionales de caja negra
racción directa e indirecta de los componentes que pueden usarse para realizar pruebas de validación. Ade-
conforman la clase» [BER93]. más, los casos de prueba deben derivarse del modelo de
Existen dos estrategias diferentes para las pruebas comportamiento del objeto y del diagrama de flujo de
de integración de los sistemas O 0 [BIN94a]. El prime- sucesos, creado como parte del AOO.
Los métodos de diseño para pruebas de caso, para las clases 00,
se discuten de las Secciones 23.4 a 23.6.
411
INGENIERfA DEL SOFTWARE. UN ENFOQUE PRACTICO
Concepto de DO0 que debe usarse con extrema precaución. Las Secciones 23.4.3 a 23.4.6 han sido adaptadas de un artículo'
de Brian Marick, divulgado en el grupo de noticias de internet
comp.testing. Esta adaptación se ha incluido con el permiso del autor.
Para adentrarse más en la discusión de este tema, véase [MAR94].
412
CAPfTULO 23 PRUEBAS ORIENTADAS A O B J E T O S
planificación preliminar requerida para llevar a cabo la perciben como «improbables», entonces esta aproxi-
prueba basada en fallos comienza con el modelo de aná- mación no es en realidad mejor que la técnica de pme-
lisis. El probador busca fallos posibles (por ejemplo, los bas aleatorias. De cualquier manera, si los modelos de
aspectos de implementación del sistema que pueden análisis y diseño pueden proporcionar la visión de lo
manifestarse en defectos). Para determinar si existen que parece andar mal, entonces las pruebas basadas en
estos fallos, los casos de prueba se diseñan para probar errores pueden encontrar un número significativo de
el diseño o código. errores con esfuerzos relativamente pequeños.
Las pruebas de integración buscan fallos probables
en operaciones o mensajes de conexión. Tres tipos de
fallos se encuentran en este contexto: resultados ines-
CLAVE perados, uso incorrecto de operaciones/mensajes, invo-
l a estrategia consiste en hacer hipótesis de una serie caciones incorrectas. Para determinar fallos probables
de posibles fallos, y luego conducir las pruebas cuando las funciones (operaciones) se invocan, se debe
para comprobar las hipótesis. examinar el comportamiento de la operación.
Considérese un ejemplo simple5. Los ingenieros de ¿Qué tipo de fallos
software generalmente cometen errores en los límites se encuentran en llamadas
del problema. Por ejemplo, cuando se prueba una ope- o operaciones y conexiones
ración SQRT que genera errores para números negati- de mensajes?
vos, se sabe probar los límites: un número negativo
cercano al cero y el cero mismo. El «cero mismo» com- Las pruebas de integración se aplican tanto a atribu-
prueba si el programador ha cometido un error como: tos como a operaciones. Los «comportamientos» de un
If( x > O ) calcular-la-raíz-cuadrada( ); objeto se definen por los valores que se asignan a sus
En lugar de lo correcto atributos. Las pruebas deben verificar los atributos para
determinar si se obtienen valores apropiados para los
If ( x >= O I calcular-la-raíz-cuadrada( );
distintos tipos de comportamientos de los objetos.
Como otro ejemplo, considérese la expresión booleana Es importante hacer notar que las pruebas de inte-
siguiente: gración intentan encontrar los errores en el objeto clien-
if (a && !b / / c ) te, no en el servidor. Dicho en términos comunes, el
enfoque de las pruebas de integración es determinar si
el error existe en el código de invocación, no en el códi-
go invocado. La invocación a operaciones se utiliza como
una pista, una forma de encontrar los requerimientos de
Ya que la prueba basada en fallos se da en un nivel la prueba que validen el código de invocación.
detallada, se reservo mejor para las operaciones
y clases que son críticas a sospechosas.
23.4.4. El impacto de la programación O 0 en las
Las pruebas de multicondición y técnicas relaciona- pruebas
das examinan las faltas posibles con toda seguridad en Hay distintas maneras en que la programación orienta-
esta expresión, como, por ejemplo, da a objetos puede tener un impacto en las pruebas.
&& debería de ser II Dependiendo del enfoque de la POO.
Algunos tipos de fallos se vuelven menos probables
! se ignoró donde se necesitaba
(no vale la pena probar).
Y debería haber un paréntesis alrededor de !b IIc Algunos tipos de fallos se vuelven más probables
Para cada error probable, se diseñan casos de prue- (vale la pena probar).
ba, que forzarán a la condición incorrecta a fallar. En la Aparecen algunos tipos nuevos de fallos.
expresión anterior, (a=O, b=O, c=O) forzarán a que la
expresión se evalúefalsa. Si el && hubiera sido II, el
código hubiera dado el resultado incorrecto y el control
habría seguido la rama errónea.
Desde luego que la efectividad de estas técnicas
depende de cómo los probadores perciben el «fallo pro-
bable». Si los fallos verdaderos en un sistema O 0 se
413
INGENIERfA DEL SOFTWARE. UN ENFOQUE PRÁCTICO
Cuando se invoca una operación es difícil decir exac- bada, porque representa un nuevo diseño y nuevo
tamente qué código se ejecuta. Esto es, la operación código. Pero, ¿la d e r i v a d a : : h e r e d a d a ( ) debe ser
debe pertenecer a una de muchas clases. Incluso, pue- recomprobada?
de ser difícil determinar el tipo exacto o clase de un Si la d e r i v a d a : h e r e d a d a ( ) invoca a redefini-
parámetro. Cuando el código lo acceda puede obtener- da y el comportamiento de redefinida cambia, d e r i -
se un valor inesperado. La diferencia puede entenderse v a d a : : h e r e d a d a ( ) podría manejar erróneamente
considerando la llamada a una función convencional: el nuevo comportamiento. De este modo, se necesi-
x = funcly); tan nuevas pruebas aunque el diseño y el código no
hayan cambiado. Es importante hacer notar, sin
Para el software convencional, el probador debe con- embargo, que solo un subconjunto de todas las prue-
siderar todos los comportamientos atribuidos a func y bas para d e r i v á d a : : h e r e d a d a ( ) deben rehacerse.
nada más. En un contexto 00,el probador debe consi- Si parte del diseño y codificación para heredada no
derar los comportamientos de base:func( ), de deriva- depende de redefinida (por ejemplo, no la llama ni
da:func( ), y así sucesivamente. Cada vez que func se llama ningún código que indirectamente la llame),
invoca, el probador debe considerar la unión de todos ese código no necesita ser recomprobado en la clase
los comportamientos distintos. Esto es más fácil si se derivada.
siguen prácticas de diseño O 0 adecuadas, y se limitan Baserredefinida ( ) y derivada: :redefinida ( )
las diferencias entre superclases y subclases (en el len- son dos operaciones diferentes con especificaciones e
guaje de C++, estas se llaman clases base y clases deri- implementaciones diferentes. Cada una debería tener
vadas). un conjunto de requisitos de prueba, derivadas de la
La aproximación a las pruebas para clases derivadas especificación e implementación. Aquellos requisitos
y base es esencialmente la misma. La diferencia es de prueban errores probables: fallos de integración, fallos
contabilidad. de condición, fallos de límites y así sucesivamente. Pero
Probar las operaciones de clases es análogo a probar las operaciones es probable que sean similares por lo
código que toma un parámetro de la función y luego la que el conjunto de requisitos de pruebas se solapan.
invoca. La herencia es una manera conveniente de pro- Cuanto mejor sea el diseño 00, el solapamiento será
ducir operaciones polimórficas. En la llamada, lo que mayor. Es necesario desarrollar las nuevas pruebas, solo
importa no es la herencia, sino el polimorfismo. La para aquellos requisitos de d e r i v a d a : :r e d e f i n i d a ( )
herencia hace que la búsqueda de los requisitos de prue- que no fueron satisfechas por pruebas de b a s e : :r e d e -
ba sea más directa. finida ( ) .
En virtud de la construcción y arquitectura de soft- Para concluir, las pruebas de b a s e : :r e d e f i n i d a ( i
ware, ¿existen algunos tipos de fallos más probables se aplican a los objetos de la clase derivada. Las entra-
para un sistema 00, y otros menos probables? la res- das de las pruebas deben ser apropiadas para las clases
puesta es «sí>>.Por ejemplo, a causa de que las ope- base y derivada, pero los resultados esperados pueden
raciones O 0 son generalmente más pequeñas, se diferir en la clase derivada.
tiende a gastar más tiempo en la integración ya que
existen más oportunidades de errores de integración.
Así que los errores de integración se vuelven más pro-
bables. 23.4.6. Diseño de pruebas basadas
en el escenario
Las pruebas basadas en los errores no localizan dos
23.4.5. Casos de prueba y jerarquía de clases tipos de errores: (1) especificaciones incorrectas y ( 2 )
Como se explicó previamente en este capítulo, la heren- interacción entre subsistemas. Cuando ocurren errores
cia no obvia la necesidad de probar todas las clases asociados con especificaciones erróneas, el producto
derivadas. De hecho, puede complicar el proceso de no realiza lo que el cliente desea. Puede que haga cosas
prueba. incorrectas, o puede omitir funcionalidad importante.
Pero en cualquier circunstancia, la calidad (cumpli-
".%
c VE
Aunque se haya comprobado bastante una clase base,
miento de requisitos) se sacrifica. Los errores asocia-
dos con la interacción de subsistemas ocurren cuando
el comportamiento de un subsistema crea circunstan-
cias, (por ejemplo, sucesos, flujo de datos) que causan
tendrá que comprobar las clases derivadas de ella. que el otro subsistema falle.
Las pruebas basadas en el escenario se concentran
Considérese la situación siguiente. Una clase base en lo que el usuario hace, no en lo que el producto
contiene operaciones heredadas y redefinidas. Una hace. Esto significa capturar las tareas (por medio de
clase derivada redefine operaciones redefinidas para los casos de uso) que el usuario tiene que hacer,
funcionar en un contexto local. Existe la pequeña duda después aplicarlas a ellas y a sus variantes como
de que la d e r i v a d a : : r e d e f i n i d a ( ) debe ser compro- pruebas.
414
CAPÍTULO 23 PRUEBAS ORIENTADAS A O B l E T O S
“ic;% VE
La prueba basada en el escenario descubrirá errores
«imprimir» en la caja de diálogo, se conseguirá que la
última página corregida se imprima de nuevo. Así que,
de acuerdo con el editor, el escenario correcto debería
que ocurren cuando cualquier actor interoctúa ser como el siguiente:
con el software OO. Caso de uso: Imprimir una nueva copia.
1. Abrir el documento.
Los escenarios revelan errores de interacción. Pero
2. Seleccionar «imprimir» en el menú.
para llevar a cabo esto, los casos de prueba deben ser
más complejos y realistas que las pruebas basadas en 3. Comprobar si se imprime un rango de páginas; si es así, pre-
los errores. Las pruebas basadas en el escenario tienden sionar para «imprimir» el documento entero.
a validar subsistemas en una prueba sencilla (los usua- 4. Presionar en el botón de impresión.
rios no se limitan al uso de un subsistema a la vez). 5. Cerrar el documento.
A manera de ejemplo, considérese el diseño de prue- Pero este escenario indica una especificación poten-
bas basadas en el escenario, para un editor de texto. Uti- cial de error. El editor no hace lo que el usuario razo-
lícense los siguientes casos: nablemente espera. Los clientes generalmente pasarán
Caso de uso: Prepara la versión final. por alto la opción de rango de páginas del paso 3 en el
Aspectos de fondo: No es inusual imprimir el borrador «final», ejemplo anterior. Se incomodarán cuando enciendan la
leerlo y descubrir algunos errores incómodos que no eran tan impresora y encuentren una página cuando ellos que-
obvios en la imagen de la pantalla. Este caso de uso describe rían 100. Los clientes fastidiados significan errores de
la secuencia de pasos que ocurren cuando esto pasa.
especificación.
1. Imprimir el documento entero. Un diseñador de casos de prueba debe olvidar la depen-
2. Rondar dentro del documento, cambiar algunas páginas. dencia en un diseño de pruebas, pero es probable que el
3. Al momento en que cada página se cambia, se imprime. problema aparezca durante las pruebas. El probador ten-
dría entonces que lidiar con la respuesta probable, «¿Esa
4. Algunas veces se imprime una serie de páginas.
es la forma como se supone que debe funcionar?».
Este escenario describe dos elementos: una prueba
y unas necesidades específicas del usuario. Las necesi-
23.4.7. Las estructuras de pruebas superficiales
dades del usuario son obvias: (1) un método para impri-
mir una sola página y (2) un método para imprimir un y profundas
rango de páginas. Hasta donde va la prueba, existe la La estructura superficial se refiere a la estructura visi-
necesidad de editar después de imprimir (así como lo ble al exterior de un programa OO. Esto es, la estruc-
contrario). El probador espera descubrir que la función tura que es inmediatamente obvia al usuario final. En
de impresión causa errores en la función de edición; esto vez de llevar a cabo funciones, los usuarios de muchos
es, que las dos funciones de software sean totalmente sistemas O 0 deben de proveerse de objetos para mani-
independientes. pular de alguna forma. Pero sin importar la interfaz, las
Caso de uso: Impresión de una nueva copia. pruebas aún se basan en las tareas de los usuarios. Cap-
turar estas tareas involucra comprensión, observación,
Aspectos de fondo: Se pide una copia reciente. Debe ser
impresa: y conversar con usuarios representativos (y tantos usua-
rios no representativos como valga la pena considerar).
1. Abrir el documento
Debe haber alguna diferencia en detalle con seguri-
2. Imprimirlo. dad. Por ejemplo, en un sistema convencional con una
3. Cerrar el documento. interfaz orientada a comandos, el usuario debe usar la
lista de comandos como una lista de control de pruebas.
Si no existen escenarios de prueba para ejercitar un
comando, las pruebas probablemente pasaron por alto
Aunque lo pruebo basada en el escenario tiene su mérito, algunas tareas del usuario (o la interfaz contiene coman-
encontrar6 uno recompenso mayor revisondo los cosos de dos inútiles). En una interfaz basada en objetos, el veri-
uso cuando se desarrollan durante el AOO. ficador debe usar la lista de todos los objetos, como una
lista de control de pruebas.
Una vez más, la aproximación de las pruebas es rela-
tivamente obvia. Excepto que el documento no apare-
ció fuera de ningún lugar. Fue creado en una tarea
anterior. ¿La tarea anterior afecta a esta?
En los editores modernos, los documentos registran
“56L
C VE
l o estructura de pruebas se da en dos niveles:
como fueron impresos por última vez. Por omisión, se (1) pruebas que validan la estructura visible
imprimen de la misma forma la siguiente vez. Después por el usuario final, (2) pruebas diseñadas
del escenario preparar la versiónfinal, con solo selec- para validar la estructura interna del programa.
415
I N G E N I E R ~ ADEL SOFTWARE. U N ENFO Q UE PR A CTICO
Las mejores pruebas se dan cuando el diseñador Los modelos de análisis y diseño se utilizan como
observa al sistema de una manera nueva o poco con- una base para la verificación de la estructura profunda.
vencional. Por ejemplo, si el sistema o producto tiene Por ejemplo, el diagrama objeto-relación o el diagrama
una interfaz basada en comandos, pruebas más com- de colaboración de subsistemas describe colaboracio-
pletas se darán si el diseñador de casos supone que las nes entre objetos y subsistemas, que no pueden ser visi-
operaciones son independientes de los objetos. Hacer bles externamente.
preguntas como <<¿Querrá el usuario usar esta operación El diseño de casos de prueba entonces se pregunta:
- q u e se aplica sólo al objeto scanner- mientras tra- «¿Se ha capturado (como una prueba) alguna tarea que
baja con la impresora?». Cualquiera que sea el estilo de pruebg la colaboración anotada en el diagrama objeto
la interfaz, el diseño de casos de prueba que ejercita la relación, o en el diagrama d&colaboración de subsiste-
estructura superficial debe usar ambos objetos y opera- mas? Si no es así, ¿por qué no?»
ciones, como pistas que conduzcan a las tareas desa- El diseño de representaciones de jerarquías de clases
percibidas. proporciona una visión de la estructura de herencia. La
La estructura profunda se refiere a los detalles téc- estructura jerárquica se utiliza en la verificación basada
nicos de un programa OO. Esto es, la estructura que se en errores. Considérese la situación en la cual una ope-
comprende examinando el diseño y/o el código. La veri- ración llamada llamar a( ) tiene un solo argumento, y
ficación de la estructura profunda está diseñada para ese argumento es unareferencia a la clase base. ¿Qué
ejercitar dependencias, comportamientos y mecanismos ocurrirá cuando llamar a( ) pase a la clase derivada?
de comunicación, que han sido establecidos como par- ¿Cuáles serán las diferencias en comportamientoque pue-
te del diseño del objeto y del sistema (Capítulo 22) de dan afectar a tal función? Las respuestas a estas pregun-
software OO. tas pueden conducir al diseño de pruebas especializadas.
En el Capítulo 17 se mencionó que la prueba de soft- Esto representa la secuencia de verificación mínima
ware comienza «en lo pequeño» y lentamente progresa para una cuenta. De cualquier modo, pueden existir una
hacia la prueba «a grande». La prueba «en pequeño», amplia variedad de combinaciones de operaciones posi-
se enfoca en una sola clase y los métodos encapsulados bles, dentro de esta secuencia:
por ella. La verificación y partición al azar son méto- Abrir - configurar - depositar - [depositar / reti-
dos que pueden usarse para ejercitar a una clase duran- rar / consultar saldo / resmen / Limitecrédito 1” -
te la prueba O 0 [KIR94]. retirar - cerrar
Pueden generarse una variedad de secuencias de ope-
raciones diferentes al azar. Por ejemplo,
23.5.1. La verificación a l azar para c l a s e s O0
Prueba rl: & r L i ~ configurar-
depositar - consultar
~
estado de la clase. Una vez más, considerando la clase La partición basada en atributos clasifica las opera-
cuenta, operaciones de estado incluyen a depositar y ciones de clase basada en los atributos que ellas usan.
retirar, y considerando que las operaciones de no-esta- Para la clase cuenta, los atributos saldo y LímiteCré-
do incluyen a consultar saldo, resumen y LímiteCrédi- dito pueden usarse para definir particiones. Las opera-
to, las pruebas se diseñan de manera que las operaciones ciones se dividen en tres particiones: (1) Operaciones
que cambian el estado, y aquellas que no lo cambian, que utilizan Limitecrédito, (2) operaciones que modi-
se ejerciten separadamente. Entonces: fican Límitecrédito, y (3) operaciones que no utilizan
o modifican Límitecrédito. Las secuencias de prueba
Prueba pI: abrir - configurar - depositar - depositar se diseñan por cada partición.
- retirar retirar - cerrar.
-
Prueba p2: abrir - configurar - depositar ~ resumen -
La partición basada en categorías clasifica las opera-
Límitecrédito - retirar cerrar.
~
ciones de la clase basadas en la función genérica que cada
una lleva a cabo. Por ejemplo, las operaciones en la cla-
La prueba pi cambia el estado, mientras que la prue- se cuenta pueden clasificarse en operaciones de iniciali-
ba p2 ejercita las operaciones que no cambian el estado zación (abrir, configurar),operaciones computacionales
(excepto por las necesarias de la secuencia mínima de (depositar, retirar), consultas (saldo, resumen, Límite-
prueba). Crédito) y operaciones de terminación (cerrar).
prueba de partición de clases individuales. La manera Prueba s l : abrir - preparar cuenta - depositar ( i n i -
como una sola clase se particiona se discutió en la Sec- c i a l ) - r e t i r o ( f i n a l ) - cerrar
ción 23.4.5. De cualquier modo, la secuencia de prue- Nótese que esta secuencia es idéntica a la secuencia
bas se extiende para incluir aquellas operaciones que se mínima de pruebas, discutida en la Sección 23.5.1. Si
invocan por los mensajes a clases colaboradoras. Una se agregan secuencias de prueba adicionales a la secuen-
aproximación alternativa basa las pruebas por partición cia mínima:
en las interfaces de una clase en particular. Haciendo
Prueba s2: abrir - preparar cuenta - depositariini-
referencia a la Figura 23.2, la clase banco recibe men- c i d - saldo - crédito - r e t i r o (final) -
sajes de las clases ATM y Cajero. Los métodos inclui- cerrar.
dos en banco pueden probarse particionándolos en
Prueba s3: preparar cuenta - depositar ( i n i c i a l ) -
aquellos que sirven a ATM y aquellos que sirven a Caje- r e t i r o - infocuenta r e t i r o (final) cerrar.
~
418
CAPfTULO 23 PRUEBAS ORIENTADAS A OBJETOS
., . . . .
. .,
, .,
',
.. . .... ..
.
5 ..
.:
\
j .
, J n' 1
El objetivo global de la verificación orientada a objetos citen. El estado de la clase representada por los valo-
-encontrar el máximo número de errores con un míni- res de sus atributos se examina, para determinar si
mo de esfuerz-, es idéntico al objetivo de prueba del persisten errores.
software convencional. Pero la estrategia y tácticas para La prueba de integración puede llevarse a cabo utili-
la prueba O 0 difieren de modo significativo. La visión zando una estrategia basada en hilos o basada en el uso.
de verificación se amplía, para incluir la revisión de La estrategia basada en hilos integra el conjunto de cla-
ambos modelos de diseño y de análisis. ses, que colaboran para responder a una entrada o suce-
En resumen, el enfoque de prueba se aleja del com- so. Las pruebas basadas en el uso construyen el sistema
ponente procedimental (el módulo) hacia la clase. Ya que en capas, comenzando con aquellas clases que no usan
los modelos d e análisis y diseño O 0 y el código fuente clases servidoras. Los métodos de diseño de integración
resultante se acoplan semánticamente, la prueba (a mane- de casos de prueba pueden usar pruebas al azar y por par-
ra de revisiones técnicas formales) comienza en estas acti- tición. En suma, las pruebas basadas en el escenario y las
vidades de ingeniería. Por esta razón, la revisión de los pruebas derivadas de los modelos de comportamiento pue-
métodos CRC, objeto-relación y objeto-comportamiento, den usarse para verificar una clase y sus colaboraciones.
pueden verse como una primera etapa de prueba. Una secuencia de pruebas registra el flujo de operacio-
Una vez que la PO0 ha sido concluida, las prue- nes, a través de las colaboraciones de clases.
bas de unidad se aplican a cada clase. El diseño de La prueba de validación de sistemas O 0 está orien-
pruebas para una clase utiliza una variedad de méto- tada a caja negra y puede completarse aplicando los
dos: pruebas basadas en errores, las pruebas al azar mismos métodos de prueba de caja de negra discutidos
y las pruebas por partición. Cada uno de estos méto- para el software convencional. Sin embargo, las prue-
dos ejercita las operaciones encapsuladas por la cla- bas basadas en el escenario dominan la validación de
se. Las secuencias de pruebas se diseñan para sistemas 00, haciendo que el caso de uso sea el con-
asegurarse de que las operaciones relevantes se ejer- ductor primario para las pruebas de validación.
[AMB95] Ambler, S., «Using Use Cases», Software Deve- [KIR94] Kirani, S., y W.T. Tsai, «Specification and Verifica-
lopment, Julio de 1995, pp. 53-61. tion of Object-Oriented Programw, Technical Report TR
[BER93] Berard, E.V., Essays on Ohject-Oriented Software 94-96, Computer Science Department, University of Min-
Engineering, vol. 1, Addison-Wesley, 1993. nesota. Diciembre de 1994.
[BIN94a] Binder, R.V., «Testing Object-Oriented Systems:
A Status Report», American Programmer, vol. 7 , n.' 4, [LIN94] Lindland, O.I., et al., «Understanding Quality in Con-
ceptual Modelinp, IEEE Software, vol. 11, n.' 4, Julio de
Abril de 1994, pp. 23-28.
1994, pp. 42-49.
[BIN94b] Binder, R.V., «Object-Oriented Software Testing»,
CACM, vol. 37, n.' 9, Septiembre de 1994, p. 29. [MAR941 Marick, B., The Crafi of Software Testing, Prenti-
[CHA93] DeChampeaux, D., D. Lea y P. Faure, Ohject-Orien- ce Hall. 1994.
ted System Development, Addison-Wesley, 1993.
[FIC92] Fichman, R., y C. Kemerer, «Object-Oriented and [MGR94] McGregor, J.D., y T.D. Korson, dntegrated Object-
conceptual Design Methodologies», Computer, vol. 25, Oriented Testing and Development Processes», CACM,
n.' 10, Octubre de 1992, pp. 22-39. vol. 37, n." 9, Septiembre de 1994, pp. 59-77.
23.1. Describa con sus propias palabras por qué la clase es 23.4. Derive un conjunto de tarjetas índice CRC para Hogar-
la más pequeña unidad razonable para las pruebas dentro de Seguro y ejecute los pasos señalados en la Sección 23.2.2 para
un sistema OO. determinar si existen inconsistencias.
23.2. ¿Por qué debemos probar de nuevo las subclases ins- 23.5. ¿Cuál es la diferencia entre las estrategias basadas en hilos
tanciadas de una clase existente si ésta ya ha sido probada por y aquellas estrategias basadas en uso para las pruebas de inte-
completo? ¿Podernos usar los casos de prueba diseñados para gración? ¿Cómo cabe la prueba de agrupación en ellas?
dicha clase? 23.6. Aplique la prueba aleatoria y la de partición a tres cla-
23.3. ¿Por qué debe comenzar la «prueba» con las activida- ses definidas en el diseño del sistema Hogarseguro produci-
des de A 0 0 y DOO? do por usted en el Problema 22.12.
419
INGENIERiA DEL SOFTWARE. UN ENFOQUE PRACTICO
Produzca casos de prueba que indiquen las secuencias de ope- 23.10. Obtenga pruebas usando los métodos señalados en los
raciones que se invocarán. Problemas 23.6 y 23.7 para el sistema de e-mail considerado
23.7. Aplique la prueba de múltiples clases y las pruebas deri- en el Problema 22.15.
vadas del modelo de comportamiento al diseño de HogarSe-
guro. 23.11. Obtenga pruebas usando los métodos señalados en los
Problemas 23.6 y 23.7 para el sistema ATC considerado en el
23.8. Obtenga pruebas usando los métodos señalados en los
Problema 22.16.
Problemas 23.6 y 23.7 para el sistema SSRB descrito en el
Problema 22.13. 23.12. Obtenga cuatro pruebas adicionales usando cada
23.9. Obtenga pruebas usando los métodos señalados en los uno de los métodos señalados en los Problemas 23.6 y 23.7
Problemas 23.6 y 23.7 para el juego de vídeo considerado en para la aplicación bancaria presentada en las Secciones 23.5
el Problema 22.14. y 23.6.
La literatura para la prueba O 0 es relativamente escasa, aun- Jorgenesen (Software Testing: A Cruftsman 's Approuch,
que se ha expandido algo en años recientes. Binder (Testing CRC Press, 1995) y McGregor y Sykes (Ohject-Oriented
Ohject-Oriented Systems: Models, Patterns, und Tools, Addi- Softwure Development, Van Nostrand Reinhold, 1992) pre-
son-Wesley, 2000) ha escrito el tratamiento más extenso del senta capítulos dedicados al tema. Beizer (Black-Box Tes-
tema publicado hasta la fecha. Siegel y Muller (Object Orien- ting, Wiley, 1995) analiza una variedad de métodos de
red Software Testing: A Hierurchical Approach, Wiley, 1996) diseño de casos prueba los cuales son apropiados en un con-
propusieron una estrategia práctica de prueba para sistemas texto OO.
OO. Marick (The Craft of Software Testing: Subsystem Tes- Binder (Testing Object-Oriented Systems, Addison-Wes-
ting Including Ohject-Based and Ohject-Oriented Testing, ley, 1996) y Marick [MAR941 presenta tratamientos detalla-
Prentice Hall, 1995) cubre la prueba tanto para software con- dos de prueba OO. En resumen, muchas de las fuentes
vencional como para OO. anotadas para el Capítulo 17 son en general aplicables a la
Antologías de publicaciones sobre prueba O 0 han sido edi- prueba OO.
tadas por Kung et al. (Testing Object-Oriented Software, IEEE Una amplia variedad de fuentes de información de prue-
Computer Society, 1998) y Braude (Ohject Oriented Analysis, ba orientada a objetos y temas relacionados se encuentran dis-
Design and Testing: Selected Readings, IEEE Computer ponibles en intemet. Una lista reciente a sitios (páginas) web
Society, 1998). Estos tutoriales de IEEE proporcionan una inte- que son relevantes a la prueba O 0 puede encontrarse en
resante perspectiva histórica en el desarrollo de prueba OO. h ttp://www.pressmanS.com
420