Está en la página 1de 14

CAPÍTULO

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.

¿Qué es? La arquitectura de software la frustración asociada con y pruebas d e agrupa-


orientado a objetos se manifiesta en to de baja calidad. Con el prop
una serie de subsistemas organizados encontrar el mayor número
por capas, que encapsuian clases que errores, las pruebas deben conducirse amente las clases colabora-
colaboran entre sí. Cada uno de estos sistemáticamente. y los casos imo, los casos d e uso
elementos del sistema (subsistemas y ba deben ser designados medi como parte del modelo
clases), realizan funciones que ayudan nicas disciplinadas. )se usan para descubrir
a alcanza requerimientos del sistema. ftware a nivel de vali-
¿Cuáles son los paros? L a
Es necesario probar un sistema OO.en
O0 son estratégicamente s
una variedad de niveles diferentes, en d o obtenido? Se
las pruebas de sistemas convenci
un esfuerzo para descubrir errores, que les. pero tácticamente difer tan un conjunto de
deben ocurrir cuando las clases cola-
que los modelos de análisis
boran con otras entre sí, y los subsis- clases, sus colaboraciones y com-
O0 son similares en estruct
temas se comunican por medio de las os;se definen los resultados
tenido al programa 00,las
capas arquitectónicas. y se registran los resulta-
comienzan con la revisión
gQlii6n lo hace? L a s pruebas orienta- modelos. Una vez que se ha
das a objetos se realizan por ingenie- el código, las pruebas O0 c o estar seguro de que lo
ros d e software y especialistas en *en lo pequeño. con las pruebas de crorreckmrente?Cuando
pruebas. clases. Existen pruebas disefíadas las pruebas, se cambia su
¿Por que es importante? Se debe eje- para probar las operaciones de las cla- ista. ¡intenta crompern el
cutar el programa antes de que llegue ses y examinar s i los error
al cliente, con la intención específica cuando una clase colabora con otras. de una forma disciplinada y revisar los
de descubrir todos los errores, de Así como las clases se integran para casos de prueba que se crean con meti-
manera que el cliente no emerimente formar un subsistema basado en hilos, culosidad.

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.

23.2.1. Exactitud de los modelos de A 0 0 y DO0


La notación y sintaxis que se utiliza para representar los
modelos de análisis y diseño se corresponderá con el
Modelos de A00
método específico de análisis y diseño, elegido para el
proyecto. Por consiguiente, la exactitud sintáctica se Para evaluar el modelo de clases, se recomiendan los
juzga en el uso apropiado de la simbología; cada mode- siguientes pasos [MGR94]:
lo se revisa para asegurarse de que se han mantenido
las convenciones propias del modelado. 1. Revisar el modelo CRC y el modelo objeto-relación.
Durante el análisis y diseño, la exactitud semántica -Realizar un control cruzado, para asegurarse de que
debe juzgarse basada en la conformidad del modelo con todas las colaboraciones implicadas en el modelo de
el dominio del problema en el mundo real. Si el mode- A 0 0 hayan sido representadas adecuadamente.
lo refleja con exactitud el mundo real (al nivel de deta-
lle apropiado a la etapa de desarrollo en la que se revisa ¿Qué pasos deben seguirse
el modelo), entonces es semánticamente correcto. Para para revisar el modelo
determinar si el modelo en realidad refleja el mundo real, de clases?
debe presentarse a expertos en el dominio del problema, 2. Inspeccionar la descripción de cada tarjeta CRC,
quienes examinarán las definiciones de las clases y sus para determinar si alguna responsabilidad delegada
jerarquías, para detectar omisiones o ambigüedades. Las es parte de la definición del colaborador. Por ejem-
relaciones entre clases (conexiones de instancia) se eva- plo, considérese una clase definida para un sistema
lúan para determinar si reflejan con exactitud conexio- de control de punto de venta, llamada venta a cré-
nes del mundo real'. dito. Esta clase tiene una tarjeta CRC, que se ilustra
en la Figura 23.1.
23.2.2. Consistencia de los modelos de A 0 0 Para esta colección de clases y colaboraciones, se
y DO0 pregunta si alguna responsabilidad (por ejemplo, leer
La consistencia de los modelos de A 0 0 y DO0 debe la tarjeta de crédito) se cumple si se delega al cola-
juzgarse «considerando las relaciones entre entidades borador nombrado (Tarjeta de crédito). Esto signi-
dentro del modelo. Un modelo inconsistente tiene repre- fica que la clase Tarjeta de crédito posee una
sentaciones en una parte, que no se reflejan correcta- operación para ser leída. En este caso, la respuesta
mente en otras partes del modelo» [MGR94]. es «Sí». El objeto-relación se recorre,. para asegu-
Para evaluar la consistencia, se debe examinar cada rarse de que todas las conexiones son válidas.
clase y sus conexiones a otras clases. Un modelo clase-
responsabilidad-colaboración (CRC), y un diagrama
objeto-relación pueden utilizarse para facilitar esta acti- Sugerencias adicionalespara conducir una revisión
vidad. Como se comentó en el Capítulo 2 1, el modelo del modelo CRC se presentan en el Capíhrlo 21.
CRC se compone de una tarjeta índice CRC. Cada tar-
jeta CRC muestra el nombre de la clase, sus responsa- 3. Invertir la conexión para asegurarse de que cada cola-
bilidades (operaciones) y sus colaboradores (otras clases borador que solicita un servicio recibe las peticiones
a las que se envían mensajes y de las cuales depende de una fuente razonable. Por ejemplo, si la clase Tar-
para el cumplimiento de sus responsabilidades). Las jeta de crédito recibe una petición de cantidad de
colaboraciones implican una serie de relaciones (por compra de la clase Venta a crédito, existirá un pro-
ejemplo, conexiones), entre clases del sistema OO. El blema. Tarjeta de crédito no reconoce la cantidad de
modelo objeto-relación proporciona una representación compra.

I Los casos de uso poseen un valor incalculable, en el seguimiento


de los modelos de análisis y diseño, frente a los escenarios del mundo
real para el sistema OO.

409
INGENlERíA DEL SOFTWARE. U N ENFOQUE PRACTICO

Una vez que se crea el modelo de DO0 (Capítulo 22),


1 Nombre de la clase: venta a crédito deben llevarse a cabo también las revisiones del diseño
del sistema y del diseño de objetos. El diseño del siste-
ma describe el producto arquitectónico global, los sub-
permanente, protegida sistemas que componen el producto, la manera en que
los subsistemas se asignan a los procesadores, la asig-
nación de clases a subsistemas y el diseño de la interfaz
1 Leer tarieta de crédito Tarjeta de crédito
I de usuario. El diseño de objetos presenta los detalles de
Obtener autorización
II
Autorización de crédito
I cada clase, y las actividades de mensajería necesarias

I Enviar por correo


cantidad de compra I Etiqueta de producto
para implementar las colaboraciones entre clases.

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

Los métodos de diseño de casos de prueba para soft-


ware orientado a objetos continúan evolucionando. Sin
embargo, una aproximación global al diseño de casos
de prueba O 0 ha sido definida por Bernard [BER93]:
1. Cada caso de prueba debe ser identificado separa-
3
Referencia Web
Una colección excelente de publicaciones, fuentes
y bibliografías de pruebas O0 puede encontrarse
damente, y explícitamente asociado con la clase a en www.rbsc.com
probar.
2. Debe declararse el propósito de la prueba. La herencia también conduce a retos adicionales para
3 . Debe desarrollarse una lista de pasos a seguir, como el diseñador de casos de prueba. Ya se ha dicho que cada
consecuencia de la prueba, pero además debe con- nuevo contexto de uso requiere repetir la prueba, aún y
tener [BER93]: cuando se haya logrado la reutilización. Además, la
a. definición de una lista de estados, específicos herencia múltiple' complica mucho más las pruebas,
para el objeto a probar. incrementando el número de contextos para los que se
requiere la prueba [BIN94a]. Si las subclases instan-
b. una lista de mensajes y operaciones, que se ejer-
ciadas de una superclase se utilizan dentro del mismo
citarán como consecuencia de las pruebas.
dominio de problema, es probable que el conjunto de
C. una lista de excepciones, que pueden ocurrir con- casos de prueba derivados de la superclase puedan usar-
forme el objeto se comprueba. se para la prueba de las subclases. De cualquier mane-
d. una lista de condiciones externas (por ejemplo, ra, si la subclase se utiliza en un contexto enteramente
los cambios en el ambiente externo al software, diferente, los casos prueba de la superclase serán esca-
que debe existir para conducir apropiadamente samente aplicables, y tendrá que diseñar un nuevo con-
las pruebas). junto de pruebas.
e. información adicional, que ayudará a la com-
prensión e implementación de la prueba. 23.4.2. Aplicabilidad de los métodos convencio-
A diferencia del diseño de pruebas convencional, que nales de diseño de casos de prueba
se conduce mediante una visión entrada-proceso-salida Los métodos de «caja blanca» descritos en el Capítulo 17
de software, o el detalle algorítmico de los módulos indi- pueden aplicarse a las operaciones definidas para una cla-
viduales, la prueba orientada a objetos se enfoca en las se. Técnicas como el camino básico, pruebas de bucle o
secuencias de operaciones de diseño apropiadas para técnicas de flujo de datos pueden ayudar a asegurar que
probar los estados de una clase. se ha probado cada sentencia de la operación. De cual-
quier modo, la estructura concisa de muchas operaciones
23.4.1. Implicaciones de los conceptos de O0 de clase provoca que algunos defiendan que el esfuerzo
al diseño de casos de prueba aplicado a la prueba de «caja blanca» debe ser redirigido
adecuadamente a las pruebas, a un nivel de clase.
Como ya se ha visto, la clase es el objetivo del diseño Los métodos de prueba de «caja negra» son tan apro-
de casos prueba. Debido a que los atributos y opera- piados para los sistemas 00,como lo son para los siste-
ciones se encapsulan, las operaciones de prueba fuera mas desarrollados utilizando los métodos convencionales
de la clase son generalmente improductivas. A pesar de de ingeniería de software. Como se dijo al principio del
que la encapsulación es un concepto de diseño esen- capítulo, los casos de uso pueden proporcionar datos Úti-
cial para la 00, puede crear un obstáculo cuando se les en el diseño de pruebas de «caja negra», y pruebas
hacen las pruebas. Como menciona Binder [BIN94a],
basadas en estados [AMB95].
«la prueba requiere informes del estado abstracto y con-
creto del objeto». La encapsulación puede dificultar un
poco la obtención de esta información. A menos que se 23.4.3. Pruebas basadas en errores4
proporcionen operaciones incorporadas para conocer El objetivo de las pruebas basadas en errores dentro de
los valores para los atributos de la clase, una imagen un sistema 00,es diseñar pruebas que tengan una alta
instantánea del estado del objeto puede ser difícil de probabilidad de revelar fallos. Ya que el producto o sis-
adquirir. tema debe adaptarse a los requerimientos del cliente, la

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

El código presentado en ésta y en las siguientes secciones utiliza la


sintaxis de C++. Para mayor información, véase cualquier buen libro
de C++.

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

cionar «imprimir» en el menú y presionando el botón

“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
~

A manera de ilustraciones sencillas de estos métodos, c<iIdo - resumen retirar - cerrar.


-
considérese una aplicación bancaria en la cual una cla- Pruehd abrir - coniigurar - depositar - retirar -
se cuenta contiene las siguientes operaciones: abrir, depositar ~consuitar saldo - LímiteCré-
configurar,depositar, retirar, consultur saldo, resumen, d i t o - retirar - cerrar.
Limitecrédito y cerrar [KIR94]. Cada una de estas ope- Estas y otras pruebas de orden aleatorio se realizan
raciones debe aplicarse a cuenta, pero algunas limita- para probar diferentes registros de operaciones de ins-
ciones (por ejemplo, la cuenta debe ser abierta antes de tancias de clases.
que otras operaciones puedan aplicársele, y cerrada des-
pués de que todas las operaciones hayan sido comple- 23.5.2. Prueba de partición al nivel de clases
tadas) están implícitas en la naturaleza del probletna. La prueba de partición reduce el número de casos de prue-
Aún con estas limitaciones, existen muchas combina- ba requeridos para validar la clase, de la misma forma que
ciones de operaciones. El registro de operaciones míni- la partición equivalente (Capítulo 17) para software con-
ma de una instancia de cuenta incluye las siguientes vencional. Las entradas y salidas se clasifican, y los casos
operaciones : de prueba se diseñan, para validar cada categoría. Pero
Abrir - coniigurar - depositar - retirar - cerrar. ¿cómo se derivan las categorías de partición?
¿Qué opciones de pruebas
están disponibles a nivel
El número de combinociones posibies poro uno prueba de clases?
oleotorio puede crecer mucha. Una estiategio similar
poro lo pruebas de orroys ariagonoles (Cupítulo 17), La partición basada en estados clasifica las opera-
puede usarse poro mejorar lo eficiencia de los pruebos. ciones de clase basada en su habilidad de cambiar el
416
CAPfTULO 23 PRUEBAS ORIENTADAS A O B J E T O S

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).

El diseño de casos de prueba se vuelve más complica- verifcuenta - verifNiP - [[verifpoliza -

do cuando la integración del sistema O 0 comienza. Es regRetirar1i reqDepositar / reqInfoCuenta 1"


en esta etapa en que la verificación de colaboraciones
entre clases comienza. Para ilustrar «la generación de
casos de prueba interclasew [KIR94], se expande el
ejemplo de la aplicación bancaria introducida en la Sec-
ción 23.5, para incluir las clases y colaboraciones de la
Figura 23.2. La dirección de las flechas en la Figura
indica que se invocan como consecuencia de colabora-
ciones implícitas a los mensajes.
Así como la verificación de clases individuales, la
verificación de colaboraciones de clases puede com- ObtenerCantidadEfectivo
pletarse aplicando métodos de partición y al azar, así
como pruebas basadas en el escenario y pruebas de com-
portamiento.
\
Depósito
I
23.6.1. Prueba de múltiples clases
FIGURA 23.2. Grafo de colaboraciones de clase
Kirani y Tsai [KIR94] sugieren la secuencia siguiente para una aplicación bancaria (KIR941.
de pasos, para generar casos de prueba aleatorios para
múltiples clases:
Un caso de prueba aleatorio para la clase banco
1. Para cada clase cliente, utilice la lista de operacio- podría ser:
nes de clase, para generar una serie de secuencias de
pruebas al azar. Las operaciones enviarán mensajes Prueba r3 = verifcuenta ~ verifNIP - reqDepositar
a las otras clases servidoras. Con la finalidad de considerar a los colaboradores
2. Para cada mensaje que se genere, determine la clase involucrados en esta prueba, los mensajes asociados con
colaboradora y la operación correspondiente en el cada una de las operaciones mencionadas en el caso de
objeto servidor. prueba r, deben ser tomados en cuenta. Banco debe cola-
3. Para cada operación en el objeto servidor (invocada borar con infovalidación para ejecutar verifcuenta y
por mensajes enviados por el objeto cliente), deter- veriflZP. Banco debe colaborar con cuenta para ejecu-
mine los mensajes que transmite. tar reqDepositar. De aquí que un nuevo caso de prueba,
4. Para cada uno de los mensajes, determine el siguiente que ejercite estas colaboraciones, es:
nivel de operaciones que son invocadas, e incorpore [validCuenta~,,,,,,,~,~~]
Prueba rq = verifCuentaH~31)Lo
éstas a la secuencia de pruebas. - VerifNIpHanLo ,riscló,,l
- [Val idNIp,nfc,,dal
- reqDeposit a r - [DepositarcucnLal
Para ilustrar [KIR94], considérese una secuencia de
operaciones para la clase banco relativa a una clase La aproximación para la prueba de partición de múl-
ATM (Figura 23.2): tiples clases es similar a la aproximación usada para la
417
INGENlERfA DEL SOFTWARE. UN ENFOQUE PRdCTICO

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.
~

ro. La partición basada en estados (Sección 23.4.9), pue-


de usarse para refinar aún más las particiones. Se pueden derivar aún más casos de prueba, para ase-
gurarse de que todos los comportamientos para la cla-
se han sido adecuadamente ejercitados. En situaciones
23.6.2. Prueba derivada de los modelos
en las que el comportamiento de la clases, resulte en
de comportamiento una colaboración con una o más clase se utilizan múl-
En el Capítulo 2 1 se discutió el uso del diagrama de tran- tiples DTEs para registrar el flujo de comportamientos
sición de estados, como el modelo que representa el com- del sistema.
portamiento dinámico de una clase. El DTE (Diagrama El modelo de estado puede ser recorrido <<primeroa
de transición de estados) para una clase puede usarse lo ancho» [MGR94]. En este contexto, primero a lo
para ayudar a derivar una secuencia de pruebas, que ejer- ancho implica que un caso de prueba valida una sola
citarán el comportamiento dinámico de la clase (y aque- transición y después, cuando se va a verificar una nue-
llas clases que colaboran con ella). La Figura 23.3 va transición, se utilizan sólo las transiciones previa-
[KIR94] ilustra una DTE para la clase cuenta explica- mente verificadas.
da con anterioridad6. Con referencia a la Figura, las tran- Considérese el objeto tarjeta-de-crédito de la Sec-
siciones iniciales se mueven por los estados cuenta vacía ción 23.2.2. El estado inicial de tarjeta-de-crédito
y configura cuenta. Un retiro final y cierre causan que es indefinido (es decir, no se ha proporcionado un
la clase cuenta haga transiciones a los estados nohace- número de tarjeta de crédito). Una vez leída la tarjeta
trabajo de cuenta y cuenta muerta, respectivamente. de crédito durante una venta, el objeto asume un esta-
do definido; esto significa que los atributos número
tarjeta y fecha expiración, se definen junto con iden-
tificadores específicos del banco. La tarjeta de crédi-
Preparar to se envía, cuando se envía la autorización, y es
cuenta aprobada cuando la autorización se recibe. La transi-
Depósito (inicial)
ción de tarjeta-de-créditode un estado a otro puede
Depósito probarse generando casos de prueba, que hagan que la
transición ocurra. Un enfoque «primero a lo ancho»
con la en este tipo de pruebas, puede no validar el envío antes
Balance cuenta
Crédito
Retirar de que se ejercite indefinida y definida. Si lo hiciera,
haría uso de transiciones que no han sido verificadas
1 Retirar todo (final) con anterioridad, y violaría el criterio «primero a lo
A ancho».

FIGURA 23.3.Diagrama de transición de estados


para la clase cuenta [KIR94]. Referencia Web/ ’
Las pruebas a diseñarse deben alcanzar una cober- Uno extensa colección de ((consejos sobre
tura de todos los estados [KIR94]. Eso significa que las pruebas 00)) (incluyendo muchos referencias
útiles) puede encontrarse en:
secuencias de operaciones deben causar que la clase
www.kinetita.tom/ootips/
cuenta haga transiciones por todos los estados:

La simbologia UML se utiliza para el DTE que se ilustra en la Figura


23.3. Difiere ligeramente de la simbología usada para los DTEs en la
parte tres de este libro.

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

También podría gustarte