Documentos de Académico
Documentos de Profesional
Documentos de Cultura
En
Ingeniería de software:un enfoque práctico (pp.395-411)(671p.)(9a ed). Ciudad de México:
McGraw Hill Interamericana. (C100528)
CAPÍTULO
PRUEBAS DE SOFTWARE:
A NIVEL DE INTEGRACIÓN 20
Un solo desarrollador tal vez pueda probar componentes de software sin involucrar a otros
miembros del equipo. Esto no aplica en las pruebas de integración, en donde un componente
debe interactuar de forma adecuada con los componentes desarrollados por otros miembros
del equipo. Las pruebas de integración exponen muchas debilidades de los grupos de desa-
rrollo de software que no están unidos como equipo; estas pruebas presentan un interesante
dilema para los ingenieros de software, quienes por naturaleza son personas constructivas.
De hecho, todas las pruebas requieren que los desarrolladores descarten nociones precon-
cebidas sobre la "precisión" del software que se acaba de desarrollar y, mejor que eso, su
trabajo duro sea diseñar casos de prueba para "romper" el software. Esto significa que los
miembros del equipo necesitan poder aceptar sugerencias de otros miembros acerca de que
su código no se comporta de manera adecuada cuando se prueba como parte del incremento
de software más reciente.
ANÁLISIS BREVE
¿Qué es? Las pruebas de integración ensamblan com- ¿Cuáles son los pasos? La lógica interna del pro-
ponentes de una forma que permiten la prueba de grama se ejerce mediante el uso de técnicas de di-
funciones de software cada vez más grandes, con la seño de casos de prueba de "caja blanca" y los
intención de encontrar errores mientras se ensambla el requerimientos de software se ejercen mediante el
software. uso de técnicas de diseño de casos de prueba de
¿Quién lo hace? Durante las primeras etapas de las "caja negra".
¿Qué es el producto de trabajo? Se diseña y docu-
pruebas, un ingeniero de software se hace cargo de
menta un conjunto de casos de prueba creados para
todas las pruebas. Sin embargo y a medida que el
ejercer lógica interna, interfaces, colaboraciones entre
proceso de pruebas progresa, es posible que se invo-
componentes y requerimientos externos, se definen
lucren los especialistas de pruebas, además de otras los resultados esperados y se registran los resultados
partes interesadas. reales.
¿Por qué es importante? Los casos de prueba deben ¿Cómo me aseguro de que lo hice bien? Cuando
diseñarse mediante el uso de técnicas disciplinadas comience las pruebas, cambie su punto de vista. ¡Es-
para asegurar que los componentes se hayan inte- fuércese por "romper" el software! Diseñe los casos
grado de manera adecuada en el producto de soft- de prueba en forma disciplinada y revise que los ca-
ware completo. sos de prueba que cree sean detallados.
395
396 PARTE TRES CALIDAD Y SEGURIDAD
Beizer [Bei90] describe un "mito" al que se enfrentan todos los que prueban software.
Escribe lo siguiente: "Hay un mito que dice que, si fuéramos realmente buenos en la pro-
gramación, no habría errores que atrapar ... Hay errores, dice el mito, porque somos malos
en lo que hacemos; y si somos malos en ello, deberíamos sentirnos culpables".
¿Deberían las pruebas infundir culpa? ¿Son las pruebas realmente destructivas? La
respuesta a estas preguntas es ¡No!
Al principio de este libro, hicimos hincapié en el hecho de que el software es solo
un elemento de un sistema más grande basado en computadora. En última instancia, el
software se incorpora con otros elementos del sistema (como hardware, personas, infor-
mación), y se realizan las pruebas de sistema (una serie de pruebas de integración y vali-
dación del sistema). Estas pruebas quedan fuera del alcance del proceso del software y
no las realizan únicamente los ingenieros de software. Sin embargo, las medidas que
se adopten durante el diseño y la prueba del software pueden mejorar de manera consi-
derable la probabilidad de una integración exitosa del software en un sistema de mayor
tamaño.
En este capítulo analizamos las técnicas para las estrategias de pruebas de integración
del software que se aplican a la mayoría de las aplicaciones de software. En el capítulo 21
analizaremos las estrategias de pruebas de software especializadas.
El objetivo de las pruebas es encontrar errores; una buena prueba tiene una alta probabilidad
de encontrar un error. Kaner, Falk y Nguyen [Kan9 3] sugieren los siguientes atributos de
una "buena" prueba:
Una buena prueba tiene una alta probabilidad de encontrar un error. Para lograr este
objetivo, el que hace las pruebas debe entender el software y tratar de desarrollar una imagen
mental acerca de cómo podría fallar el software.
Una buena prueba no es redundante. El tiempo y los recursos para las pruebas son li-
mitados. No tiene sentido realizar una prueba que tenga el mismo propósito que otra. Cada
prueba debe tener un propósito diferente (incluso aunque tengan diferencias sutiles).
Una buena prueba debe ser "la mejor de su clase" [Kan9 3]. En un grupo de pruebas que
tengan una intención similar, las restricciones de tiempo y recursos pueden dictar la ejecu-
ción de solo aquellas pruebas que tengan la mayor probabilidad de descubrir toda una clase
de errores.
Una buena prueba no debe ser demasiado simple ni demasiado compleja. Aunque algunas
veces es posible combinar una serie de pruebas dentro de un caso de prueba, los posibles
efectos secundarios asociados con este enfoque pueden enmascarar errores. En general,
hay que ejecutar cada prueba por separado.
Cualquier producto de ingeniería (y casi cualquier otra cosa) puede probarse en una
de dos formas: ( 1) Si sabemos la función especificada para la que se diseñó un producto,
pueden realizarse pruebas que demuestren que cada función es totalmente operacional y a
la vez buscar los errores en cada función. (2) Si conocemos el funcionamiento interno de
un producto, pueden realizarse pruebas para asegurar que "todos los engranes se combinen";
esto es, que las operaciones internas se realicen de acuerdo con las especificaciones y que
se hayan ejercido todos los componentes internos. El enfoque de la primera prueba adopta
una perspectiva externa de las pruebas y se conocen como pruebas de caja negra. El segundo
CAPÍTULO 20 PRUEBAS DE SOFTWARE : A NIVEL DE INTEGRACIÓN 397
enfoque requiere una perspectiva interna de las pruebas y se denominan pruebas de caja
blanca. 1 Ambas son útiles en las pruebas de integración [Jan 16].
1 Los términos pruebas funcionales y pruebas estructurales se usan algunas veces en lugar de pruebas de
caja negra y de caja blanca, respectivamente.
398 PARTE TRES CALIDAD Y SEGURIDAD
•Uh'M·*l·S•
Integración descendente
El proceso continúa desde el paso 2 hasta que se crea toda la estructura del programa.
La estrategia de integración descendente verifica los principales puntos de control o
decisión al principio del proceso de prueba. En una estructura de programa "bien factori-
zada", la toma de decisiones ocurre en los niveles superiores de la jerarquía y, por lo tanto,
se encuentra primero. Si existen problemas de control importantes, es imprescindible reco-
nocerlos lo antes posible. Si se selecciona la integración de primero en profundidad, puede
implementarse y demostrarse una función completa del software. La demostración temprana
de la capacidad funcional genera confianza para todas las partes interesadas.
•4M'hf.*J·t•
Integración ascendente Me
__
--- ---
.._
,. --.._
'
Mb
.._ __ .._ __
,. --- --- --.._
'
--.._
'
r--'
1 o, 02
.... .... .... ....
.... .... "" "" ....
"" ""
Clúster 3
Clúster 1
\....--------~-""v""'""--~--------__,I
Clúster 2
La integración sigue el patrón que se ilustra en la figura 20.1. Los componentes se combinan
para formar los clústeres 1, 2 y 3. Cada uno de los clústeres se prueba mediante el uso de
un controlador (que se muestra como un bloque con líneas punteadas). Los componentes
en los clústeres 1 y 2 son subordinados de Ma. Los controladores D 1 y D 2 se eliminan, y los
clústeres se interconectan directamente a Ma. De manera similar, el controlador D 3 para
el clúster 3 se elimina antes de la integración con el módulo M 6. Tanto Ma como M 6 se
integrarán finalmente con el componente Me y así sucesivamente.
A medida que la integración avanza hacia arriba, la necesidad de controladores de
prueba separados disminuye. De hecho, si los dos niveles de la estructura del programa se
integran descendentemente, el número de controladores puede reducirse de manera subs-
tancial y la integración de los clústeres se simplifica en gran medida.
un mecanismo para marcar el ritmo de proyectos de tiempo crítico; permite que el equipo
de software evalúe el proyecto en forma frecuente. En esencia, el enfoque de las pruebas de
humo incorpora las siguientes actividades:
l. Los componentes de software que se hayan traducido en código se integran a una
compilación. Una compilación incluye todos los archivos de datos, bibliotecas, módulos
reutilizables y componentes de ingeniería requeridos para implementar una o más
funciones del producto.
2. Se diseña una serie de pruebas para exponer los errores que eviten que la compilación
desempeñe su función de manera adecuada. La intención debería ser descubrir los
errores graves que tengan la mayor probabilidad de atrasar el proyecto de software.
3. La compilación se integra con otras compilaciones y se realiza a diario la prueba de
humo de todo el producto (en su forma actual). El enfoque de integración puede ser
descendente o ascendente.
La frecuencia diaria de las pruebas ofrece a los gerentes y profesionales especializados una
evaluación realista del proceso de las pruebas de integración, McConnell [McC96] describe
la prueba de humo de la siguiente forma:
La prueba de humo debe ejercitar todo el sistema de un extremo a otro. No tiene que
ser exhaustiva, pero debe ser capaz de exponer los problemas principales. La prueba de
humo debe ser lo bastante minuciosa como para que, si la compilación se aprueba, po-
damos asumir que es lo bastante estable como para probarla en forma más minuciosa.
Las pruebas de humo proveen varios beneficios cuando se aplican en proyectos de software
complejos de tiempo critico:
• Se minimiza el riesgo de la integración. Puesto que las pruebas de humo se realizan a
diario, los errores de incompatibilidades y otros graves se descubren lo antes posible,
con lo cual se reduce la probabilidad de un impacto grave en el calendario cuando se
descubran los errores.
• Se mejora la calidad del producto final. Debido a que el enfoque está orientado a la
construcción (integración), es probable que las pruebas de humo descubran errores
funcionales así como errores de diseño de arquitectura y a nivel de componente. Si
estos errores se corrigen lo antes posible, se logrará una mejor calidad del producto.
• El diagnóstico y la corrección de errores se simplifican. Al igual que todos los enfo-
ques de pruebas, es probable que los errores descubiertos durante las pruebas de
humo se asocien con "nuevos incrementos de software"; es decir, el software que
se acaba de agregar a la o las compilaciones es una causa probable de un error recién
descubierto.
• El progreso es más fácil evaluar. Con cada día que pasa, se integra una mayor parte del
software y se ha demostrado que funcionan más cosas. Esto mejora la moral del equipo
y provee a los gerentes un buen indicio de que se está progresando.
En ciertas formas las pruebas de humo se asemejan a las pruebas de regresión (que se
analizan en la sección 20.3), lo que ayuda a asegurar que los componentes recién agregados
no interfieran con los comportamientos de los componentes existentes que se probaron
previamente. Para ello, es buena idea volver a ejecutar un subconjunto de los casos de prueba
que se ejecutaron con el componente de software existente antes de agregar los nuevos
componentes. El esfuerzo requerido para volver a ejecutar los casos de prueba no es trivial;
pueden usarse las pruebas automatizadas para reducir el tiempo y esfuerzo recreados para
volver a ejecutar estos casos de prueba [Netl8]. Un análisis completo de las pruebas
402 PART E TRES CA LIDAD Y SE GURIDAD
automatizadas está más allá del alcance de este capítulo, pero encontrará vínculos a herra-
mientas representativas en las páginas web que complementan este libro. 2
Cada vez que se agrega un nuevo módulo como parte de las pruebas de integración, el
software cambia. Se establecen nuevas rutas de flujo de datos, puede haber nueva entrada/
2 Vea el sitio web de SEPA 9e (Software Engineering A Practitioner's Approach 9th Edition).
CAPÍTULO 20 PRUEBAS DE SOFTWARE: A NIVEL DE INTEGRACIÓN 403
salida (E/S) y se invoca una nueva lógica de control. Los efectos secundarios asociados con
estos cambios pueden provocar problemas con las funciones que anteriormente funcionaban
perfectamente. En el contexto de una estrategia de pruebas de integración, las pruebas de
regresión son la re-ejecución de cierto subconjunto de pruebas que ya se realizaron para
asegurar que los cambios no hayan propagado efectos secundarios imprevistos. Las pruebas
de regresión deben ejecutarse cada vez que se realice un cambio importante en el software
(incluida la integración de nuevos componentes). Las pruebas de regresión ayudan a asegurar
que los cambios (debido a las pruebas o por otras razones) no introduzcan un comporta-
miento inesperado o errores adicionales.
Las pruebas de regresión pueden realizarse en forma manual, mediante la re-ejecución
de un subconjunto de todos los casos de prueba o mediante el uso de herramientas de
captura/reproducción automatizadas. Las herramientas de captura/reproducción permiten
al ingeniero de software capturar los casos de prueba y resultados para su posterior repro-
ducción y comparación. La suite de pruebas de regresión (el subconjunto de pruebas a eje-
cutar) contiene tres clases diferentes de casos de prueba:
• Una muestra representativa de pruebas que ejercite todas las funciones del software.
• Pruebas adicionales que se enfoquen en las funciones del software que puedan verse
afectadas por el cambio.
• Pruebas que se enfocan en los componentes de software que cambiaron.
A medida que proceden las pruebas de integración, el número de pruebas de regresión
puede hacerse bastante grande. Por lo tanto, la suite de pruebas de regresión debe diseñarse
para incluir solo las pruebas que aborden una o más clases de errores en cada una de las
funciones principales del programa.
Yoo y Harman [Yoo 13] escriben sobre los posibles usos de la inteligencia artificial (IA)
en la identificación de casos de prueba para usarlos en suites de pruebas de regresión.
Una herramienta de software podría examinar las dependencias entre los componentes en
el incremento de software después de agregar los nuevos componentes, y generar casos de
prueba en forma automática para usarlos en las pruebas de regresión. Otra posibilidad sería
el uso de técnicas de aprendizaje de máquina para seleccionar conjuntos de casos de prueba
que optimicen el descubrimiento de errores de colaboración de componentes. Este trabajo
es prometedor, pero requiere de una interacción considerable del humano para revisar los
casos de prueba y el orden recomendado para ejecutarlos.
CASASEG l lRA
Pruebas de regresión
El escenario: Oficina de Doug Miller, Vinod: Creo que sí, pero ¿acaso no basta con que
mientras se realizan las pruebas de probemos las interacciones de los nuevos compo-
integración. nentes con los componentes que se supone deben
colaborar?
Los participantes: Doug Miller, gerente de ingeniería
de software: Vinod, Jamie, Ed y Shakira, miembros del Doug: No siempre. Algunas veces los componentes
equipo de ingeniería de software de CasaSegura. realizan cambios inesperados en los datos que otros
componentes utilizan. Sé que estamos ocupados, pero
La conversación: es importante descubrir estos problemas lo antes
posible.
Doug: Me parece que no estamos invirtiendo el tiem-
po suficiente en volver a probar los componentes de Shakira: Tenemos un repositorio de casos de prueba
software después de integrar nuevos componentes. que hemos estado usando. Tal vez podamos seleccionar
404 PARTE TRES CALIDAD Y SEGURIDAD
al azar varios casos de prueba y ejecutarlos mediante Jamie: He estado tratando de diseñar un conjunto de
nuestro marco de trabajo de pruebas automatizado. pruebas asociadas para cada función en el sistema. Tal
vez deba etiquetar algunas de las más importantes pa-
Doug: Es un comienzo. Pero tal vez deberíamos ser
ra que Vinod las use para las pruebas de regresión.
más estratégicos en cuanto a la forma de seleccionar
nuestros casos de prueba. Doug (a Vinod): ¿Con qué frecuencia ejecutarás los
casos de prueba de regresión?
Ed: Supongo que podríamos usar nuestra tabla de ras-
treabilidad de casos de prueba/requerimientos y revisar Vinod: Cada día que integre un nuevo componente
nuestro modelo de tarjetas CRC. usaré los casos de prueba de regresión ... hasta que
decidamos que el incremento de software está listo.
Vinod: He estado usando la integración continua, lo
que significa que integro cada componente tan pronto Doug: Probemos los casos de prueba de regresión de
como uno de los desarrolladores me lo pasa. Trato de Jamie a medida que se crean y veamos cómo salen las
ejecutar una serie de pruebas de regresión en el pro- cosas.
grama parcialmente integrado.
3 Las secciones 20.4.1y20.4.2 se adaptaron de un artículo de Brian Marick que se publicó originalmente
en el grupo de noticias de internet comp.testing. Esta adaptación se incluye con el permiso del autor.
Si desea más información sobre estos temas, vea [Mar94]. Hay que tener en cuenta que las técnicas
analizadas en las secciones 20.4.1 y 20.4.2 también se aplican para el software convencional.
406 PARTE TRES CALIDAD Y SEGURIDAD
•Uh'M·*l·f •
Diagrama de colaboración tarjeta Insertada verificarCta
contraseña verificarNIP
de clases para la aplicación depósito verificarPolítica
bancaria retiro reqRetiro
estadoCuenta reqDepósito
-------, terminar
....-------,_ infoCta
;;;:
Interfaz de
ATM Banco
usuario del ATM
verificarEstado
límiteCrédito
! !
estadoDepósito nipVálido
abrirCta tipoCta
dispensarEfectivo ctaVálida
depósitolnicial balance
imprEstadoCta
autorizarTarj retiro
leerlnfoTarj
desautorizar depósito
obtenerMontoEfvo
cerrarCta cerrar
lnfo
Cajero Cuenta
Validación
Fuente: Kirani, Shekhar y Tsai, W. T., "Specification and Verification of Object-Oriented Programs", Informe técnico TR 94-64, University
of Minnesota, 4 de diciembre de 1994, 72.
3. Para cada operación en el objeto servidor (que se haya invocado mediante mensajes
enviados desde el objeto cliente), determinar los mensajes que transmite.
4. Para cada uno de los mensajes, determinar el siguiente nivel de operaciones que se
invocan e incorporarlos en la secuencia de pruebas.
Para ilustrar [Kir94], considere una secuencia de operaciones para la clase Banco relativa
a una clase ATM (figura 20.3):
verificarCta•verificarNIP•[[verificarPolftica•reqRetiro]lreqDepósitolreqlnfoCta]n
Para considerar los colaboradores involucrados en esta prueba, se toman en cuenta los
mensajes asociados con cada una de las operaciones señaladas en el caso de prueba r3.
Banco debe colaborar con InfoValidación para ejecutar verificarCta() y verificarNIP(). Banco
debe colaborar con Cuenta para ejecutar reqDepósito(). Por lo tanto, un nuevo caso que
emplea estas colaboraciones es
incorrecto u omitir funcionalidad importante. Pero en cualquier caso, la calidad (de con-
formidad con los requerimientos) sufre. Ocurren errores asociados con la interacción del
subsistema cuando el comportamiento de un subsistema crea circunstancias (eventos, flujo
de datos, etc.) que provocan la falla de otro subsistema.
Las pruebas basadas en escenarios descubrirán errores que ocurren cuando cualquier
actor interactúa con el software. Las pruebas basadas en escenarios se concentran en lo
que hace el usuario, no en lo que hace el producto. Esto significa capturar las tareas (me-
diante casos de uso) que el usuario tiene que realizar, para luego aplicarlas junto con sus
variantes como pruebas. Esto es muy similar a las pruebas de hilos.
Las pruebas de escenarios descubren los errores de interacción. Pero para lograr esto,
los casos de prueba deben ser más complejos y realistas que las pruebas basadas en fallas.
Las pruebas basadas en escenarios tienden a emplear múltiples subsistemas en una sola
prueba (los usuarios no se limitan al uso de un subsistema a la vez).
El diseño de casos de prueba se vuelve más complicado cuando comienza la integración
del sistema orientado a objetos. Es en esta etapa que deben empezar las pruebas de las
colaboraciones entre clases. Para ilustrar la "generación de casos de prueba entre clases"
[Kir94], vamos a expandir el ejemplo bancario que presentamos en la sección 19.6 para
incluir las clases y colaboraciones señaladas en la figura 20.3. La dirección de las flechas
en la figura indica la dirección de los mensajes; el etiquetado indica las operaciones que se
invocan como consecuencia de las colaboraciones que implican los mensajes.
Al igual que las pruebas de clases individuales, las pruebas de colaboraciones entre
clases pueden realizarse mediante la aplicación de métodos aleatorios y de particionamiento,
así como pruebas basadas en escenario y del comportamiento.
Al igual que todos los pasos de las pruebas, la validación trata de descubrir errores, pero el
enfoque está en el nivel de requerimientos: en las cosas que serán evidentes de inmediato
para el usuario final. Las pruebas de validación comienzan en la culminación de las pruebas
de integración, cuando se han empleado los componentes individuales, el software se en-
sambla completamente como un paquete y se han descubierto y corregido los errores de
interfaces. Al nivel de validación o del sistema, la distinción entre las diferentes categorías
de software desaparece. Las pruebas se enfocan en las acciones visibles para el usuario y la
salida del sistema reconocida por el usuario.
Podemos definir la validación de muchas formas, pero una definición simple (aunque
cruda) es que la validación tiene éxito cuando el software funciona de una forma que el
cliente pueda esperar razonablemente. En este punto, un desarrollador de software curtido
por la batalla podría protestar: "¿Quién o qué es el árbitro de expectativas razonables?". Si
se desarrolló una especificación de requerimientos de software, describe cada historia de
usuario, todos los atributos visibles para el usuario y los criterios de aceptación del cliente
para cada uno de ellos. Los criterios de aceptación del cliente forman la base de un enfoque
de pruebas de validación.
La validación del software se logra a través de una serie de pruebas que demuestran la
conformidad con los requerimientos. Un plan de pruebas describe las clases de pruebas a
realizar y un procedimiento de pruebas define los casos de prueba específicos diseñados
para asegurar que se cumpla con todos los requerimientos funcionales, se logren todas las
características del comportamiento, todo el contenido sea preciso y se presente de manera
adecuada, se obtengan todos los requerimientos de rendimiento, la documentación sea
correcta y se cumpla con los requerimientos de facilidad de uso y otros más (como facilidad
de transporte, compatibilidad, recuperación de errores, facilidad de mantenimiento).
408 PARTE TRES CA LIDA D Y SE GURIDAD
CASASEGl ' RA
A nivel de validación o del sistema, desaparecen los detalles de las conexiones de las clases.
La validación del software 00 se enfoca en las acciones visibles para el usuario y las salidas
del sistema que el usuario reconoce. Para ayudar en la derivación de las pruebas de valida-
ción, el encargado de las pruebas debe basarse en los casos de uso (capítulos 7 y 8) que sean
parte del modelo de requerimientos. El caso de uso proporciona un escenario que tiene una
alta probabilidad de descubrir errores en los requerimientos de interacción con el usuario.
Los métodos convencionales de las pruebas de caja negra (capítulo 19) pueden usarse
para controlar las pruebas de validación. Además, puede optar por derivar los casos de prueba
del modelo de objeto-comportamiento creado como parte del análisis orientado a objetos
(AOO).
CAPÍTULO 20 PRUEBAS DE SOFTWARE: A NIVEL DE INTEGRACIÓN 409
Abstracto: este patrón orientado a objetos llamado pruebas por pares describe una técnica
analógica a la programación por pares [capítulo 3] , en la que dos personas encargadas
de las pruebas trabajan en conjunto para diseñar y ejecutar una serie de pruebas que puedan
aplicarse a las actividades de las pruebas unitarias, de integración o de validación.
Abstracto: es necesario probar todas las clases en un sistema orientado a objetos, inclui-
das las "clases internas" (es decir, clases que no exponen interfaces fuera del componente
que las utilizó). El patrón InterfazPruebaSeparada describe cómo crear una "interfaz de
prueba que pueda usarse para describir pruebas específicas en clases que sean visibles
solo de manera interna para un componente" [LanOl].
Abstracto: una vez que se realizan las pruebas unitarias y de integración, es necesario
determinar si el software se desempeñará de una forma que satisfaga a los usuarios. El
patrón PruebasEscenarios describe una técnica para ejecutar el software desde el punto
de vista del usuario. Una falla en este nivel indica que el software no logró cumplir un
requerimiento visible para el usuario [KanOl].
Un análisis más detallado de los patrones de prueba queda fuera del alcance de este libro.
Si le interesa, consulte [Bin99], [Mar02], [Tho04], [MaclO] y [Gonl7] para obtener más
información sobre este importante tema.
20. 7 RESUMEN
Las pruebas de integración construyen la arquitectura del software, y a la vez realizan pruebas
para descubrir errores asociados con las interfaces entre los componentes de software. El
objetivo es tomar componentes que se hayan sometido a pruebas unitarias y crear una es-
tructura del programa dictada por el diseño.
A menudo los desarrolladores de software dicen: "las pruebas nunca terminan; solo se
transfieren de uno [el ingeniero de software] al cliente. Cada vez que su cliente usa el pro-
grama, se está llevando a cabo una prueba". Al aplicar el diseño de casos de prueba, es
410 PARTE TR ES C ALIDAD Y SE GURIDAD
posible obtener pruebas más completas y, por lo tanto, descubrir y corregir el mayor número
de errores antes de que comiencen las "pruebas del cliente".
Hetzel [Het84] describe las pruebas de caja blanca como "pruebas en pequeño". Su
lógica es que las pruebas de caja blanca que consideramos en este capítulo se aplican por
lo general a componentes pequeños del programa (como módulos o pequeños grupos de
módulos). Por otro lado, las pruebas de caja negra amplían nuestro enfoque y podrían lla-
marse "pruebas en grande".
Las pruebas de integración de caja negra se basan en los requerimientos especificados
en las historias de usuario o en alguna otra representación de modelado de análisis. Los autores
de casos de prueba no necesitan esperar a que se escriba el código de implementación del
componente, siempre y cuando entiendan la funcionalidad requerida de los componentes
que se someten a las pruebas. Por lo general, las pruebas de validación se realizan con casos
de prueba de caja negra que producen acciones de entrada visibles para el usuario final y
comportamientos de salida observables.
Las pruebas de caja blanca requieren de un examen minucioso de los detalles de im-
plementación procedimentales y los detalles de implementación de estructuras de datos
para los componentes que se someten a las pruebas. Las pruebas de caja blanca pueden
diseñarse solo hasta que exista el diseño a nivel de componentes (o código fuente). Las
rutas lógicas a través del software y las colaboraciones entre componentes son el enfoque
de las pruebas de integración de caja blanca.
Las pruebas de integración del software 00 pueden lograrse mediante una estrategia
basada en hilos o en uso. Las pruebas basadas en hilos integran el conjunto de clases que
colaboran para responder a una entrada o evento. Las pruebas basadas en uso construyen el
sistema en niveles, comenzando con las clases que no usan clases servidor. Los métodos de diseño
de casos de uso de integración también pueden hacer uso de pruebas aleatorias y de partición.
Además, las pruebas basadas en escenarios y las pruebas derivadas de modelos del compor-
tamiento pueden usarse para probar una clase y sus colaboradoras. Una secuencia de pruebas
rastrea el flujo de operaciones a través de las colaboraciones de clases.
Las pruebas de validación de un sistema 00 están orientadas a la caja negra y pueden
realizarse mediante la aplicación de los mismos métodos de caja negra que vimos para el
software convencional. Sin embargo, las pruebas basadas en escenarios dominan la valida-
ción de los sistemas de 00; hacen del caso de uso un controlador principal para las pruebas
de validación.
Las pruebas de regresión son el proceso de re-ejecutar un caso de prueba seleccionado
después de realizar un cambio en un sistema de software. Las pruebas de regresión deben
ejecutarse cada vez que se agregan nuevos componentes o cambios a un incremento de
software. Las pruebas de regresión ayudan a asegurar que los cambios no introduzcan un
comportamiento inesperado o errores adicionales.
Los patrones de prueba describen problemas de pruebas comunes y soluciones que
pueden ayudarnos a lidiar con ellos. Si los patrones de prueba pueden ayudar a un equipo
de software a comunicarse sobre las pruebas con más eficiencia, entender las fuerzas mo-
tivacionales que conducen a un enfoque específico para las pruebas y abordar el diseño de
los casos de prueba como una actividad evolutiva en la que cada iteración resulta en una
suite más completa de casos de prueba, entonces los patrones han logrado mucho.
20.2. ¿Quién debe realizar las pruebas de validación: el desarrollador o el usuario del software?
Justifique su respuesta.
CAPÍTULO 20 PRUEBAS DE SOFTWARE: A NIVEL DE INTEGRACIÓN 411
20.3. ¿Las pruebas exhaustivas (incluso si es posible para programas muy pequeños) garantizan que
un programa sea 100% correcto?
20.4. ¿Por qué las "pruebas" deben comenzar con el análisis y diseño de los requerimientos?
20.5. ¿Deben probarse los requerimientos no funcionales (como seguridad o rendimiento) como
parte de las pruebas de integración?
20.6. ¿Por qué tenemos que volver a probar las subclases que se instancian de una clase existente, si
la clase existente ya se probó de manera exhaustiva?
20. 7. ¿Cuál es la diferencia entre las estrategias basadas en hilos y basadas en uso para las pruebas
de integración?
20.8. Desarrolle una estrategia de pruebas completa para el sistema CasaSegura que analizamos
antes en este libro. Documéntela en una especificación de pruebas.
20.9. Seleccione una de las historias de usuario del sistema CasaSegura para usarlo como la base de
las pruebas basadas en escenarios; elabore un conjunto de casos de prueba de integración necesarios
para realizar las pruebas de integración para esa historia de usuario.
20.10. Para los casos de prueba que escribió en el problema 20.9, identifique un subconjunto de casos
de prueba que usará para realizar pruebas de regresión en Jos componentes de software que se agregan
al programa.