19.05.2013 Views

Prueba de componentes de software basadas en el modelo de ...

Prueba de componentes de software basadas en el modelo de ...

Prueba de componentes de software basadas en el modelo de ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

UNIVERSIDAD AUTÓNOMA DE TLAXCALA<br />

DEPARTAMENTO DE INGENIERÍA Y TECNOLOGÍA<br />

UNIDAD DE ESTUDIOS DE POSGRADO<br />

PRUEBA DE COMPONENTES DE<br />

SOFTWARE BASADAS EN EL MODELO DE<br />

JAVABEANS<br />

TESIS<br />

QUE PARA OBTENER EL GRADO DE<br />

MAESTRO EN CIENCIAS<br />

EN INGENIERÍA EN COMPUTACIÓN<br />

PRESENTA:<br />

PERLA INÉS VELASCO ELIZONDO.<br />

DIRIGIDA POR:<br />

M.I. JUAN MANUEL FERNÁNDEZ PEÑA.<br />

M.C. MA. ELENA HERNÁNDEZ HERNÁNDEZ.<br />

APIZACO, TLAX. ABRIL DE 2001.


Dedico cariñosam<strong>en</strong>te este trabajo a:<br />

Mis padres, porque con su invaluable apoyo pu<strong>de</strong><br />

iniciar y terminar esta nueva etapa.<br />

Mi hermana Lilia.<br />

So<strong>de</strong>l, que comparte conmigo la emoción <strong>de</strong> este<br />

nuevo mom<strong>en</strong>to.<br />

Mi maestro y asesor Juan Manu<strong>el</strong> Fernán<strong>de</strong>z Peña.


Índice<br />

Resum<strong>en</strong> ........................................................................................................................ 1<br />

Abstract .......................................................................................................................... 2<br />

Introducción ................................................................................................................. 3<br />

1. Sofware Basado <strong>en</strong> Compon<strong>en</strong>tes ................................................................... 6<br />

1.1 El concepto <strong>de</strong> compon<strong>en</strong>te .......................................................................... 6<br />

1.2 El concepto <strong>de</strong> <strong>software</strong> basado <strong>en</strong> <strong>compon<strong>en</strong>tes</strong> ........................................ 8<br />

1.3 Objetos y <strong>compon<strong>en</strong>tes</strong> ................................................................................... 9<br />

1.4 Mo<strong>de</strong>los para <strong>el</strong> <strong>de</strong>sarrollo ............................................................................ 10<br />

1.4.1 COM y DCOM ..................................................................................... 10<br />

1.4.2 Corba ...........................................................................................…… 11<br />

1.4.3 JavaBeans .................................….............................................…..… 12<br />

1.4.3.1 El bean <strong>de</strong>v<strong>el</strong>opm<strong>en</strong>t kit ………………..……….....................…. 14<br />

2. Revisión Técnica sobre <strong>Prueba</strong> <strong>de</strong> Software ...................................... .. 17<br />

2.1 La prueba <strong>de</strong> <strong>software</strong> .................................................................................. 17<br />

2.2 Objetivos <strong>de</strong> la prueba <strong>de</strong>l <strong>software</strong> ............................................................ 19<br />

2.3 Métodos <strong>de</strong> prueba <strong>de</strong>l <strong>software</strong> .................................................................. 20<br />

2.3.1 <strong>Prueba</strong>s <strong>de</strong> caja blanca .................................................................... 20<br />

2.3.2 <strong>Prueba</strong>s <strong>de</strong> caja negra ...................................................................... 22<br />

2.4 Niv<strong>el</strong>es <strong>de</strong> prueba <strong>de</strong>l <strong>software</strong> .................................................................... 23<br />

2.5 <strong>Prueba</strong> <strong>de</strong> <strong>software</strong> para objetos ................................................................. 25<br />

2.5.1 G<strong>en</strong>eralida<strong>de</strong>s <strong>de</strong>l mo<strong>de</strong>lo <strong>de</strong> <strong>de</strong>sarrollo<br />

ori<strong>en</strong>tado a objetos ............................................................................ 26<br />

2.5.2 Aspectos a consi<strong>de</strong>rar <strong>en</strong> la prueba <strong>de</strong>l<br />

<strong>software</strong> ori<strong>en</strong>tado a objetos ............................................................. 27


2.5.3 Métodos <strong>de</strong> prueba <strong>de</strong> <strong>software</strong> ori<strong>en</strong>tado<br />

a objetos ........................................................................................... 30<br />

2.5.3.1 <strong>Prueba</strong>s <strong>de</strong> unidad ................................................................... 30<br />

2.5.3.2 <strong>Prueba</strong>s <strong>de</strong> integración ........................................................... 32<br />

2.5.3.3 <strong>Prueba</strong>s <strong>de</strong> sistema ................................................................ 34<br />

2.6 <strong>Prueba</strong> <strong>de</strong> <strong>software</strong> basado <strong>en</strong> <strong>compon<strong>en</strong>tes</strong> ............................................ 35<br />

2.6.1 Métodos <strong>de</strong> prueba <strong>de</strong> <strong>software</strong> basado<br />

<strong>en</strong> <strong>compon<strong>en</strong>tes</strong> ............................................................................... 35<br />

2.6.1.1 <strong>Prueba</strong>s <strong>de</strong> unidad .................................................................. 36<br />

2.6.1.2 <strong>Prueba</strong>s <strong>de</strong> integración ............................................................ 36<br />

3. Descripción <strong>de</strong>l Diseño ..................................................................................... 38<br />

3.1 Antece<strong>de</strong>ntes ............................................................................................... 38<br />

3.2 La prueba <strong>de</strong> beans ..................................................................................... 39<br />

3.3 Aspectos <strong>de</strong> diseño ..................................................................................... 42<br />

3.3.1 S<strong>el</strong>ección <strong>de</strong> los <strong>compon<strong>en</strong>tes</strong> .......................................................... 44<br />

3.3.2 La g<strong>en</strong>eración <strong>de</strong> casos <strong>de</strong> prueba .................................................... 46<br />

3.3.3 La ejecución <strong>de</strong> casos <strong>de</strong> prueba ...................................................... 50<br />

3.3.4 La pres<strong>en</strong>tación <strong>de</strong> resultados ........................................................... 52<br />

4. Descripción <strong>de</strong> la Arquitectura e Implem<strong>en</strong>tación ...................................... 56<br />

4.1 Arquitectura y colaboración <strong>en</strong>tre clases ..................................................... 56<br />

4.1.1 La invocación <strong>de</strong> los servicios .......................................................... 59<br />

4.1.2 La extracción <strong>de</strong> archivos jar ............................................................ 61<br />

4.1.3 La g<strong>en</strong>eración <strong>de</strong> casos <strong>de</strong> prueba .................................................. 64<br />

4.1.4 La ejecución <strong>de</strong> casos <strong>de</strong> prueba g<strong>en</strong>erados<br />

automáticam<strong>en</strong>te .............................................................................. 67<br />

4.1.5 La ejecución <strong>de</strong> casos <strong>de</strong> prueba g<strong>en</strong>erados<br />

manualm<strong>en</strong>te .................................................................................... 70<br />

4.1.6 La pres<strong>en</strong>tación <strong>de</strong> resultados ......................................................... 73


5. <strong>Prueba</strong>s <strong>de</strong> Funcionami<strong>en</strong>to ............................................................................ 77<br />

5.1 Los <strong>compon<strong>en</strong>tes</strong> utilizados .......................................................................... 77<br />

5.2 El compon<strong>en</strong>te Puzzle ................................................................................ 78<br />

5.2.1 Los resultados observados ................................................................. 80<br />

5.3 El compon<strong>en</strong>te TextEditor ........................................................................... 82<br />

5.3.1 Los resultados observados ................................................................. 84<br />

5.4 El compon<strong>en</strong>te ProgressBar ........................................................................ 86<br />

5.4.1 Los resultados observados ................................................................. 87<br />

Conclusiones ............................................................................................................ 89<br />

Anexo A ...................................................................................................................... 91<br />

Anexo B ..................................................................................................................... 93<br />

Anexo C ..................................................................................................................... 106<br />

Refer<strong>en</strong>cias bibliográficas ................................................................................... 109


Resum<strong>en</strong>.<br />

El <strong>de</strong>sarrollo <strong>de</strong> <strong>software</strong> basado <strong>en</strong> <strong>compon<strong>en</strong>tes</strong> hace necesario contar con<br />

herrami<strong>en</strong>tas a<strong>de</strong>cuadas; <strong>en</strong>tre <strong>el</strong>las se <strong>en</strong>cu<strong>en</strong>tran las herrami<strong>en</strong>tas <strong>de</strong> prueba. Los JavaBeans<br />

repres<strong>en</strong>tan una forma <strong>de</strong> construir aplicaciones a partir <strong>de</strong> <strong>compon<strong>en</strong>tes</strong> preexist<strong>en</strong>tes. Por <strong>el</strong><br />

mom<strong>en</strong>to solo hay ayuda para probar aspectos gráficos <strong>de</strong> sus interfaces <strong>de</strong> usuario, pero no<br />

<strong>de</strong>l funcionami<strong>en</strong>to interno <strong>de</strong> los beans. Este trabajo pres<strong>en</strong>ta una herrami<strong>en</strong>ta <strong>de</strong> prueba <strong>de</strong><br />

<strong>compon<strong>en</strong>tes</strong> <strong>de</strong> <strong>software</strong> construidas bajo <strong>el</strong> mo<strong>de</strong>lo <strong>de</strong> JavaBeans. El objetivo <strong>de</strong> la<br />

herrami<strong>en</strong>ta es proveer al usuario <strong>de</strong> directrices que le permitan realizar las tareas <strong>de</strong> s<strong>el</strong>ección<br />

y evaluación <strong>de</strong> las <strong>compon<strong>en</strong>tes</strong> mediante la g<strong>en</strong>eración y ejecución automática <strong>de</strong> casos <strong>de</strong><br />

prueba.<br />

1


Abstract.<br />

Compon<strong>en</strong>t-based <strong>software</strong> <strong>de</strong>v<strong>el</strong>opm<strong>en</strong>t makes necessary to have a<strong>de</strong>quate tools;<br />

some of them are testing tools. JavaBeans are a way to build applications based in preexist<strong>en</strong>t<br />

compon<strong>en</strong>ts. At pres<strong>en</strong>t testing of interfaces’ graphical aspects is available, but testing beans’<br />

internal behavior is not. This work pres<strong>en</strong>ts a testing tool for <strong>software</strong> compon<strong>en</strong>ts using the<br />

JavaBeans mo<strong>de</strong>l. Testing tool’s objective is to offer gui<strong>de</strong>s to users on compon<strong>en</strong>ts s<strong>el</strong>ection<br />

and evaluation through automatic execution and g<strong>en</strong>eration of test cases.<br />

2


Introducción.<br />

Actualm<strong>en</strong>te <strong>el</strong> reuso <strong>de</strong> <strong>el</strong>em<strong>en</strong>tos preexist<strong>en</strong>tes es una práctica común <strong>en</strong> la actividad<br />

<strong>de</strong> <strong>de</strong>sarrollo <strong>de</strong> <strong>software</strong>. Situaciones como la compet<strong>en</strong>cia <strong>en</strong> <strong>el</strong> mercado para g<strong>en</strong>erar<br />

nuevos productos o actualizar versiones, han propiciado que muchos <strong>de</strong>sarrolladores busqu<strong>en</strong><br />

nuevas opciones para g<strong>en</strong>erar <strong>software</strong> <strong>en</strong> tiempos muy cortos. Incluso, <strong>en</strong> ambi<strong>en</strong>tes <strong>de</strong><br />

<strong>de</strong>sarrollo no comercial, la actividad <strong>de</strong>l reuso también se lleva a cabo; un simple ejemplo es<br />

la inclusión <strong>de</strong> bibliotecas o clases <strong>en</strong> los programas <strong>de</strong> un estudiante, con <strong>el</strong> fin <strong>de</strong> reutilizar<br />

funciones o métodos ya implem<strong>en</strong>tados.<br />

La creación <strong>de</strong> nuevas metodologías <strong>de</strong> <strong>de</strong>sarrollo, cuyas características han permitido<br />

alcanzar <strong>en</strong> diversos grados la rápida construcción <strong>de</strong> programas, han consi<strong>de</strong>rado al reuso<br />

como una actividad básica, contribuy<strong>en</strong>do así a que esta se convierta <strong>en</strong> una alternativa<br />

atractiva <strong>en</strong> la construcción <strong>de</strong> <strong>software</strong>. El <strong>de</strong>sarrollo ori<strong>en</strong>tado a objetos y <strong>el</strong> <strong>de</strong>sarrollo<br />

basado <strong>en</strong> <strong>compon<strong>en</strong>tes</strong>, son ejemplos significativos <strong>de</strong> lo planteado anteriorm<strong>en</strong>te. A pesar <strong>de</strong><br />

la aceptación alcanzada por estos <strong>en</strong>foques, una <strong>de</strong> las más importantes limitaciones que<br />

surg<strong>en</strong>, es la falta <strong>de</strong> garantías que se ti<strong>en</strong><strong>en</strong> <strong>de</strong> que <strong>el</strong> o los <strong>el</strong>em<strong>en</strong>tos <strong>de</strong> <strong>software</strong> que se están<br />

reusando funcion<strong>en</strong> correctam<strong>en</strong>te <strong>en</strong> todas las ocasiones, situación que influye<br />

consi<strong>de</strong>rablem<strong>en</strong>te <strong>en</strong> la calidad <strong>de</strong> los productos que se <strong>de</strong>sarrollan.<br />

Java Beans, actualm<strong>en</strong>te es uno <strong>de</strong> los mo<strong>de</strong>los <strong>de</strong> <strong>de</strong>sarrollo basados <strong>en</strong> <strong>compon<strong>en</strong>tes</strong><br />

con gran aceptación, factores como la in<strong>de</strong>p<strong>en</strong><strong>de</strong>ncia <strong>de</strong>l sistema operativo, con lo que se<br />

pret<strong>en</strong><strong>de</strong> <strong>el</strong>iminar los problemas <strong>de</strong> plataforma y <strong>software</strong>, interoperabilidad y capacidad <strong>de</strong><br />

trabajar <strong>en</strong> ambi<strong>en</strong>tes distribuidos, contribuy<strong>en</strong> a que <strong>el</strong> número <strong>de</strong> personas que utilizan este<br />

mo<strong>de</strong>lo este creci<strong>en</strong>do notablem<strong>en</strong>te. A pesar <strong>de</strong> esto, <strong>el</strong> área <strong>de</strong> pruebas es poco robusta.<br />

Definitivam<strong>en</strong>te, la prueba <strong>de</strong> <strong>software</strong> es una actividad que <strong>de</strong> una u otra manera es<br />

llevada a cabo <strong>en</strong> algún mom<strong>en</strong>to al m<strong>en</strong>os por su <strong>de</strong>sarrollador original. Para <strong>el</strong>lo este pue<strong>de</strong><br />

planear y realizar un proceso <strong>de</strong> prueba <strong>en</strong>focado a un ambi<strong>en</strong>te <strong>en</strong> <strong>el</strong> que espera operará su<br />

producto. Aunque esto es aceptable, pue<strong>de</strong> no ser sufici<strong>en</strong>te. Muchas veces <strong>el</strong> ambi<strong>en</strong>te <strong>de</strong><br />

operación p<strong>en</strong>sado por <strong>el</strong> <strong>de</strong>sarrollador pue<strong>de</strong> diferir <strong>de</strong>l ambi<strong>en</strong>te que se pres<strong>en</strong>ta para la<br />

3


persona que utiliza finalm<strong>en</strong>te dicho <strong>el</strong>em<strong>en</strong>to <strong>de</strong> <strong>software</strong>, por lo que <strong>en</strong> la prueba<br />

<strong>de</strong>sarrollada se pue<strong>de</strong>n haber ignorado algunas situaciones. Así mismo, cuando una persona<br />

distinta al <strong>de</strong>sarrollador <strong>de</strong>sea probar un <strong>el</strong>em<strong>en</strong>to que está reusando, <strong>el</strong> hecho <strong>de</strong> ser un<br />

<strong>el</strong>em<strong>en</strong>to reutilizable, <strong>de</strong> los que g<strong>en</strong>eralm<strong>en</strong>te no se ti<strong>en</strong>e mucha información, dificulta esta<br />

actividad. En <strong>el</strong> caso <strong>de</strong> los <strong>compon<strong>en</strong>tes</strong>, que normalm<strong>en</strong>te se ofrec<strong>en</strong> como productos<br />

terminados, no se dispone <strong>de</strong>l código fu<strong>en</strong>te, por lo que es difícil inspeccionar completam<strong>en</strong>te<br />

su estructura interna. Este, a<strong>de</strong>más <strong>de</strong> otros factores propios <strong>de</strong>l mo<strong>de</strong>lo <strong>de</strong> <strong>de</strong>sarrollo impi<strong>de</strong>n<br />

que un proceso <strong>de</strong> prueba pueda llevarse a cabo fácil y efici<strong>en</strong>tem<strong>en</strong>te.<br />

Actualm<strong>en</strong>te son pocas las herrami<strong>en</strong>tas que permit<strong>en</strong> evaluar <strong>el</strong>em<strong>en</strong>tos preexist<strong>en</strong>tes.<br />

Cuando algui<strong>en</strong> requiere integrar un <strong>el</strong>em<strong>en</strong>to <strong>de</strong> <strong>software</strong> para construir una aplicación o<br />

simplem<strong>en</strong>te para utilizarla <strong>de</strong> forma aislada, la evaluación que se realiza radica <strong>en</strong> la mayoría<br />

<strong>de</strong> los casos <strong>en</strong> una prueba manual, que <strong>en</strong> <strong>el</strong> peor <strong>de</strong> los casos no es nada sistematizada ni<br />

fundam<strong>en</strong>tada. Si <strong>el</strong> usuario requiriera realizar una prueba más exhaustiva, esta prueba seria<br />

más amplia y formal, pero <strong>en</strong> raras ocasiones automatizada, por lo que para llevarla acabo se<br />

requiere una cantidad <strong>de</strong> tiempo consi<strong>de</strong>rable.<br />

Tomado como temas c<strong>en</strong>trales <strong>el</strong> <strong>de</strong>sarrollo basado <strong>en</strong> <strong>compon<strong>en</strong>tes</strong> y la prueba <strong>de</strong><br />

<strong>software</strong>, <strong>el</strong> propósito <strong>de</strong> este trabajo es pres<strong>en</strong>tar una alternativa para la prueba <strong>de</strong><br />

<strong>compon<strong>en</strong>tes</strong>. Esto se llevará a cabo mediante la implem<strong>en</strong>tación <strong>de</strong> una herrami<strong>en</strong>ta que<br />

permita realizar pruebas a <strong>compon<strong>en</strong>tes</strong> <strong>de</strong>sarrollados bajo <strong>el</strong> mo<strong>de</strong>lo propuesto por Sun<br />

Microsystems, Java Beans.<br />

Haci<strong>en</strong>do uso <strong>de</strong> las funcionalida<strong>de</strong>s que ofrecerá esta herrami<strong>en</strong>ta, se podrán realizar<br />

<strong>de</strong> forma automática la g<strong>en</strong>eración y ejecución <strong>de</strong> casos <strong>de</strong> prueba, <strong>de</strong> modo que con los<br />

resultados obt<strong>en</strong>idos <strong>en</strong> esta última actividad, <strong>el</strong> usuario <strong>de</strong> los <strong>compon<strong>en</strong>tes</strong> pueda t<strong>en</strong>er<br />

algunas directrices que le permitan realizar con mayor facilidad las tareas <strong>de</strong> s<strong>el</strong>ección y<br />

evaluación <strong>de</strong> las mismas.<br />

4


El tipo <strong>de</strong> prueba que realizará la herrami<strong>en</strong>ta es a niv<strong>el</strong> <strong>de</strong> unidad, utilizándose para<br />

<strong>el</strong>lo técnicas <strong>de</strong> prueba funcional. Así mismo, los servicios que ofrecerá la herrami<strong>en</strong>ta<br />

estarán ori<strong>en</strong>tados a los usuarios <strong>de</strong> los <strong>compon<strong>en</strong>tes</strong>, más que a los <strong>de</strong>sarrolladores originales.<br />

Con <strong>el</strong> propósito <strong>de</strong> <strong>de</strong>scribir <strong>el</strong> trabajo que se realizará para la creación <strong>de</strong> la<br />

herrami<strong>en</strong>ta, este trabajo se organiza fundam<strong>en</strong>talm<strong>en</strong>te <strong>en</strong> dos partes, <strong>en</strong> la primera que<br />

compr<strong>en</strong><strong>de</strong> los capítulos 1 y 2, se pres<strong>en</strong>ta <strong>de</strong> acuerdo a una revisión bibliográfica los temas<br />

Software Basado <strong>en</strong> Compon<strong>en</strong>tes y Métodos <strong>de</strong> <strong>Prueba</strong> <strong>de</strong> <strong>software</strong> respectivam<strong>en</strong>te, <strong>en</strong> los<br />

cuales se pret<strong>en</strong><strong>de</strong> proporcionar al lector un marco teórico <strong>de</strong> refer<strong>en</strong>cia con respecto al diseño<br />

<strong>de</strong> aplicación a <strong>de</strong>sarrollar. La segunda parte que compr<strong>en</strong><strong>de</strong> <strong>de</strong> los capítulos 3 al 5, se<br />

conc<strong>en</strong>tra <strong>en</strong> la <strong>de</strong>scripción <strong>de</strong> la herrami<strong>en</strong>ta implem<strong>en</strong>tada. Para <strong>el</strong>lo <strong>en</strong> <strong>el</strong> capítulo 3<br />

“Descripción <strong>de</strong>l Diseño”, como su nombre lo indica, se pres<strong>en</strong>tarán las consi<strong>de</strong>raciones con<br />

respecto al diseño <strong>de</strong> la herrami<strong>en</strong>ta <strong>de</strong> prueba. En <strong>el</strong> capitulo 4 “Descripción <strong>de</strong> la<br />

Arquitectura e Implem<strong>en</strong>tación”, se <strong>de</strong>scrib<strong>en</strong> <strong>de</strong>talles refer<strong>en</strong>te a la implem<strong>en</strong>tación. En <strong>el</strong><br />

quinto y último capitulo “<strong>Prueba</strong>s <strong>de</strong> Funcionami<strong>en</strong>to”, se pres<strong>en</strong>tan algunas <strong>de</strong> las pruebas<br />

realizadas con <strong>el</strong> propósito <strong>de</strong> verificar <strong>el</strong> a<strong>de</strong>cuado funcionami<strong>en</strong>to <strong>de</strong> la aplicación.<br />

Al final <strong>de</strong> este docum<strong>en</strong>to, se <strong>en</strong>cu<strong>en</strong>tran secciones que conti<strong>en</strong><strong>en</strong> las conclusiones,<br />

obt<strong>en</strong>idas como producto <strong>de</strong> este trabajo, una sección <strong>en</strong> don<strong>de</strong> se citan las refer<strong>en</strong>cias<br />

bibliográficas, y anexos.<br />

El Anexo A que conti<strong>en</strong>e información refer<strong>en</strong>te a los valores establecidos para la<br />

g<strong>en</strong>eración <strong>de</strong> casos <strong>de</strong> prueba. El anexo B conti<strong>en</strong>e <strong>el</strong> manual <strong>de</strong>l usuario <strong>de</strong> la herrami<strong>en</strong>ta.<br />

El anexo C pres<strong>en</strong>ta <strong>de</strong>talles <strong>de</strong> la notación utilizada para la <strong>de</strong>scripción <strong>de</strong>l diseño.<br />

5


Capítulo 1<br />

Software Basado <strong>en</strong> Compon<strong>en</strong>tes.<br />

Como respuesta a la necesidad <strong>de</strong> buscar alternativas que permitan hacer más fáciles<br />

las tareas <strong>de</strong> <strong>de</strong>sarrollo e integración <strong>de</strong> <strong>software</strong>, uno <strong>de</strong> los más reci<strong>en</strong>tes mo<strong>de</strong>los <strong>de</strong><br />

<strong>de</strong>sarrollo es <strong>el</strong> <strong>de</strong> <strong>compon<strong>en</strong>tes</strong>. Aspectos como <strong>el</strong> reuso y la interoperabilidad, muy<br />

importantes <strong>en</strong> la actualidad, son característicos <strong>de</strong> este <strong>en</strong>foque. Pue<strong>de</strong> visualizarse como un<br />

mo<strong>de</strong>lo <strong>de</strong> <strong>de</strong>sarrollo bastante prometedor.<br />

Con <strong>el</strong> propósito <strong>de</strong> ofrecer información que permita al lector conocer sobre <strong>el</strong><br />

<strong>de</strong>sarrollo a partir <strong>de</strong> <strong>compon<strong>en</strong>tes</strong>, <strong>en</strong> este capítulo se pres<strong>en</strong>ta una <strong>de</strong>scripción <strong>de</strong>l mo<strong>de</strong>lo<br />

con base <strong>en</strong> sus principales características. Así mismo, al término <strong>de</strong> esta <strong>de</strong>scripción, se<br />

pres<strong>en</strong>tarán tres mo<strong>de</strong>los muy populares que actualm<strong>en</strong>te se ofrec<strong>en</strong> <strong>en</strong> <strong>el</strong> mercado para<br />

construir <strong>software</strong> bajo esta modalidad: COM+/DCOM, CORBA, y Java Beans.<br />

1.1 El concepto <strong>de</strong> compon<strong>en</strong>te.<br />

La palabra compon<strong>en</strong>te nos hace p<strong>en</strong>sar <strong>en</strong> una unidad o <strong>el</strong>em<strong>en</strong>to con propósito bi<strong>en</strong><br />

<strong>de</strong>finido que, trabajando <strong>en</strong> conjunto con otras, pue<strong>de</strong> ofrecer alguna funcionalidad compleja.<br />

Transportando este concepto al contexto <strong>de</strong> ing<strong>en</strong>iería <strong>de</strong> <strong>software</strong>, específicam<strong>en</strong>te <strong>de</strong><br />

<strong>de</strong>sarrollo basado <strong>en</strong> <strong>compon<strong>en</strong>tes</strong>, un compon<strong>en</strong>te es la pieza <strong>el</strong>em<strong>en</strong>tal <strong>de</strong> este <strong>en</strong>foque <strong>de</strong><br />

<strong>de</strong>sarrollo, <strong>de</strong> esta forma, a partir <strong>de</strong> <strong>compon<strong>en</strong>tes</strong> exist<strong>en</strong>tes pue<strong>de</strong>n llegarse a construir<br />

aplicaciones completas.<br />

En términos formales, y <strong>de</strong> acuerdo con [MAR96], un compon<strong>en</strong>te es una pieza <strong>de</strong><br />

<strong>software</strong> que cumple con dos características: no <strong>de</strong>p<strong>en</strong><strong>de</strong> <strong>de</strong> la aplicación que la utiliza y, se<br />

pue<strong>de</strong> emplear <strong>en</strong> diversas aplicaciones.<br />

Según se cita [SZY97], los asist<strong>en</strong>tes a la ECOOP96 <strong>de</strong>fin<strong>en</strong> a un compon<strong>en</strong>te como<br />

una unidad <strong>de</strong> composición con interfaces <strong>de</strong>finidas contractualm<strong>en</strong>te y <strong>de</strong>p<strong>en</strong><strong>de</strong>ncias<br />

6


contextuales explícitas solam<strong>en</strong>te. Un compon<strong>en</strong>te <strong>de</strong> <strong>software</strong> pue<strong>de</strong> <strong>de</strong>splegarse<br />

in<strong>de</strong>p<strong>en</strong>di<strong>en</strong>tem<strong>en</strong>te y estar sujeta a composición por terceros.<br />

El análisis <strong>de</strong> las i<strong>de</strong>as pres<strong>en</strong>tadas <strong>en</strong> estas <strong>de</strong>finiciones y, <strong>de</strong> acuerdo con lo que<br />

plantea [FER99], se pue<strong>de</strong>n i<strong>de</strong>ntificar características <strong>en</strong> común:<br />

- Ori<strong>en</strong>tación al reuso, lo que nos hace p<strong>en</strong>sar <strong>en</strong> algo que se pue<strong>de</strong> tomar y utilizar<br />

más <strong>de</strong> una vez.<br />

- Interoperabilidad, <strong>el</strong> compon<strong>en</strong>te no pue<strong>de</strong> solo usarse <strong>de</strong> forma aislada, sino que<br />

pue<strong>de</strong> integrarse a otras y trabajar conjuntam<strong>en</strong>te.<br />

- Función significativa, <strong>el</strong> compon<strong>en</strong>te ti<strong>en</strong>e una función bi<strong>en</strong> <strong>de</strong>finida, i<strong>de</strong>ntificable<br />

y difer<strong>en</strong>ciable.<br />

- Encapsulami<strong>en</strong>to, g<strong>en</strong>eralm<strong>en</strong>te los <strong>compon<strong>en</strong>tes</strong> ocultan <strong>de</strong>talles acerca <strong>de</strong> su<br />

implem<strong>en</strong>tación.<br />

Una <strong>de</strong>finición más ori<strong>en</strong>tada a un <strong>en</strong>foque <strong>de</strong> <strong>de</strong>sarrollo, es la pres<strong>en</strong>tada <strong>en</strong> [DSO99]<br />

<strong>en</strong> la que un compon<strong>en</strong>te se <strong>de</strong>fine como un paquete coher<strong>en</strong>te <strong>de</strong> una implem<strong>en</strong>tación <strong>de</strong><br />

<strong>software</strong> que pue<strong>de</strong> ser in<strong>de</strong>p<strong>en</strong>di<strong>en</strong>tem<strong>en</strong>te <strong>de</strong>sarrollado y <strong>en</strong>tregado, ti<strong>en</strong>e interfaces<br />

explícitas y bi<strong>en</strong> especificadas para informar los servicios que provee y espera <strong>de</strong> otros, pue<strong>de</strong><br />

estar constituido por otros <strong>compon<strong>en</strong>tes</strong>, quizás mediante la especialización <strong>de</strong> algunas <strong>de</strong> sus<br />

propieda<strong>de</strong>s, sin que esto signifique modificar los <strong>compon<strong>en</strong>tes</strong> mismos.<br />

Tomando esta última <strong>de</strong>finición se pue<strong>de</strong>n <strong>en</strong>riquecer algunas <strong>de</strong> las características<br />

pres<strong>en</strong>tadas antes consi<strong>de</strong>rando también:<br />

- Una lista <strong>de</strong> interfaces proveídas y requeridas, las cuales repres<strong>en</strong>tan mecanismos<br />

indisp<strong>en</strong>sables para la interoperabilidad <strong>de</strong> los <strong>compon<strong>en</strong>tes</strong>.<br />

7


- Una especificación externa, medio que permite principalm<strong>en</strong>te i<strong>de</strong>ntificar la función<br />

<strong>de</strong>l compon<strong>en</strong>te.<br />

- El código <strong>de</strong> validación, necesario para verificar, cuando se utilizan mas <strong>de</strong> un<br />

compon<strong>en</strong>te, si se conectaron correctam<strong>en</strong>te.<br />

- El código ejecutable <strong>de</strong>l compon<strong>en</strong>te.<br />

1.2 El concepto <strong>de</strong> <strong>software</strong> basado <strong>en</strong> <strong>compon<strong>en</strong>tes</strong>.<br />

El concepto <strong>de</strong> <strong>software</strong> basado <strong>en</strong> <strong>compon<strong>en</strong>tes</strong> consi<strong>de</strong>ra a todas aqu<strong>el</strong>las<br />

aplicaciones que se construy<strong>en</strong> haci<strong>en</strong>do uso <strong>de</strong> <strong>compon<strong>en</strong>tes</strong> <strong>de</strong> <strong>software</strong>.<br />

En la <strong>de</strong>finición pres<strong>en</strong>tada para este concepto por [DSO99], se habla <strong>de</strong> un <strong>en</strong>foque<br />

<strong>de</strong> <strong>de</strong>sarrollo <strong>de</strong> <strong>software</strong> <strong>en</strong> <strong>el</strong> cual todos los artefactos -<strong>de</strong>s<strong>de</strong> código ejecutable para la<br />

especificación <strong>de</strong> la interfaz, arquitecturas, mo<strong>de</strong>los <strong>de</strong> negocios, escalar aplicaciones<br />

completas y <strong>de</strong>scomposición <strong>de</strong> sistemas <strong>en</strong> partes- pue<strong>de</strong>n ser construidos por <strong>en</strong>samble,<br />

adaptación y conexión <strong>de</strong> <strong>compon<strong>en</strong>tes</strong> exist<strong>en</strong>tes <strong>de</strong>ntro <strong>de</strong> una variedad <strong>de</strong> configuraciones.<br />

Es claro que las características <strong>de</strong>scritas para este <strong>en</strong>foque <strong>de</strong> <strong>de</strong>sarrollo su<strong>en</strong>an<br />

bastante atractivas; <strong>de</strong> hecho muchos autores resaltan algunas otras como <strong>el</strong> reuso <strong>de</strong><br />

implem<strong>en</strong>taciones e interfaces, la facilidad <strong>de</strong> mant<strong>en</strong>imi<strong>en</strong>to y actualización <strong>de</strong> aplicaciones<br />

o la posibilidad <strong>de</strong> <strong>de</strong>sarrollo <strong>en</strong> paral<strong>el</strong>o <strong>de</strong> difer<strong>en</strong>tes partes <strong>de</strong> un sistema. Ante este<br />

panorama, es importante hacer m<strong>en</strong>ción <strong>de</strong> que al ser esta un área <strong>de</strong> investigación<br />

r<strong>el</strong>ativam<strong>en</strong>te jov<strong>en</strong>, exist<strong>en</strong> muchos aspectos que aún no son lo sufici<strong>en</strong>tem<strong>en</strong>te robustos.<br />

Car<strong>en</strong>cias como <strong>el</strong> soporte disponible, la s<strong>el</strong>ección <strong>de</strong> <strong>compon<strong>en</strong>tes</strong>, <strong>el</strong> manejo <strong>de</strong> excepciones<br />

o bi<strong>en</strong> la prueba <strong>de</strong> integración <strong>de</strong> <strong>compon<strong>en</strong>tes</strong> son situaciones que se <strong>de</strong>stacan <strong>en</strong> [FER99].<br />

8


1.3 Objetos y <strong>compon<strong>en</strong>tes</strong>.<br />

Exist<strong>en</strong> algunos aspectos comunes <strong>en</strong>tre los objetos y los <strong>compon<strong>en</strong>tes</strong> que pue<strong>de</strong>n<br />

hacer que estos se <strong>en</strong>ti<strong>en</strong>dan como conceptos equival<strong>en</strong>tes. Aunque hay similitu<strong>de</strong>s, exist<strong>en</strong><br />

marcadas difer<strong>en</strong>cias que permit<strong>en</strong> <strong>en</strong>t<strong>en</strong><strong>de</strong>rlos como <strong>en</strong>tida<strong>de</strong>s difer<strong>en</strong>tes, aunque no por <strong>el</strong>lo<br />

excluy<strong>en</strong>tes una <strong>de</strong> otra.<br />

Según [DSO99] los <strong>compon<strong>en</strong>tes</strong> son artefactos <strong>de</strong> <strong>software</strong> que repres<strong>en</strong>tan <strong>el</strong> trabajo<br />

realizado por los <strong>de</strong>sarrolladores. Por otra parte, un objeto se concibe como una instancia<br />

i<strong>de</strong>ntificable creada <strong>en</strong> <strong>el</strong> sistema <strong>en</strong> ejecución, <strong>el</strong> cual es parte <strong>de</strong> un compon<strong>en</strong>te. Esta i<strong>de</strong>a<br />

permite compr<strong>en</strong><strong>de</strong>r que un compon<strong>en</strong>te pue<strong>de</strong> cont<strong>en</strong>er uno o más objetos. En términos<br />

reales, un compon<strong>en</strong>te se manifiesta frecu<strong>en</strong>tem<strong>en</strong>te como una colección <strong>de</strong> objetos.<br />

Finalm<strong>en</strong>te, con <strong>el</strong> propósito <strong>de</strong> difer<strong>en</strong>ciar a los <strong>compon<strong>en</strong>tes</strong> <strong>de</strong> los objetos, a<br />

continuación se pres<strong>en</strong>tan algunas características que se <strong>de</strong>stacan <strong>en</strong> [FER99] y [DSO99]:<br />

- Los <strong>compon<strong>en</strong>tes</strong> ti<strong>en</strong><strong>en</strong> persist<strong>en</strong>cia, los objetos solo utilizan memoria.<br />

- Los <strong>compon<strong>en</strong>tes</strong> utilizan otras formas <strong>de</strong> comunicación como ev<strong>en</strong>tos, <strong>en</strong> lugar <strong>de</strong><br />

limitarse al uso <strong>de</strong> m<strong>en</strong>sajes como los objetos.<br />

- La granularidad <strong>de</strong> los <strong>compon<strong>en</strong>tes</strong> es mayor que la <strong>de</strong> los objetos, un<br />

compon<strong>en</strong>te pue<strong>de</strong> pres<strong>en</strong>tarse como varios objetos <strong>de</strong> difer<strong>en</strong>tes clases.<br />

- El paquete que conti<strong>en</strong>e a <strong>el</strong> compon<strong>en</strong>te, incluye la especificación <strong>de</strong> las<br />

interfaces proveídas y requeridas, mi<strong>en</strong>tras que la <strong>en</strong> los objetos estas<br />

especificaciones se conc<strong>en</strong>tran <strong>en</strong> las operaciones proveídas.<br />

9


1.4 Mo<strong>de</strong>los para <strong>el</strong> <strong>de</strong>sarrollo.<br />

La metodología <strong>de</strong> <strong>de</strong>sarrollo basada <strong>en</strong> <strong>compon<strong>en</strong>tes</strong>, ha adquirido <strong>el</strong> respaldo <strong>de</strong><br />

compañías importantes como Microsoft y Sun que han propuesto sus propios mo<strong>de</strong>los <strong>de</strong><br />

<strong>de</strong>sarrollo. En las sigui<strong>en</strong>tes secciones se <strong>de</strong>scrib<strong>en</strong> tres <strong>de</strong> los más populares actualm<strong>en</strong>te,<br />

COM+/DCOM, CORBA y Java Beans.<br />

1.4.1 COM y DCOM.<br />

El Compon<strong>en</strong>t Object Mo<strong>de</strong>l (COM), es la propuesta <strong>de</strong> Microsoft <strong>en</strong> materia <strong>de</strong><br />

<strong>compon<strong>en</strong>tes</strong>, [MIC00]. Aunque inicialm<strong>en</strong>te fue creado para resolver problemas <strong>en</strong> la<br />

construcción <strong>de</strong> docum<strong>en</strong>tos con OLE para Windows 3.1, este mo<strong>de</strong>lo ha sido <strong>en</strong>riquecido con<br />

<strong>el</strong> propósito <strong>de</strong> permitir la construcción <strong>de</strong> aplicaciones a partir <strong>de</strong> <strong>compon<strong>en</strong>tes</strong>.<br />

COM es es<strong>en</strong>cialm<strong>en</strong>te un esquema <strong>de</strong> integración, <strong>de</strong> modo que los <strong>compon<strong>en</strong>tes</strong> que<br />

se construy<strong>en</strong> para trabajar bajo este mo<strong>de</strong>lo, <strong>de</strong>b<strong>en</strong> <strong>de</strong>scribir su comportami<strong>en</strong>to bajo las<br />

consi<strong>de</strong>raciones <strong>de</strong> este esquema, <strong>el</strong> cual es popularm<strong>en</strong>te conocido como estándar binario.<br />

Este estándar permite que las interfaces <strong>de</strong> los <strong>compon<strong>en</strong>tes</strong> se pres<strong>en</strong>t<strong>en</strong> a los cli<strong>en</strong>tes como<br />

un conjunto <strong>de</strong> apuntadores a tablas <strong>en</strong> memoria, llamadas tablas virtuales <strong>de</strong> funciones o<br />

vtables. El llamado <strong>de</strong> funciones <strong>en</strong>tre <strong>compon<strong>en</strong>tes</strong> se realiza utilizando estos apuntadores,<br />

ocultándose así <strong>de</strong>talles <strong>de</strong> implem<strong>en</strong>tación, lo cual permite que <strong>compon<strong>en</strong>tes</strong> que estén<br />

escritos <strong>en</strong> difer<strong>en</strong>tes l<strong>en</strong>guajes <strong>de</strong> programación <strong>de</strong> los que se pue<strong>de</strong>n incluir a C++, Small<br />

Talk, Ada, VisualBasic, D<strong>el</strong>phi o Power Buil<strong>de</strong>r, puedan comunicarse.<br />

Dadas las características <strong>de</strong> las vtables, las interfaces no pue<strong>de</strong>n <strong>de</strong>finirse utilizando<br />

her<strong>en</strong>cia múltiple, porque se <strong>de</strong>b<strong>en</strong> consi<strong>de</strong>rar la posibilidad <strong>de</strong> t<strong>en</strong>er varias vtables y más <strong>de</strong><br />

un apuntador por interface.<br />

Las interfaces COM se <strong>de</strong>fin<strong>en</strong> utilizando un l<strong>en</strong>guaje especial <strong>de</strong>nominado IDL. La<br />

compilación <strong>de</strong> estas interfaces, produce una especie <strong>de</strong> librerías que conti<strong>en</strong><strong>en</strong> información<br />

sobre los meta<strong>de</strong>scriptores <strong>de</strong>l objeto, <strong>de</strong> sus interfaces, <strong>de</strong> las estructuras <strong>de</strong>finidas por <strong>el</strong><br />

10


usuario y <strong>de</strong> los <strong>el</strong>em<strong>en</strong>tos referidos por <strong>el</strong> compon<strong>en</strong>te, así como un mapa <strong>de</strong> memoria para<br />

las operaciones públicas.<br />

Distributed COM, mejor conocido como DCOM, es una ext<strong>en</strong>sión <strong>de</strong> COM que se<br />

implem<strong>en</strong>ta como una respuesta a la necesidad <strong>de</strong> aplicaciones distribuidas, proporcionando<br />

capacida<strong>de</strong>s para <strong>el</strong> trabajo con <strong>compon<strong>en</strong>tes</strong> que resi<strong>de</strong>n <strong>en</strong> difer<strong>en</strong>tes computadoras. DCOM<br />

utiliza como mecanismo <strong>de</strong> comunicación los llamados a procedimi<strong>en</strong>tos remotos (RPC), los<br />

cuales son transpar<strong>en</strong>tes para <strong>el</strong> cli<strong>en</strong>te.<br />

Tanto COM como DCOM son mo<strong>de</strong>los que inicialm<strong>en</strong>te fueron implem<strong>en</strong>tados para<br />

trabajar bajo ambi<strong>en</strong>tes Windows y Windows NT, sin embargo actualm<strong>en</strong>te exist<strong>en</strong> versiones<br />

para operar con MacOS y UNIX. Como se m<strong>en</strong>cionó inicialm<strong>en</strong>te <strong>el</strong> funcionami<strong>en</strong>to <strong>de</strong> COM<br />

y DCOM, se basa estrictam<strong>en</strong>te <strong>en</strong> <strong>el</strong> estándar binario, por lo que los <strong>compon<strong>en</strong>tes</strong> construidos<br />

para estos mo<strong>de</strong>los no son <strong>de</strong>l todo in<strong>de</strong>p<strong>en</strong>di<strong>en</strong>tes <strong>de</strong> la plataforma, <strong>en</strong> caso <strong>de</strong> migrar a otros<br />

<strong>en</strong>tornos, para po<strong>de</strong>r utilizare los <strong>compon<strong>en</strong>tes</strong> necesitan ser recompilados para la plataforma<br />

<strong>en</strong> que se van a utilizar o bi<strong>en</strong>, disponer <strong>el</strong> interprete <strong>de</strong>l formato binario correspondi<strong>en</strong>te.<br />

1.4.2 CORBA.<br />

CORBA, Common Object Request Broker Architecture, es una infraestructura abierta<br />

para <strong>el</strong> manejo <strong>de</strong> objetos distribuidos que esta si<strong>en</strong>do estandarizada por <strong>el</strong> Object<br />

Managem<strong>en</strong>t Group (OMG), [ORG00]. En CORBA, un objeto se consi<strong>de</strong>ra como una<br />

instancia <strong>de</strong> una clase que <strong>en</strong>capsula operaciones, atributos y excepciones.<br />

CORBA permite que los objetos puedan comunicarse con otros sin necesidad <strong>de</strong><br />

preocuparse por don<strong>de</strong> están localizados o por qui<strong>en</strong> han sido diseñados. Para esto, se han<br />

consi<strong>de</strong>rado algunos <strong>el</strong>em<strong>en</strong>tos importantes como: un l<strong>en</strong>guaje <strong>de</strong> <strong>de</strong>finición <strong>de</strong> interface<br />

(IDL) y una API que provee al programador la interacción cli<strong>en</strong>te-servidor <strong>en</strong>tre <strong>compon<strong>en</strong>tes</strong><br />

con la implem<strong>en</strong>tación especifica <strong>de</strong> un Object Request Broker (ORB), <strong>el</strong> cual es una especie<br />

<strong>de</strong> infraestructura <strong>en</strong> CORBA que permite que los objetos puedan comunicarse.<br />

11


Un compon<strong>en</strong>te expone un conjunto <strong>de</strong> interfaces, implem<strong>en</strong>tadas utilizando un<br />

l<strong>en</strong>guaje <strong>de</strong> <strong>de</strong>finición llamado OMG Interface Definition Language (OMG IDL), mismas que<br />

<strong>de</strong>fin<strong>en</strong> las operaciones <strong>de</strong> los objetos. Actualm<strong>en</strong>te exist<strong>en</strong> estándares para <strong>el</strong> mapeo <strong>de</strong> un<br />

IDL a l<strong>en</strong>guajes <strong>de</strong> programación como C, C++, Java, Smalltalk, o Ada.<br />

Una vez que la interfaz se ha <strong>de</strong>finido, se proce<strong>de</strong> a g<strong>en</strong>erar dos archivos especiales, un<br />

archivo <strong>de</strong>nominado stub para <strong>el</strong> cli<strong>en</strong>te y, un archivo sk<strong>el</strong>eton para <strong>el</strong> servidor, estos archivos<br />

son una especie <strong>de</strong> pegam<strong>en</strong>to <strong>en</strong>tre <strong>el</strong> cli<strong>en</strong>te y <strong>el</strong> servidor con <strong>el</strong> ORB que le permit<strong>en</strong><br />

acce<strong>de</strong>r a sus interfaces.<br />

El Object Request Broker (ORB), provee un mecanismo para la comunicación<br />

transpar<strong>en</strong>te <strong>en</strong>tre cli<strong>en</strong>tes y objetos, actuando como un intermediario para realizar la<br />

comunicación ya sea local o remota <strong>en</strong>tre <strong>compon<strong>en</strong>tes</strong>. El ORB simplifica la programación<br />

distribuida <strong>de</strong>sligando <strong>de</strong>l cli<strong>en</strong>te <strong>de</strong>talles sobre la invocación <strong>de</strong> los métodos. Para <strong>el</strong>lo,<br />

intercepta la solicitud, <strong>en</strong>cu<strong>en</strong>tra <strong>el</strong> objeto que correspon<strong>de</strong> a dicha solicitud, invoca al método<br />

correspondi<strong>en</strong>te y regresa <strong>el</strong> resultado. Al <strong>de</strong>legarse al ORB todas estas responsabilida<strong>de</strong>s, <strong>el</strong><br />

cli<strong>en</strong>te no ti<strong>en</strong>e que preocuparse por <strong>de</strong>talles sobre la localización <strong>de</strong>l objeto, sobre <strong>el</strong> l<strong>en</strong>guaje<br />

<strong>de</strong> programación <strong>en</strong> <strong>el</strong> cual <strong>el</strong> objeto ha sido implem<strong>en</strong>tado, <strong>de</strong>l sistema operativo, u otros<br />

aspectos propios <strong>de</strong>l sistema.<br />

1.4.3 JavaBeans.<br />

Actualm<strong>en</strong>te uno <strong>de</strong> los mo<strong>de</strong>los <strong>de</strong> <strong>de</strong>sarrollo <strong>de</strong> <strong>software</strong> basado <strong>en</strong> <strong>compon<strong>en</strong>tes</strong> con<br />

mayor aceptación, es <strong>el</strong> propuesto por Sun Microsystems [SUN97], conocido como Java<br />

Beans.<br />

Java Beans es una API implem<strong>en</strong>tada para la construcción y uso <strong>de</strong> <strong>compon<strong>en</strong>tes</strong><br />

escritos <strong>en</strong> Java, los cuales son comúnm<strong>en</strong>te llamados Beans. Esta API es proporcionada por<br />

SUN como una herrami<strong>en</strong>ta visual que permite la carga, utilización, modificación, así como<br />

también interconexión <strong>de</strong> Beans, con <strong>el</strong> propósito <strong>de</strong> construir nuevos Beans, applets o bi<strong>en</strong><br />

aplicaciones completas.<br />

12


Retomando la i<strong>de</strong>a <strong>de</strong> [VAN98] , una forma útil para <strong>de</strong>scribir a un Bean es<br />

comparándolo con una especie <strong>de</strong> caja negra; una unidad <strong>de</strong> la cual se conoce su funcionalidad<br />

pero no su implem<strong>en</strong>tación o estructura interna. Si<strong>en</strong>do un Bean un <strong>el</strong>em<strong>en</strong>to <strong>de</strong> <strong>software</strong><br />

sobre <strong>el</strong> cual solo se conoce su función, es preciso contar con algún mecanismo que permita la<br />

comunicación con él. En este mo<strong>de</strong>lo, ese mecanismo <strong>de</strong> comunicación consiste <strong>en</strong> una<br />

interfaz, a partir <strong>de</strong> la cual, se pue<strong>de</strong> acce<strong>de</strong>r a los <strong>el</strong>em<strong>en</strong>tos principales <strong>de</strong> un Bean: sus<br />

métodos, propieda<strong>de</strong>s y ev<strong>en</strong>tos.<br />

En Java Beans, los métodos implem<strong>en</strong>tados <strong>en</strong> un Bean, especialm<strong>en</strong>te los <strong>de</strong>finidos<br />

con <strong>el</strong> prefijo set o get, son un medio para interactuar con <strong>el</strong>. Los métodos pue<strong>de</strong>n <strong>en</strong>t<strong>en</strong><strong>de</strong>rse<br />

como servicios con efectos específicos que <strong>el</strong> usuario pue<strong>de</strong> invocar <strong>en</strong> algún mom<strong>en</strong>to.<br />

Las propieda<strong>de</strong>s son conceptualm<strong>en</strong>te equival<strong>en</strong>tes a lo que <strong>en</strong> <strong>el</strong> <strong>software</strong> tradicional<br />

se conoc<strong>en</strong> como atributos, estos consist<strong>en</strong> <strong>en</strong> conjunto <strong>de</strong> características que un usuario<br />

pue<strong>de</strong> leer o modificar haci<strong>en</strong>do uso <strong>de</strong> los métodos <strong>de</strong> acceso.<br />

Los ev<strong>en</strong>tos son utilizados por <strong>el</strong> Bean como un medio <strong>de</strong> comunicación con otros<br />

Beans. Un ev<strong>en</strong>to se pres<strong>en</strong>ta como un cambio <strong>de</strong> estado que <strong>el</strong> compon<strong>en</strong>te pue<strong>de</strong> notificar a<br />

su ambi<strong>en</strong>te. El ev<strong>en</strong>to lleva información <strong>de</strong> quién lo g<strong>en</strong>era, así mismo pue<strong>de</strong> llevar datos y<br />

aún objetos que migran <strong>de</strong> una clase a otra.<br />

Puesto que exist<strong>en</strong> otros mo<strong>de</strong>los <strong>de</strong> <strong>de</strong>sarrollo basados <strong>en</strong> <strong>compon<strong>en</strong>tes</strong>, <strong>en</strong> Java<br />

Beans se han establecido algunas capacida<strong>de</strong>s con <strong>el</strong> propósito <strong>de</strong> distinguirlo <strong>de</strong> otros. La<br />

característica más importante, es por supuesto, que <strong>el</strong> compon<strong>en</strong>te este escrito <strong>en</strong> Java, a<strong>de</strong>más<br />

<strong>de</strong> soportar las sigui<strong>en</strong>tes capacida<strong>de</strong>s:<br />

a) Introspección, mecanismo mediante <strong>el</strong> cual se pue<strong>de</strong>n <strong>de</strong>scubrir las propieda<strong>de</strong>s,<br />

métodos y ev<strong>en</strong>tos que un Bean conti<strong>en</strong>e.<br />

13


) Soporte a propieda<strong>de</strong>s, la posibilidad <strong>de</strong> conocer las características <strong>de</strong> los<br />

atributos y la capacidad <strong>de</strong> po<strong>de</strong>r ser modificados a tiempo <strong>de</strong> diseño.<br />

c) Soporte a ev<strong>en</strong>tos, activida<strong>de</strong>s como g<strong>en</strong>eración, escucha o respuesta a ev<strong>en</strong>tos<br />

con <strong>el</strong> propósito <strong>de</strong> comunicarse con otros Beans.<br />

d) Persist<strong>en</strong>cia, capacidad para salvar y recuperar las especializaciones realizadas a<br />

un Bean.<br />

El mo<strong>de</strong>lo propuesto por Sun Microsystems, permite interr<strong>el</strong>acionar los <strong>compon<strong>en</strong>tes</strong><br />

construidos bajo sus propias consi<strong>de</strong>raciones con <strong>compon<strong>en</strong>tes</strong> <strong>de</strong> otros l<strong>en</strong>guajes y mo<strong>de</strong>los,<br />

<strong>de</strong>stacando principalm<strong>en</strong>te la compatibilidad con <strong>el</strong> estándar <strong>de</strong> CORBA.<br />

Aunque los Beans han sido p<strong>en</strong>sados para ser simples procesos locales, reci<strong>en</strong>tem<strong>en</strong>te<br />

se ha propuesto una alternativa para trabajar con <strong>compon<strong>en</strong>tes</strong> remotos diseñadas para correr<br />

<strong>en</strong> un servidor y ser invocados por cli<strong>en</strong>tes, esta propuesta es conocida como Server Beans o<br />

Enterprise Java Beans (EJB) [SUN00]. Los EJB cu<strong>en</strong>tan con mecanismos que les permit<strong>en</strong><br />

ofrecer nuevos y mejores servicios <strong>en</strong>tre los que <strong>de</strong>stacan los <strong>de</strong> seguridad, manejo <strong>de</strong><br />

transacciones, concurr<strong>en</strong>cia y persist<strong>en</strong>cia.<br />

1.4.3.1 El Bean Dev<strong>el</strong>opm<strong>en</strong>t Kit.<br />

El Bean Dev<strong>el</strong>opm<strong>en</strong>t Kit (BDK), es un ambi<strong>en</strong>te visual que permite construir y<br />

utilizar Beans. Con <strong>el</strong> propósito <strong>de</strong> realizar estas tareas, <strong>el</strong> BDK implem<strong>en</strong>ta tres <strong>el</strong>em<strong>en</strong>tos<br />

principales: <strong>el</strong> BeanBox, <strong>el</strong> ToolBox, y <strong>el</strong> PropertySheet. La apari<strong>en</strong>cia <strong>de</strong> estos <strong>el</strong>em<strong>en</strong>tos,<br />

<strong>de</strong>spués <strong>de</strong> haberse s<strong>el</strong>eccionado un Bean, se pres<strong>en</strong>ta <strong>en</strong> la Figura 1.1.<br />

El BeanBox, que es <strong>el</strong> lugar don<strong>de</strong> se visualiza y mo<strong>de</strong>lan algunos <strong>de</strong> los aspectos<br />

involucrados con <strong>el</strong> comportami<strong>en</strong>to <strong>de</strong> un Bean, <strong>en</strong> este espacio <strong>el</strong> usuario pue<strong>de</strong> conectar<br />

Beans y <strong>de</strong>finir como quiere que se realic<strong>en</strong> las interacciones <strong>en</strong>tre <strong>el</strong>los. Para esto, <strong>el</strong><br />

14


BeanBox ofrece al usuario un conjunto <strong>de</strong> m<strong>en</strong>úes, que incluy<strong>en</strong> acciones como salvar <strong>el</strong><br />

cont<strong>en</strong>ido actual <strong>de</strong>l BeanBox -incluy<strong>en</strong>do aspectos como tamaño, posición, estado-,<br />

g<strong>en</strong>eración <strong>de</strong> applets a partir <strong>de</strong>l cont<strong>en</strong>ido <strong>de</strong>l BeanBox, cargar archivos JAR, realizar un<br />

reporte <strong>de</strong> introspección al Bean, listar los métodos que lanzan ev<strong>en</strong>tos, etc.<br />

Figura 1.1 Apari<strong>en</strong>cia <strong>de</strong>l BDK.<br />

En <strong>el</strong> BeanBox se pres<strong>en</strong>ta al usuario una vista, <strong>en</strong> tiempo <strong>de</strong> diseño, <strong>de</strong> lo que<br />

ocurriría cuando la aplicación se ejecute fuera <strong>de</strong> este ambi<strong>en</strong>te <strong>de</strong> trabajo.<br />

Ya se ha m<strong>en</strong>cionado que un compon<strong>en</strong>te pue<strong>de</strong> estar conformado por varias clases,<br />

las cuales <strong>en</strong> este mo<strong>de</strong>lo <strong>de</strong>b<strong>en</strong> estar cont<strong>en</strong>idas <strong>en</strong> un archivo JAR. Un archivo JAR es muy<br />

similar a un archivo ZIP, es un archivo que comprime y almac<strong>en</strong>a varios archivos. De hecho,<br />

la principal difer<strong>en</strong>cia <strong>en</strong>tre un archivo ZIP y un JAR, es que este último requiere <strong>de</strong> un<br />

archivo especial <strong>de</strong>nominado MANIFEST.MF, que conti<strong>en</strong>e la <strong>de</strong>scripción <strong>de</strong> lo que conti<strong>en</strong>e<br />

<strong>el</strong> JAR, dicho <strong>de</strong> otro modo, <strong>el</strong> archivo MANIFEST.MF almac<strong>en</strong>a los meta datos <strong>de</strong>l archivo<br />

JAR.<br />

15


El ToolBox es un cont<strong>en</strong>edor <strong>de</strong> Beans, <strong>el</strong> cual utiliza los archivos JAR localizados <strong>en</strong><br />

un directorio pre<strong>de</strong>finido <strong>de</strong>ntro <strong>de</strong>l ambi<strong>en</strong>te <strong>de</strong> refer<strong>en</strong>cia, beans/jars. Los mecanismos<br />

implem<strong>en</strong>tados <strong>en</strong> <strong>el</strong> ToolBox examinan <strong>el</strong> cont<strong>en</strong>ido <strong>de</strong> estos archivos, <strong>de</strong> forma que puedan<br />

mostrarse los Beans cont<strong>en</strong>idos <strong>en</strong> él y así, permitir al usuario s<strong>el</strong>eccionar y posteriorm<strong>en</strong>te<br />

colocar los Beans <strong>de</strong>ntro <strong>de</strong>l BeanBox para su manipulación.<br />

Al iniciarse BeanBox, este carga <strong>de</strong> forma automática todos los Beans cont<strong>en</strong>idos <strong>en</strong><br />

los archivos JAR, sin embargo se pue<strong>de</strong>n cargar JAR <strong>de</strong> forma manual mediante <strong>el</strong> m<strong>en</strong>ú<br />

File|LoadJar <strong>de</strong>l BeanBox.<br />

Ya se ha m<strong>en</strong>cionado que la apari<strong>en</strong>cia <strong>de</strong> un Bean pue<strong>de</strong> cambiarse mediante la<br />

manipulación <strong>de</strong> sus propieda<strong>de</strong>s, métodos y ev<strong>en</strong>tos; <strong>el</strong> PropertySheet muestra y permite<br />

modificar los valores <strong>de</strong> las propieda<strong>de</strong>s <strong>de</strong> un Bean. Si se s<strong>el</strong>ecciona un Bean <strong>en</strong> <strong>el</strong> BeanBox,<br />

<strong>en</strong> <strong>el</strong> PropertySheet se <strong>de</strong>spliegan los nombres <strong>de</strong> cada una <strong>de</strong> las propieda<strong>de</strong>s y <strong>de</strong> sus valores<br />

actuales. Estos valores pue<strong>de</strong>n ser editados por <strong>el</strong> usuario modificándose así la apari<strong>en</strong>cia y<br />

comportami<strong>en</strong>to <strong>de</strong>l Bean, aspectos que <strong>en</strong> muchos casos pue<strong>de</strong>n ser apreciables <strong>de</strong>s<strong>de</strong> <strong>el</strong><br />

BeanBox.<br />

16


Capítulo 2<br />

Revisión Técnica sobre <strong>Prueba</strong> <strong>de</strong> Software.<br />

Cuando se <strong>de</strong>sarrolla <strong>software</strong>, una <strong>de</strong> las activida<strong>de</strong>s asociadas a este proceso es la<br />

prueba; <strong>de</strong> hecho, se ha establecido formalm<strong>en</strong>te que la prueba es una actividad fundam<strong>en</strong>tal<br />

<strong>de</strong>ntro <strong>de</strong> cada una <strong>de</strong> las etapas <strong>de</strong>l proceso <strong>de</strong> <strong>de</strong>sarrollo <strong>de</strong> <strong>software</strong>. La prueba es<br />

indisp<strong>en</strong>sable, puesto que a partir <strong>de</strong> <strong>el</strong>la se pue<strong>de</strong> <strong>de</strong>terminar la calidad <strong>de</strong> los productos<br />

implem<strong>en</strong>tados; a pesar <strong>de</strong> esto, no es difícil percibir como su importancia se ha subestimado<br />

y <strong>en</strong> ocasiones hasta ignorado.<br />

Des<strong>de</strong> hace ya mucho tiempo, la prueba ha sido un tema muy importante <strong>en</strong> la<br />

ing<strong>en</strong>iería <strong>de</strong> <strong>software</strong>, a partir <strong>de</strong> cual se han g<strong>en</strong>erado un gran número <strong>de</strong> trabajos. En este<br />

capítulo se pres<strong>en</strong>ta una revisión técnica sobre la prueba <strong>de</strong> <strong>software</strong>, abordándose<br />

fundam<strong>en</strong>talm<strong>en</strong>te los <strong>en</strong>foques <strong>de</strong> prueba propuestos para probar <strong>software</strong> construido bajo un<br />

<strong>en</strong>foque funcional, ori<strong>en</strong>tado a objetos y basado <strong>en</strong> <strong>compon<strong>en</strong>tes</strong>.<br />

2.1 La prueba <strong>de</strong> <strong>software</strong>.<br />

Para muchas <strong>de</strong> las activida<strong>de</strong>s que lleva a cabo <strong>el</strong> ser humano, la prueba es una<br />

actividad necesaria que permite <strong>de</strong>terminar la calidad <strong>de</strong> estas. Hoy por ejemplo, se realizan<br />

pruebas para <strong>de</strong>terminar resist<strong>en</strong>cia <strong>de</strong> <strong>de</strong>terminados materiales, para <strong>de</strong>terminar la vida útil <strong>de</strong><br />

diversas maquinarias y equipos, o bi<strong>en</strong> para verificar que ciertas tareas se realic<strong>en</strong> <strong>de</strong> forma<br />

correcta.<br />

Definitivam<strong>en</strong>te la prueba es una actividad fundam<strong>en</strong>tal <strong>en</strong> muchos procesos <strong>de</strong><br />

<strong>de</strong>sarrollo, incluy<strong>en</strong>do <strong>el</strong> <strong>de</strong>l <strong>software</strong>. De manera g<strong>en</strong>eral, se pue<strong>de</strong> <strong>de</strong>cir que la prueba <strong>de</strong><br />

<strong>software</strong> permite al <strong>de</strong>sarrollador <strong>de</strong>terminar si <strong>el</strong> producto g<strong>en</strong>erado satisface las<br />

especificaciones establecidas. Así mismo, una prueba <strong>de</strong> <strong>software</strong> permite <strong>de</strong>tectar la<br />

pres<strong>en</strong>cia <strong>de</strong> errores que pudieran g<strong>en</strong>erar salidas o comportami<strong>en</strong>tos inapropiados durante su<br />

ejecución.<br />

17


De acuerdo a la IEEE [IEEE90] <strong>el</strong> concepto <strong>de</strong> prueba (testing) se <strong>de</strong>fine como:<br />

Una actividad <strong>en</strong> la cual un sistema o compon<strong>en</strong>te es ejecutado bajo condiciones<br />

especificas, se observan o almac<strong>en</strong>an los resultados y se realiza una evaluación <strong>de</strong><br />

algún aspecto <strong>de</strong>l sistema o compon<strong>en</strong>te.<br />

Cuando se habla <strong>de</strong> condiciones especificas <strong>en</strong> la <strong>de</strong>finición anterior, se pue<strong>de</strong> suponer<br />

la pres<strong>en</strong>cia <strong>de</strong> una especie <strong>de</strong> ambi<strong>en</strong>te <strong>de</strong> operación <strong>de</strong> la prueba, para <strong>el</strong> cual <strong>de</strong>b<strong>en</strong> existir<br />

<strong>de</strong>terminados valores para las <strong>en</strong>tradas y las salidas, así como también ciertas condiciones que<br />

<strong>de</strong>limitan a dicho ambi<strong>en</strong>te <strong>de</strong> operación. Formalm<strong>en</strong>te esto es conocido como caso <strong>de</strong> prueba.<br />

La IEEE [IEEE90] <strong>de</strong>fine un caso <strong>de</strong> prueba como:<br />

Un conjunto <strong>de</strong> <strong>en</strong>tradas, condiciones <strong>de</strong> ejecución y resultados esperados diseñados<br />

para un objetivo particular.<br />

A partir <strong>de</strong> las <strong>de</strong>finiciones anteriores y retomando las i<strong>de</strong>as pres<strong>en</strong>tadas <strong>en</strong> [WOH98]<br />

y [FER99] , <strong>en</strong> un proceso <strong>de</strong> prueba <strong>de</strong> <strong>software</strong>, se pue<strong>de</strong>n i<strong>de</strong>ntificar las sigui<strong>en</strong>tes<br />

acciones:<br />

a) preparar una serie <strong>de</strong> casos <strong>de</strong> prueba,<br />

b) llevar a cabo dichos casos <strong>de</strong> prueba,<br />

c) <strong>de</strong>cidir cuando susp<strong>en</strong><strong>de</strong>r la prueba.<br />

d) evaluar los resultados g<strong>en</strong>erados por la prueba,<br />

e) emitir un criterio <strong>de</strong> evaluación.<br />

De lo anteriorm<strong>en</strong>te pres<strong>en</strong>tado surg<strong>en</strong> cuestionami<strong>en</strong>tos como: ¿cómo s<strong>el</strong>eccionar<br />

casos <strong>de</strong> prueba repres<strong>en</strong>tativos?, ¿cuántas pruebas realizar? o bi<strong>en</strong> ¿cómo <strong>de</strong>cidir si es o no<br />

<strong>de</strong> calidad <strong>el</strong> producto evaluado?, los cuales permit<strong>en</strong> <strong>en</strong>t<strong>en</strong><strong>de</strong>r que cada una <strong>de</strong> estas acciones<br />

18


equiere especial at<strong>en</strong>ción. Por fortuna, actualm<strong>en</strong>te existe una base teórica que permite guiar<br />

la puesta <strong>en</strong> marcha <strong>de</strong> estas activida<strong>de</strong>s.<br />

Términos como falla, equivocación y error, pue<strong>de</strong>n consi<strong>de</strong>rarse como sinónimos, sin<br />

embargo, <strong>de</strong>ntro <strong>de</strong>l contexto <strong>de</strong> prueba <strong>de</strong> <strong>software</strong> no es pru<strong>de</strong>nte realizar esta suposición.<br />

Con <strong>el</strong> propósito evitar confusiones y pres<strong>en</strong>tar al lector conceptos básicos <strong>en</strong> materia <strong>de</strong><br />

pruebas, se pres<strong>en</strong>tan estas <strong>de</strong>finiciones tomadas <strong>de</strong> [IEEE90] :<br />

a) Equivocación (mistake):<br />

Acción <strong>de</strong>l ser humano que produce un resultado incorrecto.<br />

b) Defecto o falta (fault):<br />

Un paso, proceso o <strong>de</strong>finición <strong>de</strong> dato incorrecto <strong>en</strong> un programa <strong>de</strong> computadora. El<br />

resultado <strong>de</strong> una equivocación.<br />

c) Falla (failure):<br />

Resultado incorrecto. El resultado <strong>de</strong> una falla.<br />

d) Error (error):<br />

Magnitud por la que <strong>el</strong> resultado es incorrecto.<br />

2.2 Objetivos <strong>de</strong> la prueba <strong>de</strong> <strong>software</strong>.<br />

Un bu<strong>en</strong> preámbulo, antes <strong>de</strong> establecer los objetivos <strong>de</strong> la prueba <strong>de</strong> <strong>software</strong> es<br />

recordar la afirmación realizada por Dijkstra <strong>en</strong> los años 70 y citada <strong>en</strong> [PRE98], <strong>en</strong> don<strong>de</strong> se<br />

plantea que <strong>el</strong> hecho <strong>de</strong> realizar una prueba no garantiza la aus<strong>en</strong>cia <strong>de</strong> <strong>de</strong>fectos, sino<br />

solam<strong>en</strong>te se <strong>de</strong>muestra la exist<strong>en</strong>cia <strong>de</strong> éstos.<br />

19


Como ya se m<strong>en</strong>cionó <strong>en</strong> la sección anterior, la prueba <strong>de</strong> <strong>software</strong> se realiza con <strong>el</strong><br />

propósito <strong>de</strong> <strong>en</strong>contrar algo que difiera a las especificaciones planteadas para <strong>el</strong> producto o<br />

bi<strong>en</strong>, para <strong>de</strong>tectar la pres<strong>en</strong>cia <strong>de</strong> situaciones que pudieran g<strong>en</strong>erar resultados inapropiados.<br />

Aunque a gran<strong>de</strong>s rasgos estas razones pue<strong>de</strong>n ori<strong>en</strong>tar <strong>el</strong> s<strong>en</strong>tido <strong>de</strong> una prueba, <strong>en</strong><br />

[MYE79] se pres<strong>en</strong>tan algunas normas que pue<strong>de</strong>n servir como objetivos:<br />

a) La prueba es un proceso <strong>de</strong> ejecución <strong>de</strong> un programa con la int<strong>en</strong>ción <strong>de</strong><br />

<strong>de</strong>scubrir un error.<br />

b) Un bu<strong>en</strong> caso <strong>de</strong> prueba es aqu<strong>el</strong> que ti<strong>en</strong>e alta probabilidad <strong>de</strong> mostrar un<br />

error no <strong>de</strong>scubierto hasta <strong>en</strong>tonces.<br />

c) Una prueba ti<strong>en</strong>e éxito si se <strong>de</strong>scubre un error.<br />

2.3 Métodos <strong>de</strong> prueba <strong>de</strong> <strong>software</strong>.<br />

Des<strong>de</strong> hace ya algunos años, han surgido y evolucionado una variedad <strong>de</strong> métodos<br />

para realizar pruebas <strong>de</strong> <strong>software</strong>. Las alternativas más significativas <strong>en</strong> este contexto son las<br />

pruebas <strong>de</strong> caja blanca y las pruebas <strong>de</strong> caja negra; las primeras, pruebas ori<strong>en</strong>tadas a la<br />

estructura y las segundas al comportami<strong>en</strong>to <strong>de</strong>l <strong>software</strong>. A continuación se hace una<br />

<strong>de</strong>scripción <strong>de</strong> algunas <strong>de</strong> las propuestas que plantean cada una <strong>de</strong> estas alternativas, tomando<br />

material <strong>de</strong> las refer<strong>en</strong>cias [JOR95], [PRE98] y [KIT96].<br />

2.3.1 <strong>Prueba</strong>s <strong>de</strong> caja blanca.<br />

La pruebas <strong>de</strong> caja blanca <strong>en</strong>focan su at<strong>en</strong>ción a los <strong>de</strong>talles procedim<strong>en</strong>tales <strong>de</strong>l<br />

<strong>software</strong>, por <strong>el</strong>lo la implem<strong>en</strong>tación <strong>de</strong> estas pruebas <strong>de</strong>p<strong>en</strong><strong>de</strong> fuertem<strong>en</strong>te <strong>de</strong> la<br />

disponibilidad <strong>de</strong> código fu<strong>en</strong>te. Este tipo <strong>de</strong> pruebas, permit<strong>en</strong> g<strong>en</strong>erar casos para ejercitar y<br />

20


validar los caminos <strong>de</strong> cada módulo, las condiciones lógicas, los bucles y sus límites, así como<br />

también para las estructuras <strong>de</strong> datos. Las pruebas <strong>de</strong> caja blanca también son conocidas como<br />

pruebas <strong>de</strong> caja <strong>de</strong> cristal o pruebas estructurales.<br />

Algunas <strong>de</strong> las pruebas más significativas <strong>de</strong>ntro <strong>de</strong> este <strong>en</strong>foque son:<br />

- <strong>Prueba</strong> <strong>de</strong> caminos.<br />

En este tipo <strong>de</strong> prueba se realiza un análisis sobre una repres<strong>en</strong>tación gráfica <strong>de</strong> un<br />

programa <strong>de</strong>nominada grafo <strong>de</strong> control. En este grafo, los nodos repres<strong>en</strong>tan bloques<br />

<strong>de</strong> instrucciones <strong>de</strong> un programa y los flujos <strong>de</strong> ejecución para dichas instrucciones<br />

se repres<strong>en</strong>tan por medio <strong>de</strong> aristas. A partir <strong>de</strong> este grafo, se pue<strong>de</strong> i<strong>de</strong>ntificar un<br />

conjunto básico <strong>de</strong> caminos <strong>de</strong> ejecución, sobre <strong>el</strong> cual se pue<strong>de</strong>n realizar pruebas<br />

con <strong>el</strong> propósito <strong>de</strong> ejercitar <strong>el</strong> flujo <strong>de</strong> ejecución <strong>de</strong> los caminos <strong>en</strong> una unidad.<br />

- <strong>Prueba</strong> <strong>de</strong> condiciones.<br />

Basándose <strong>de</strong> igual forma <strong>en</strong> un grafo <strong>de</strong> control, pue<strong>de</strong>n g<strong>en</strong>erarse casos <strong>de</strong> prueba<br />

para <strong>el</strong>em<strong>en</strong>tos individuales <strong>de</strong> expresiones lógicas. De esta forma se pret<strong>en</strong><strong>de</strong> probar<br />

cada condición con todas sus posibles alternativas.<br />

- <strong>Prueba</strong> <strong>de</strong> ciclos.<br />

A partir <strong>de</strong>l grafo <strong>de</strong> control, pue<strong>de</strong>n g<strong>en</strong>erarse casos <strong>de</strong> prueba para las iteraciones<br />

<strong>de</strong>finidas <strong>en</strong> los programas con <strong>el</strong> propósito <strong>de</strong> verificar si se realizan <strong>de</strong> forma<br />

correcta.<br />

- <strong>Prueba</strong> <strong>de</strong> <strong>de</strong>finición <strong>de</strong> datos.<br />

Estas pruebas son realizadas con <strong>el</strong> objetivo <strong>de</strong> <strong>en</strong>contrar posibles contradicciones o<br />

redundancias <strong>en</strong> la <strong>de</strong>finición <strong>de</strong> los datos utilizados <strong>en</strong> <strong>el</strong> <strong>software</strong>. Para <strong>el</strong>lo se<br />

realiza un análisis <strong>de</strong>l comportami<strong>en</strong>to <strong>de</strong> cada uno <strong>de</strong> los datos o cada una <strong>de</strong> los<br />

flujos <strong>de</strong> ejecución.<br />

21


2.3.2 <strong>Prueba</strong>s <strong>de</strong> caja negra.<br />

Este tipo <strong>de</strong> pruebas, conocidas también como pruebas funcionales o pruebas <strong>de</strong><br />

comportami<strong>en</strong>to, conc<strong>en</strong>tran la at<strong>en</strong>ción <strong>en</strong> g<strong>en</strong>erar casos <strong>de</strong> prueba que permitan ejercitar los<br />

requisitos funcionales <strong>de</strong> un programa. A difer<strong>en</strong>cia <strong>de</strong> las pruebas <strong>de</strong> caja blanca, que se<br />

basan <strong>en</strong> la lógica interna <strong>de</strong>l <strong>software</strong>, este tipo <strong>de</strong> pruebas se conc<strong>en</strong>tran <strong>en</strong> su funcionalidad,<br />

por lo que mucho <strong>de</strong>l trabajo se realiza interactuando con la interfaz <strong>de</strong>l <strong>software</strong>. Los casos<br />

<strong>de</strong> prueba g<strong>en</strong>erados <strong>en</strong> este <strong>en</strong>foque, se diseñan a partir <strong>de</strong> valores <strong>en</strong>trada y salida. De esta<br />

forma, se pue<strong>de</strong> <strong>de</strong>terminar la vali<strong>de</strong>z <strong>de</strong> una salida para un conjunto <strong>de</strong> <strong>en</strong>tradas<br />

proporcionadas.<br />

La aplicación <strong>de</strong> pruebas <strong>de</strong> caja negra permit<strong>en</strong> <strong>de</strong>tectar errores como funciones<br />

incorrectas o aus<strong>en</strong>tes, errores <strong>en</strong> estructuras <strong>de</strong> datos, errores <strong>de</strong> r<strong>en</strong>dimi<strong>en</strong>to, así como<br />

errores <strong>de</strong> inicialización y terminación.<br />

Estas son algunas <strong>de</strong> las pruebas más conocidas <strong>en</strong> este contexto:<br />

- Partición equival<strong>en</strong>te.<br />

La i<strong>de</strong>a <strong>de</strong> esta técnica, es <strong>en</strong> dividir los valores válidos y no válidos para <strong>en</strong>tradas y<br />

salidas <strong>en</strong> un número reducido <strong>de</strong> particiones <strong>de</strong> forma que, <strong>el</strong> comportami<strong>en</strong>to <strong>de</strong>l<br />

<strong>software</strong> sea <strong>el</strong> mismo para cualquier valor cont<strong>en</strong>ido <strong>en</strong> una partición particular. El<br />

propósito principal <strong>de</strong> una partición es reducir la cantidad <strong>de</strong> casos <strong>de</strong> prueba<br />

g<strong>en</strong>erados <strong>en</strong> <strong>el</strong> proceso.<br />

- Análisis <strong>de</strong> los valores límite.<br />

La g<strong>en</strong>eración <strong>de</strong> casos <strong>de</strong> prueba <strong>en</strong> esta técnica, se <strong>en</strong>foca <strong>en</strong> los valores limites,<br />

esto bajo la consi<strong>de</strong>ración <strong>de</strong> que existe una t<strong>en</strong><strong>de</strong>ncia a fallar precisam<strong>en</strong>te cuando<br />

<strong>el</strong> <strong>software</strong> trabaja con valores extremos <strong>de</strong> la variable <strong>de</strong> <strong>en</strong>trada. G<strong>en</strong>eralm<strong>en</strong>te los<br />

valores establecidos para g<strong>en</strong>erar los casos <strong>de</strong> prueba son <strong>el</strong> mínimo, valores un poco<br />

arriba <strong>de</strong>l mínimo, valor máximo y valores un poco arriba <strong>de</strong>l máximo.<br />

22


- <strong>Prueba</strong>s según la experi<strong>en</strong>cia (error guessing).<br />

Este tipo <strong>de</strong> prueba la g<strong>en</strong>eración <strong>de</strong> casos se realiza a partir <strong>de</strong> la intuición y la<br />

experi<strong>en</strong>cia. La i<strong>de</strong>a básica es redactar una lista <strong>de</strong> las posibles fallas o <strong>de</strong> las<br />

posibles situaciones <strong>en</strong> las cuales su<strong>el</strong>e ocurrir algún problema y así <strong>de</strong>sarrollar casos<br />

<strong>de</strong> prueba basados <strong>en</strong> la información cont<strong>en</strong>ida <strong>en</strong> estas listas.<br />

- Tablas <strong>de</strong> <strong>de</strong>cisión.<br />

Este tipo <strong>de</strong> prueba permite <strong>de</strong>scribir <strong>el</strong> comportami<strong>en</strong>to <strong>de</strong> un programa a partir <strong>de</strong><br />

un conjunto <strong>de</strong> acciones que este realiza cuando se opera bajo <strong>de</strong>terminadas<br />

condiciones. En este <strong>en</strong>foque, las condiciones pue<strong>de</strong>n ser interpretadas como<br />

<strong>en</strong>tradas <strong>de</strong> un programa y las acciones como las salidas producidas. Para <strong>el</strong>lo se<br />

pue<strong>de</strong>n utilizar conectores lógicos y (and), o (or) y no (not). Al involucrar aspectos<br />

<strong>de</strong> lógica, se dice que este tipo <strong>de</strong> prueba se hace más rigurosa, que permite a<strong>de</strong>más<br />

transformar una especificación <strong>en</strong> l<strong>en</strong>guaje natural <strong>en</strong> una especificación más formal.<br />

2.4 Niv<strong>el</strong>es <strong>de</strong> prueba <strong>de</strong>l <strong>software</strong>.<br />

Un niv<strong>el</strong> <strong>de</strong> prueba permite especificar <strong>el</strong> alcance <strong>de</strong> la prueba <strong>de</strong> <strong>software</strong> que se<br />

realiza, se pue<strong>de</strong>n i<strong>de</strong>ntificar principalm<strong>en</strong>te dos niv<strong>el</strong>es:<br />

a) Bajo niv<strong>el</strong>.<br />

En este niv<strong>el</strong> están consi<strong>de</strong>radas todas aqu<strong>el</strong>las pruebas que se realizan a <strong>compon<strong>en</strong>tes</strong><br />

individuales <strong>de</strong> un programa. Las pruebas que se pue<strong>de</strong>n realizar <strong>en</strong> este niv<strong>el</strong> son:<br />

• <strong>Prueba</strong>s <strong>de</strong> unidad.<br />

Como su nombre lo indica, este tipo <strong>de</strong> prueba se aplica a <strong>el</strong>em<strong>en</strong>tos <strong>de</strong> <strong>software</strong><br />

individualm<strong>en</strong>te, excluy<strong>en</strong>do todos aqu<strong>el</strong>los casos <strong>en</strong> los que se consi<strong>de</strong>re la<br />

interacción con otras unida<strong>de</strong>s. El propósito fundam<strong>en</strong>tal <strong>de</strong> una prueba <strong>de</strong> unidad es<br />

23


<strong>de</strong>scubrir difer<strong>en</strong>cias <strong>en</strong>tre la especificación <strong>de</strong>l modulo <strong>de</strong> la interfaz y <strong>el</strong><br />

comportami<strong>en</strong>to efectivo.<br />

• <strong>Prueba</strong>s <strong>de</strong> integración<br />

Las pruebas <strong>de</strong> integración se realizan con <strong>el</strong> propósito <strong>de</strong> ejercitar la arquitectura <strong>de</strong><br />

un sistema. Una vez que ya se han probado que las unida<strong>de</strong>s funcionan <strong>de</strong> forma<br />

correcta <strong>de</strong> forma aislada, se proce<strong>de</strong> a probar cómo funcionan al integrarlas con<br />

otras <strong>de</strong> forma que se llegue a probar <strong>el</strong> comportami<strong>en</strong>to <strong>de</strong> un sistema final.<br />

La forma <strong>en</strong> que se pu<strong>de</strong> organizar la integración <strong>de</strong> las unida<strong>de</strong>s para la prueba<br />

pue<strong>de</strong> realizarse sigui<strong>en</strong>do <strong>en</strong>foques como <strong>el</strong> asc<strong>en</strong><strong>de</strong>nte, <strong>de</strong>sc<strong>en</strong><strong>de</strong>nte, big bang, o<br />

sandwich.<br />

b) Alto niv<strong>el</strong>.<br />

En éste niv<strong>el</strong> las pruebas se ori<strong>en</strong>tan a un producto completo; para <strong>el</strong>lo se propon<strong>en</strong> las<br />

sigui<strong>en</strong>tes alternativas:<br />

• <strong>Prueba</strong>s <strong>de</strong> sistema<br />

Este tipo <strong>de</strong> pruebas permit<strong>en</strong> probar <strong>el</strong> sistema como un todo así como también<br />

aspectos r<strong>el</strong>acionados con la integración <strong>de</strong>l producto a otros sistemas.<br />

• <strong>Prueba</strong>s <strong>de</strong> usabilidad.<br />

El diseño <strong>de</strong> pruebas <strong>de</strong> usabilidad, requiere consi<strong>de</strong>rar a los usuarios que trabajan<br />

con <strong>el</strong> producto, con <strong>el</strong> propósito <strong>de</strong> observar sus respuestas hacia éste. De ésta<br />

forma se pue<strong>de</strong>n observar discrepancias exist<strong>en</strong>tes <strong>en</strong>tre las interfaces<br />

implem<strong>en</strong>tadas y los requerimi<strong>en</strong>tos <strong>de</strong> los estilos <strong>de</strong> trabajo <strong>de</strong> los usuarios finales.<br />

• <strong>Prueba</strong>s <strong>de</strong> función.<br />

Este tipo <strong>de</strong> pruebas ti<strong>en</strong>e como objetivo <strong>de</strong>tectar inconsist<strong>en</strong>cias <strong>en</strong>tre la<br />

especificación funcional <strong>de</strong> un programa y su comportami<strong>en</strong>to actual.<br />

24


• <strong>Prueba</strong>s <strong>de</strong> aceptación.<br />

Realizando estas pruebas se pue<strong>de</strong> comparar <strong>el</strong> producto final con las necesida<strong>de</strong>s<br />

finales <strong>de</strong> los los usuarios.<br />

• <strong>Prueba</strong>s <strong>de</strong> regresión.<br />

Las pruebas <strong>de</strong> regresión son recom<strong>en</strong>dables cuando partes <strong>de</strong>l <strong>software</strong> se<br />

modifican, ya que permit<strong>en</strong> verificar que los cambios realizados no g<strong>en</strong>eran<br />

comportami<strong>en</strong>tos no <strong>de</strong>seados.<br />

2.5 <strong>Prueba</strong> <strong>de</strong> <strong>software</strong> para objetos.<br />

Como consecu<strong>en</strong>cia <strong>de</strong> las facilida<strong>de</strong>s y b<strong>en</strong>eficios que ofrece, actualm<strong>en</strong>te una <strong>de</strong> las<br />

nuevas alternativas para <strong>de</strong>sarrollo <strong>de</strong> <strong>software</strong> con mayor aceptación es la metodología<br />

ori<strong>en</strong>tada a objetos. Si bi<strong>en</strong> es cierto que este nuevo <strong>en</strong>foque ha sido adoptado por muchos, es<br />

también cierto que estas personas han t<strong>en</strong>ido que <strong>en</strong>fr<strong>en</strong>tarse y adaptarse a cambios bastante<br />

significativos. Conceptos como objeto, her<strong>en</strong>cia y <strong>en</strong>capsulación marcan una nueva<br />

perspectiva que contrasta con los mo<strong>de</strong>los <strong>de</strong> <strong>de</strong>sarrollo anteriorm<strong>en</strong>te utilizados.<br />

Esta nueva percepción ha impedido que áreas <strong>de</strong> vital importancia, como la prueba <strong>de</strong><br />

<strong>software</strong>, no hayan alcanzado <strong>el</strong> <strong>de</strong>sarrollo y la robustez que requier<strong>en</strong>. Es importante <strong>de</strong>stacar<br />

que mucho <strong>de</strong>l <strong>software</strong> que se está fabricando hoy es ori<strong>en</strong>tado a objetos, por lo resulta<br />

evi<strong>de</strong>nte la necesidad <strong>de</strong> contar con herrami<strong>en</strong>tas o al m<strong>en</strong>os guías <strong>de</strong> acción para realizar esta<br />

actividad.<br />

Esta falta <strong>de</strong> trabajos quizá sea <strong>de</strong>bida a la suposición y afirmación inicial <strong>de</strong> algunos<br />

autores <strong>de</strong> que <strong>el</strong> <strong>software</strong> ori<strong>en</strong>tado a objetos, al t<strong>en</strong>er como una característica es<strong>en</strong>cial <strong>el</strong><br />

reuso, está prop<strong>en</strong>so a pres<strong>en</strong>tar m<strong>en</strong>os errores que <strong>el</strong> <strong>software</strong> construido usando las<br />

metodologías tradicionales. Lam<strong>en</strong>tablem<strong>en</strong>te las experi<strong>en</strong>cias obt<strong>en</strong>idas han <strong>de</strong>mostrado que<br />

no es así.<br />

25


2.5.1 G<strong>en</strong>eralida<strong>de</strong>s <strong>de</strong>l mo<strong>de</strong>lo <strong>de</strong> <strong>de</strong>sarrollo ori<strong>en</strong>tado a objetos.<br />

En cierto grado algunos <strong>de</strong> los conceptos <strong>de</strong> la ori<strong>en</strong>tación a objetos han estado<br />

pres<strong>en</strong>tes <strong>en</strong> los l<strong>en</strong>guajes <strong>de</strong> programación que se han utilizado; sin embargo la programación<br />

ori<strong>en</strong>tada a objetos aparece formalm<strong>en</strong>te durante la década <strong>de</strong> los 80, como una alternativa <strong>de</strong><br />

<strong>de</strong>sarrollo <strong>de</strong> <strong>software</strong> que ofrece características muy atractivas: mejor modularidad <strong>en</strong> los<br />

programas, mayor flexibilidad y una <strong>de</strong> las más significativas <strong>el</strong> reuso, característica nada<br />

<strong>de</strong>spreciable <strong>en</strong> ambi<strong>en</strong>tes <strong>de</strong> trabajo don<strong>de</strong> se requiere construir <strong>software</strong> <strong>en</strong> tiempos muy<br />

cortos.<br />

De acuerdo con [PER90], la programación ori<strong>en</strong>tada a objetos pue<strong>de</strong> <strong>de</strong>finirse como la<br />

<strong>de</strong>scripción <strong>de</strong> tareas <strong>en</strong> términos <strong>de</strong> los objetos que la misma tarea <strong>en</strong>vu<strong>el</strong>ve, así como <strong>de</strong> las<br />

propieda<strong>de</strong>s <strong>de</strong> dichos objetos.<br />

A pesar <strong>de</strong> lo simple <strong>de</strong> la <strong>de</strong>finición, se pue<strong>de</strong> apreciar que un <strong>el</strong>em<strong>en</strong>to muy<br />

repres<strong>en</strong>tativo <strong>en</strong> este mo<strong>de</strong>lo es <strong>el</strong> objeto. Profundizando sobre este tema, es posible <strong>de</strong>cir<br />

que la programación ori<strong>en</strong>tada a objetos gira <strong>en</strong> torno a dos conceptos: <strong>el</strong> objeto y la clase.<br />

En los l<strong>en</strong>guajes <strong>de</strong> programación imperativos, los <strong>el</strong>em<strong>en</strong>tos más significativos son<br />

las estructuras <strong>de</strong> datos y los procedimi<strong>en</strong>tos, los cuales aparec<strong>en</strong> <strong>en</strong> forma <strong>de</strong>sligada. En <strong>el</strong><br />

mo<strong>de</strong>lo ori<strong>en</strong>tado a objetos, existe una unidad que conjunta estos <strong>el</strong>em<strong>en</strong>tos, esta unidad es <strong>el</strong><br />

objeto. La <strong>de</strong>finición formal <strong>de</strong> un objeto esta cont<strong>en</strong>ida <strong>en</strong> una clase a la que pert<strong>en</strong>ece. Esta<br />

<strong>de</strong>finición conti<strong>en</strong>e las características <strong>de</strong>l objeto, las cuales se mo<strong>de</strong>lan <strong>en</strong> términos los<br />

atributos, datos que <strong>el</strong> objeto utiliza, y los métodos que son las funciones que manipulan a<br />

estos datos.<br />

A continuación se pres<strong>en</strong>tan <strong>de</strong>scripciones mas amplias <strong>de</strong> clase y objeto, que<br />

permitirán t<strong>en</strong>er una mejor compr<strong>en</strong>sión <strong>de</strong> lo m<strong>en</strong>cionado anteriorm<strong>en</strong>te:<br />

26


Según [KIR94], un objeto ti<strong>en</strong>e un estado y un comportami<strong>en</strong>to. El estado <strong>de</strong>l objeto<br />

lo <strong>de</strong>termina un conjunto <strong>de</strong> atributos. El comportami<strong>en</strong>to <strong>de</strong> un objeto está <strong>de</strong>finido<br />

por <strong>el</strong> conjunto <strong>de</strong> métodos <strong>de</strong>l objeto.<br />

Una clase <strong>de</strong>scribe <strong>el</strong> comportami<strong>en</strong>to común <strong>de</strong> un grupo único <strong>de</strong> objetos. Describe<br />

todos los métodos y los atributos <strong>de</strong> esos objetos. Los objetos son creados mediante<br />

la instanciación <strong>de</strong> clases.<br />

Para [PER90], un objeto es un <strong>en</strong>tidad instanciada la cual ti<strong>en</strong>e:<br />

1. un conjunto <strong>de</strong> operaciones a las cuales respon<strong>de</strong>,<br />

2. un estado <strong>el</strong> cual es afectado por un subconjunto <strong>de</strong> operaciones,<br />

3. la habilidad <strong>de</strong> <strong>en</strong>viar m<strong>en</strong>sajes a otros objetos para invocar operaciones.<br />

Una clase especifica las propieda<strong>de</strong>s <strong>de</strong> un objetos y conti<strong>en</strong>e:<br />

1. una interfaz la cual <strong>de</strong>talla como se acce<strong>de</strong> a las propieda<strong>de</strong>s públicas <strong>de</strong> la<br />

clase,<br />

2. un cuerpo <strong>de</strong> código que implem<strong>en</strong>ta las operaciones <strong>de</strong>finidas <strong>en</strong> la interfaz, y<br />

3. variables <strong>de</strong> instancia, las cuales implem<strong>en</strong>tan <strong>el</strong> estado <strong>de</strong>l objeto.<br />

A<strong>de</strong>más <strong>de</strong> clase y objeto, exist<strong>en</strong> otros conceptos r<strong>el</strong>acionados con esta forma <strong>de</strong><br />

programación; <strong>en</strong>capsulación, polimorfismo y her<strong>en</strong>cia, son algunos <strong>de</strong> los más <strong>de</strong>stacables.<br />

En la sigui<strong>en</strong>te sección se abordan cada uno <strong>de</strong> <strong>el</strong>los, <strong>de</strong>ntro <strong>de</strong>l contexto <strong>de</strong> prueba <strong>de</strong><br />

<strong>software</strong>.<br />

2.5.2 Aspectos a consi<strong>de</strong>rar <strong>en</strong> la prueba <strong>de</strong> <strong>software</strong> ori<strong>en</strong>tado a objetos.<br />

Al igual que <strong>el</strong> <strong>software</strong> construido utilizando otros <strong>en</strong>foques <strong>de</strong> <strong>de</strong>sarrollo, todo<br />

producto construido a partir <strong>de</strong>l mo<strong>de</strong>lo ori<strong>en</strong>tado a objetos requiere ser sometido a pruebas<br />

con <strong>el</strong> propósito <strong>de</strong> garantizar su calidad. En términos g<strong>en</strong>erales, se pue<strong>de</strong> <strong>de</strong>cir que los dos<br />

<strong>en</strong>foques mas repres<strong>en</strong>tativos <strong>en</strong> materia <strong>de</strong> pruebas, <strong>de</strong> caja blanca y <strong>de</strong> caja negra, son<br />

aplicables al <strong>software</strong> ori<strong>en</strong>tado a objetos <strong>en</strong> cierta medida. Sin embargo como se m<strong>en</strong>ciona <strong>en</strong><br />

27


[FER99], exist<strong>en</strong> algunas características <strong>de</strong>l <strong>software</strong> ori<strong>en</strong>tado a objetos que g<strong>en</strong>eran<br />

problemas adicionales no cubiertos por las técnicas tradicionales <strong>de</strong> prueba.<br />

Existe una refer<strong>en</strong>cia común <strong>en</strong> [BIN95-A], [PER90] o [FER99], acerca <strong>de</strong> que la<br />

unidad básica para la prueba <strong>de</strong> <strong>software</strong> ori<strong>en</strong>tado a objetos es la clase. A pesar <strong>de</strong> <strong>el</strong>lo,<br />

cuando se prueba al <strong>software</strong> ori<strong>en</strong>tado a objetos, no es posible realizar una prueba para una<br />

clase por sí misma, sino que hay que realizarla para una instancia <strong>de</strong> ésta, es <strong>de</strong>cir para un<br />

objeto.<br />

Una característica importante <strong>de</strong>l <strong>en</strong>foque ori<strong>en</strong>tado a objetos es la <strong>en</strong>capsulación. Un<br />

objeto <strong>en</strong>capsula su estado y sus funciones asociadas. La abstracción, concepto que <strong>de</strong>fine la<br />

capacidad <strong>de</strong> solo <strong>de</strong>stacar las características es<strong>en</strong>ciales <strong>de</strong> un objeto <strong>de</strong> tal forma que se pue<strong>de</strong><br />

separar su comportami<strong>en</strong>to es<strong>en</strong>cial <strong>de</strong> su implem<strong>en</strong>tación, va estrecham<strong>en</strong>te ligada con la<br />

<strong>en</strong>capsulación. Indudablem<strong>en</strong>te la posibilidad <strong>de</strong> po<strong>de</strong>r <strong>en</strong>cerrar <strong>de</strong>ntro <strong>de</strong> un cont<strong>en</strong>edor<br />

físico o lógico <strong>el</strong>em<strong>en</strong>tos como arreglos, registros o incluso objetos parece ser muy atractiva<br />

para ciertas activida<strong>de</strong>s, sin embargo <strong>en</strong> <strong>el</strong> contexto <strong>de</strong> prueba esto no es realm<strong>en</strong>te una<br />

v<strong>en</strong>taja.<br />

Como se cita <strong>en</strong> [BAS99], <strong>el</strong> ocultar todos los <strong>de</strong>talles <strong>de</strong>l objeto que no contribuy<strong>en</strong> a<br />

sus características es<strong>en</strong>ciales, por ejemplo su estructura y la implem<strong>en</strong>tación <strong>de</strong> sus métodos,<br />

hace que parte <strong>de</strong> un objeto sea inaccesible para <strong>el</strong> mundo. Naturalm<strong>en</strong>te, esto obstaculiza la<br />

efici<strong>en</strong>cia <strong>de</strong> las pruebas, ya que para realizarlas, <strong>en</strong> algún mom<strong>en</strong>to se requiere monitorear <strong>el</strong><br />

estado <strong>de</strong> un objeto. Esto es difícil <strong>de</strong> realizar con características como la <strong>en</strong>capsulación y la<br />

abstracción, pues la dificultad <strong>de</strong> visualizar <strong>el</strong> estado interno <strong>de</strong>l objeto impi<strong>de</strong> consultar<br />

información que podría requerirse para <strong>el</strong> <strong>de</strong>sarrollo <strong>de</strong> la prueba. [BIN95-A].<br />

Por otra parte, la her<strong>en</strong>cia es otra <strong>de</strong> las características que han v<strong>en</strong>ido a facilitar <strong>en</strong><br />

gran medida <strong>el</strong> <strong>de</strong>sarrollo <strong>de</strong> sistemas, la posibilidad <strong>de</strong> que una clase pueda ser escrita <strong>en</strong><br />

términos <strong>de</strong> variaciones <strong>de</strong> otras clases es una v<strong>en</strong>taja significativa. Pue<strong>de</strong> p<strong>en</strong>sarse que esto<br />

apoya la prev<strong>en</strong>ción <strong>de</strong> fallas al construir <strong>software</strong>. Desgraciadam<strong>en</strong>te, se ha comprobado que.<br />

mediante esta práctica, se ti<strong>en</strong><strong>en</strong> muchas posibilida<strong>de</strong>s <strong>de</strong> cometer errores, porque<br />

28


g<strong>en</strong>eralm<strong>en</strong>te los <strong>el</strong>em<strong>en</strong>tos heredados son sometidos a algún tipo <strong>de</strong> refinami<strong>en</strong>to o<br />

re<strong>de</strong>finición y <strong>en</strong> algunos casos <strong>el</strong>iminación <strong>de</strong> <strong>compon<strong>en</strong>tes</strong> [FER99]. Cuando un objeto es<br />

creado a partir <strong>de</strong> características heredadas, se g<strong>en</strong>era un nuevo contexto que pue<strong>de</strong> ser<br />

difer<strong>en</strong>te al que pudiera crearse por la clase antecesesora si esta trabajara <strong>de</strong> manera aislada y,<br />

por tanto, pres<strong>en</strong>tarse problemas ante situaciones no previstas <strong>en</strong> <strong>el</strong> nuevo contexto. Todas<br />

estas situaciones hac<strong>en</strong> que autores como [BIN95-A], afirm<strong>en</strong> que realizar una prueba a los<br />

métodos heredados <strong>de</strong>be ser una regla más que una excepción.<br />

La her<strong>en</strong>cia <strong>en</strong> cierta medida trae como consecu<strong>en</strong>cia reuso, lo que g<strong>en</strong>era una<br />

interrogante común con respecto a la formulación <strong>de</strong> las pruebas: las subclases <strong>de</strong> una clase<br />

que ya ha sido probada ¿<strong>de</strong>b<strong>en</strong> <strong>de</strong> ser probadas nuevam<strong>en</strong>te?. Si la respuesta es sí, <strong>en</strong><br />

refer<strong>en</strong>cias como [PER90], se habla <strong>de</strong> difer<strong>en</strong>tes niv<strong>el</strong>es <strong>de</strong> her<strong>en</strong>cia lo que increm<strong>en</strong>ta <strong>el</strong><br />

número <strong>de</strong> pruebas a realizar. Así mismo, <strong>en</strong> [BIN95-B] se afirma que <strong>el</strong> reuso no garantiza<br />

que <strong>el</strong> <strong>software</strong> esté ex<strong>en</strong>to <strong>de</strong> errores, ya que no es posible <strong>de</strong>terminar si un número sufici<strong>en</strong>te<br />

<strong>de</strong> rutas y estados hayan sido ejercitados.<br />

Otro aspecto que <strong>de</strong>termina la dificultad <strong>de</strong> las pruebas que se realizan al <strong>software</strong><br />

ori<strong>en</strong>tado a objetos es <strong>el</strong> polimorfismo. En [BIN95-A] se explica que cada vez que se realiza<br />

una instancia difer<strong>en</strong>te <strong>de</strong> un objeto como producto <strong>de</strong>l polimorfismo <strong>en</strong> los métodos, se<br />

requiere una prueba separada. Realizar una prueba separada para cada una <strong>de</strong> la formas <strong>de</strong> un<br />

método es una tarea difícil, la complejidad y <strong>el</strong> tiempo requerido crece consi<strong>de</strong>rablem<strong>en</strong>te<br />

cuando se ti<strong>en</strong><strong>en</strong> que <strong>de</strong>finir todos los posibles errores y obstáculos que pue<strong>de</strong>n pres<strong>en</strong>tarse.<br />

En los sistemas ori<strong>en</strong>tados a objetos, <strong>el</strong> flujo <strong>de</strong> control se lleva a cabo mediante <strong>el</strong><br />

paso <strong>de</strong> m<strong>en</strong>sajes <strong>en</strong>tre objetos. Cuando un m<strong>en</strong>saje es <strong>en</strong>viado <strong>de</strong> un objeto u otro, la<br />

consecu<strong>en</strong>cia es, g<strong>en</strong>eralm<strong>en</strong>te, que <strong>el</strong> objeto receptor ejecute alguna operación para examinar<br />

o alterar su estado. En [PER90] hace hincapié que <strong>el</strong> paso <strong>de</strong> m<strong>en</strong>sajes es un punto<br />

fundam<strong>en</strong>tal al realizar la prueba .<br />

Si bi<strong>en</strong> estos son algunos <strong>de</strong> los aspectos más significativos y <strong>de</strong> refer<strong>en</strong>cia común <strong>en</strong><br />

revisiones bibliográficas, <strong>de</strong> igual forma pue<strong>de</strong>n m<strong>en</strong>cionarse la <strong>de</strong>p<strong>en</strong><strong>de</strong>ncia <strong>de</strong> estado, <strong>el</strong><br />

29


<strong>de</strong>sarrollo increm<strong>en</strong>tal, <strong>el</strong> manejo <strong>de</strong> excepciones, las invocaciones implícitas, <strong>el</strong> cambio <strong>de</strong><br />

tipo, las peculiarida<strong>de</strong>s <strong>de</strong>l l<strong>en</strong>guaje o la g<strong>en</strong>ericidad, las cuales pue<strong>de</strong>n consultarse con mayor<br />

<strong>de</strong>talle <strong>en</strong> [FER99].<br />

2.5.3 Métodos <strong>de</strong> prueba <strong>de</strong> <strong>software</strong> ori<strong>en</strong>tado a objetos.<br />

Se ha dicho <strong>en</strong> secciones anteriores que muchas <strong>de</strong> las g<strong>en</strong>eralida<strong>de</strong>s <strong>de</strong> los métodos <strong>de</strong><br />

prueba tradicionales han sido adaptadas consi<strong>de</strong>rando las características <strong>de</strong>l mo<strong>de</strong>lo ori<strong>en</strong>tado<br />

a objetos, con <strong>el</strong> propósito <strong>de</strong> que puedan ser aplicables <strong>en</strong> este nuevo contexto.<br />

Actualm<strong>en</strong>te, exist<strong>en</strong> muy pocos trabajos producto <strong>de</strong>l estudio <strong>de</strong> prueba <strong>de</strong> <strong>software</strong><br />

ori<strong>en</strong>tado a objetos; <strong>de</strong> hecho, por sí mismo, <strong>el</strong> área <strong>de</strong> prueba <strong>de</strong> <strong>software</strong> es bastante<br />

compleja y <strong>de</strong>ntro <strong>de</strong> este marco <strong>de</strong> objetos existe una car<strong>en</strong>cia <strong>de</strong> métodos robustos para<br />

garantizar la realización <strong>de</strong> las pruebas <strong>de</strong> forma eficaz.<br />

A continuación se pres<strong>en</strong>ta un panorama <strong>de</strong>l estado actual <strong>en</strong> cuanto a prueba <strong>de</strong><br />

<strong>software</strong> ori<strong>en</strong>tado a objetos <strong>en</strong> términos <strong>de</strong>l niv<strong>el</strong> <strong>de</strong> prueba, basado principalm<strong>en</strong>te <strong>en</strong><br />

[AMB99], [JAC92] y [FER99].<br />

2.5.3.1 <strong>Prueba</strong>s <strong>de</strong> unidad.<br />

En <strong>el</strong> <strong>software</strong> ori<strong>en</strong>tado a objetos la m<strong>en</strong>or unidad a consi<strong>de</strong>rar para realizar una<br />

prueba es la clase. Para [PRE98], la prueba <strong>de</strong> clases <strong>en</strong> <strong>el</strong> ámbito <strong>de</strong> <strong>software</strong> OO es<br />

equival<strong>en</strong>te a la prueba <strong>de</strong> unidad realizada al <strong>software</strong> tradicional. Esta prueba está<br />

fundam<strong>en</strong>talm<strong>en</strong>te dirigida a las operaciones <strong>en</strong>capsuladas por la clase, así como al estado y<br />

comportami<strong>en</strong>to <strong>de</strong>l objeto que se implem<strong>en</strong>ta <strong>en</strong> <strong>el</strong>la. Como se explica <strong>en</strong> [BAS99], <strong>el</strong> énfasis<br />

<strong>de</strong> la prueba <strong>de</strong> unidad es verificar que esta pequeña unidad trabaje correctam<strong>en</strong>te <strong>en</strong> forma<br />

aislada, antes <strong>de</strong> proce<strong>de</strong>r a integrarla <strong>en</strong> <strong>el</strong> sistema.<br />

Los métodos cont<strong>en</strong>idos <strong>en</strong> una clase pue<strong>de</strong>n ser muchos y una operación <strong>en</strong> particular<br />

<strong>de</strong> ese conjunto, a consecu<strong>en</strong>cia <strong>de</strong> la her<strong>en</strong>cia, pue<strong>de</strong> existir como parte <strong>de</strong> varias clases<br />

30


difer<strong>en</strong>tes. Por lo tanto <strong>el</strong> significado <strong>de</strong> prueba <strong>de</strong> unidad cambia <strong>en</strong> muchos s<strong>en</strong>tidos y es<br />

importante diseñarla bajo ciertas consi<strong>de</strong>raciones.<br />

En este tiempo, no existe una práctica única <strong>de</strong> cómo realizar pruebas <strong>de</strong> unidad al<br />

<strong>software</strong> ori<strong>en</strong>tado a objetos, pues <strong>el</strong> construir casos <strong>de</strong> prueba para este tipo <strong>de</strong> sistemas no es<br />

una tarea s<strong>en</strong>cilla. A<strong>de</strong>más exist<strong>en</strong> muchas posibilida<strong>de</strong>s <strong>de</strong> que estos casos caduqu<strong>en</strong> muy<br />

rápido, por lo que resulta imposible reutilizarlos muchas veces. Autores como [MCG94],<br />

[MUR94] y [BIN96], han propuesto estrategias para llevar a cabo la pruebas <strong>de</strong> unidad<br />

consi<strong>de</strong>rando aspectos como <strong>el</strong> or<strong>de</strong>n <strong>en</strong> que los métodos son sometidos a la prueba, <strong>el</strong> or<strong>de</strong>n<br />

<strong>en</strong> que una jerarquía <strong>de</strong> clases pue<strong>de</strong> ser probada, ejercitar <strong>el</strong> flujo <strong>de</strong> datos o bi<strong>en</strong> <strong>el</strong> análisis<br />

<strong>de</strong>l estado <strong>de</strong>l objeto.<br />

Pero, ¿qué aspectos <strong>de</strong>b<strong>en</strong> consi<strong>de</strong>rarse para construir casos <strong>de</strong> prueba para una clase?.<br />

Se pue<strong>de</strong> verificar que esta proporcione los servicios que promete, que responda<br />

correctam<strong>en</strong>te a las condiciones esperadas y, más aún, ante las inesperadas. Aspectos<br />

adicionales pue<strong>de</strong>n <strong>el</strong> verificar si la clase conti<strong>en</strong>e y permite disponer <strong>de</strong> todas las funciones<br />

asociadas a <strong>el</strong>la o que cada método <strong>de</strong> la clase ejecute su responsabilidad especificada. Todo<br />

esto se pres<strong>en</strong>ta <strong>en</strong> [BAS99] con mayor <strong>de</strong>talle.<br />

Estas son algunas <strong>de</strong> las técnicas mas populares para realizar pruebas <strong>de</strong> unidad:<br />

- <strong>Prueba</strong>s estructurales.<br />

Si se ti<strong>en</strong>e la disponibilidad <strong>de</strong> código fu<strong>en</strong>te, pue<strong>de</strong>n realizarse pruebas estructurales<br />

a las unida<strong>de</strong>s sometidas a la prueba. Las acciones <strong>de</strong> esta actividad pue<strong>de</strong>n diseñarse<br />

con <strong>el</strong> propósito <strong>de</strong> ejercitar todas las rutas <strong>de</strong>l código, las condiciones establecidas o<br />

bi<strong>en</strong> las ciclos <strong>de</strong>finidos <strong>en</strong> <strong>el</strong> programa.<br />

- <strong>Prueba</strong> <strong>de</strong> valores limite.<br />

Mediante esta técnica se prueba la unidad bajo situaciones inusuales o extremas, con<br />

<strong>el</strong> propósito verificar cómo son manejadas por <strong>el</strong> <strong>software</strong>. Para <strong>el</strong>lo, los casos <strong>de</strong><br />

prueba suministrados son diseñados consi<strong>de</strong>rando valores frontera, es <strong>de</strong>cir los<br />

31


valores mínimo y máximo que la unidad pue<strong>de</strong> aceptar, así como también aqu<strong>el</strong>los<br />

valores cercanos a las fronteras i<strong>de</strong>ntificadas.<br />

- <strong>Prueba</strong> basada <strong>en</strong> estados.<br />

Para esta técnica, se g<strong>en</strong>erarán casos <strong>de</strong> prueba para un contexto <strong>en</strong> don<strong>de</strong> una clase<br />

se mo<strong>de</strong>la como una máquina <strong>de</strong> estados con secu<strong>en</strong>cias <strong>de</strong> transiciones, con esto se<br />

pret<strong>en</strong><strong>de</strong> analizar <strong>el</strong> estado <strong>de</strong> los objetos <strong>de</strong> acuerdo a su comportami<strong>en</strong>to. Una vez<br />

que se ha establecido un mo<strong>de</strong>lo <strong>de</strong> estados con base <strong>en</strong> los atributos <strong>de</strong>l objeto, se<br />

consi<strong>de</strong>ran <strong>en</strong> la prueba los métodos necesarios para po<strong>de</strong>r observar los cambios <strong>de</strong><br />

estado. La aplicación <strong>de</strong> esta técnica permite observar alguna <strong>de</strong> las sigui<strong>en</strong>tes<br />

situaciones: se produce un cambio a un estado correcto, se produce cambio a un<br />

estado incorrecto, no hay cambio <strong>de</strong> estado, se produce un estado in<strong>de</strong>finido correcto<br />

o bién, se produce un estado in<strong>de</strong>finido incorrecto .<br />

- <strong>Prueba</strong> increm<strong>en</strong>tal.<br />

La prueba increm<strong>en</strong>tal dirige su at<strong>en</strong>ción a las subclases g<strong>en</strong>eradas como<br />

consecu<strong>en</strong>cia <strong>de</strong> la her<strong>en</strong>cia, si<strong>en</strong>do la clase padre una clase previam<strong>en</strong>te probada.<br />

Aunque exist<strong>en</strong> situaciones <strong>en</strong> las que éste tipo <strong>de</strong> pruebas se <strong>de</strong>scarta, se pue<strong>de</strong>n<br />

i<strong>de</strong>ntificar algunas <strong>en</strong> las que no estarían <strong>de</strong> más: cuando se han agregado o<br />

modificado propieda<strong>de</strong>s y/o métodos, cuando exist<strong>en</strong> propieda<strong>de</strong>s y métodos que se<br />

han heredado y no se han alterado, pero que realizan algún tipo <strong>de</strong> interacción con<br />

<strong>el</strong>em<strong>en</strong>tos nuevos o modificados.<br />

2.5.3.2 <strong>Prueba</strong>s <strong>de</strong> integración.<br />

Cuando se aplican pruebas <strong>de</strong> integración al <strong>software</strong> ori<strong>en</strong>tado a objetos, se pret<strong>en</strong><strong>de</strong><br />

<strong>de</strong>mostrar que las unida<strong>de</strong>s que ya han sido sometidas a un proceso <strong>de</strong> prueba y funcionan<br />

correctam<strong>en</strong>te, lo hac<strong>en</strong> <strong>de</strong> igual forma cuando interactúan y se integran con otras unida<strong>de</strong>s<br />

32


<strong>de</strong>l sistema. Prácticam<strong>en</strong>te, <strong>el</strong> trabajo <strong>de</strong> esta prueba se conc<strong>en</strong>tra <strong>en</strong> la interacción <strong>de</strong> métodos<br />

<strong>en</strong> difer<strong>en</strong>tes unida<strong>de</strong>s.<br />

Existe una coinci<strong>de</strong>ncia <strong>en</strong> los dos <strong>en</strong>foques para realizar este tipo <strong>de</strong> pruebas: <strong>el</strong><br />

basado <strong>en</strong> hilos y <strong>el</strong> basado <strong>en</strong> uso. En <strong>el</strong> primero, pret<strong>en</strong><strong>de</strong> que todas las clases respondan a<br />

s<strong>en</strong>cillas <strong>en</strong>tradas externas, prov<strong>en</strong>i<strong>en</strong>tes <strong>de</strong> otra unidad. De esta forma, se realizan casos <strong>de</strong><br />

prueba para cada clase <strong>en</strong> la unidad, con lo cual un hilo <strong>de</strong> este conjunto se ejercita.<br />

<strong>de</strong> otras clases.<br />

En <strong>el</strong> <strong>en</strong>foque basado <strong>en</strong> uso, se realizan pruebas para clases las cuales usan servicios<br />

A continuación se pres<strong>en</strong>tan algunos métodos para realizar pruebas <strong>de</strong> integración:<br />

- Método <strong>de</strong> Caminos <strong>de</strong> M<strong>en</strong>sajes.<br />

Este método se conc<strong>en</strong>tra principalm<strong>en</strong>te <strong>en</strong> probar aqu<strong>el</strong>los caminos que se g<strong>en</strong>eran<br />

por un ev<strong>en</strong>to <strong>de</strong> <strong>en</strong>trada y terminan con un ev<strong>en</strong>to <strong>de</strong> salida.<br />

- El método <strong>de</strong> Overbek.<br />

En este método se prueban las clases por pares, don<strong>de</strong> una hace <strong>el</strong> pap<strong>el</strong> <strong>de</strong> cli<strong>en</strong>te y<br />

otra <strong>el</strong> <strong>de</strong> servidor, estableciéndose para estas dos conjuntos <strong>de</strong> pruebas. El primer<br />

conjunto, son pruebas ori<strong>en</strong>tadas a verificar si los m<strong>en</strong>sajes <strong>de</strong> <strong>en</strong>trada y <strong>de</strong> salida<br />

g<strong>en</strong>erados son correctos; es <strong>de</strong>cir si se usa correctam<strong>en</strong>te cualquier clase servidora y<br />

si todas las secu<strong>en</strong>cias <strong>de</strong> operaciones son correctas. En <strong>el</strong> segundo conjunto se<br />

verifica a<strong>de</strong>más <strong>de</strong> lo anterior, si la clase cli<strong>en</strong>te siempre satisface las precondiciones<br />

<strong>de</strong> la clase servidora, así como también si satisface las salidas esperadas por la clase<br />

servidora.<br />

- El método <strong>de</strong> Kung.<br />

Este método emplea una estrategia <strong>de</strong> ing<strong>en</strong>iería <strong>en</strong> reversa sobre <strong>el</strong> código <strong>de</strong> las<br />

unida<strong>de</strong>s con <strong>el</strong> propósito <strong>de</strong> g<strong>en</strong>erar un diagrama <strong>de</strong> r<strong>el</strong>aciones <strong>en</strong>tre objetos. A<br />

partir <strong>de</strong> este diagrama se propone un or<strong>de</strong>n para las pruebas que minimiza <strong>el</strong> uso <strong>de</strong><br />

33


cabos. El diagrama se convierte <strong>en</strong> un grafo acíclico, que pue<strong>de</strong> cont<strong>en</strong>er varios<br />

clusters <strong>de</strong> objetos y los or<strong>de</strong>nan topológicam<strong>en</strong>te. Su método involucra las etapas <strong>de</strong><br />

pruebas <strong>de</strong> unidad y <strong>de</strong> integración y pue<strong>de</strong> usarse también para pruebas <strong>de</strong><br />

regresión.<br />

2.5.3.3 <strong>Prueba</strong>s <strong>de</strong> sistema.<br />

Las pruebas <strong>de</strong> unidad se conc<strong>en</strong>tran <strong>en</strong> verificar si las funcionalida<strong>de</strong>s <strong>de</strong>scritas <strong>en</strong> las<br />

especificaciones o <strong>en</strong> los requisitos iniciales correspon<strong>de</strong>n a las que se pres<strong>en</strong>tan <strong>en</strong> <strong>el</strong><br />

producto final. En esta área, al igual que la <strong>de</strong> pruebas <strong>de</strong> integración, se han g<strong>en</strong>erado pocos<br />

trabajos, por lo que se emplean muchos <strong>de</strong> los métodos tradicionales.<br />

- <strong>Prueba</strong> <strong>de</strong> función.<br />

La prueba <strong>de</strong> función comúnm<strong>en</strong>te es llevada a cabo por <strong>el</strong> grupo <strong>de</strong> personas que<br />

<strong>de</strong>sarrollaron <strong>el</strong> producto. Este <strong>en</strong>foque se ori<strong>en</strong>ta a confirmar que la aplicación<br />

alcanza los requerimi<strong>en</strong>tos y la funcionalidad especificadas por <strong>el</strong> usuario.<br />

- <strong>Prueba</strong>s <strong>de</strong> aceptación (beta).<br />

En este tipo <strong>de</strong> pruebas, versiones que aún no han sido liberadas <strong>en</strong> <strong>el</strong> mercado, son<br />

ofrecidas a ciertos grupos <strong>de</strong> usuarios con <strong>el</strong> propósito <strong>de</strong> que las utilic<strong>en</strong>. El<br />

propósito <strong>de</strong> ésto es que los usuarios report<strong>en</strong> <strong>de</strong>fectos que pudieran pres<strong>en</strong>tarse.<br />

- <strong>Prueba</strong> bajo stress.<br />

Para realizar esta prueba, <strong>el</strong> sistema somete a condiciones extremas <strong>de</strong> trabajo, como<br />

pue<strong>de</strong>n ser un alto volum<strong>en</strong> <strong>de</strong> transacciones o una gran número <strong>de</strong> usuarios.<br />

Aplicando este <strong>en</strong>foque, se pue<strong>de</strong> verificar si <strong>el</strong> sistema se comporta como se espera<br />

aún ante este tipo <strong>de</strong> esc<strong>en</strong>arios.<br />

34


2.6 <strong>Prueba</strong> <strong>de</strong> <strong>software</strong> basado <strong>en</strong> <strong>compon<strong>en</strong>tes</strong>.<br />

La construcción <strong>de</strong> <strong>software</strong> a partir <strong>de</strong> <strong>compon<strong>en</strong>tes</strong> es una práctica r<strong>el</strong>ativam<strong>en</strong>te<br />

nueva, por lo que no es extraño que sea escasa la exist<strong>en</strong>cia <strong>de</strong> trabajos g<strong>en</strong>erados al respecto.<br />

Puesto que <strong>el</strong> <strong>de</strong>sarrollo basado <strong>en</strong> <strong>compon<strong>en</strong>tes</strong> pres<strong>en</strong>ta algunas similitu<strong>de</strong>s con <strong>el</strong> <strong>en</strong>foque<br />

ori<strong>en</strong>tado a objetos, para un compon<strong>en</strong>te pue<strong>de</strong>n ser aplicables algunas <strong>de</strong> sus<br />

consi<strong>de</strong>raciones, incluso <strong>en</strong> materia <strong>de</strong> prueba. Aspectos <strong>de</strong>scritos <strong>en</strong> la sección 3.2, como la<br />

her<strong>en</strong>cia, <strong>en</strong>capsulación, polimorfismo, liga dinámica o mecanismos <strong>de</strong> comunicación, son<br />

comunes <strong>en</strong>tre ambos mo<strong>de</strong>los. Es evi<strong>de</strong>nte que para hacer las pruebas <strong>de</strong> <strong>compon<strong>en</strong>tes</strong> más<br />

robustas, será necesario consi<strong>de</strong>rar las características propias <strong>de</strong>l <strong>en</strong>foque <strong>de</strong> <strong>compon<strong>en</strong>tes</strong>.<br />

En la mayoría <strong>de</strong> los casos, los criterios <strong>de</strong> prueba <strong>de</strong> caja negra son los más aplicados<br />

a los <strong>compon<strong>en</strong>tes</strong>, puesto que la disponibilidad <strong>de</strong>l código fu<strong>en</strong>te es nula <strong>en</strong> la mayoría <strong>de</strong> las<br />

veces. Debido a que un compon<strong>en</strong>te es una unidad concreta, con una función bi<strong>en</strong> <strong>de</strong>finida, no<br />

basta realizar pruebas para su evaluación; <strong>de</strong> igual forma se requier<strong>en</strong> procesos <strong>de</strong> prueba<br />

para su s<strong>el</strong>ección y para su integración, [FER99] y [VOA98] .<br />

Durante la etapa <strong>de</strong> construcción <strong>de</strong> un compon<strong>en</strong>te, <strong>el</strong> <strong>de</strong>sarrollador pue<strong>de</strong> aplicar las<br />

técnicas <strong>de</strong> prueba <strong>de</strong> unidad y <strong>de</strong> integración tradicionales <strong>de</strong>l mo<strong>de</strong>lo OO, sin embargo <strong>en</strong> lo<br />

que respecta a la s<strong>el</strong>ección y evaluación, consi<strong>de</strong>rar <strong>el</strong> punto vista <strong>de</strong>l usuario es un aspecto<br />

vital para la realización <strong>de</strong> la prueba. Finalm<strong>en</strong>te <strong>en</strong> <strong>el</strong> marco <strong>de</strong> pruebas <strong>de</strong> integración,<br />

consi<strong>de</strong>raciones como la arquitectura <strong>de</strong> la aplicación, <strong>el</strong> <strong>software</strong> intermediario y los mo<strong>de</strong>los<br />

<strong>de</strong> los <strong>compon<strong>en</strong>tes</strong>, <strong>de</strong>b<strong>en</strong> agregarse a los criterios <strong>de</strong> evaluación.<br />

2.6.1 Métodos <strong>de</strong> prueba <strong>de</strong> <strong>software</strong> basado <strong>en</strong> <strong>compon<strong>en</strong>tes</strong>.<br />

Con <strong>el</strong> propósito <strong>de</strong> organizar algunas <strong>de</strong> las estrategias <strong>de</strong> prueba <strong>de</strong> <strong>compon<strong>en</strong>tes</strong> más<br />

comunes, <strong>en</strong> las sigui<strong>en</strong>tes secciones se pres<strong>en</strong>ta una <strong>de</strong>scripción <strong>de</strong> las mismas <strong>en</strong> los<br />

términos que se pres<strong>en</strong>taron para <strong>el</strong> <strong>en</strong>foque ori<strong>en</strong>tado a objetos, <strong>de</strong> niv<strong>el</strong> unidad y niv<strong>el</strong> <strong>de</strong><br />

integración.<br />

35


2.6.1.1 <strong>Prueba</strong>s <strong>de</strong> unidad.<br />

Aunque la realización <strong>de</strong> pruebas <strong>de</strong> unidad es una actividad que <strong>en</strong> algún mom<strong>en</strong>to es<br />

llevada a cabo por <strong>el</strong> <strong>de</strong>sarrollador, existe un marco <strong>de</strong> trabajo adicional a consi<strong>de</strong>rar: <strong>el</strong> <strong>de</strong> la<br />

persona que se interesa <strong>en</strong> <strong>el</strong> compon<strong>en</strong>te con <strong>el</strong> fin <strong>de</strong> integrarlo <strong>en</strong> sus sistemas.<br />

Actualm<strong>en</strong>te son pocos los trabajos <strong>en</strong> materia <strong>de</strong> pruebas <strong>de</strong> unidad para<br />

<strong>compon<strong>en</strong>tes</strong>, dos sobresali<strong>en</strong>tes <strong>en</strong> este ramo son <strong>el</strong> proyecto Trusted Compon<strong>en</strong>ts [TRU99]<br />

y <strong>el</strong> Proyecto Kimera [SIR97], aunque este último no esta dirigido totalm<strong>en</strong>te a <strong>compon<strong>en</strong>tes</strong>,<br />

sino a la seguridad <strong>de</strong> las máquinas virtuales <strong>de</strong> Java cada vez que se carga una clase.<br />

Trusted Compon<strong>en</strong>ts, es un proyecto <strong>de</strong> investigación paras asistir a la industria <strong>de</strong><br />

construcción <strong>de</strong> <strong>software</strong> mediante librerías probadas <strong>de</strong> <strong>compon<strong>en</strong>tes</strong>. Las pruebas que se<br />

aplican a los <strong>compon<strong>en</strong>tes</strong> se construy<strong>en</strong> bajo los combinación <strong>de</strong> varios <strong>en</strong>foques como<br />

diseño por contrato, como pruebas matemáticas, métricas, validación exhaustiva <strong>en</strong> proyectos<br />

prácticos y manejo <strong>de</strong> cambios rigurosos.<br />

2.6.1.2 <strong>Prueba</strong>s <strong>de</strong> integración.<br />

Si las pruebas <strong>de</strong> niv<strong>el</strong> <strong>de</strong> unidad para <strong>compon<strong>en</strong>tes</strong> muestran severas car<strong>en</strong>cias, <strong>en</strong><br />

niv<strong>el</strong> <strong>de</strong> integración, al igual que <strong>en</strong> otros <strong>en</strong>foques <strong>de</strong> <strong>de</strong>sarrollo, las car<strong>en</strong>cias son aún más<br />

notables. Sin embargo, exist<strong>en</strong> coinci<strong>de</strong>ncias <strong>en</strong> cuanto a las problemáticas comunes al<br />

integrar <strong>compon<strong>en</strong>tes</strong>:<br />

- El volum<strong>en</strong> y la l<strong>en</strong>titud.<br />

Cuando se utilizan <strong>compon<strong>en</strong>tes</strong> <strong>de</strong>ntro <strong>de</strong> un sistema, no siempre se utilizan todas<br />

sus capacida<strong>de</strong>s, lo que hace que cierta parte <strong>de</strong>l código no sea necesario. Este<br />

36


problema se agrava cuando se ti<strong>en</strong><strong>en</strong> sistemas gran<strong>de</strong>s, afectándose así su<br />

r<strong>en</strong>dimi<strong>en</strong>to.<br />

- Los mecanismos <strong>de</strong> comunicación utilizados.<br />

Se han pres<strong>en</strong>tado algunas contrarieda<strong>de</strong>s e inconsist<strong>en</strong>cias al utilizar <strong>de</strong>ntro <strong>de</strong> un<br />

mismo sistema varios mecanismos <strong>de</strong> comunicación como ev<strong>en</strong>tos, m<strong>en</strong>sajes o bi<strong>en</strong><br />

<strong>el</strong> paso <strong>de</strong> parámetros.<br />

37


Capítulo 3<br />

Descripción <strong>de</strong>l Diseño.<br />

Una vez que se han abordado los fundam<strong>en</strong>tos teóricos involucrados <strong>en</strong> <strong>el</strong> <strong>de</strong>sarrollo<br />

<strong>de</strong> este proyecto, <strong>en</strong> este tercer capítulo se pres<strong>en</strong>ta información refer<strong>en</strong>te al diseño y<br />

funciones <strong>de</strong> la herrami<strong>en</strong>ta <strong>de</strong> prueba.<br />

Inicialm<strong>en</strong>te se pres<strong>en</strong>tan al lector algunas secciones que sirv<strong>en</strong> como un marco <strong>de</strong><br />

refer<strong>en</strong>cia <strong>en</strong> que se abordan aspectos sobre la necesidad <strong>de</strong> la herrami<strong>en</strong>ta, su ambi<strong>en</strong>te <strong>de</strong><br />

operación, su alcance y limitaciones. Posteriorm<strong>en</strong>te, se <strong>de</strong>scribirá la herrami<strong>en</strong>ta con base <strong>en</strong><br />

los módulos que la conforman y la funcionalidad que estos prove<strong>en</strong>.<br />

3.1 Antece<strong>de</strong>ntes.<br />

El mo<strong>de</strong>lo <strong>de</strong> <strong>de</strong>sarrollo ori<strong>en</strong>tado a objetos se ha convertido <strong>en</strong> una alternativa<br />

bastante popular para la construcción <strong>de</strong> <strong>software</strong>; actualm<strong>en</strong>te está si<strong>en</strong>do adoptada por<br />

muchos <strong>de</strong>sarrolladores. D<strong>en</strong>tro <strong>de</strong> este <strong>en</strong>torno, se pue<strong>de</strong>n <strong>en</strong>contrar una amplia gama <strong>de</strong><br />

<strong>el</strong>em<strong>en</strong>tos que asist<strong>en</strong> la construcción <strong>de</strong> este tipo <strong>de</strong> <strong>software</strong>, l<strong>en</strong>guajes como Pascal y C++,<br />

que han sido adaptados con <strong>el</strong> fin <strong>de</strong> ofrecer capacida<strong>de</strong>s <strong>de</strong> ori<strong>en</strong>tación a objetos, o bi<strong>en</strong><br />

alternativas como Eiff<strong>el</strong> y una <strong>de</strong> las más reci<strong>en</strong>tes, Java, l<strong>en</strong>guaje que cada día es mas<br />

utilizado.<br />

Muy r<strong>el</strong>acionada con la tecnología <strong>de</strong> objetos se ti<strong>en</strong>e <strong>el</strong> <strong>de</strong>sarrollo <strong>de</strong> <strong>software</strong> basado<br />

<strong>en</strong> <strong>compon<strong>en</strong>tes</strong>. Actualm<strong>en</strong>te la construcción <strong>de</strong> <strong>software</strong> basado <strong>en</strong> <strong>compon<strong>en</strong>tes</strong> está<br />

convirtiéndose <strong>en</strong> una práctica que va ganando aceptación y aunque ofrece ciertas v<strong>en</strong>tajas, <strong>el</strong><br />

principal inconv<strong>en</strong>i<strong>en</strong>te que se pres<strong>en</strong>ta es <strong>el</strong> que se refiere a su calidad. Los <strong>compon<strong>en</strong>tes</strong> se<br />

ofrec<strong>en</strong> g<strong>en</strong>eralm<strong>en</strong>te como unida<strong>de</strong>s terminadas por lo que, para usarlas <strong>el</strong> usuario requiere<br />

conocer <strong>en</strong> primera instancia qué hace, y <strong>en</strong> segunda, y no m<strong>en</strong>os importante, que lo que <strong>el</strong><br />

compon<strong>en</strong>te hace se hace siempre bi<strong>en</strong>, o al m<strong>en</strong>os, <strong>en</strong> términos mas realistas, que la<br />

funcionalidad <strong>de</strong>l compon<strong>en</strong>te será la esperada <strong>de</strong>ntro <strong>de</strong>l marco <strong>de</strong> trabajo <strong>en</strong> <strong>el</strong> que se<br />

38


pret<strong>en</strong><strong>de</strong> usarlo. Esto permite <strong>en</strong>t<strong>en</strong><strong>de</strong>r que un aspecto fundam<strong>en</strong>tal para <strong>de</strong>terminar la calidad,<br />

y por consigui<strong>en</strong>te conseguir la aceptación <strong>de</strong> un compon<strong>en</strong>te y <strong>de</strong> su <strong>en</strong>foque <strong>de</strong> <strong>de</strong>sarrollo,<br />

sigue si<strong>en</strong>do la prueba, igual que ocurre <strong>en</strong> otros mo<strong>de</strong>los.<br />

En <strong>el</strong> <strong>software</strong> ori<strong>en</strong>tado a objetos y especialm<strong>en</strong>te <strong>en</strong> <strong>el</strong> <strong>de</strong> <strong>compon<strong>en</strong>tes</strong>, existe una<br />

característica muy <strong>de</strong>stacable: <strong>el</strong> reuso, aspecto muy importante a consi<strong>de</strong>rar para realizar la<br />

prueba. Cuando se realiza una prueba <strong>de</strong> <strong>software</strong>, este proceso la mayoría <strong>de</strong> las veces, se<br />

lleva a cabo por <strong>el</strong> mismo <strong>de</strong>sarrollador. Apoyándose <strong>en</strong> metodologías a<strong>de</strong>cuadas, se pue<strong>de</strong>n<br />

obt<strong>en</strong>er resultados significativos para <strong>de</strong>terminar la calidad <strong>de</strong>l <strong>software</strong>, sin embargo<br />

conv<strong>en</strong>dría reflexionar un poco más sobre esto. El <strong>en</strong>torno consi<strong>de</strong>rado para la realización <strong>de</strong><br />

la prueba es <strong>el</strong> imaginado por <strong>el</strong> <strong>de</strong>sarrollador <strong>de</strong>l compon<strong>en</strong>te, mismo que <strong>en</strong> algunos casos<br />

pue<strong>de</strong> verse influ<strong>en</strong>ciado <strong>de</strong> manera inconsci<strong>en</strong>te por sus propios intereses, esto último pue<strong>de</strong><br />

evitar que muchos <strong>de</strong> los errores puedan ser <strong>de</strong>scubiertos. Si <strong>el</strong> <strong>software</strong> es utilizado por<br />

personas difer<strong>en</strong>tes al <strong>de</strong>sarrollador, es muy posible consi<strong>de</strong>rar que <strong>el</strong> ambi<strong>en</strong>te <strong>de</strong> operación<br />

difiera, ante esta posibilidad, pue<strong>de</strong> plantearse la sigui<strong>en</strong>te interrogante, ¿es sufici<strong>en</strong>te la<br />

prueba realizada por <strong>el</strong> <strong>de</strong>sarrollador para garantizar que <strong>el</strong> compon<strong>en</strong>te es <strong>de</strong> calidad?, <strong>en</strong> la<br />

mayoría <strong>de</strong> los casos la respuesta es no.<br />

3.2 La <strong>Prueba</strong> <strong>de</strong> beans.<br />

De las nuevas alternativas para construir <strong>software</strong> ori<strong>en</strong>tado a objetos, Java es una <strong>de</strong><br />

las que ha ganado muchos a<strong>de</strong>ptos. De hecho, mucho <strong>de</strong>l <strong>software</strong> que se construye hoy, esta<br />

si<strong>en</strong>do escrito con este l<strong>en</strong>guaje <strong>de</strong> programación, <strong>de</strong>l cual analizando sus características, no es<br />

difícil <strong>en</strong>t<strong>en</strong><strong>de</strong>r <strong>el</strong> porqué.<br />

Java es un l<strong>en</strong>guaje <strong>de</strong> programación Ori<strong>en</strong>tado a Objetos, <strong>de</strong> propósito g<strong>en</strong>eral, creado<br />

por la compañía Sun Microsystems. Está parcialm<strong>en</strong>te basado <strong>en</strong> C lo que facilita su<br />

apr<strong>en</strong>dizaje; quizás una <strong>de</strong> sus más atractivas v<strong>en</strong>tajas es la in<strong>de</strong>p<strong>en</strong><strong>de</strong>ncia <strong>de</strong> <strong>software</strong> y<br />

hardware que ti<strong>en</strong><strong>en</strong> las aplicaciones que con él se construy<strong>en</strong>. Dada esta característica,<br />

cuando se crea una aplicación <strong>en</strong> Java para una plataforma específica, <strong>el</strong> <strong>de</strong>sarrollador <strong>de</strong><br />

39


aplicaciones ya no ti<strong>en</strong>e que invertir tiempo y esfuerzo para modificarla <strong>en</strong> caso <strong>de</strong> que t<strong>en</strong>ga<br />

que migrarla hacia otros ambi<strong>en</strong>tes, sino solo preocuparse por disponer <strong>de</strong> la máquina virtual<br />

a<strong>de</strong>cuada.<br />

Cuando surge <strong>el</strong> mo<strong>de</strong>lo <strong>de</strong> <strong>de</strong>sarrollo basado <strong>en</strong> <strong>compon<strong>en</strong>tes</strong>, al igual que ocurrió con<br />

los objetos, algunas compañías ofrec<strong>en</strong> alternativas para la construcción <strong>de</strong> <strong>software</strong> <strong>en</strong> este<br />

contexto. Tres <strong>de</strong> las más significativas se pres<strong>en</strong>taron <strong>en</strong> <strong>el</strong> capítulo 1. Con Java Beans,<br />

actualm<strong>en</strong>te es posible contar con las capacida<strong>de</strong>s que ofrece Java <strong>en</strong> <strong>el</strong> ámbito <strong>de</strong> los<br />

<strong>compon<strong>en</strong>tes</strong>.<br />

Como <strong>el</strong> <strong>software</strong> <strong>de</strong> <strong>compon<strong>en</strong>tes</strong> es r<strong>el</strong>ativam<strong>en</strong>te nuevo, <strong>en</strong> materia <strong>de</strong> pruebas no<br />

ti<strong>en</strong>e nada formal, sobre todo si la prueba ésta p<strong>en</strong>sada más para un usuario final, factor<br />

<strong>de</strong>terminante para <strong>el</strong> uso <strong>de</strong> <strong>compon<strong>en</strong>tes</strong>. Actualm<strong>en</strong>te exist<strong>en</strong> herrami<strong>en</strong>tas automatizadas<br />

para probar <strong>software</strong> ori<strong>en</strong>tado a objetos y bajo ciertas consi<strong>de</strong>raciones algunos <strong>de</strong> los<br />

métodos <strong>de</strong>finidos para probarlo pue<strong>de</strong>n ser aplicables a <strong>compon<strong>en</strong>tes</strong>, ya que estos son un<br />

tipo <strong>de</strong> <strong>software</strong> muy parecido al ori<strong>en</strong>tado a objetos.<br />

Aún ante la pres<strong>en</strong>cia <strong>de</strong> una afirmación <strong>de</strong> garantía total sobre <strong>el</strong> compon<strong>en</strong>te que se<br />

dispone a utilizar, <strong>el</strong> usuario normalm<strong>en</strong>te, antes <strong>de</strong> adoptarlo, lo somete a una proceso <strong>de</strong><br />

prueba. Este proceso, <strong>de</strong> acuerdo a su experi<strong>en</strong>cia y suspicacia, pue<strong>de</strong> ser <strong>de</strong>tallado e<br />

implem<strong>en</strong>tado bajo metodologías formales <strong>de</strong> prueba <strong>de</strong> <strong>software</strong>. Sin embargo, si<strong>en</strong>do<br />

realistas, la mayoría <strong>de</strong> los usuarios finales carec<strong>en</strong> <strong>de</strong> estos conocimi<strong>en</strong>tos. A<strong>de</strong>más, cuando<br />

un compon<strong>en</strong>te se ofrece <strong>en</strong> <strong>el</strong> mercado, es una unidad <strong>en</strong>capsulada y, <strong>en</strong> <strong>el</strong> caso <strong>de</strong><br />

JavaBeans, comprimida <strong>de</strong>ntro <strong>de</strong> un archivo JAR, que impi<strong>de</strong> al m<strong>en</strong>os <strong>de</strong> forma inmediata,<br />

que pueda ser inspeccionada por <strong>el</strong> usuario. El difícil acceso a todos los métodos <strong>de</strong>l<br />

compon<strong>en</strong>te, obstaculiza que estos puedan ser sometidos a una prueba. En términos g<strong>en</strong>erales,<br />

no se cu<strong>en</strong>tan con muchas alternativas para probar <strong>compon<strong>en</strong>tes</strong>.<br />

40


Actualm<strong>en</strong>te exist<strong>en</strong> <strong>en</strong> <strong>el</strong> mercado herrami<strong>en</strong>tas para probar clases <strong>de</strong> Java como por<br />

ejemplo junit (1) y jtest (2) , pero no son útiles para realizar pruebas a Beans y, <strong>en</strong> g<strong>en</strong>eral estas<br />

<strong>de</strong>scansan sobre <strong>el</strong> código fu<strong>en</strong>te.<br />

Es cierto que <strong>el</strong> BeanBox pue<strong>de</strong> consi<strong>de</strong>rarse como una herrami<strong>en</strong>ta con facilida<strong>de</strong>s <strong>de</strong><br />

prueba, pues <strong>de</strong> manera implícita, implem<strong>en</strong>ta algunas funciones para la prueba <strong>de</strong><br />

<strong>compon<strong>en</strong>tes</strong>. El usuario pue<strong>de</strong> cargar, interconectar y ejecutar <strong>compon<strong>en</strong>tes</strong> <strong>de</strong>ntro <strong>de</strong>l<br />

BeanBox. Mediante la PropertySheet, se permite al usuario modificar directam<strong>en</strong>te los valores<br />

para las algunas propieda<strong>de</strong>s, o bi<strong>en</strong>, visualizar efecto g<strong>en</strong>erado sobre estas, como producto <strong>de</strong><br />

la ejecución <strong>de</strong> métodos. Este procedimi<strong>en</strong>to pue<strong>de</strong> repetirse tantas veces se requiera, y<br />

aunque <strong>el</strong> monitoreo <strong>de</strong> casos es responsabilidad <strong>de</strong>l usuario, este pue<strong>de</strong> comparar los<br />

resultados obt<strong>en</strong>idos y <strong>de</strong>terminar si <strong>el</strong> comportami<strong>en</strong>to <strong>de</strong>l compon<strong>en</strong>te es <strong>el</strong> a<strong>de</strong>cuado, o<br />

mejor dicho, si la funcionalidad <strong>de</strong>l compon<strong>en</strong>te es la que necesita. A pesar <strong>de</strong> esto, las<br />

capacida<strong>de</strong>s ofrecidas distan mucho <strong>de</strong> las que ofrece una herrami<strong>en</strong>ta creada especialm<strong>en</strong>te<br />

para probar <strong>software</strong>, puesto que la prueba es solo visual.<br />

En <strong>el</strong> caso que una compon<strong>en</strong>te pres<strong>en</strong>ta una falla, mediante <strong>el</strong> BeanBox, no siempre<br />

es posible saber qué parte es la que falló; con un poco <strong>de</strong> suerte, <strong>el</strong> usuario podría i<strong>de</strong>ntificar<br />

bajo qué condiciones no trabaja correctam<strong>en</strong>te <strong>el</strong> compon<strong>en</strong>te; sin embargo esto no <strong>de</strong>ja <strong>de</strong> ser<br />

una prueba muy oscura. Ya se m<strong>en</strong>cionó que exist<strong>en</strong> <strong>el</strong>em<strong>en</strong>tos <strong>de</strong> la clase que son<br />

manipulables, pero no son todos, exist<strong>en</strong> métodos que no pue<strong>de</strong>n ser directam<strong>en</strong>te afectados<br />

por <strong>el</strong> usuario, por lo que usando <strong>el</strong> BDK, no son fáciles <strong>de</strong> probar.<br />

Todo esto nos permite p<strong>en</strong>sar que se requiere contar con alternativas más robustas que<br />

permitan probar este tipo <strong>de</strong> <strong>compon<strong>en</strong>tes</strong>.<br />

1 http://www.mcwestcorp.com/Junit.html<br />

2 http://www.parasoft.com/products/jtest/quick.html<br />

41


3.3 Aspectos <strong>de</strong> diseño.<br />

El objetivo <strong>de</strong> este trabajo es pres<strong>en</strong>tar una herrami<strong>en</strong>ta para realizar pruebas a<br />

<strong>compon<strong>en</strong>tes</strong> construidos bajo <strong>el</strong> mo<strong>de</strong>lo <strong>de</strong> Java Beans. Las pruebas que realiza la<br />

herrami<strong>en</strong>ta se aplican <strong>en</strong> <strong>el</strong> niv<strong>el</strong> <strong>de</strong> unidad, puesto que como un primer esfuerzo, este trabajo<br />

se apoya <strong>en</strong> trabajos g<strong>en</strong>erados para este niv<strong>el</strong> <strong>en</strong> <strong>el</strong> ámbito ori<strong>en</strong>tado a objetos. Así mismo <strong>en</strong><br />

materia <strong>de</strong> <strong>compon<strong>en</strong>tes</strong>, es <strong>el</strong> niv<strong>el</strong> <strong>de</strong>l cual se dispone mayor cantidad <strong>de</strong> información,<br />

comparándolo con <strong>el</strong> <strong>de</strong> niv<strong>el</strong> <strong>de</strong> integración.<br />

Para <strong>el</strong> diseño <strong>de</strong> la herrami<strong>en</strong>ta, se i<strong>de</strong>ntificaron cuatro etapas <strong>de</strong>terminantes:<br />

a) La s<strong>el</strong>ección <strong>de</strong> unida<strong>de</strong>s a ser probadas,<br />

b) la g<strong>en</strong>eración <strong>de</strong> casos <strong>de</strong> prueba,<br />

c) la ejecución <strong>de</strong>l plan <strong>de</strong> prueba, y<br />

d) la pres<strong>en</strong>tación <strong>de</strong> resultados.<br />

Estas etapas se implem<strong>en</strong>tan <strong>en</strong> la herrami<strong>en</strong>ta como un conjunto <strong>de</strong> módulos con<br />

funciones bi<strong>en</strong> <strong>de</strong>finidas y que guardan <strong>de</strong>p<strong>en</strong><strong>de</strong>ncias mínimas <strong>en</strong>tre sí. La <strong>de</strong>p<strong>en</strong><strong>de</strong>ncia<br />

principal radica <strong>en</strong> las salidas que g<strong>en</strong>eran, las cuales <strong>en</strong> algunos casos son utilizadas como<br />

<strong>en</strong>tradas para otros módulos. Esta estructura permite un <strong>en</strong>foque similar al <strong>de</strong> <strong>de</strong>sarrollo a<br />

partir <strong>de</strong> <strong>compon<strong>en</strong>tes</strong>, <strong>de</strong> forma que se pue<strong>de</strong>n realizar cambios y sustituciones <strong>de</strong> módulos<br />

<strong>de</strong> acuerdo a las prefer<strong>en</strong>cias <strong>de</strong> los usuarios. Todos estos módulos son invocados <strong>de</strong>s<strong>de</strong> un<br />

modulo lanzador, ver Figura 3.1.<br />

A continuación se pres<strong>en</strong>ta la <strong>de</strong>scripción <strong>de</strong> cada uno <strong>de</strong> los módulos <strong>de</strong> la herrami<strong>en</strong>ta.<br />

42


Usuario<br />

<strong>de</strong> la<br />

herrami<strong>en</strong>ta<br />

L<br />

a<br />

n<br />

z<br />

a<br />

d<br />

o<br />

r<br />

S<strong>el</strong>ección <strong>de</strong> los<br />

<strong>compon<strong>en</strong>tes</strong><br />

G<strong>en</strong>erador <strong>de</strong> Casos<br />

<strong>de</strong> <strong>Prueba</strong><br />

Editor <strong>de</strong> Casos <strong>de</strong><br />

<strong>Prueba</strong><br />

Ejecutor <strong>de</strong> Casos<br />

<strong>de</strong> <strong>Prueba</strong> II<br />

Pres<strong>en</strong>tador <strong>de</strong><br />

Resultados II<br />

Pres<strong>en</strong>tador <strong>de</strong><br />

Resultados I<br />

Ejecutor <strong>de</strong> Casos<br />

<strong>de</strong> <strong>Prueba</strong> I<br />

Figura 3.1 R<strong>el</strong>aciones <strong>en</strong>tre los módulos <strong>de</strong> la herrami<strong>en</strong>ta <strong>de</strong> prueba.<br />

S3<br />

S4<br />

S5<br />

S1<br />

S2<br />

S6<br />

Salida a un<br />

archivo <strong>de</strong> texto<br />

43


3.3.1 S<strong>el</strong>ección <strong>de</strong> los <strong>compon<strong>en</strong>tes</strong>.<br />

El <strong>software</strong> ori<strong>en</strong>tado a objetos g<strong>en</strong>eralm<strong>en</strong>te está construido a partir <strong>de</strong> un conjunto <strong>de</strong><br />

clases, las cuales ofrec<strong>en</strong> y utilizan servicios <strong>en</strong>tre sí con <strong>el</strong> fin <strong>de</strong> realizar ciertas funciones.<br />

A<strong>de</strong>más <strong>de</strong> las clases, para que funcione una aplicación, se pue<strong>de</strong>n requerir otros <strong>el</strong>em<strong>en</strong>tos<br />

tales como archivos <strong>de</strong> imág<strong>en</strong>es, <strong>de</strong> configuración o <strong>de</strong> ayuda. Esta situación se pres<strong>en</strong>ta<br />

también <strong>en</strong> los <strong>compon<strong>en</strong>tes</strong> escritos con Java.<br />

La mayoría <strong>de</strong> los <strong>compon<strong>en</strong>tes</strong> construidos bajo <strong>el</strong> mo<strong>de</strong>lo <strong>de</strong> Java Beans, conti<strong>en</strong><strong>en</strong><br />

los sigui<strong>en</strong>tes <strong>el</strong>em<strong>en</strong>tos:<br />

a) Una o más clases <strong>de</strong>finidas como Beans,<br />

b) un archivo para su repres<strong>en</strong>tación mediante un icono, y<br />

c) una o más clases que no están <strong>de</strong>finidas como Beans, pero que son necesarias<br />

para <strong>el</strong> funcionami<strong>en</strong>to <strong>de</strong>l compon<strong>en</strong>te.<br />

Para muchos <strong>de</strong> los usuarios <strong>de</strong>l <strong>software</strong> ori<strong>en</strong>tado a objetos, y <strong>en</strong> especial <strong>de</strong><br />

<strong>compon<strong>en</strong>tes</strong>, <strong>el</strong> t<strong>en</strong>er que manejar estos <strong>el</strong>em<strong>en</strong>tos <strong>en</strong> forma individual pue<strong>de</strong> repres<strong>en</strong>tar<br />

cierta dificultad o incomodidad, por esta razón, si se ha t<strong>en</strong>ido la oportunidad <strong>de</strong> utilizar<br />

<strong>compon<strong>en</strong>tes</strong> <strong>de</strong> Java, se pue<strong>de</strong> apreciar que estos se pres<strong>en</strong>tan <strong>en</strong> muchas ocasiones como un<br />

archivo JAR, mismo que empaqueta todos los <strong>el</strong>em<strong>en</strong>tos necesarios para la ejecución <strong>de</strong>l<br />

compon<strong>en</strong>te <strong>de</strong>ntro una sola unidad.<br />

Cuando un compon<strong>en</strong>te se carga <strong>en</strong> <strong>el</strong> BeanBox, si <strong>el</strong> archivo JAR fue correctam<strong>en</strong>te<br />

creado, se extra<strong>en</strong> <strong>el</strong> o los Beans cont<strong>en</strong>idos <strong>en</strong> él, así como otros <strong>el</strong>em<strong>en</strong>tos <strong>de</strong> forma que<br />

puedan utilizarse <strong>de</strong>ntro <strong>de</strong>l ambi<strong>en</strong>te <strong>de</strong> trabajo.<br />

De forma similar al BeanBox, la herrami<strong>en</strong>ta cu<strong>en</strong>ta con la capacidad para leer<br />

archivos JAR, con <strong>el</strong> propósito <strong>de</strong> que los procesos implem<strong>en</strong>tados para las pruebas puedan<br />

ser aplicados a los <strong>compon<strong>en</strong>tes</strong> que <strong>el</strong> archivo cont<strong>en</strong>ga. Exist<strong>en</strong> algunas consi<strong>de</strong>raciones con<br />

44


especto a los archivos JAR para que puedan ser correctam<strong>en</strong>te manipulados por la<br />

herrami<strong>en</strong>ta. Básicam<strong>en</strong>te las consi<strong>de</strong>raciones son <strong>de</strong> dos tipos:<br />

1. Con respecto a su cont<strong>en</strong>ido:<br />

a) Que las clases sean <strong>compon<strong>en</strong>tes</strong> implem<strong>en</strong>tados bajo las consi<strong>de</strong>raciones<br />

<strong>de</strong>l mo<strong>de</strong>lo propuesto por JavaBeans.<br />

b) Que <strong>el</strong> compon<strong>en</strong>te sea válido, es <strong>de</strong>cir pueda ser cargado y utilizado<br />

correctam<strong>en</strong>te <strong>en</strong> <strong>el</strong> BeanBox.<br />

Las consi<strong>de</strong>raciones respecto al cont<strong>en</strong>ido permit<strong>en</strong> que la herrami<strong>en</strong>ta pueda<br />

disponer <strong>de</strong> unida<strong>de</strong>s válidas para los procesos que realiza.<br />

2. Con respecto a su función:<br />

a) Que <strong>el</strong> usuario t<strong>en</strong>ga una compr<strong>en</strong>sión, al m<strong>en</strong>os g<strong>en</strong>eral, <strong>de</strong> la función que<br />

realiza <strong>el</strong> compon<strong>en</strong>te.<br />

La consi<strong>de</strong>ración respecto al cont<strong>en</strong>ido facilitan al usuario <strong>el</strong> análisis <strong>de</strong> los<br />

resultados g<strong>en</strong>erados por los procesos que realiza la herrami<strong>en</strong>ta.<br />

Las salida g<strong>en</strong>erada mediante la ejecución <strong>de</strong> este módulo consiste <strong>en</strong> un archivo <strong>de</strong><br />

texto <strong>de</strong>ntro <strong>de</strong>l cual se almac<strong>en</strong>an los nombres <strong>de</strong> cada uno <strong>de</strong> los <strong>compon<strong>en</strong>tes</strong> cont<strong>en</strong>idos <strong>en</strong><br />

<strong>el</strong> archivo JAR, esta información se comunica al usuario mediante la interfaz <strong>de</strong>l módulo. La<br />

Figura 3.2, muestra una vista <strong>de</strong> lo que vería <strong>el</strong> usuario <strong>de</strong>spués <strong>de</strong> haber utilizado este<br />

módulo.<br />

45


Figura 3.2 El módulo apertura <strong>de</strong> archivos JAR.<br />

3.3.2 La g<strong>en</strong>eración <strong>de</strong> casos <strong>de</strong> prueba.<br />

La <strong>de</strong>finición <strong>de</strong>l plan, es un aspecto <strong>de</strong>terminante para la efectividad <strong>de</strong> la prueba <strong>de</strong><br />

<strong>software</strong>, ya que los resultados obt<strong>en</strong>idos <strong>de</strong>spués <strong>de</strong> haberse realizado este proceso permitirán<br />

t<strong>en</strong>er ciertas directrices para calificar <strong>el</strong> comportami<strong>en</strong>to <strong>de</strong>l <strong>el</strong>em<strong>en</strong>to evaluado.<br />

Las pruebas <strong>de</strong> unidad para <strong>software</strong> ori<strong>en</strong>tado a objetos establec<strong>en</strong> como unidad<br />

<strong>el</strong>em<strong>en</strong>tal <strong>de</strong> evaluación a la clase, específicam<strong>en</strong>te a una instancia <strong>de</strong> esta, un objeto,<br />

dirigi<strong>en</strong>do especial at<strong>en</strong>ción a sus atributos y operaciones. De esta forma, una prueba i<strong>de</strong>al,<br />

podría ser aqu<strong>el</strong>la <strong>en</strong> la que se consi<strong>de</strong>raran a todos los métodos cont<strong>en</strong>idos <strong>en</strong> la clase.<br />

En <strong>el</strong> contexto <strong>de</strong> <strong>compon<strong>en</strong>tes</strong>, y <strong>en</strong> virtud <strong>de</strong> que <strong>el</strong> usuario experim<strong>en</strong>ta con <strong>el</strong>los,<br />

g<strong>en</strong>eralm<strong>en</strong>te no se dispone <strong>de</strong>l código fu<strong>en</strong>te, <strong>el</strong> <strong>en</strong>foque que parece ser más aplicable para<br />

realizar pruebas a este tipo <strong>de</strong> <strong>software</strong> es <strong>el</strong> funcional, ya que permite al probador<br />

experim<strong>en</strong>tar con respecto a <strong>en</strong>tradas suministradas y salidas obt<strong>en</strong>idas.<br />

46


De acuerdo a lo que establece [BER93], para <strong>el</strong> diseño <strong>de</strong> un plan <strong>de</strong> prueba <strong>de</strong>b<strong>en</strong><br />

consi<strong>de</strong>rarse los sigui<strong>en</strong>tes puntos:<br />

a) Establecer una r<strong>el</strong>ación <strong>en</strong>tre caso <strong>de</strong> prueba y clase.<br />

b) Establecer un propósito para la prueba.<br />

c) Definir los pasos <strong>de</strong> la prueba consi<strong>de</strong>rando:<br />

• una lista <strong>de</strong> estados iniciales <strong>de</strong> los objetos a probar,<br />

• una lista <strong>de</strong> métodos a ejercitar,<br />

• una lista <strong>de</strong> excepciones que pue<strong>de</strong>n ocurrir cuando se prueba <strong>el</strong> objeto,<br />

• una lista <strong>de</strong> condiciones externas para que se lleve a cabo <strong>de</strong> forma<br />

correcta la prueba, e<br />

• información adicional, <strong>en</strong> caso que se requiera, con <strong>el</strong> propósito <strong>de</strong> ayudar<br />

a realizar la prueba.<br />

T<strong>en</strong>i<strong>en</strong>do <strong>en</strong> cu<strong>en</strong>ta estos aspectos, la herrami<strong>en</strong>ta ofrece dos alternativas para la<br />

g<strong>en</strong>eración <strong>de</strong> casos <strong>de</strong> prueba: casos g<strong>en</strong>erados <strong>de</strong> forma automática y casos administrados<br />

por <strong>el</strong> usuario. A continuación se <strong>de</strong>scrib<strong>en</strong> las g<strong>en</strong>eralida<strong>de</strong>s <strong>de</strong> la g<strong>en</strong>eración automática <strong>de</strong><br />

casos <strong>de</strong> prueba.<br />

De acuerdo con <strong>el</strong> objetivo, automatizar la realización <strong>de</strong> pruebas tanto como sea<br />

posible, se ejecutarán programas con casos <strong>de</strong> prueba asociados. Con esto se pret<strong>en</strong><strong>de</strong> ofrecer<br />

al usuario una directriz sobre la calidad <strong>de</strong> la compon<strong>en</strong>te.<br />

La prueba preparada por la herrami<strong>en</strong>ta, consiste <strong>de</strong> un conjunto <strong>de</strong> casos <strong>de</strong> prueba,<br />

los cuales se aplican a los métodos cont<strong>en</strong>idos <strong>en</strong> la clase que implem<strong>en</strong>ta <strong>el</strong> compon<strong>en</strong>te.<br />

Exist<strong>en</strong> métodos o funcionalida<strong>de</strong>s <strong>de</strong>l compon<strong>en</strong>te, <strong>de</strong> las que un usuario espera<br />

comportami<strong>en</strong>to <strong>de</strong>terminado <strong>en</strong> r<strong>el</strong>ación a una <strong>en</strong>trada suministrada. T<strong>en</strong>i<strong>en</strong>do <strong>en</strong> m<strong>en</strong>te esto<br />

y, at<strong>en</strong>di<strong>en</strong>do las consi<strong>de</strong>raciones <strong>de</strong> la técnica <strong>de</strong> prueba <strong>de</strong> valores límite, los casos fueron<br />

p<strong>en</strong>sados bajo la premisa <strong>de</strong> que al suministrar valores a la frontera, es posible que pudieran<br />

pres<strong>en</strong>tarse errores al ejecutarse un método.<br />

47


Así mismo, se tomaron <strong>en</strong> cu<strong>en</strong>ta algunas consi<strong>de</strong>raciones <strong>de</strong> la prueba basada <strong>en</strong><br />

estados, con <strong>el</strong> propósito <strong>de</strong> pres<strong>en</strong>tar una <strong>de</strong>scripción <strong>de</strong>l estado <strong>de</strong> los objetos evaluados.<br />

Esto se consi<strong>de</strong>ró necesario ya que pue<strong>de</strong>n existir situaciones <strong>en</strong> la que la ejecución <strong>de</strong> un<br />

método ocurre sin ningún contratiempo, sin embargo <strong>el</strong> estado final <strong>de</strong>l compon<strong>en</strong>te no es <strong>el</strong><br />

esperado. Específicam<strong>en</strong>te se inspecciona <strong>el</strong> estado inicial y final <strong>de</strong>l compon<strong>en</strong>te, con<br />

respecto a la ejecución <strong>de</strong> un método.<br />

Es importante m<strong>en</strong>cionar que, aunque son técnicas validas y efici<strong>en</strong>tes para evaluar<br />

<strong>compon<strong>en</strong>tes</strong>, mediante su aplicación no es posible garantizar que todas las líneas <strong>de</strong> código<br />

que conti<strong>en</strong>e un método se ejercit<strong>en</strong>; esto se <strong>de</strong>be t<strong>en</strong>er pres<strong>en</strong>te al diseñar los casos <strong>de</strong> prueba<br />

y la cobertura <strong>de</strong> los mismos.<br />

Cuando un método se invoca suce<strong>de</strong>n varias cosas: <strong>el</strong> método toma los parámetros <strong>de</strong><br />

<strong>en</strong>trada, los combina con las variables <strong>de</strong> instancia, ejecuta <strong>el</strong> código correspondi<strong>en</strong>te y<br />

produce un resultado, [KUN96]. Consi<strong>de</strong>rando esta secu<strong>en</strong>cia <strong>de</strong> acciones, <strong>en</strong> la herrami<strong>en</strong>ta<br />

cada caso <strong>de</strong> prueba se g<strong>en</strong>era <strong>en</strong> torno a las <strong>en</strong>tradas que pue<strong>de</strong> recibir un método, las cuales<br />

han sido i<strong>de</strong>ntificadas mediante la revisión <strong>de</strong> sus parámetros. Estas pue<strong>de</strong>n pres<strong>en</strong>tarse como:<br />

a) Argum<strong>en</strong>tos que consist<strong>en</strong> <strong>en</strong> tipos <strong>de</strong>finidos <strong>en</strong> Java, como un int, char,<br />

Object, Color, etc., o bi<strong>en</strong>,<br />

b) La invocación <strong>de</strong> un objeto externo, específicam<strong>en</strong>te objetos <strong>de</strong>finidos por <strong>el</strong><br />

usuario.<br />

Aunque se ha m<strong>en</strong>cionado que se han tomado <strong>en</strong> cu<strong>en</strong>ta las consi<strong>de</strong>raciones <strong>de</strong> la<br />

prueba <strong>de</strong> valores limite para la g<strong>en</strong>eración <strong>de</strong> casos <strong>de</strong> prueba, también se <strong>de</strong>cidió someter a<br />

la unidad a condiciones muy simples, g<strong>en</strong>erado así también casos <strong>de</strong> prueba con estas<br />

características. Los valores establecidos para la g<strong>en</strong>eración <strong>de</strong> casos <strong>de</strong> prueba se pres<strong>en</strong>tan<br />

con <strong>de</strong>talle <strong>en</strong> <strong>el</strong> Anexo A.<br />

48


Con respecto a la cobertura <strong>de</strong> las pruebas, se pret<strong>en</strong><strong>de</strong> inicialm<strong>en</strong>te g<strong>en</strong>erar y<br />

suministrar casos <strong>de</strong> prueba a cada uno <strong>de</strong> los métodos cont<strong>en</strong>idos <strong>en</strong> la clase, sin embargo<br />

este objetivo pue<strong>de</strong> verse impedido ante la pres<strong>en</strong>cia <strong>de</strong> parámetros no consi<strong>de</strong>rados <strong>en</strong> la<br />

herrami<strong>en</strong>ta, o bi<strong>en</strong> cuando se pres<strong>en</strong>tan problemas al hacer refer<strong>en</strong>cia a objetos externos.<br />

Con <strong>el</strong> propósito <strong>de</strong> atacar esta <strong>de</strong>bilidad, se ha implem<strong>en</strong>tado un mecanismo que<br />

permite a este módulo cargar “Plug-ins” <strong>de</strong>finidos por <strong>el</strong> usuario. Este mecanismo consiste<br />

básicam<strong>en</strong>te <strong>de</strong> un archivo que conti<strong>en</strong>e valores <strong>de</strong> prueba para <strong>el</strong> nuevo argum<strong>en</strong>to y la<br />

inclusión <strong>de</strong>l constructor correspondi<strong>en</strong>te <strong>de</strong>ntro <strong>de</strong> una clase especial.<br />

Los casos <strong>de</strong> prueba g<strong>en</strong>erados por este módulo son almac<strong>en</strong>ados <strong>en</strong> un archivo <strong>de</strong><br />

texto. Mediante la interfaz <strong>de</strong> este módulo, se informa al usuario <strong>el</strong> número <strong>de</strong> métodos<br />

cont<strong>en</strong>idos <strong>en</strong> la clase, <strong>el</strong> número <strong>de</strong> métodos para los cuales se g<strong>en</strong>eraron casos <strong>de</strong> prueba, <strong>el</strong><br />

número <strong>de</strong> métodos para los que no se g<strong>en</strong>eraron casos <strong>de</strong> prueba y <strong>el</strong> número <strong>de</strong> métodos que<br />

no recib<strong>en</strong> ningún tipo <strong>de</strong> argum<strong>en</strong>to, ver Figura 3.3.<br />

Figura 3.3 El módulo g<strong>en</strong>erador <strong>de</strong> casos <strong>de</strong> prueba.<br />

De igual forma, este módulo g<strong>en</strong>era un segundo archivo <strong>de</strong> salida con <strong>el</strong> propósito <strong>de</strong><br />

que, posteriorm<strong>en</strong>te, <strong>el</strong> usuario, pueda utilizarlo para almac<strong>en</strong>ar los casos que él plantea<br />

49


mediante <strong>el</strong> módulo <strong>de</strong> edición <strong>de</strong> casos <strong>de</strong> prueba. En caso <strong>de</strong> que <strong>el</strong> usuario no <strong>de</strong>see<br />

proporcionar casos <strong>en</strong> la prueba <strong>de</strong> forma manual, <strong>el</strong> cont<strong>en</strong>ido <strong>de</strong>l archivo pue<strong>de</strong> <strong>de</strong>jarse sin<br />

modificación alguna.<br />

3.3.3 La ejecución <strong>de</strong> casos <strong>de</strong> prueba.<br />

Una vez que han sido g<strong>en</strong>erados los casos <strong>de</strong> prueba para un Bean, ya sea <strong>de</strong> forma<br />

automática o <strong>de</strong> forma manual, la sigui<strong>en</strong>te actividad consiste <strong>en</strong> alim<strong>en</strong>tar dichos casos <strong>de</strong><br />

prueba a los módulos correspondi<strong>en</strong>tes para que sean ejecutados, así como también capturar<br />

las salidas g<strong>en</strong>eradas como producto <strong>de</strong> esta serie <strong>de</strong> ejecuciones. Estas son las tareas que<br />

realizan los dos módulos ejecutores disponibles, uno <strong>de</strong> <strong>el</strong>los que ejecuta los casos g<strong>en</strong>erados<br />

<strong>de</strong> forma automática por la herrami<strong>en</strong>ta y otro que ejecuta los casos <strong>de</strong> prueba proporcionados<br />

por <strong>el</strong> usuario.<br />

Aunque <strong>en</strong> condiciones i<strong>de</strong>ales se pret<strong>en</strong><strong>de</strong> ejercitar cada uno <strong>de</strong> los métodos<br />

cont<strong>en</strong>idos <strong>en</strong> la clase al m<strong>en</strong>os una vez, pue<strong>de</strong>n existir métodos que se ejecut<strong>en</strong> más <strong>de</strong> una<br />

vez, al igual que métodos que pas<strong>en</strong> <strong>de</strong>sapercibidos durante esta etapa, como consecu<strong>en</strong>cia <strong>de</strong>l<br />

número <strong>de</strong> casos <strong>de</strong> prueba g<strong>en</strong>erados para cada método <strong>en</strong> <strong>el</strong> módulo anterior. De esta forma,<br />

se ejercitan los métodos que así lo permit<strong>en</strong><br />

Como consecu<strong>en</strong>cia <strong>de</strong> estas ejecuciones se produc<strong>en</strong> una serie <strong>de</strong> salidas las cuales, se<br />

i<strong>de</strong>ntifican mediante alguna <strong>de</strong> las sigui<strong>en</strong>tes alternativas:<br />

a) <strong>el</strong> valor <strong>de</strong> retorno <strong>de</strong>l método y,<br />

b) los mecanismos <strong>de</strong> excepción.<br />

Por tratarse <strong>de</strong> <strong>software</strong> ori<strong>en</strong>tado a objetos, es conv<strong>en</strong>i<strong>en</strong>te hacer más profunda la<br />

revisión y manejo <strong>de</strong> las salidas obt<strong>en</strong>idas, pues <strong>en</strong> ocasiones una salida correcta, no implica<br />

que <strong>el</strong> estado interno <strong>de</strong> un compon<strong>en</strong>te lo sea también. Con este propósito, se tomaron <strong>en</strong><br />

50


cu<strong>en</strong>ta algunas consi<strong>de</strong>raciones <strong>de</strong> la prueba basada <strong>en</strong> estados, por lo se agrega un tercer tipo<br />

<strong>de</strong> alternativa:<br />

c) <strong>el</strong> estado <strong>de</strong>l objeto<br />

Retomando i<strong>de</strong>as planteadas <strong>en</strong> [TUR93] y [BAS99], se inspecciona la repres<strong>en</strong>tación<br />

<strong>de</strong> los datos miembros y la forma <strong>en</strong> que los métodos están manipulando la repres<strong>en</strong>tación <strong>de</strong>l<br />

objeto, con <strong>el</strong> propósito <strong>de</strong> establecer un conjunto <strong>de</strong> estados que un objeto pue<strong>de</strong> t<strong>en</strong>er,<br />

concretam<strong>en</strong>te, un conjunto <strong>de</strong> estados validos a partir <strong>de</strong> los cuales pue<strong>de</strong> aceptar una <strong>en</strong>trada<br />

y un conjunto <strong>de</strong> estados válidos <strong>de</strong>spués <strong>de</strong> haberse g<strong>en</strong>erado una salida esperada. Esto<br />

permite que se puedan ejecutar casos <strong>de</strong> prueba parti<strong>en</strong>do <strong>de</strong>l estado inicial <strong>de</strong> la compon<strong>en</strong>te,<br />

o bi<strong>en</strong> cuando este estado haya cambiado como resultado <strong>de</strong> operaciones previas. Este manejo<br />

<strong>de</strong> estados consiste básicam<strong>en</strong>te <strong>en</strong> la g<strong>en</strong>eración <strong>de</strong>l pre-estado <strong>de</strong>l objeto sobre <strong>el</strong> cual <strong>el</strong><br />

método actúa y la g<strong>en</strong>eración <strong>de</strong>l post-estado resultante. Se está suponi<strong>en</strong>do <strong>el</strong> estado <strong>de</strong>l<br />

objeto como la colección <strong>de</strong> valores <strong>de</strong> las propieda<strong>de</strong>s <strong>de</strong>l Bean <strong>en</strong> un mom<strong>en</strong>to dado,<br />

accesibles mediante mecanismos <strong>de</strong>l propio Bean.<br />

Los módulos ejecutores <strong>de</strong> casos <strong>de</strong> prueba operan <strong>de</strong> forma individual y, al término <strong>de</strong><br />

la ejecución <strong>de</strong> cualquiera <strong>de</strong> estos, se dispone <strong>de</strong> un archivo <strong>de</strong> texto que almac<strong>en</strong>a los<br />

resultados obt<strong>en</strong>idos.<br />

De igual forma <strong>en</strong> ambos módulos, mediante la interfaz <strong>de</strong>l usuario se pres<strong>en</strong>ta un<br />

resum<strong>en</strong> que informa la cantidad <strong>de</strong> métodos <strong>en</strong> la clase, la cantidad <strong>de</strong> métodos para los<br />

cuales se ejecutaron casos <strong>de</strong> prueba y la cantidad <strong>de</strong> métodos para los cuales no se g<strong>en</strong>eraron<br />

casos <strong>de</strong> prueba. En la Figura 3.4, se pres<strong>en</strong>ta la interfaz <strong>de</strong> uno <strong>de</strong> los módulos <strong>de</strong>spués <strong>de</strong><br />

haberse ejecutado un serie <strong>de</strong> casos <strong>de</strong> prueba.<br />

51


Figura 3.4 El módulo ejecutor <strong>de</strong> casos <strong>de</strong> prueba.<br />

3.3.4 La Pres<strong>en</strong>tación <strong>de</strong> resultados.<br />

En la herrami<strong>en</strong>ta exist<strong>en</strong> tres módulos que permit<strong>en</strong> al usuario visualizar los<br />

resultados g<strong>en</strong>erados <strong>de</strong>spués <strong>de</strong> haberse realizado <strong>el</strong> proceso <strong>de</strong> prueba.<br />

Dos <strong>de</strong> los módulos, <strong>de</strong>scrib<strong>en</strong> primordialm<strong>en</strong>te <strong>el</strong> resultado obt<strong>en</strong>ido a partir <strong>de</strong> la<br />

prueba realizada al compon<strong>en</strong>te. Recordando que pue<strong>de</strong>n existir dos grupos <strong>de</strong> casos <strong>de</strong><br />

prueba, los que g<strong>en</strong>era la herrami<strong>en</strong>ta automáticam<strong>en</strong>te y los <strong>de</strong>finidos por <strong>el</strong> usuario, existe<br />

un módulo para pres<strong>en</strong>tar los resultados g<strong>en</strong>erados por cada una <strong>de</strong> estas dos modalida<strong>de</strong>s,<br />

exponiéndose <strong>en</strong> ambos la sigui<strong>en</strong>te información:<br />

a) Nombre <strong>de</strong> la clase evaluada.<br />

b) Para cada método cont<strong>en</strong>ido <strong>en</strong> la clase:<br />

• Descripción <strong>de</strong> los argum<strong>en</strong>tos <strong>de</strong>l método.<br />

• Descripción <strong>de</strong> valor <strong>de</strong> retorno <strong>de</strong>l método.<br />

• Total <strong>de</strong> casos <strong>de</strong> prueba g<strong>en</strong>erados.<br />

c) Para cada caso <strong>de</strong> prueba g<strong>en</strong>erado:<br />

• Detalle <strong>de</strong> los valores <strong>de</strong>l caso <strong>de</strong> prueba.<br />

• Estado <strong>de</strong>l compon<strong>en</strong>te antes <strong>de</strong> ejecutarse <strong>el</strong> caso <strong>de</strong> prueba.<br />

52


• Estado <strong>de</strong>l compon<strong>en</strong>te <strong>de</strong>spués <strong>de</strong> ejecutarse <strong>el</strong> caso <strong>de</strong> prueba.<br />

Todo esto se aprecia con mayor <strong>de</strong>talle <strong>en</strong> la Figura 3.5.<br />

Figura 3.5 El módulo que pres<strong>en</strong>ta los resultados <strong>de</strong> la prueba.<br />

53


El segundo módulo <strong>de</strong>nominado información interna, pres<strong>en</strong>ta información refer<strong>en</strong>te a<br />

la implem<strong>en</strong>tación <strong>de</strong> la clase. Para <strong>el</strong>lo se consi<strong>de</strong>ran los sigui<strong>en</strong>tes datos:<br />

a) Para cada variable:<br />

• El nombre.<br />

• El tipo.<br />

b) Número <strong>de</strong> métodos <strong>en</strong> la clase.<br />

c) Para cada método:<br />

• El nombre <strong>de</strong>l método.<br />

• Descripción <strong>de</strong> sus argum<strong>en</strong>tos <strong>de</strong> <strong>en</strong>trada.<br />

• Descripción sobre su valor <strong>de</strong> retorno.<br />

La Figura 3.6, pres<strong>en</strong>ta lo <strong>de</strong>scrito anteriorm<strong>en</strong>te.<br />

Como ya se ha m<strong>en</strong>cionado, las salidas g<strong>en</strong>eradas por estos módulos, permit<strong>en</strong> al<br />

usuario obt<strong>en</strong>er algunas <strong>de</strong> las directrices necesarias para la s<strong>el</strong>ección y evaluación <strong>de</strong> los<br />

<strong>compon<strong>en</strong>tes</strong>. Estas directrices pue<strong>de</strong>n obt<strong>en</strong>erse cuando se pres<strong>en</strong>tan algunas <strong>de</strong> estas<br />

situaciones:<br />

- Cambios <strong>de</strong> estado <strong>de</strong>l compon<strong>en</strong>te, específicam<strong>en</strong>te <strong>en</strong> <strong>el</strong> valor <strong>de</strong> sus<br />

propieda<strong>de</strong>s.<br />

- Excepciones g<strong>en</strong>eradas a partir <strong>de</strong> la ejecución <strong>de</strong> un método.<br />

- Análisis <strong>de</strong> los casos <strong>de</strong> prueba, lo que permite i<strong>de</strong>ntificar a qué obe<strong>de</strong>ce<br />

<strong>de</strong>terminado comportami<strong>en</strong>to <strong>de</strong> la compon<strong>en</strong>te.<br />

- Análisis <strong>de</strong> los métodos y variables, lo que permite obt<strong>en</strong>er directrices ori<strong>en</strong>tadas<br />

a métricas <strong>de</strong> <strong>software</strong>.<br />

- Total <strong>de</strong> métodos probados.<br />

- Total <strong>de</strong> casos <strong>de</strong> prueba g<strong>en</strong>erados para cada método.<br />

- Total <strong>de</strong> métodos no ejercitados.<br />

54


Figura 3.6 El módulo <strong>de</strong> información interna.<br />

55


Capítulo 4<br />

Descripción <strong>de</strong> la Arquitectura e Implem<strong>en</strong>tación.<br />

En <strong>el</strong> capítulo anterior se pres<strong>en</strong>taron aspectos r<strong>el</strong>acionados con los principios <strong>de</strong><br />

diseño y la metodología utilizada para la construcción <strong>de</strong> la herrami<strong>en</strong>ta; este capítulo se<br />

conc<strong>en</strong>tra <strong>en</strong> los <strong>de</strong>talles refer<strong>en</strong>tes a su implem<strong>en</strong>tación.<br />

En las sigui<strong>en</strong>tes secciones se <strong>de</strong>scrib<strong>en</strong> cada una <strong>de</strong> las clases que conforman la<br />

herrami<strong>en</strong>ta y la funcionalidad que estas prove<strong>en</strong>. Con este propósito apoyándose <strong>en</strong> notación<br />

<strong>en</strong> UML, inicialm<strong>en</strong>te se pres<strong>en</strong>ta un diagrama <strong>de</strong> colaboración <strong>en</strong>tre clases, a partir <strong>de</strong>l cual<br />

se podrá obt<strong>en</strong>er una vista g<strong>en</strong>eral <strong>de</strong> la arquitectura <strong>de</strong>l sistema, para posteriorm<strong>en</strong>te, abordar<br />

cada una <strong>de</strong> estas <strong>de</strong> forma más precisa.<br />

4.1 Arquitectura y colaboración <strong>en</strong>tre clases.<br />

PACJavaBeans está <strong>de</strong>sarrollada <strong>en</strong> Java 1.2.2. De esta forma, su implem<strong>en</strong>tación<br />

consiste <strong>de</strong> un conjunto <strong>de</strong> clases, las cuales proporcionan <strong>de</strong>terminados servicios con <strong>el</strong><br />

objetivo <strong>de</strong> llevar a cabo <strong>el</strong> proceso <strong>de</strong> prueba <strong>de</strong> <strong>compon<strong>en</strong>tes</strong>.<br />

Durante <strong>el</strong> capítulo anterior se hizo hincapié <strong>en</strong> que, durante su diseño, se i<strong>de</strong>ntificaron<br />

ciertas activida<strong>de</strong>s primordiales: la i<strong>de</strong>ntificación <strong>de</strong> las unida<strong>de</strong>s a ser probadas, la<br />

g<strong>en</strong>eración <strong>de</strong> casos <strong>de</strong> prueba, la ejecución <strong>de</strong>l plan <strong>de</strong> prueba y la pres<strong>en</strong>tación <strong>de</strong><br />

resultados. De forma g<strong>en</strong>eral, pue<strong>de</strong> <strong>de</strong>cirse que para llevar a cabo cada una <strong>de</strong> las activida<strong>de</strong>s<br />

anteriorm<strong>en</strong>te citadas, se implem<strong>en</strong>tó una clase <strong>en</strong> Java. En la Figura 4.1 se pres<strong>en</strong>tan<br />

gráficam<strong>en</strong>te estas clases, sus métodos más importantes y sus r<strong>el</strong>aciones <strong>de</strong> colaboración .<br />

Como se m<strong>en</strong>cionó <strong>en</strong> <strong>el</strong> capítulo 3 y se aprecia <strong>en</strong> la Figura 4.1, las r<strong>el</strong>aciones <strong>en</strong>tre<br />

las clases que conforman a la herrami<strong>en</strong>ta radican primordialm<strong>en</strong>te <strong>en</strong> la refer<strong>en</strong>cia a archivos<br />

<strong>de</strong> texto específicos para cada uno <strong>de</strong> los casos. Estos archivos se g<strong>en</strong>eran a partir <strong>de</strong>l trabajo<br />

realizado por alguna otra clase.<br />

56


La clase PACAbre correspon<strong>de</strong> a la actividad <strong>de</strong> i<strong>de</strong>ntificación <strong>de</strong> la unida<strong>de</strong>s a ser<br />

probadas, específicam<strong>en</strong>te a la extracción <strong>de</strong> archivos JAR. Esta clase g<strong>en</strong>era como salida <strong>el</strong><br />

archivo <strong>de</strong> texto “beans.txt”, <strong>el</strong> cual almac<strong>en</strong>a los nombres <strong>de</strong> los Beans cont<strong>en</strong>idos <strong>en</strong> <strong>el</strong> JAR.<br />

Este archivo lo utiliza posteriorm<strong>en</strong>te la clase PACG<strong>en</strong>era.<br />

PACG<strong>en</strong>era implem<strong>en</strong>ta los procesos necesarios para g<strong>en</strong>erar los casos <strong>de</strong> prueba para<br />

cada uno <strong>de</strong> los métodos cont<strong>en</strong>idos <strong>en</strong> <strong>el</strong> Bean. Estos casos se almac<strong>en</strong>an <strong>en</strong> <strong>el</strong> archivo <strong>de</strong><br />

texto “casos.txt”. Con la int<strong>en</strong>ción <strong>de</strong> que <strong>el</strong> usuario pueda proponer sus propios casos <strong>de</strong><br />

prueba, la clase PACG<strong>en</strong>era crea un segundo archivo <strong>de</strong> salida, <strong>de</strong>nominado “casosp.txt”, <strong>el</strong><br />

cual pue<strong>de</strong> utilizarse posteriorm<strong>en</strong>te para almac<strong>en</strong>ar este tipo <strong>de</strong> casos.<br />

La clase PACEjecuta toma los casos <strong>de</strong> prueba <strong>de</strong>l archivo “casos.txt” y los ejecuta.<br />

Los resultados obt<strong>en</strong>idos a partir <strong>de</strong> la ejecución <strong>de</strong> estos casos se guardan <strong>en</strong> <strong>el</strong> archivo<br />

“resultados.txt”, <strong>el</strong> cual es utilizado posteriorm<strong>en</strong>te por la clase PACResum<strong>en</strong> con <strong>el</strong> propósito<br />

<strong>de</strong> pres<strong>en</strong>tar al usuario la información g<strong>en</strong>erada a partir <strong>de</strong>l proceso <strong>de</strong> prueba realizado.<br />

De forma similar, la clase PACEjecuta2 ejecuta los casos <strong>de</strong> prueba proporcionados<br />

por <strong>el</strong> usuario, mismos que están almac<strong>en</strong>ados <strong>en</strong> <strong>el</strong> archivo “casosp.txt”. Los resultados<br />

obt<strong>en</strong>idos a partir <strong>de</strong> esta actividad se guardan <strong>en</strong> <strong>el</strong> archivo “resultadosp.txt”, <strong>el</strong> cual utiliza<br />

posteriorm<strong>en</strong>te la clase PACResum<strong>en</strong>2 que informa los resultados obt<strong>en</strong>idos.<br />

En la figura 4.1 se pue<strong>de</strong> apreciar <strong>de</strong> igual forma la pres<strong>en</strong>cia <strong>de</strong> otras clases:<br />

PACLanzador PACIInterna y PACAcerca. La clase PACLanzador, es una clase que se<br />

implem<strong>en</strong>tó con <strong>el</strong> propósito <strong>de</strong> contar con un mecanismo para administración <strong>de</strong> los procesos<br />

que se g<strong>en</strong>eran al ejercitar cada una <strong>de</strong> las clases <strong>de</strong> la herrami<strong>en</strong>ta. La clase PACLanzador<br />

funciona como un programa lanzador <strong>de</strong> aplicaciones con <strong>el</strong> cual <strong>el</strong> usuario pue<strong>de</strong> invocar los<br />

servicios <strong>de</strong> las clases restantes.<br />

En los que respecta a la clase PACAcerca, se construye para ofrecer la información<br />

tradicional <strong>de</strong> los autores <strong>de</strong> la herrami<strong>en</strong>ta.<br />

58


A continuación se pres<strong>en</strong>ta una <strong>de</strong>scripción sobre la implem<strong>en</strong>tación <strong>de</strong> cada una <strong>de</strong> las<br />

clases <strong>de</strong> la Figura 4.1.<br />

4.1.1 La invocación <strong>de</strong> los servicios.<br />

Como ya se ha m<strong>en</strong>cionado, PACJavaBeans ofrece al usuario los servicios <strong>de</strong>: apertura<br />

<strong>de</strong> archivos JAR, g<strong>en</strong>eración automática <strong>de</strong> casos <strong>de</strong> prueba, edición <strong>de</strong> casos <strong>de</strong> prueba por <strong>el</strong><br />

usuario, ejecución <strong>de</strong> los casos <strong>de</strong> prueba g<strong>en</strong>erados <strong>de</strong> forma automática, ejecución <strong>de</strong> los<br />

casos <strong>de</strong> prueba proporcionados por <strong>el</strong> usuario y pres<strong>en</strong>tación <strong>de</strong> resultados. Adicionalm<strong>en</strong>te,<br />

proporcionan servicios como Limpieza <strong>de</strong>l Entorno <strong>de</strong> Trabajo y Acerca <strong>de</strong>. La clase<br />

PACLanzador es la <strong>en</strong>cargada <strong>de</strong> proveer los mecanismos necesarios para la invocación <strong>de</strong><br />

estos servicios. Los <strong>de</strong>talles <strong>de</strong> los atributos y los métodos <strong>de</strong> esta clase se pres<strong>en</strong>tan <strong>en</strong> la<br />

Figura 4.2.<br />

PACLanzador<br />

JFrame<br />

void invocaModuloPACAbre()<br />

void invocaModuloPACG<strong>en</strong>era()<br />

void invocaModuloPACG<strong>en</strong>eraU()<br />

void invocaModuloPACEjecuta()<br />

sdsd<br />

void invocaModuloPACEjecutaU()<br />

void invocaModuloPACResum<strong>en</strong>()<br />

void invocaModuloPACResum<strong>en</strong>U()<br />

void invocaModuloPACIInterna()<br />

void invocaAccionesLimpiar()<br />

void invocaAccionesAcerca()<br />

void preparaEntorno()<br />

boolean existeArchivo (String archivo)<br />

boolean borraArchivo (String archivo)<br />

Runtime rt<br />

Process proceso<br />

ImageIcon icono<br />

JButton botonAbre, botonG<strong>en</strong>era, botonG<strong>en</strong>eraU, botonEjecuta<br />

JButton botonEjecutaU, botonResultados, botonResultadosU<br />

JButton botonIInterna, botonLimpiar, botonAcerca<br />

Figura 4.2 La clase PACLanzador.<br />

59


La clase PACLanzador implem<strong>en</strong>ta un cont<strong>en</strong>edor que reúne un conjunto <strong>de</strong> botones<br />

que <strong>el</strong> usuario pue<strong>de</strong> presionar con <strong>el</strong> propósito <strong>de</strong> invocar alguno <strong>de</strong> los servicios<br />

anteriorm<strong>en</strong>te m<strong>en</strong>cionados. Para <strong>el</strong>lo es necesario que esta clase haga uso <strong>de</strong> algunas <strong>de</strong> las<br />

funcionalida<strong>de</strong>s <strong>de</strong> la clase JFrame <strong>de</strong> Java.<br />

Los servicios se repres<strong>en</strong>tan como un conjunto <strong>de</strong> procesos que corr<strong>en</strong> <strong>de</strong> forma<br />

individual y bajo cierto or<strong>de</strong>n. Así mismo, algunos <strong>de</strong> los procesos requier<strong>en</strong> <strong>de</strong> <strong>de</strong>terminadas<br />

condiciones para que puedan ejecutarse, las cuales consist<strong>en</strong> primordialm<strong>en</strong>te <strong>en</strong> la exist<strong>en</strong>cia<br />

<strong>de</strong> un archivo <strong>de</strong> <strong>en</strong>trada específico.<br />

El constructor esta clase, PACLanzador(), conti<strong>en</strong>e las instrucciones necesarias para<br />

realizar las sigui<strong>en</strong>tes tareas: establecimi<strong>en</strong>to <strong>de</strong>l <strong>en</strong>torno inicial <strong>de</strong> operación, creación y<br />

pres<strong>en</strong>tación <strong>en</strong> pantalla <strong>de</strong>l cont<strong>en</strong>edor e invocación <strong>de</strong>l método correspondi<strong>en</strong>te al botón<br />

presionado por <strong>el</strong> usuario.<br />

El establecimi<strong>en</strong>to <strong>de</strong>l <strong>en</strong>torno inicial <strong>de</strong> operación consiste <strong>en</strong> <strong>el</strong>iminar toda aqu<strong>el</strong>la<br />

información que pudiera haberse g<strong>en</strong>erado por sesiones <strong>de</strong> prueba anteriores, utilizándose así<br />

los métodos void preparaEntorno(), boolean existeArchivo(String archivo) y boolean<br />

borraArchivo(String archivo).<br />

Una vez creado <strong>el</strong> ambi<strong>en</strong>te inicial, <strong>el</strong> constructor ejecuta las instrucciones necesarias<br />

para la creación y <strong>de</strong>spliegue <strong>de</strong>l cont<strong>en</strong>edor. Inicialm<strong>en</strong>te los únicos botones activos <strong>en</strong> <strong>el</strong><br />

cont<strong>en</strong>edor son <strong>el</strong> <strong>de</strong> Apertura <strong>de</strong> Archivos Jar y <strong>el</strong> <strong>de</strong> Acerca <strong>de</strong>. Si se presiona alguno <strong>de</strong><br />

estos botones, <strong>el</strong> método constructor realiza una llamada a un método especifico <strong>de</strong> un<br />

conjunto especial, estos ti<strong>en</strong><strong>en</strong> la característica <strong>de</strong> que sus nombres inician con <strong>el</strong> prefijo<br />

invocaModulo. Por ejemplo, si se presiona <strong>el</strong> botón Apertura <strong>de</strong> archivos JAR, <strong>el</strong> flujo <strong>de</strong>l<br />

sistema pasa al método invocaModuloPACAbre(), <strong>el</strong> cual conti<strong>en</strong>e la instrucciones necesarias<br />

para la creación y administración <strong>de</strong>l proceso que repres<strong>en</strong>tará al módulo PACAbre.<br />

Conforme se utilizan los servicios ofrecidos por la herrami<strong>en</strong>ta para la prueba <strong>de</strong>l<br />

Bean, se pue<strong>de</strong> observar que diferirá <strong>el</strong> tipo y número <strong>de</strong> botones activos <strong>en</strong> <strong>el</strong> cont<strong>en</strong>edor. De<br />

60


esta forma, y continuando con <strong>el</strong> paso anterior, si las acciones <strong>de</strong>l modulo PACAbre se<br />

realizaron <strong>de</strong> forma exitosa, ya no se t<strong>en</strong>drá activo <strong>en</strong> <strong>el</strong> cont<strong>en</strong>edor <strong>el</strong> botón Apertura <strong>de</strong><br />

Archivos Jar; <strong>en</strong> lugar <strong>de</strong> este, se activará <strong>el</strong> botón G<strong>en</strong>erar Casos <strong>de</strong> <strong>Prueba</strong>, que<br />

correspon<strong>de</strong>ría a la sigui<strong>en</strong>te etapa <strong>de</strong>l proceso <strong>de</strong> prueba.<br />

Así, void invocaModuloPACG<strong>en</strong>era(), void invocaModuloPACG<strong>en</strong>eraU(), void<br />

invocaModuloPACEjecuta(), void invocaModuloPACEjecutaU(), void<br />

invocaModuloPACResum<strong>en</strong>(), void invocaModuloPACResum<strong>en</strong>U() y void<br />

invocaModuloPACIInterna() son los métodos que ati<strong>en</strong><strong>de</strong>n y administran los procesos<br />

correspondi<strong>en</strong>tes a las activida<strong>de</strong>s repres<strong>en</strong>tadas por los botones G<strong>en</strong>erar Casos <strong>de</strong> <strong>Prueba</strong>,<br />

Editar Casos <strong>de</strong> <strong>Prueba</strong>, Ejecutar Casos <strong>de</strong> <strong>Prueba</strong>, Ejecutar Casos Editados, Ver Resultados,<br />

Ver Resultados CE y Ver Información interna respectivam<strong>en</strong>te<br />

Mediante <strong>el</strong> botón Limpiar, <strong>el</strong> usuario pue<strong>de</strong> establecer <strong>el</strong> <strong>en</strong>torno inicial <strong>en</strong> <strong>el</strong><br />

mom<strong>en</strong>to que lo disponga, incluso aún sin haberse llevado a cabo todas las etapas <strong>de</strong>l proceso<br />

<strong>de</strong> prueba. Esto se realiza por medio <strong>de</strong>l método void invocaAccionesLimpiar().<br />

El método que ati<strong>en</strong><strong>de</strong> al boton Acerca <strong>de</strong> es void invocaAccionesAcerca(). Este<br />

conti<strong>en</strong><strong>en</strong> las instrucciones necesarias para <strong>el</strong> <strong>de</strong>spliegue <strong>de</strong> la información tradicional<br />

manejada para este concepto.<br />

4.1.2 La extracción <strong>de</strong> archivos JAR.<br />

Para que la prueba pueda iniciarse, es necesario conocer y disponer <strong>de</strong> las unida<strong>de</strong>s que<br />

pue<strong>de</strong>n ser sometidas a este proceso a partir <strong>de</strong> un archivo JAR. Esto es posible utilizando los<br />

servicios <strong>de</strong> las clases PACAbre, SimpleFilter y UNzip. Los <strong>de</strong>talles sobre los atributos y<br />

métodos <strong>de</strong> estas clases se pres<strong>en</strong>tan <strong>en</strong> la Figura 4.3.<br />

61


La clase PACAbre hereda los servicios <strong>de</strong> la clase JFrame proporcionada por Java, <strong>de</strong><br />

esta forma se pue<strong>de</strong>n utilizar sus métodos para la implem<strong>en</strong>tación <strong>de</strong> la interfaz <strong>de</strong>l módulo, la<br />

cual se g<strong>en</strong>era mediante <strong>el</strong> constructor PACAbre().<br />

La interfaz implem<strong>en</strong>tada por <strong>el</strong> método PACAbre() consiste fundam<strong>en</strong>talm<strong>en</strong>te <strong>en</strong> un<br />

JFileChooser para s<strong>el</strong>eccionar archivos JAR <strong>en</strong> las unida<strong>de</strong>s <strong>de</strong> disco <strong>de</strong>l sistema y un botón<br />

que permite, una vez que se ha s<strong>el</strong>eccionado un archivo JAR, iniciar <strong>el</strong> proceso <strong>de</strong> extracción.<br />

Con <strong>el</strong> propósito <strong>de</strong> ofrecer funcionalida<strong>de</strong>s <strong>de</strong>l filtrado <strong>de</strong> archivos JAR <strong>en</strong> <strong>el</strong> JFileChooser,<br />

se utilizan los servicios <strong>de</strong> la clase SimpleFilter. Ambas clases son parte <strong>de</strong> Java.<br />

Cuando <strong>el</strong> usuario ha s<strong>el</strong>eccionado <strong>el</strong> archivo JAR, se proce<strong>de</strong> a extraer su cont<strong>en</strong>ido.<br />

Para esto se utilizan la clase UNzip, la cual provee este tipo <strong>de</strong> funcionalidad.<br />

Si las acciones para la extracción <strong>de</strong>l cont<strong>en</strong>ido <strong>de</strong>l archivo JAR se llevaron a cabo <strong>de</strong><br />

forma a<strong>de</strong>cuada, <strong>el</strong> método leeManifest() realiza la lectura <strong>de</strong>l archivo MANIFEST.MF con <strong>el</strong><br />

propósito <strong>de</strong> i<strong>de</strong>ntificar cuales clases disponibles correspon<strong>de</strong>n a JavaBeans. El nombre <strong>de</strong> los<br />

archivos con la característica “Java-Bean = true”, se almac<strong>en</strong>an <strong>en</strong> un Vector para<br />

posteriorm<strong>en</strong>te almac<strong>en</strong>ar su cont<strong>en</strong>ido <strong>en</strong> <strong>el</strong> archivo “beans.txt”. Este procedimi<strong>en</strong>to lo lleva<br />

a cabo <strong>el</strong> método guardaJavaBeans().<br />

Los resultados obt<strong>en</strong>idos a partir <strong>de</strong> la realización <strong>de</strong> estas activida<strong>de</strong>s, se <strong>de</strong>spliegan<br />

<strong>en</strong> la interfaz <strong>de</strong>l módulo con <strong>el</strong> propósito <strong>de</strong> que <strong>el</strong> usuario pueda conocerlos.<br />

El diagrama que se pres<strong>en</strong>ta <strong>en</strong> la Figura 4.4, muestra gráficam<strong>en</strong>te las activida<strong>de</strong>s<br />

<strong>de</strong>scritas anteriorm<strong>en</strong>te.<br />

62


javax.swing.filechooser.FileFilter<br />

SimpleFilter<br />

SimpleFilter (String ext<strong>en</strong>sion, String <strong>de</strong>scription)<br />

String getDescription()<br />

boolean accept (File f)<br />

String m_<strong>de</strong>scription<br />

String m_ext<strong>en</strong>sion<br />

PACAbre<br />

JFrame<br />

PACAbre()<br />

void invocaAcciones()<br />

Vector leeManifest()<br />

boolean guardaJavaBeans()<br />

JTextArea areaTexto<br />

JFileChooser archivoS<strong>el</strong><br />

JTextFi<strong>el</strong>d unNombreJar<br />

Vector vecBeanClases<br />

UNzip<br />

UNzip (String xnombreJar)<br />

boolean unzipArchivo()<br />

File creaJarElem<strong>en</strong>to ( String name )<br />

copiaCont<strong>en</strong>ido (InputStream archFu<strong>en</strong>te, File archDestino)<br />

boolean archVacio<br />

String compacArchivo<br />

String archDestinoDir<br />

Figura 4.3 Las clases PACAbre, SimpleFilter y UNzip.<br />

63


Esperar llegada<br />

<strong>de</strong> ev<strong>en</strong>to<br />

I<strong>de</strong>ntificar<br />

ev<strong>en</strong>to<br />

Extraer Archivo<br />

JAR<br />

[ev<strong>en</strong>to <strong>de</strong>l botón Salir]<br />

[ev<strong>en</strong>to <strong>de</strong>l botón Abre]<br />

[exito]<br />

I<strong>de</strong>ntificar Beans<br />

[si hay Beans]<br />

G<strong>en</strong>erar archivo<br />

beans.txt<br />

[exito]<br />

Informar exito<br />

[fracaso]<br />

[no hay Beans]<br />

[fracaso]<br />

Informar la razón<br />

<strong>de</strong>l fracaso<br />

Figura 4.4 Diagrama <strong>de</strong> activida<strong>de</strong>s <strong>de</strong> la clase PACAbre.<br />

4.1.3 La g<strong>en</strong>eración <strong>de</strong> casos <strong>de</strong> prueba.<br />

La clase PACG<strong>en</strong>era utiliza <strong>el</strong> archivo <strong>de</strong> texto “beans.txt”, que creó la clase<br />

PACAbre, y realiza las activida<strong>de</strong>s necesarias para la g<strong>en</strong>eración automática <strong>de</strong> los casos <strong>de</strong><br />

prueba. Los métodos y los atributos <strong>de</strong> la clase PACG<strong>en</strong>era se pres<strong>en</strong>tan <strong>en</strong> la figura 4.5.<br />

La clase PACG<strong>en</strong>era exti<strong>en</strong><strong>de</strong> a la clase <strong>de</strong> Java JFrame, puesto que los servicios <strong>de</strong><br />

esta última se utilizan para <strong>de</strong>finir la interfaz <strong>de</strong>l módulo.<br />

Ya se ha m<strong>en</strong>cionado que <strong>el</strong> punto <strong>de</strong> partida para que la clase pueda realizar sus<br />

activida<strong>de</strong>s es <strong>el</strong> archivo “beans.txt”; utilizando su cont<strong>en</strong>ido, <strong>el</strong> método obt<strong>en</strong>Beans() obti<strong>en</strong>e<br />

los nombres <strong>de</strong> los Beans i<strong>de</strong>ntificados, con <strong>el</strong> propósito <strong>de</strong> pres<strong>en</strong>tarlos <strong>en</strong> la interfaz <strong>de</strong>l<br />

64


módulo <strong>de</strong>ntro <strong>de</strong> un JcomboBox. De este, <strong>el</strong> usuario pue<strong>de</strong> s<strong>el</strong>eccionar la clase que <strong>de</strong>sea<br />

someter al proceso <strong>de</strong> prueba.<br />

PACG<strong>en</strong>era<br />

PACG<strong>en</strong>era ()<br />

void invocaAcciones ()<br />

Vector obt<strong>en</strong>Beans ()<br />

boolean verMetodos ()<br />

void iniciaG<strong>en</strong>eracion ()<br />

public boolean g<strong>en</strong>eraCasos(String xmetodoNombre,Class[] xmetodoArgs, boolean xesProp)<br />

void almac<strong>en</strong>aCasos (String xmetodoNombre ,Vector xvectorCasos)<br />

void almac<strong>en</strong>aCasosP (String xmetodoNombre ,Vector xvectorCasos)<br />

iniciaVectores (Vector xvectorBoolean, Vector xvectorChar, ...)<br />

String procesaArgs (Class[] xmetodoArgs)<br />

Vector obt<strong>en</strong>PlugInValores (String xplugIn)<br />

Vector procesaPlugInValores (Vector xvectorInicio, Vector xvectorCasos, String xplugIn )<br />

Vector cargaPlugIns ()<br />

JTextArea areaTexto;<br />

String laClase;<br />

MethodDescriptor[] metodosBean;<br />

MethodDescriptor metodosDescriptor;<br />

Vector vectorPlugIn;<br />

Vector vectorCasos;<br />

JFrame<br />

Figura 4.5. La clase PACG<strong>en</strong>era.<br />

Una vez que se ha s<strong>el</strong>eccionado un Bean <strong>de</strong> la lista y se indicó iniciar <strong>el</strong> proceso <strong>de</strong><br />

g<strong>en</strong>eración <strong>de</strong> casos <strong>de</strong> prueba mediante <strong>el</strong> botón <strong>de</strong> la interfaz, la sigui<strong>en</strong>te actividad consiste<br />

<strong>en</strong> aplicar un proceso <strong>de</strong> introspección a la clase, con <strong>el</strong> propósito <strong>de</strong> conocer cuáles son los<br />

métodos que esta conti<strong>en</strong>e. Esto se hace usando <strong>el</strong> método verMetodos().<br />

Si exist<strong>en</strong> métodos <strong>en</strong> <strong>el</strong> Bean, situación que se espera, se proce<strong>de</strong> a preparar los<br />

<strong>el</strong>em<strong>en</strong>tos indisp<strong>en</strong>sables para la g<strong>en</strong>eración <strong>de</strong> casos. Para <strong>el</strong>lo primeram<strong>en</strong>te se cargan <strong>en</strong> <strong>el</strong><br />

sistema los Plug-Ins. Este conjunto <strong>de</strong> archivos, cuya característica es t<strong>en</strong>er la ext<strong>en</strong>sión<br />

“.pin”, están localizados <strong>en</strong> <strong>el</strong> directorio /PlugIns, <strong>el</strong> método cargaPlugIns() lleva a cabo esta<br />

65


actividad. También se proce<strong>de</strong> a crear los archivos “casos.txt” y “casosp.txt” por medio <strong>de</strong>l<br />

método iniciaG<strong>en</strong>eracion(). El primero almac<strong>en</strong>ará los casos <strong>de</strong> prueba g<strong>en</strong>erados <strong>en</strong> forma<br />

automática y <strong>el</strong> segundo que almac<strong>en</strong>ará los casos <strong>de</strong> prueba propuestos por <strong>el</strong> usuario.<br />

Para cada método <strong>de</strong>l conjunto obt<strong>en</strong>ido por <strong>el</strong> método verMétodos() se realiza un<br />

análisis <strong>de</strong> sus argum<strong>en</strong>tos. De esta forma, si <strong>el</strong> método recibe argum<strong>en</strong>tos, se realiza la<br />

llamada al método public boolean g<strong>en</strong>eraCasos(String xmetodoNombre,Class[] xmetodoArgs,<br />

boolean xesProp), que se <strong>en</strong>cargara <strong>de</strong> realizar <strong>el</strong> proceso <strong>de</strong> g<strong>en</strong>eración <strong>de</strong>l o los casos <strong>de</strong><br />

prueba para dicho método.<br />

La primera actividad para <strong>el</strong> proceso <strong>de</strong> g<strong>en</strong>eración <strong>de</strong> casos consiste <strong>en</strong> verificar si los<br />

argum<strong>en</strong>tos <strong>de</strong>l método <strong>en</strong> turno son conocidos por <strong>el</strong> sistema, pues solo <strong>de</strong> ser así <strong>el</strong> proceso<br />

pue<strong>de</strong> continuar. De ser así, si <strong>el</strong> método correspon<strong>de</strong> a una propiedad, <strong>el</strong> método<br />

almac<strong>en</strong>aCasosP (String xmetodoNombre), se <strong>en</strong>carga <strong>de</strong> escribir parcialm<strong>en</strong>te <strong>el</strong> archivo<br />

“casosp.txt”. Para <strong>el</strong>lo, se escribe <strong>el</strong> <strong>en</strong>cabezado <strong>de</strong>l método <strong>en</strong> turno –valor <strong>de</strong> retorno,<br />

nombre y argum<strong>en</strong>tos- y un terminador especial. Posteriorm<strong>en</strong>te, se realizan las acciones<br />

necesarias para g<strong>en</strong>erar los casos <strong>de</strong> prueba. Cuando <strong>el</strong> proceso <strong>de</strong> g<strong>en</strong>eración ha concluido, <strong>el</strong><br />

método almac<strong>en</strong>aCasos (String xmetodoNombre ,Vector xvectorCasos) guarda los casos<br />

g<strong>en</strong>erados <strong>en</strong> <strong>el</strong> archivo “casos.txt”.<br />

interfaz.<br />

Los resultados obt<strong>en</strong>idos por las activida<strong>de</strong>s que realiza <strong>el</strong> módulo se <strong>de</strong>spliegan <strong>en</strong> su<br />

El diagrama que <strong>de</strong>scribe las activida<strong>de</strong>s que realiza <strong>el</strong> módulo que implem<strong>en</strong>ta la<br />

clase PACG<strong>en</strong>era se pres<strong>en</strong>ta <strong>en</strong> la Figura 4.6.<br />

66


Leer los nombres <strong>de</strong><br />

Beans <strong>de</strong>l archivo<br />

beans.txt<br />

[exito]<br />

Desplegar<br />

nombres <strong>en</strong> la<br />

interfaz<br />

[fracaso]<br />

[no recibe argum<strong>en</strong>tos]<br />

Almac<strong>en</strong>ar<br />

casos <strong>en</strong> archivo<br />

casos.txt<br />

Espera llegada<br />

<strong>de</strong> ev<strong>en</strong>to<br />

[ev<strong>en</strong>to <strong>de</strong>l botón Salir]<br />

Cargar<br />

Plug-Ins<br />

Crear archivo<br />

casosp.txt<br />

Crear archivo<br />

casos.txt<br />

Tomar método<br />

Verificar<br />

argum<strong>en</strong>tos<br />

[argum<strong>en</strong>tos <strong>de</strong>sconocidos]<br />

[exist<strong>en</strong> métodos]<br />

[no hay metodos por evaluar ]<br />

[hay metodos por evaluar ]<br />

[recibe argum<strong>en</strong>tos]<br />

G<strong>en</strong>erar casos<br />

<strong>de</strong> prueba<br />

I<strong>de</strong>ntificar<br />

ev<strong>en</strong>to<br />

Obt<strong>en</strong>er los<br />

Métodos <strong>de</strong>l Bean<br />

[argum<strong>en</strong>tos conocidos]<br />

[ev<strong>en</strong>to <strong>de</strong>l botón G<strong>en</strong>era]<br />

Escribir <strong>en</strong><br />

archivo<br />

casosp.txt<br />

[no exist<strong>en</strong> métodos]<br />

Informar<br />

Resultado<br />

[no es Propiedad]<br />

[es Propiedad]<br />

Figura 4.6 Diagrama <strong>de</strong> activida<strong>de</strong>s <strong>de</strong> la clase PACG<strong>en</strong>era.<br />

4.1.4 La ejecución <strong>de</strong> casos <strong>de</strong> prueba g<strong>en</strong>erados automáticam<strong>en</strong>te.<br />

Informar<br />

Fracaso<br />

La ejecución <strong>de</strong> estos casos <strong>de</strong> prueba consiste fundam<strong>en</strong>talm<strong>en</strong>te <strong>en</strong> la lectura <strong>de</strong> los<br />

casos g<strong>en</strong>erados automáticam<strong>en</strong>te y su ejecución. Estas activida<strong>de</strong>s son llevadas a cabo por la<br />

clase PACEjecuta con la asist<strong>en</strong>cia <strong>de</strong> los servicios proporcionados por la clase PlugIn. La<br />

figura 4.7, muestra los <strong>de</strong>talles <strong>de</strong> implem<strong>en</strong>tación <strong>de</strong> estas clases.<br />

Cuando <strong>el</strong> usuario inicia <strong>el</strong> proceso <strong>de</strong> ejecución <strong>de</strong> casos presionando <strong>el</strong> botón<br />

provisto <strong>en</strong> la interfaz <strong>de</strong>l módulo, la primera actividad que se realiza es llevada a cabo por <strong>el</strong><br />

método cargaPlugIns(), <strong>el</strong> cual permite al módulo conocer cuáles son los tipos <strong>de</strong> argum<strong>en</strong>tos<br />

adicionales que <strong>de</strong>b<strong>en</strong> consi<strong>de</strong>rarse para la ejecución <strong>de</strong> los casos <strong>de</strong> prueba.<br />

67


PACEjecuta<br />

PACEjecuta()<br />

Vector obt<strong>en</strong>Clase()<br />

void ejecutaMetodos()<br />

void cargaPlugIns ()<br />

void recuperacion()<br />

Vector leeArchivoCasos (String xmetodoInfo)<br />

String verBeanPropieda<strong>de</strong>s (BeanInfo xbeanInformacion, Object xbeanObjeto)<br />

void almac<strong>en</strong>aResultados (String xmetodoInfo, Vector xvecResulta)<br />

void almac<strong>en</strong>aRegistro (int xiMetodos)<br />

Object [] g<strong>en</strong>eraArgsCont<strong>en</strong>ido (Class [] xmetodoArgs, Object objetoCaso, Vector xvectorPlugIn)<br />

Object creaBean()<br />

String procesaArgs (Class[] xmetodoArgs)<br />

JTextArea areaTexto<br />

String laClase = null<br />

Vector vecResulta = new Vector()<br />

Vector vectorPlugIn<br />

MethodDescriptor[] metodosBean<br />

MethodDescriptor metodosDescriptor<br />

PlugIn<br />

JFrame<br />

PlugIn ()<br />

Object creaPlugInValor(String plugIn, String valor)<br />

Object objVal<br />

Figura 4.7 Las clases PACEjecuta y PlugIn.<br />

La sigui<strong>en</strong>te actividad consiste <strong>en</strong> ejecutar una rutina que permite a la herrami<strong>en</strong>ta<br />

recuperarse <strong>de</strong> fallos ocurridos durante un proceso <strong>de</strong> ejecución previo. De esta forma, <strong>el</strong><br />

método recuperación() revisa si <strong>el</strong> proceso <strong>de</strong> ejecución previo es <strong>el</strong> mismo que <strong>el</strong> que ahora<br />

se pret<strong>en</strong><strong>de</strong> iniciar y si es así, verifica si <strong>el</strong> proceso anterior se terminó a<strong>de</strong>cuadam<strong>en</strong>te. El<br />

objetivo <strong>de</strong> esta rutina <strong>de</strong> recuperación es establecer un método <strong>de</strong> partida para iniciar la<br />

ejecución <strong>de</strong> casos, <strong>el</strong> cual pue<strong>de</strong> ser <strong>el</strong> primer método <strong>de</strong> la clase, si no hubo un fallo previo o<br />

68


se trata <strong>de</strong> una nueva clase, o bi<strong>en</strong>, <strong>el</strong> método que le sigue al último método que se ejercitó <strong>en</strong><br />

<strong>el</strong> proceso anterior. El método recuperación() utiliza la información cont<strong>en</strong>ida <strong>en</strong> <strong>el</strong><br />

archivo“registro.txt”<br />

Una vez establecido <strong>el</strong> método a partir <strong>de</strong>l cual se iniciará <strong>el</strong> proceso <strong>de</strong> ejecución, se<br />

crea <strong>el</strong> archivo “resultados.txt” que se utiliza para almac<strong>en</strong>ar la información arrojada por este<br />

proceso.<br />

Puesto que para diseñar las pruebas se consi<strong>de</strong>raron algunos aspectos <strong>de</strong> la técnica<br />

basada <strong>en</strong> estados, es necesario almac<strong>en</strong>ar <strong>el</strong> estado inicial <strong>de</strong>l Bean (esta información se<br />

utiliza <strong>en</strong> <strong>el</strong> módulo <strong>de</strong> pres<strong>en</strong>tación <strong>de</strong> resultados). Para llevar a cabo esto, se crea una<br />

instancia <strong>de</strong>l Bean mediante <strong>el</strong> método creaBean(), se aplica un proceso <strong>de</strong> introspección<br />

sobre la instancia mediante <strong>el</strong> método verBeanPropieda<strong>de</strong>s (BeanInfo xbeanInformacion,<br />

Object xbeanObjeto), se crea <strong>el</strong> archivo “estadoi.txt” y se almac<strong>en</strong>an <strong>en</strong> él los nombres y<br />

valores <strong>de</strong> cada una <strong>de</strong> las propieda<strong>de</strong>s <strong>de</strong>l Bean.<br />

La ejecución <strong>de</strong> casos llevada a cabo por <strong>el</strong> método ejecutaMetodos() se realiza <strong>de</strong><br />

forma similar al proceso <strong>de</strong> g<strong>en</strong>eración <strong>de</strong>scrito <strong>en</strong> la sección anterior. Inicialm<strong>en</strong>te se obti<strong>en</strong>e<br />

<strong>el</strong> conjunto <strong>de</strong> métodos implem<strong>en</strong>tados <strong>en</strong> la clase y para todos aqu<strong>el</strong>los que recib<strong>en</strong><br />

argum<strong>en</strong>tos, <strong>el</strong> método Vector leeArchivoCasos (String xmetodoInfo) realiza la búsqueda <strong>de</strong><br />

los casos correspondi<strong>en</strong>tes <strong>en</strong> <strong>el</strong> archivo “casos.txt”, los cuales regresa <strong>en</strong> un Vector.<br />

Ya que se dispone <strong>de</strong> los casos <strong>de</strong> prueba que le correspon<strong>de</strong>n al método, para cada<br />

uno <strong>de</strong> estos se realizan las sigui<strong>en</strong>tes acciones: se crea nuevam<strong>en</strong>te una instancia <strong>de</strong>l Bean<br />

con <strong>el</strong> método creaBean(), se ejercita <strong>el</strong> método con <strong>el</strong> caso <strong>de</strong> prueba <strong>en</strong> turno, se obti<strong>en</strong>e <strong>el</strong><br />

valor <strong>de</strong> las propieda<strong>de</strong>s <strong>de</strong>l Bean, se almac<strong>en</strong>an los resultados <strong>en</strong> <strong>el</strong> archivo “resultados.txt” y<br />

se almac<strong>en</strong>a <strong>el</strong> número <strong>de</strong>l método ejercitado <strong>en</strong> <strong>el</strong> archivo “registro.txt”. Estas dos últimas<br />

activida<strong>de</strong>s son llevadas a cabo por los métodos almac<strong>en</strong>aResultados (String xmetodoInfo,<br />

Vector xvecResulta) y almac<strong>en</strong>aRegistro (int xiMetodos) respectivam<strong>en</strong>te.<br />

69


La figura 4.8, muestra <strong>el</strong> diagrama <strong>de</strong> activida<strong>de</strong>s <strong>de</strong> la clase PACEjecuta.<br />

Esperar llegada<br />

<strong>de</strong> ev<strong>en</strong>to<br />

Almac<strong>en</strong>ar estado<br />

inicial<br />

[ev<strong>en</strong>to <strong>de</strong>l botón Ejecutar]<br />

I<strong>de</strong>ntificar ev<strong>en</strong>to<br />

Cargar Plug-Ins<br />

Ejecutar rutina<br />

<strong>de</strong> recuperación<br />

Crear Bean<br />

Obt<strong>en</strong>er los<br />

metodos <strong>de</strong>l Bean<br />

Tomar método<br />

Crear Bean<br />

Ejecutar método<br />

con Caso <strong>de</strong><br />

<strong>Prueba</strong><br />

[ev<strong>en</strong>to <strong>de</strong>l botón Salir]<br />

[hay métodos por ejecutar]<br />

[hay errores anteriores]<br />

[no hay errores anteriores]<br />

Crear archivo<br />

resultados.txt<br />

Verifica<br />

argum<strong>en</strong>tos<br />

[no hay métodos por ejecutar]<br />

[no recibe argum<strong>en</strong>tos]<br />

Obt<strong>en</strong>er estado<br />

Final<br />

Almac<strong>en</strong>ar <strong>en</strong><br />

resultados.txt<br />

Almac<strong>en</strong>ar <strong>en</strong><br />

registro.txt<br />

Establecer método<br />

<strong>de</strong> partida<br />

[recibe argum<strong>en</strong>tos]<br />

Obt<strong>en</strong>er casos <strong>de</strong><br />

prueba <strong>de</strong>l archivo<br />

casos.txt<br />

Figura 4.8 Diagrama <strong>de</strong> activida<strong>de</strong>s <strong>de</strong> la clase PACEjecuta.<br />

4.1.5 La ejecución <strong>de</strong> casos <strong>de</strong> prueba g<strong>en</strong>erados manualm<strong>en</strong>te.<br />

Informar<br />

resultados<br />

La clase PACEjecuta2 se <strong>en</strong>carga <strong>de</strong> la ejecución <strong>de</strong> casos <strong>de</strong> prueba g<strong>en</strong>erados<br />

manualm<strong>en</strong>te por <strong>el</strong> usuario. El proceso que lleva a cabo esta clase es muy similar al <strong>de</strong>scrito<br />

anteriorm<strong>en</strong>te. La figura 4.9, muestra los <strong>de</strong>talles <strong>de</strong> implem<strong>en</strong>tación <strong>de</strong> PACEjecuta2.<br />

70


PACEjecuta<br />

PACEjecuta()<br />

Vector obt<strong>en</strong>Clase()<br />

void ejecutaMetodos()<br />

void cargaPlugIns ()<br />

Object creaBean()<br />

Vector leeArchivoCasos (String xmetodoInfo)<br />

Object [] g<strong>en</strong>eraArgsCont<strong>en</strong>ido (Class [] xmetodoArgs, Object objetoCaso, Vector xvectorPlugIn)<br />

String verBeanPropieda<strong>de</strong>s (BeanInfo xbeanInformacion, Object xbeanObjeto)<br />

void almac<strong>en</strong>aResultados (String xmetodoInfo, Vector xvecResulta)<br />

String procesaArgs (Class[] xmetodoArgs)<br />

JTextArea areaTexto<br />

String laClase = null<br />

Vector vecResulta = new Vector()<br />

Vector vectorPlugIn<br />

MethodDescriptor[] metodosBean<br />

MethodDescriptor metodosDescriptor<br />

Figura 4.9 Las clases PACEjecuta2 y PlugIn.<br />

Como pue<strong>de</strong> observarse, muchos métodos que se <strong>de</strong>scribieron <strong>en</strong> la sección anterior están<br />

pres<strong>en</strong>tes <strong>en</strong> esta clase. De hecho, las variaciones que pres<strong>en</strong>ta esta clase consist<strong>en</strong> <strong>en</strong>:<br />

a) El archivo <strong>de</strong> <strong>en</strong>trada que utiliza la clase para ejecutar los casos, <strong>el</strong> cual es ahora <strong>el</strong><br />

archivo “casosp.txt”.<br />

b) Se ha omitido <strong>el</strong> proceso <strong>de</strong> recuperación, y por consigui<strong>en</strong>te, la escritura <strong>de</strong>l archivo<br />

<strong>de</strong> “registro.txt”<br />

PlugIn<br />

PlugIn ()<br />

Object creaPlugInValor(String plugIn, String valor)<br />

Object objVal<br />

JFrame<br />

71


c) No se almac<strong>en</strong>a <strong>el</strong> estado inicial <strong>de</strong>l Bean, ya al llegar a esta etapa, <strong>el</strong> archivo<br />

“estadoi.txt” <strong>de</strong>be haber sido ya creado.<br />

d) El archivo <strong>de</strong> salida que almac<strong>en</strong>a los resultados obt<strong>en</strong>idos se llama “resultadosp.txt”.<br />

e) Los métodos ejercitados son únicam<strong>en</strong>te los que correspon<strong>de</strong>n a propieda<strong>de</strong>s.<br />

La figura 4.10, muestra <strong>el</strong> diagrama <strong>de</strong> activida<strong>de</strong>s <strong>de</strong> la clase PACEjecuta2.<br />

Esperar llegada<br />

<strong>de</strong> ev<strong>en</strong>to<br />

[ev<strong>en</strong>to <strong>de</strong>l botón Ejecutar]<br />

I<strong>de</strong>ntificar ev<strong>en</strong>to<br />

Cargar<br />

Pluig-Ins<br />

Crear archivo<br />

resultadosp.txt<br />

Crear Bean<br />

Obt<strong>en</strong>er los<br />

metodos <strong>de</strong>l Bean<br />

Tomar método<br />

[ev<strong>en</strong>to <strong>de</strong>l botón Salir]<br />

[hay métodos por ejecutar]<br />

[no es propiedad “set”]<br />

[no hay métodos por ejecutar]<br />

[es propiedad “set”]<br />

Obt<strong>en</strong>er casos <strong>de</strong><br />

prueba <strong>de</strong>l archivo<br />

casosp.txt<br />

Ejecutar método<br />

con Caso <strong>de</strong><br />

<strong>Prueba</strong><br />

Obt<strong>en</strong>er estado<br />

Final<br />

Almac<strong>en</strong>ar <strong>en</strong><br />

resultadosp.txt<br />

Informar<br />

resultados<br />

Figura 4.10 Diagrama <strong>de</strong> activida<strong>de</strong>s <strong>de</strong> la clase PACEjecuta2.<br />

72


4.1.6 La pres<strong>en</strong>tación <strong>de</strong> resultados.<br />

En <strong>el</strong> capítulo anterior se indicó que la herrami<strong>en</strong>ta cu<strong>en</strong>ta con tres módulos que<br />

permit<strong>en</strong> pres<strong>en</strong>tar resultados al usuario; estos correspon<strong>de</strong>n a las clases: PACResum<strong>en</strong>,<br />

PACResum<strong>en</strong>2 y PACIInterna.<br />

Las funcionalida<strong>de</strong>s que ofrec<strong>en</strong> las clases PACResum<strong>en</strong> y PACResum<strong>en</strong>2 consist<strong>en</strong><br />

<strong>en</strong> pres<strong>en</strong>tar los resultados g<strong>en</strong>erados por las activida<strong>de</strong>s realizadas por los procesos <strong>de</strong><br />

prueba. La interfaz <strong>de</strong> los módulos que implem<strong>en</strong>tan estas clases, pres<strong>en</strong>tan la información<br />

bajo un formato <strong>de</strong> árbol.<br />

Para <strong>el</strong>lo fue necesario que, tanto PACResum<strong>en</strong> como PACResum<strong>en</strong>2, heredaran las<br />

funcionalida<strong>de</strong>s <strong>de</strong> la clase JFrame <strong>de</strong> Java, así como utilizar los servicios <strong>de</strong> la clase<br />

DefaultTreeC<strong>el</strong>lR<strong>en</strong><strong>de</strong>rer, esta última ofrece facilida<strong>de</strong>s para r<strong>el</strong>acionar iconos con nodos y<br />

hojas <strong>de</strong> un JTree.<br />

En ambas clases se ti<strong>en</strong>e un método <strong>de</strong>nominado void leeArchivoResultados(), <strong>el</strong> cual<br />

obti<strong>en</strong>e, ya sea <strong>de</strong>l archivo “resultados.txt” o “resultadosp.txt”, la información g<strong>en</strong>erada por <strong>el</strong><br />

proceso <strong>de</strong> ejecución <strong>de</strong> casos <strong>de</strong> prueba. Esta información es almac<strong>en</strong>ada <strong>en</strong> un Vector que<br />

posteriorm<strong>en</strong>te es utilizado para la g<strong>en</strong>eración <strong>de</strong>l árbol. Con <strong>el</strong> propósito <strong>de</strong> mostrar <strong>el</strong> estado<br />

inicial <strong>de</strong>l Bean, a partir <strong>de</strong>l cual se aplica <strong>el</strong> proceso <strong>de</strong> prueba, <strong>el</strong> método void<br />

leeArchivoEInicial(), pres<strong>en</strong>ta esta información utilizando para <strong>el</strong>lo archivo “estadoi.txt”.<br />

Las figuras 4.11. y 4.12, muestran la implem<strong>en</strong>tación <strong>de</strong> estas clases y <strong>el</strong> diagrama <strong>de</strong><br />

activida<strong>de</strong>s para la clase PACResum<strong>en</strong>. Las figuras 4.13. y 4.14, pres<strong>en</strong>tan lo correspondi<strong>en</strong>te<br />

a la clase PACResum<strong>en</strong>2.<br />

Por otra parte, la clase PACIInterna ti<strong>en</strong>e <strong>el</strong> propósito <strong>de</strong> mostrar al usuario <strong>de</strong>talles<br />

sobre la implem<strong>en</strong>tación <strong>de</strong>l Bean. Para <strong>el</strong>lo. <strong>el</strong> método String obt<strong>en</strong>Clase() busca <strong>de</strong>ntro <strong>de</strong>l<br />

archivo “resultados.txt” <strong>el</strong> nombre <strong>de</strong> la clase a inspeccionar. Posteriorm<strong>en</strong>te <strong>el</strong> método<br />

beanIntrospeccion(String laClase), realiza las tareas <strong>de</strong> introspección con este propósito,<br />

73


g<strong>en</strong>erándose así <strong>el</strong> conjunto <strong>de</strong> datos que se pres<strong>en</strong>tarán <strong>en</strong> <strong>el</strong> módulo. De igual forma que <strong>en</strong><br />

PACResum<strong>en</strong> y PACResum<strong>en</strong>2, se hace uso <strong>de</strong> una estructura <strong>de</strong> árbol para pres<strong>en</strong>tar la<br />

información.<br />

PACResum<strong>en</strong><br />

PACResum<strong>en</strong>()<br />

leeArchivoResultados()<br />

void leeArchivoEInicial()<br />

JFrame DefaultTreeC<strong>el</strong>lR<strong>en</strong><strong>de</strong>rer<br />

Vector vectorResultados<br />

Vector vectorEInicial<br />

JTree tree<br />

DefaultTreeMo<strong>de</strong>l treeMo<strong>de</strong>lo<br />

DefaultMutableTreeNo<strong>de</strong> nodoClase;<br />

DefaultMutableTreeNo<strong>de</strong> nodoC;<br />

DefaultMutableTreeNo<strong>de</strong> nodoMetodo;<br />

DefaultMutableTreeNo<strong>de</strong> nodoCaso;<br />

Figura 4.11 La clases PACResum<strong>en</strong> y resR<strong>en</strong><strong>de</strong>rer.<br />

Lee archivo<br />

estadoi.txt<br />

Lee archivo<br />

resultados.txt<br />

Organiza<br />

información<br />

Pres<strong>en</strong>ta<br />

información<br />

resR<strong>en</strong><strong>de</strong>rer<br />

Compon<strong>en</strong>t getTreeC<strong>el</strong>lR<strong>en</strong><strong>de</strong>rerCompon<strong>en</strong>t()<br />

boolean esClase(Object value)<br />

boolean esMetodo(Object value)<br />

boolean esCaso(Object value)<br />

esExcepcion(Object value)<br />

esError(Object value)<br />

ImageIcon clase<br />

ImageIcon metodo<br />

ImageIcon caso<br />

ImageIcon propiedad<br />

ImageIcon error<br />

ImageIcon exepcion<br />

Figura 4.12 Diagrama <strong>de</strong> activida<strong>de</strong>s <strong>de</strong> la clase PACResum<strong>en</strong>.<br />

74


PACResum<strong>en</strong>2<br />

PACResum<strong>en</strong>()<br />

void leeArchivoResultados()<br />

void leeArchivoEInicial()<br />

JFrame DefaultTreeC<strong>el</strong>lR<strong>en</strong><strong>de</strong>rer<br />

Vector vectorResultados<br />

Vector vectorEInicial<br />

Vector vectorNodos<br />

JTree tree<br />

DefaultTreeMo<strong>de</strong>l treeMo<strong>de</strong>lo<br />

DefaultMutableTreeNo<strong>de</strong> nodoClase;<br />

DefaultMutableTreeNo<strong>de</strong> nodoC;<br />

DefaultMutableTreeNo<strong>de</strong> nodoMetodo;<br />

DefaultMutableTreeNo<strong>de</strong> nodoCaso;<br />

Figura 4.13 La clases PACResum<strong>en</strong> y respR<strong>en</strong><strong>de</strong>rer.<br />

Lee archivo<br />

estadoi.txt<br />

Lee archivo<br />

resultadosp.txt<br />

Organiza<br />

información<br />

Pres<strong>en</strong>ta<br />

información<br />

respR<strong>en</strong><strong>de</strong>rer<br />

Compon<strong>en</strong>t getTreeC<strong>el</strong>lR<strong>en</strong><strong>de</strong>rerCompon<strong>en</strong>t()<br />

boolean esClase(Object value)<br />

boolean esMetodo(Object value)<br />

boolean esCaso(Object value)<br />

boolean esExcepcion(Object value)<br />

boolean esError(Object value)<br />

ImageIcon clase<br />

ImageIcon metodo<br />

ImageIcon caso<br />

ImageIcon propiedad<br />

ImageIcon error<br />

ImageIcon exepcion<br />

Figura 4.14 Diagrama <strong>de</strong> activida<strong>de</strong>s <strong>de</strong> la clase PACResum<strong>en</strong>2.<br />

75


Las figuras 4.15. y 4.16, muestran la implem<strong>en</strong>tación <strong>de</strong> la clase PACIInterna y <strong>el</strong><br />

diagrama <strong>de</strong> activida<strong>de</strong>s respectivam<strong>en</strong>te.<br />

PACResum<strong>en</strong><br />

JFrame<br />

PACIInterna()<br />

beanIntrospeccion(String laClase)<br />

String procesaArgs (Class[] xmetodoArgs)<br />

String obt<strong>en</strong>Clase()<br />

JTree tree<br />

DefaultTreeMo<strong>de</strong>l treeMo<strong>de</strong>lo<br />

DefaultMutableTreeNo<strong>de</strong> nodoClase;<br />

DefaultMutableTreeNo<strong>de</strong> nodoC;<br />

DefaultMutableTreeNo<strong>de</strong> nodoConcepto;<br />

DefaultMutableTreeNo<strong>de</strong> nodoVariable;<br />

String laClase;<br />

Vector vecPrivate<br />

Vector vecProtected<br />

Vector vecMetodos<br />

Figura 4.15. La clases PACInformación interna y metR<strong>en</strong><strong>de</strong>rer.<br />

Obt<strong>en</strong>er<br />

Clase<br />

Realizar<br />

introspección<br />

Organizar<br />

información<br />

Pres<strong>en</strong>tar<br />

información<br />

metR<strong>en</strong><strong>de</strong>rer<br />

DefaultTreeC<strong>el</strong>lR<strong>en</strong><strong>de</strong>rer<br />

Compon<strong>en</strong>t getTreeC<strong>el</strong>lR<strong>en</strong><strong>de</strong>rerCompon<strong>en</strong>t()<br />

boolean esClase(Object value)<br />

boolean esProtected(Object value)<br />

boolean esPrivate(Object value)<br />

boolean esMetodos(Object value)<br />

boolean esMetodo(Object value)<br />

boolean esVariable(Object value)<br />

boolean esVariables(Object value)<br />

ImageIcon clase<br />

ImageIcon metodo<br />

ImageIcon vprotected<br />

ImageIcon metodos<br />

ImageIcon variable<br />

ImageIcon vprivate<br />

Figura 4.16. Diagrama <strong>de</strong> activida<strong>de</strong>s <strong>de</strong> la clase PACIInterna.<br />

76


Capitulo 5<br />

<strong>Prueba</strong>s <strong>de</strong> Funcionami<strong>en</strong>to.<br />

En este capítulo se pres<strong>en</strong>ta información refer<strong>en</strong>te un conjunto <strong>de</strong> pruebas que se<br />

realizaron con <strong>el</strong> propósito <strong>de</strong> verificar <strong>el</strong> funcionami<strong>en</strong>to <strong>de</strong> los módulos que conforman la<br />

herrami<strong>en</strong>ta. La información que se citará correspon<strong>de</strong> a procedimi<strong>en</strong>tos aplicados a los<br />

<strong>compon<strong>en</strong>tes</strong> Puzzle, TextEditor y ProgressBar, los cuales se abordan <strong>en</strong> las secciones 5.2, 5.3<br />

y 5.4 respectivam<strong>en</strong>te.<br />

Con <strong>el</strong> propósito <strong>de</strong> clasificar las activida<strong>de</strong>s observadas durante la prueba, estas se<br />

pres<strong>en</strong>tan <strong>en</strong> dos tablas. La primera consi<strong>de</strong>ra los resultados g<strong>en</strong>erados a partir <strong>de</strong>l<br />

funcionami<strong>en</strong>to <strong>de</strong> cada uno <strong>de</strong> los módulos al ser utilizados <strong>de</strong> forma individual y la segunda,<br />

que pres<strong>en</strong>ta un análisis <strong>de</strong> los resultados obt<strong>en</strong>idos al final <strong>de</strong> proceso <strong>de</strong> prueba, los cuales se<br />

pue<strong>de</strong>n apreciar utilizando los módulos <strong>de</strong> pres<strong>en</strong>tación <strong>de</strong> resultados.<br />

5.1 Los <strong>compon<strong>en</strong>tes</strong> utilizados.<br />

Los <strong>compon<strong>en</strong>tes</strong> utilizados <strong>en</strong> ésta sección fueron s<strong>el</strong>eccionados aleatoriam<strong>en</strong>te <strong>de</strong> un<br />

banco disponible. Este banco consiste <strong>de</strong> varios <strong>compon<strong>en</strong>tes</strong> que han sido recolectados <strong>de</strong> la<br />

WWW y refer<strong>en</strong>cias bibliográficas, así como la creación <strong>de</strong> nuevas versiones a partir <strong>de</strong><br />

<strong>compon<strong>en</strong>tes</strong> exist<strong>en</strong>tes. Es importante m<strong>en</strong>cionar que, <strong>de</strong>bido a que <strong>el</strong> mercado <strong>de</strong><br />

<strong>compon<strong>en</strong>tes</strong> es r<strong>el</strong>ativam<strong>en</strong>te nuevo, no hay mucha disponibilidad <strong>de</strong> <strong>compon<strong>en</strong>tes</strong>.<br />

A pesar <strong>de</strong> que <strong>en</strong> la mayoría <strong>de</strong> los casos, los <strong>compon<strong>en</strong>tes</strong> se ofrec<strong>en</strong> como productos<br />

a la v<strong>en</strong>ta, los cuales se <strong>en</strong>tregan sin código fu<strong>en</strong>te y con una pobre docum<strong>en</strong>tación, para las<br />

<strong>compon<strong>en</strong>tes</strong> cont<strong>en</strong>idas <strong>en</strong> <strong>el</strong> banco se ti<strong>en</strong>e información clara sobre sus especificaciones.<br />

77


5.2 El compon<strong>en</strong>te Puzzle.<br />

Puzzle es un compon<strong>en</strong>te que repres<strong>en</strong>ta un rompecabezas <strong>de</strong> números. Utilizándolo,<br />

<strong>en</strong> combinación con otros <strong>compon<strong>en</strong>tes</strong>, se pue<strong>de</strong> construir una aplicación que permita<br />

manipular las piezas que lo conforman <strong>de</strong> un modo organizado. La figura 5.1 es un applet<br />

construído <strong>de</strong>s<strong>de</strong> <strong>el</strong> BeanBox utilizando <strong>el</strong> compon<strong>en</strong>te Puzzle.<br />

El archivo JAR que conti<strong>en</strong>e al compon<strong>en</strong>te es Puzzle.jar y la clase <strong>de</strong>finida como<br />

Bean correspon<strong>de</strong> al archivo Puzzle.class, localizado <strong>en</strong> <strong>el</strong> directorio /jozart/puzzle. Esta clase<br />

conti<strong>en</strong>e 45 métodos.<br />

La tabla 5.1 pres<strong>en</strong>ta las principales activida<strong>de</strong>s llevadas a cabo y los resultados<br />

obt<strong>en</strong>idos para estas al realizar la prueba para <strong>el</strong> compon<strong>en</strong>te Puzzle. Las activida<strong>de</strong>s se<br />

agrupan <strong>de</strong> acuerdo al módulo que las lleva a cabo. Mediante <strong>el</strong> análisis <strong>de</strong> la información<br />

pres<strong>en</strong>tada <strong>en</strong> la tabla se pue<strong>de</strong> observar que todas estas se llevaron <strong>de</strong> la forma <strong>en</strong> que se<br />

esperaba.<br />

Figura 5.1 Una applet que usa <strong>el</strong> compon<strong>en</strong>te Puzzle.<br />

78


Módulo Actividad Resultado Observaciones<br />

Apertura <strong>de</strong> Archivos<br />

JAR.<br />

Primer<br />

G<strong>en</strong>erador <strong>de</strong> Casos <strong>de</strong><br />

<strong>Prueba</strong><br />

Segundo<br />

G<strong>en</strong>erador <strong>de</strong> Casos <strong>de</strong><br />

<strong>Prueba</strong><br />

Extracción y creación <strong>de</strong> archivos<br />

propios <strong>de</strong>l compon<strong>en</strong>te<br />

Correcto<br />

I<strong>de</strong>ntificación <strong>de</strong> Beans. Correcto<br />

Creación <strong>de</strong>l archivo “beans.txt” Correcto<br />

La g<strong>en</strong>eración archivo “casos.txt” Correcto<br />

Uso <strong>de</strong> Plug-Ins <strong>en</strong> la g<strong>en</strong>eración<br />

<strong>de</strong> casos.<br />

Correcto<br />

Creación archivo “casosp.txt” Correcto<br />

Uso <strong>de</strong> Plug-Ins <strong>en</strong> la g<strong>en</strong>eración<br />

<strong>de</strong> casos.<br />

Creación <strong>de</strong>l archivo<br />

Primer<br />

“resultados.txt”<br />

Ejecutor <strong>de</strong> Casos <strong>de</strong><br />

<strong>Prueba</strong> Uso <strong>de</strong> Plug-Ins <strong>en</strong> la ejecución <strong>de</strong><br />

casos.<br />

Creación <strong>de</strong>l archivo<br />

Segundo<br />

“resultadosp.txt”<br />

Ejecutor <strong>de</strong> Casos <strong>de</strong><br />

<strong>Prueba</strong> Uso <strong>de</strong> Plug-Ins <strong>en</strong> la ejecución <strong>de</strong><br />

casos.<br />

Correcto<br />

Correcto<br />

Correcto<br />

Correcto<br />

Correcto<br />

Se crearon correctam<strong>en</strong>te las estructuras <strong>de</strong><br />

directorios, así como los cont<strong>en</strong>idos para los<br />

archivos .class y manifest.mf<br />

La clase Puzzle, correspon<strong>de</strong> con lo<br />

establecido <strong>en</strong> <strong>el</strong> archivo manifest.mf.<br />

Se crea correctam<strong>en</strong>te <strong>el</strong> archivo y su<br />

cont<strong>en</strong>ido <strong>en</strong> <strong>el</strong> directorio /reportes<br />

- Se crea correctam<strong>en</strong>te <strong>el</strong> archivo <strong>en</strong> <strong>el</strong><br />

directorio /reportes<br />

- Solo se almac<strong>en</strong>an los casos para 12 * <strong>de</strong> los<br />

19 métodos que recib<strong>en</strong> argum<strong>en</strong>tos.<br />

* Solo los argum<strong>en</strong>tos <strong>de</strong> 12 métodos son<br />

conocidos por la herrami<strong>en</strong>ta.<br />

Se utilizaron correctam<strong>en</strong>te los Plug-Ins para<br />

los argum<strong>en</strong>tos:<br />

- Color para métodos 28 y 42.<br />

- Font para <strong>el</strong> método 36.<br />

- Se crea correctam<strong>en</strong>te <strong>el</strong> archivo <strong>en</strong> <strong>el</strong><br />

directorio /reportes<br />

- Solo se almac<strong>en</strong>an los casos para 12 * <strong>de</strong> los<br />

15 métodos que correspon<strong>de</strong>n a propieda<strong>de</strong>s.<br />

* Solo los argum<strong>en</strong>tos <strong>de</strong> 12 métodos son<br />

conocidos por la herrami<strong>en</strong>ta.<br />

Se utilizaron correctam<strong>en</strong>te los Plug-Ins para<br />

los argum<strong>en</strong>tos:<br />

- Color para métodos 28 y 42.<br />

- Font para <strong>el</strong> método 36.<br />

- Se crea correctam<strong>en</strong>te <strong>el</strong> archivo <strong>en</strong> <strong>el</strong><br />

directorio /reportes<br />

- Se almac<strong>en</strong>an los resultados para los 45<br />

métodos cont<strong>en</strong>idos <strong>en</strong> la clase.<br />

Se utilizaron correctam<strong>en</strong>te los Plug-Ins para<br />

los argum<strong>en</strong>tos:<br />

- Color para métodos 28 y 42.<br />

- Font para <strong>el</strong> método 36.<br />

- Se crea correctam<strong>en</strong>te <strong>el</strong> archivo <strong>en</strong> <strong>el</strong><br />

directorio /reportes<br />

- Se almac<strong>en</strong>an los resultados para los 12<br />

métodos que correspon<strong>de</strong>n a propieda<strong>de</strong>s.<br />

Se utilizaron correctam<strong>en</strong>te los Plug-Ins para<br />

los argum<strong>en</strong>tos:<br />

- Color para métodos 28 y 42.<br />

- Font para <strong>el</strong> método 36.<br />

Tabla 5.1 Comportami<strong>en</strong>to <strong>de</strong> los módulos durante la prueba al compon<strong>en</strong>te Puzzle.<br />

79


5.2.1 Los resultados observados.<br />

Mediante <strong>el</strong> Primer Módulo <strong>de</strong> Pres<strong>en</strong>tación <strong>de</strong> Resultados se pue<strong>de</strong> observar que las<br />

pruebas <strong>de</strong> los métodos etiquetados como 4, 11, 20, 23 y 24, que correspon<strong>de</strong>n a void<br />

scramble(), void startSolving(), void moveBackward(), void moveForward() y addNotify()<br />

respectivam<strong>en</strong>te, g<strong>en</strong>eraron excepciones, <strong>de</strong>bido a que estos requier<strong>en</strong> contextos especiales<br />

para su ejecución, como lo son la llegada <strong>de</strong> un ev<strong>en</strong>to prov<strong>en</strong>i<strong>en</strong>te <strong>de</strong> otro compon<strong>en</strong>te.<br />

Los métodos 13, 16, 25 y 33 que correspon<strong>de</strong>n a void setGap(int), void<br />

setPuzzleCols(int), void setPuzzleRows(int), void setB<strong>el</strong>v<strong>el</strong>Heigth(int), ti<strong>en</strong><strong>en</strong> que ver con la<br />

apari<strong>en</strong>cia <strong>de</strong>l Bean. No se espera que estos métodos admitan valores negativos para<br />

especificar <strong>el</strong> número <strong>de</strong> filas y columnas <strong>de</strong>l rompecabezas (métodos 16 y 25), o bi<strong>en</strong> para<br />

establecer <strong>el</strong> espacio <strong>en</strong>tre fichas y <strong>el</strong> sombreado <strong>de</strong> cada una <strong>de</strong> estas (métodos 13 y 33). A<br />

difer<strong>en</strong>cia <strong>de</strong> estas expectativas, al suministrarse los valores <strong>de</strong> prueba -2147483648, -<br />

2147483647, -2147483646, -1073741824, -2, y –1, <strong>el</strong> compon<strong>en</strong>te no g<strong>en</strong>eró ninguna<br />

excepción o acción correctiva y sí un cambio <strong>de</strong> estado admiti<strong>en</strong>do este tipo <strong>de</strong> valores. Este<br />

comportami<strong>en</strong>to advierte al usuario sobre <strong>el</strong> funcionami<strong>en</strong>to <strong>de</strong> estos métodos.<br />

La tabla 5.2 pres<strong>en</strong>ta un resum<strong>en</strong> <strong>de</strong> los resultados obt<strong>en</strong>idos <strong>en</strong> la prueba <strong>de</strong>l<br />

compon<strong>en</strong>te Puzzle.<br />

80


Método Caso Resultado G<strong>en</strong>erado Resultado Esperado Diagnóstico<br />

4 void scramble () Único Excepción Excepción.<br />

El método<br />

11 void startSolving () Único Excepción Excepción.<br />

funcionó<br />

20 void moveBackward () Único Excepción Excepción. correctam<strong>en</strong>te.<br />

23 void moveForward () Único Excepción Excepción.<br />

34 void addNotify () Único Excepción Excepción.<br />

13 void setGap(int),<br />

16 void setPuzzleCols(int),<br />

25 void setPuzzleRows(int),<br />

33 void<br />

setB<strong>el</strong>v<strong>el</strong>Heigth(int),<br />

-2147483648<br />

-2147483647<br />

-2147483646<br />

-1073741824<br />

–2<br />

–1<br />

-2147483648<br />

-2147483647<br />

-2147483646<br />

-1073741824<br />

–2<br />

–1<br />

-2147483648<br />

-2147483647<br />

-2147483646<br />

-1073741824<br />

–2<br />

–1<br />

-2147483648<br />

-2147483647<br />

-2147483646<br />

-1073741824<br />

–2<br />

–1<br />

null y la propiedad gap<br />

igual al valor suministrado.<br />

null y la propiedad<br />

puzzleCols igual al valor<br />

suministrado.<br />

null y la propiedad<br />

puzzleRows igual al valor<br />

suministrado.<br />

null y la propiedad<br />

b<strong>el</strong>v<strong>el</strong>Heigth igual al valor<br />

suministrado.<br />

Excepción o acción<br />

correctiva sobre <strong>el</strong> valor <strong>de</strong><br />

la propiedad gap<br />

(gap > 0)<br />

Excepción o acción<br />

correctiva sobre <strong>el</strong> valor <strong>de</strong><br />

la propiedad puzzleCols<br />

(puzzleCols > 0)<br />

Excepción o acción<br />

correctiva sobre <strong>el</strong> valor <strong>de</strong><br />

la propiedad puzzleRows<br />

(puzzleRows > 0)<br />

Excepción o acción<br />

correctiva sobre <strong>el</strong> valor <strong>de</strong><br />

la propiedad b<strong>el</strong>v<strong>el</strong>Heigth<br />

(b<strong>el</strong>v<strong>el</strong>Heigth > 0)<br />

Tabla 5.2 Resultados <strong>de</strong> la prueba al compon<strong>en</strong>te Puzzle.<br />

Ningún error<br />

<strong>de</strong>tectado<br />

El método no<br />

siempre funcionó<br />

correctam<strong>en</strong>te.<br />

Error <strong>de</strong>tectado<br />

El método no<br />

siempre funcionó<br />

correctam<strong>en</strong>te.<br />

Error <strong>de</strong>tectado<br />

El método no<br />

siempre funcionó<br />

correctam<strong>en</strong>te.<br />

Error <strong>de</strong>tectado<br />

El método no<br />

siempre funcionó<br />

correctam<strong>en</strong>te.<br />

Error <strong>de</strong>tectado<br />

81


5.3 El compon<strong>en</strong>te TextEditor.<br />

TextEditor es un compon<strong>en</strong>te que ofrece las funcionalida<strong>de</strong>s <strong>de</strong> un s<strong>en</strong>cillo procesador<br />

<strong>de</strong> texto. La figura 5.2 muestra un applet que utiliza este y otros <strong>compon<strong>en</strong>tes</strong> con <strong>el</strong> propósito<br />

<strong>de</strong> crear una aplicación.<br />

Figura 5.2 Una applet que usa <strong>el</strong> compon<strong>en</strong>te TextEditor.<br />

El archivo TextEditor.jar comprime los <strong>el</strong>em<strong>en</strong>tos necesarios por <strong>el</strong> compon<strong>en</strong>te y <strong>el</strong><br />

compon<strong>en</strong>te según lo especificado <strong>en</strong> <strong>el</strong> archivo “manifest.mf”, correspon<strong>de</strong> a la clase<br />

TextEditor.class localizada <strong>en</strong> <strong>el</strong> directorio sunw/<strong>de</strong>mo/TextEditor. Esta clase conti<strong>en</strong>e 15<br />

métodos.<br />

La tabla 5.3 conti<strong>en</strong>e una <strong>de</strong>scripción <strong>de</strong> las activida<strong>de</strong>s realizadas y los resultados por<br />

cada uno <strong>de</strong> los módulos que conforma la herrami<strong>en</strong>ta, durante la prueba <strong>de</strong>l compon<strong>en</strong>te<br />

TextEditor. Las acciones realizadas se llevaron a cabo sin pres<strong>en</strong>tarse ningún contratiempo.<br />

82


Módulo Actividad Resultado Observaciones<br />

Apertura <strong>de</strong> Archivos<br />

JAR.<br />

Primer<br />

G<strong>en</strong>erador <strong>de</strong> Casos <strong>de</strong><br />

<strong>Prueba</strong><br />

Segundo<br />

G<strong>en</strong>erador <strong>de</strong> Casos <strong>de</strong><br />

<strong>Prueba</strong><br />

Primer<br />

Ejecutor <strong>de</strong> Casos <strong>de</strong><br />

Extracción y creación <strong>de</strong> archivos<br />

propios <strong>de</strong>l compon<strong>en</strong>te<br />

Correcto<br />

I<strong>de</strong>ntificación <strong>de</strong> Beans. Correcto<br />

Creación <strong>de</strong>l archivo “beans.txt” Correcto<br />

La g<strong>en</strong>eración archivo “casos.txt” Correcto<br />

Uso <strong>de</strong> Plug-Ins <strong>en</strong> la g<strong>en</strong>eración<br />

<strong>de</strong> casos.<br />

Creación archivo “casosp.txt” Correcto<br />

Uso <strong>de</strong> Plug-Ins <strong>en</strong> la g<strong>en</strong>eración<br />

<strong>de</strong> casos.<br />

Creación <strong>de</strong>l archivo<br />

“resultados.txt”<br />

<strong>Prueba</strong> Uso <strong>de</strong> Plug-Ins <strong>en</strong> la ejecución <strong>de</strong><br />

casos.<br />

Segundo<br />

Ejecutor <strong>de</strong> Casos <strong>de</strong><br />

<strong>Prueba</strong><br />

Creación <strong>de</strong>l archivo<br />

“resultadosp.txt”<br />

Uso <strong>de</strong> Plug-Ins <strong>en</strong> la ejecución <strong>de</strong><br />

casos.<br />

Se crearon correctam<strong>en</strong>te las estructuras <strong>de</strong><br />

directorios, así como los cont<strong>en</strong>idos para los<br />

archivos .class y manifest.mf<br />

La clase TextEditor, correspon<strong>de</strong> con lo<br />

establecido <strong>en</strong> <strong>el</strong> archivo manifest.mf.<br />

Se crea correctam<strong>en</strong>te <strong>el</strong> archivo y su<br />

cont<strong>en</strong>ido <strong>en</strong> <strong>el</strong> directorio /reportes<br />

- Se crea correctam<strong>en</strong>te <strong>el</strong> archivo <strong>en</strong> <strong>el</strong><br />

directorio /reportes.<br />

- Solo se almac<strong>en</strong>an los casos para 4 <strong>de</strong> los<br />

15 métodos que recib<strong>en</strong> argum<strong>en</strong>tos.<br />

* Solo los argum<strong>en</strong>tos <strong>de</strong> 4 métodos son<br />

conocidos por la herrami<strong>en</strong>ta.<br />

Correcto No se requirieron Plug Ins.<br />

- Se crea correctam<strong>en</strong>te <strong>el</strong> archivo <strong>en</strong> <strong>el</strong><br />

directorio /reportes<br />

- Se almac<strong>en</strong>an los casos para los 4 métodos<br />

que correspon<strong>de</strong>n a propieda<strong>de</strong>s.<br />

Correcto No se requirieron Plug Ins.<br />

Correcto<br />

- Se crea correctam<strong>en</strong>te <strong>el</strong> archivo <strong>en</strong> <strong>el</strong><br />

directorio /reportes<br />

- Se almac<strong>en</strong>an los resultados para los 15<br />

métodos cont<strong>en</strong>idos <strong>en</strong> la clase.<br />

Correcto No se requirieron Plug Ins.<br />

Correcto<br />

- Se crea correctam<strong>en</strong>te <strong>el</strong> archivo <strong>en</strong> <strong>el</strong><br />

directorio /reportes<br />

- Se almac<strong>en</strong>an los resultados para los 4<br />

métodos cont<strong>en</strong>idos <strong>en</strong> la clase que<br />

correspon<strong>de</strong>n a propieda<strong>de</strong>s.<br />

Correcto No se requirieron Plug Ins.<br />

Tabla 5.3 Comportami<strong>en</strong>to <strong>de</strong> los módulos durante la prueba al compon<strong>en</strong>te TextEditor.<br />

83


5.3.1 Los resultados observados.<br />

TextEditor.<br />

La tabla 5.4 pres<strong>en</strong>ta los resultados obt<strong>en</strong>idos al realizar la prueba al compon<strong>en</strong>te<br />

El método 2, void load(), que permite la carga <strong>de</strong> un archivo, g<strong>en</strong>eró una excepción al<br />

ejercitarse, aspecto que se esperaba. Sin embargo <strong>el</strong> método 3 que correspon<strong>de</strong> a la<br />

<strong>de</strong>claración void save(), <strong>de</strong>l cual se esperaba un comportami<strong>en</strong>to similar, no pres<strong>en</strong>tó <strong>el</strong><br />

mismo comportami<strong>en</strong>to y se ejecuto sin problemas.<br />

El método void setFontName(java.lang.String) (método 7) permite establecer <strong>el</strong> tipo <strong>de</strong><br />

fu<strong>en</strong>te a utilizar <strong>en</strong> <strong>el</strong> procesador <strong>de</strong> texto, sin embargo al probarlo se comprobó que no existe<br />

ningún tipo <strong>de</strong> validación con respecto a <strong>en</strong>tradas que no correspon<strong>de</strong>n con un tipo <strong>de</strong> letra.<br />

Algo similar ocurre con métodos que manipulan <strong>el</strong> tamaño y estilo <strong>de</strong> la fu<strong>en</strong>te como lo son<br />

void setFontSize(int) y void setFontStyle(int) (metodos 11 y 15).<br />

Al no pres<strong>en</strong>tarse algún tipo <strong>de</strong> validación <strong>de</strong>l argum<strong>en</strong>to <strong>de</strong> <strong>en</strong>trada, estos métodos<br />

<strong>de</strong>b<strong>en</strong> ser utilizados con sumo cuidado para evitar inconsist<strong>en</strong>cias y mal funcionami<strong>en</strong>to <strong>de</strong>l<br />

compon<strong>en</strong>te.<br />

84


Método Caso Resultado G<strong>en</strong>erado Resultado Esperado Diagnóstico<br />

2 void load () Único Excepción Excepción.<br />

3 void save () Único null Excepción.<br />

7 void setFontName<br />

(java.lang.String)<br />

11 void setFontSize (int)<br />

15 void setFontStyle (int)<br />

aeiou<br />

!”#$%&/()=?¡<br />

1234567890<br />

2147483645<br />

2147483646<br />

2147483647<br />

1073741824<br />

2<br />

1<br />

0<br />

-1<br />

-2<br />

-1073741824<br />

-2147483646<br />

-2147483647<br />

-2147483648<br />

2147483645<br />

2147483646<br />

2147483647<br />

1073741824<br />

2<br />

1<br />

0<br />

-1<br />

-2<br />

-1073741824<br />

-2147483646<br />

-2147483647<br />

-2147483648<br />

null y la propiedad<br />

fontName igual al valor<br />

suministrado<br />

null y la propiedad fontSize<br />

igual al valor suministrado<br />

null y la propiedad<br />

fontStyle igual al valor<br />

suministrado<br />

Excepción o acción<br />

correctiva sobre <strong>el</strong> valor <strong>de</strong><br />

la propiedad fontName<br />

Excepción o acción<br />

correctiva sobre <strong>el</strong> valor <strong>de</strong><br />

la propiedad fontSize<br />

(fontSize > 0)<br />

Excepción o acción<br />

correctiva sobre <strong>el</strong> valor <strong>de</strong><br />

la propiedad fontStyle<br />

(fontStyle > 0)<br />

5.4 Resultados <strong>de</strong> la prueba al compon<strong>en</strong>te TextEditor.<br />

El método<br />

funcionó<br />

correctam<strong>en</strong>te.<br />

Ningún error<br />

<strong>de</strong>tectado<br />

El método<br />

funcionó<br />

correctam<strong>en</strong>te.<br />

Error <strong>de</strong>tectado<br />

El método no<br />

siempre funcionó<br />

correctam<strong>en</strong>te.<br />

Error <strong>de</strong>tectado<br />

El método no<br />

siempre funcionó<br />

correctam<strong>en</strong>te.<br />

Error <strong>de</strong>tectado<br />

El método no<br />

siempre funcionó<br />

correctam<strong>en</strong>te.<br />

Error <strong>de</strong>tectado<br />

85


5.4 El compon<strong>en</strong>te ProgressBar.<br />

El compon<strong>en</strong>te ProgressBar es un termómetro que permite la repres<strong>en</strong>tación gráfica <strong>de</strong><br />

un porc<strong>en</strong>taje especificado. La clase ProgressBar.class que mediante la cual se implem<strong>en</strong>ta <strong>el</strong><br />

JavaBean conti<strong>en</strong>e 11 métodos. La figura 5.3, muestra este compon<strong>en</strong>te <strong>en</strong> <strong>el</strong> BeanBox.<br />

Figura 5.3 El compon<strong>en</strong>te ProgressBar.<br />

Los resultados obt<strong>en</strong>idos durante <strong>el</strong> proceso <strong>de</strong> prueba para este compon<strong>en</strong>te fueron<br />

satisfactorios, sin pres<strong>en</strong>tarse alguna contrariedad. La tabla 5.5 pres<strong>en</strong>ta un resum<strong>en</strong> <strong>de</strong> los<br />

mismos.<br />

86


Módulo Actividad Resultado Observaciones<br />

Apertura <strong>de</strong> Archivos<br />

JAR.<br />

Primer<br />

G<strong>en</strong>erador <strong>de</strong> Casos <strong>de</strong><br />

<strong>Prueba</strong><br />

Segundo<br />

G<strong>en</strong>erador <strong>de</strong> Casos <strong>de</strong><br />

<strong>Prueba</strong><br />

Primer<br />

Ejecutor <strong>de</strong> Casos <strong>de</strong><br />

Extracción y creación <strong>de</strong> archivos<br />

propios <strong>de</strong>l compon<strong>en</strong>te<br />

Tabla 5.5 Comportami<strong>en</strong>to <strong>de</strong> los módulos durante la prueba al compon<strong>en</strong>te<br />

ProgressBar.<br />

5.4.1 Los resultados observados.<br />

Correcto<br />

I<strong>de</strong>ntificación <strong>de</strong> Beans. Correcto<br />

Creación <strong>de</strong>l archivo “beans.txt” Correcto<br />

La g<strong>en</strong>eración archivo “casos.txt” Correcto<br />

Uso <strong>de</strong> Plug-Ins <strong>en</strong> la g<strong>en</strong>eración<br />

<strong>de</strong> casos.<br />

Correcto<br />

Creación archivo “casosp.txt” Correcto<br />

Uso <strong>de</strong> Plug-Ins <strong>en</strong> la g<strong>en</strong>eración<br />

<strong>de</strong> casos.<br />

Creación <strong>de</strong>l archivo<br />

“resultados.txt”<br />

<strong>Prueba</strong> Uso <strong>de</strong> Plug-Ins <strong>en</strong> la ejecución <strong>de</strong><br />

casos.<br />

Segundo<br />

Ejecutor <strong>de</strong> Casos <strong>de</strong><br />

Creación <strong>de</strong>l archivo<br />

“resultadosp.txt”<br />

<strong>Prueba</strong> Uso <strong>de</strong> Plug-Ins <strong>en</strong> la ejecución <strong>de</strong><br />

casos.<br />

Correcto<br />

Correcto<br />

Se crearon correctam<strong>en</strong>te las estructuras <strong>de</strong><br />

directorios, así como los cont<strong>en</strong>idos para los<br />

archivos .class y manifest.mf<br />

La clase ProgressBar, correspon<strong>de</strong> con lo<br />

establecido <strong>en</strong> <strong>el</strong> archivo manifest.mf.<br />

Se crea correctam<strong>en</strong>te <strong>el</strong> archivo y su<br />

cont<strong>en</strong>ido <strong>en</strong> <strong>el</strong> directorio /reportes<br />

- Se crea correctam<strong>en</strong>te <strong>el</strong> archivo <strong>en</strong> <strong>el</strong><br />

directorio /reportes.<br />

- Solo se almac<strong>en</strong>an los casos para 3 * <strong>de</strong> los<br />

4 métodos que recib<strong>en</strong> argum<strong>en</strong>tos.<br />

* Solo los argum<strong>en</strong>tos <strong>de</strong> 3 métodos son<br />

conocidos por la herrami<strong>en</strong>ta.<br />

Se utilizó correctam<strong>en</strong>te los Plug-Ins para <strong>el</strong><br />

argum<strong>en</strong>to:<br />

- Color para <strong>el</strong> método 3<br />

- Se crea correctam<strong>en</strong>te <strong>el</strong> archivo <strong>en</strong> <strong>el</strong><br />

directorio /reportes<br />

- Se almac<strong>en</strong>an los casos para los 3 métodos<br />

que correspon<strong>de</strong>n a propieda<strong>de</strong>s.<br />

Se utilizó correctam<strong>en</strong>te los Plug-Ins para <strong>el</strong><br />

argum<strong>en</strong>to:<br />

- Color para <strong>el</strong> método 3<br />

- Se crea correctam<strong>en</strong>te <strong>el</strong> archivo <strong>en</strong> <strong>el</strong><br />

directorio /reportes<br />

- Se almac<strong>en</strong>an los resultados para los 11<br />

métodos cont<strong>en</strong>idos <strong>en</strong> la clase.<br />

Correcto No se requirieron Plug Ins.<br />

Correcto<br />

Correcto<br />

- Se crea correctam<strong>en</strong>te <strong>el</strong> archivo <strong>en</strong> <strong>el</strong><br />

directorio /reportes<br />

- Se almac<strong>en</strong>an los resultados para los 3<br />

métodos que correspon<strong>de</strong>n a propiea<strong>de</strong>s.<br />

Se utilizó correctam<strong>en</strong>te los Plug-Ins para <strong>el</strong><br />

argum<strong>en</strong>to:<br />

- Color para <strong>el</strong> método 3<br />

Un aspecto interesante <strong>de</strong> este compon<strong>en</strong>te <strong>de</strong>scubierto a partir <strong>de</strong> las pruebas, es <strong>el</strong><br />

que ti<strong>en</strong>e que ver con <strong>el</strong> método que modifica la propiedad perc<strong>en</strong>t <strong>de</strong>l compon<strong>en</strong>te, void<br />

setPerc<strong>en</strong>t(int), (método 1). En <strong>el</strong> análisis <strong>de</strong> los resultados se observa que al proporcionar<br />

valores que no cumpl<strong>en</strong> con la característica <strong>de</strong> ser mayor que 0 y m<strong>en</strong>or que 100, <strong>el</strong><br />

87


compon<strong>en</strong>te restaura <strong>el</strong> valor <strong>de</strong> la propiedad perc<strong>en</strong>t a un valor válido que pue<strong>de</strong> ser 0 o bién<br />

1. Esto se pres<strong>en</strong>ta con <strong>de</strong>talle <strong>en</strong> la tabla 5.6.<br />

A difer<strong>en</strong>cia <strong>de</strong>l compon<strong>en</strong>te analizado <strong>en</strong> la sección anterior, ProgressBar realiza una<br />

validación <strong>de</strong> los valores sumistrados por <strong>el</strong> usuario para la propiedad perc<strong>en</strong>t.<br />

D<strong>en</strong>tro <strong>de</strong>l conjunto <strong>de</strong> resultados obt<strong>en</strong>idos no se <strong>en</strong>contró ningún tipo <strong>de</strong> excepción.<br />

Método Caso Resultado G<strong>en</strong>erado Resultado Esperado Diagnóstico<br />

1 void<br />

setPerc<strong>en</strong>t(int)<br />

2147483645<br />

2147483646<br />

2147483647<br />

1073741824<br />

null y la propiedad perc<strong>en</strong>t<br />

igual con 0<br />

Excepción o acción<br />

correctiva sobre <strong>el</strong> valor <strong>de</strong><br />

la propiedad perc<strong>en</strong>t.<br />

(perc<strong>en</strong>t <br />

0)<br />

2 2 2<br />

1 1 1<br />

0 0 2<br />

-1<br />

-2<br />

-1073741824<br />

-2147483646<br />

-2147483647<br />

-2147483648<br />

null y la propiedad perc<strong>en</strong>t<br />

igual con 0<br />

Excepción o acción<br />

correctiva sobre <strong>el</strong> valor <strong>de</strong><br />

la propiedad perc<strong>en</strong>t.<br />

(perc<strong>en</strong>t <br />

0)<br />

Tabla 5.6 Resultados <strong>de</strong> la prueba al compon<strong>en</strong>te ProgressBar.<br />

El método no siempre<br />

funcionó correctam<strong>en</strong>te.<br />

Error <strong>de</strong>tectado<br />

El método funcionó<br />

correctam<strong>en</strong>te.<br />

Ningún error <strong>de</strong>tectado<br />

El método funcionó<br />

correctam<strong>en</strong>te.<br />

Ningún error <strong>de</strong>tectado<br />

El método no siempre<br />

funcionó correctam<strong>en</strong>te.<br />

Error <strong>de</strong>tectado<br />

El método no siempre<br />

funcionó correctam<strong>en</strong>te.<br />

Error <strong>de</strong>tectado<br />

88


Conclusiones.<br />

Es claro que una actividad indisp<strong>en</strong>sable <strong>en</strong> todo proceso <strong>de</strong> <strong>de</strong>sarrollo <strong>de</strong> <strong>software</strong>, es<br />

la prueba, si esta actividad no se llevara a cabo, se t<strong>en</strong>dría un <strong>de</strong>sconocimi<strong>en</strong>to total sobre la<br />

calidad <strong>de</strong> los productos.<br />

No se pue<strong>de</strong> negar que, con la aparición <strong>de</strong> nuevos mo<strong>de</strong>los <strong>de</strong> <strong>de</strong>sarrollo, muchos <strong>de</strong><br />

los procesos involucrados <strong>en</strong> la construcción <strong>de</strong> <strong>software</strong> se han simplificado; sin embargo<br />

exist<strong>en</strong> otras activida<strong>de</strong>s que no han corrido con la misma suerte, ejemplo <strong>de</strong> <strong>el</strong>lo es la prueba<br />

<strong>de</strong> <strong>software</strong>.<br />

Las activida<strong>de</strong>s realizadas para la realización <strong>de</strong> éste trabajo han permitido obt<strong>en</strong>er las<br />

sigui<strong>en</strong>tes conclusiones:<br />

a) Con respecto a la herrami<strong>en</strong>ta <strong>de</strong> prueba:<br />

• Se logró <strong>el</strong> objetivo <strong>de</strong> <strong>de</strong>sarrollar una herrami<strong>en</strong>ta para probar <strong>compon<strong>en</strong>tes</strong><br />

construidas bajo <strong>el</strong> mo<strong>de</strong>lo <strong>de</strong> JavaBeans. Esta herrami<strong>en</strong>ta terminada y probada,<br />

provee una alternativa <strong>de</strong> prueba automática <strong>de</strong> este tipo <strong>de</strong> <strong>compon<strong>en</strong>tes</strong>.<br />

• Como se m<strong>en</strong>cionó <strong>en</strong> un principio, la g<strong>en</strong>eración automática <strong>de</strong> casos <strong>de</strong> prueba así<br />

como la puesta <strong>en</strong> marcha <strong>de</strong> los mismos, repres<strong>en</strong>ta una v<strong>en</strong>taja significativa si se<br />

pi<strong>en</strong>sa que <strong>el</strong> usuario que utiliza los <strong>compon<strong>en</strong>tes</strong>, carece, regularm<strong>en</strong>te, <strong>de</strong><br />

conocimi<strong>en</strong>tos formales para <strong>el</strong>lo.<br />

• Así mismo, es importante <strong>de</strong>stacar que para la implem<strong>en</strong>tación <strong>de</strong> la herrami<strong>en</strong>ta, se<br />

consi<strong>de</strong>ran aspectos r<strong>el</strong>evantes <strong>en</strong> <strong>el</strong> área <strong>de</strong> prueba <strong>de</strong> <strong>software</strong>, técnicas como la<br />

prueba <strong>de</strong> valores limite y la prueba basada <strong>en</strong> estado, así como algunas métricas para<br />

<strong>software</strong> ori<strong>en</strong>tado a objetos, todo esto con <strong>el</strong> propósito <strong>de</strong> <strong>en</strong>riquecer los criterios <strong>de</strong><br />

evaluación.<br />

89


• Aunque pudiera p<strong>en</strong>sarse como una limitación <strong>el</strong> hecho <strong>de</strong> utilizar técnicas <strong>de</strong> prueba<br />

funcional, es importante hacer m<strong>en</strong>ción que dada la naturaleza <strong>de</strong> los <strong>compon<strong>en</strong>tes</strong>, los<br />

cuales se ofrec<strong>en</strong> como productos <strong>en</strong> los que no se incluye <strong>el</strong> código fu<strong>en</strong>te, las<br />

estrategias <strong>de</strong> prueba utilizadas correspon<strong>de</strong>n con <strong>el</strong> contexto actual <strong>de</strong>l <strong>software</strong><br />

basado <strong>en</strong> <strong>compon<strong>en</strong>tes</strong>, ya que <strong>de</strong> otro modo pudieron haberse incluido <strong>en</strong> la<br />

herrami<strong>en</strong>ta otras técnicas <strong>de</strong> prueba.<br />

b) Con respecto a aplicaciones futuras y mejoras <strong>de</strong> la herrami<strong>en</strong>ta:<br />

• Puesto que <strong>el</strong> mercado <strong>de</strong> <strong>compon<strong>en</strong>tes</strong> está <strong>en</strong> <strong>de</strong>sarrollo y aún no exist<strong>en</strong> acuerdos<br />

totalm<strong>en</strong>te establecidos <strong>en</strong> este contexto, inicialm<strong>en</strong>te se optó por contemplar las<br />

pruebas a niv<strong>el</strong> <strong>de</strong> unidad, sin embargo a futuro podrían contemplarse niv<strong>el</strong>es<br />

superiores <strong>de</strong> prueba.<br />

• Otro <strong>de</strong>sarrollo pot<strong>en</strong>cial es la aplicación <strong>de</strong> técnicas similares <strong>en</strong> la prueba <strong>de</strong> servlets<br />

y aún <strong>de</strong> Enterprise JavaBeans. Todos <strong>el</strong>los compart<strong>en</strong> <strong>el</strong>em<strong>en</strong>tos comunes con los<br />

JavaBeans.<br />

• En un trabajo posterior, podría mejorarse la edición <strong>de</strong> casos por <strong>el</strong> usuario, <strong>de</strong> forma<br />

que los errores <strong>en</strong> su captura puedan disminuirse.<br />

• Así mismo, podría incluirse un mecanismo para proporcionar <strong>el</strong> estado inicial <strong>de</strong>l<br />

compon<strong>en</strong>te a partir <strong>de</strong>l cual iniciar <strong>el</strong> proceso <strong>de</strong> prueba. Esto mejoraría lo que<br />

actualm<strong>en</strong>te provee la herrami<strong>en</strong>ta, que es únicam<strong>en</strong>te <strong>el</strong> estado posterior a la<br />

instanciación <strong>de</strong>l Bean.<br />

La realización <strong>de</strong> este trabajo, los resultados obt<strong>en</strong>idos a partir <strong>de</strong> él y, muchas otras<br />

experi<strong>en</strong>cias, permit<strong>en</strong> darnos cu<strong>en</strong>ta que la prueba es una actividad que indiscutiblem<strong>en</strong>te<br />

<strong>de</strong>be llevarse a cabo, aun ante la pres<strong>en</strong>cia <strong>de</strong> mo<strong>de</strong>los <strong>de</strong> <strong>de</strong>sarrollo que insist<strong>en</strong> <strong>en</strong><br />

subestimarla.<br />

90


a) Tipos <strong>de</strong> datos primitivos.<br />

ANEXO A<br />

Valores Establecidos para la<br />

G<strong>en</strong>eración <strong>de</strong> Casos <strong>de</strong> <strong>Prueba</strong>.<br />

Nombre Tamaño<br />

Máximo<br />

Valores Establecidos<br />

Medio Mínimo<br />

boolean 1 bit true False<br />

byte 8 bits<br />

short 16 bits<br />

int 32 bits<br />

long 64 bits<br />

125<br />

126<br />

127<br />

32765<br />

32766<br />

32767<br />

2147483645<br />

2147483646<br />

2147483647<br />

9223372036854775805<br />

9223372036854775806<br />

9223372036854775807<br />

-64<br />

-2<br />

-1<br />

0<br />

1<br />

2<br />

64<br />

-16384<br />

-2<br />

-1<br />

0<br />

1<br />

2<br />

16384<br />

-1073741824<br />

-2<br />

-1<br />

0<br />

1<br />

2<br />

-1073741824<br />

-4611686018427387904<br />

-2<br />

-1<br />

0<br />

1<br />

2<br />

-4611686018427387904<br />

-128<br />

-127<br />

-126<br />

-32768<br />

-32767<br />

-32765<br />

-2147483648<br />

-2147483647<br />

-2147483646<br />

-9223372036854775808<br />

-9223372036854775807<br />

-9223372036854775805<br />

91


Nombre Tamaño<br />

float 32 bits<br />

double 64 bits<br />

b) Otros tipos.<br />

Máximo<br />

Valores Establecidos<br />

Medio Mínimo<br />

-3.40292347 E36<br />

-3.40292347 E37<br />

-3.40292347 E38<br />

-1.79769313486231570E306<br />

-1.79769313486231560E307<br />

-1.79769313486231560E308<br />

Nombre Valores Establecidos<br />

String<br />

char<br />

aeiou<br />

!#$%&/()=?¡<br />

1234567890<br />

a<br />

Z<br />

%<br />

1<br />

-9223372036854775807.99<br />

-2.9<br />

-1.1<br />

0.1<br />

1.1<br />

2.9<br />

9223372036854775807.99<br />

-3.40292347E36<br />

-2.9<br />

-1.1<br />

0.1<br />

1.1<br />

2.9<br />

3.40292347E36<br />

-3.40292347 E38<br />

-3.40292347 E37<br />

-3.40292347 E36<br />

-1.79769313486231570E308<br />

-1.79769313486231560E307<br />

-1.79769313486231560E306<br />

92


ANEXO B<br />

Manual <strong>de</strong> Operación.<br />

En la actualidad exist<strong>en</strong> pocas herrami<strong>en</strong>tas para probar <strong>software</strong> ori<strong>en</strong>tado a objetos y<br />

aún m<strong>en</strong>os para probar <strong>software</strong> basado <strong>en</strong> <strong>compon<strong>en</strong>tes</strong>, por lo que surgió la i<strong>de</strong>a <strong>de</strong><br />

<strong>de</strong>sarrollar una herrami<strong>en</strong>ta para <strong>el</strong>lo.<br />

La herrami<strong>en</strong>ta <strong>de</strong> <strong>Prueba</strong> Automática <strong>de</strong> Compon<strong>en</strong>tes JavaBeans, “PACJavaBeans”,<br />

ofrece varios servicios ori<strong>en</strong>tados a la prueba <strong>de</strong> <strong>compon<strong>en</strong>tes</strong> construidos bajo <strong>el</strong> mo<strong>de</strong>lo<br />

JavaBeans, <strong>de</strong> forma que al utilizarlos <strong>el</strong> usuario lleve a cabo <strong>de</strong> forma más s<strong>en</strong>cilla las tareas<br />

<strong>de</strong> s<strong>el</strong>ección y evaluación <strong>de</strong> Beans. La sigui<strong>en</strong>te figura, muestra <strong>el</strong> pan<strong>el</strong> con <strong>el</strong> cual <strong>el</strong><br />

usuario interactúa con <strong>el</strong> propósito <strong>de</strong> utilizar los servicios que ofrece la herrami<strong>en</strong>ta.<br />

Los servicios que ofrece PACJavaBeans, se pres<strong>en</strong>tan <strong>en</strong> <strong>el</strong> pan<strong>el</strong> lanzador como un<br />

conjunto <strong>de</strong> botones que <strong>el</strong> usuario utiliza para invocar a los módulos que los llevan a cabo.<br />

Estos servicios <strong>de</strong>b<strong>en</strong> ser invocados bajo un or<strong>de</strong>n, ya que repres<strong>en</strong>tan etapas difer<strong>en</strong>tes <strong>de</strong> un<br />

93


proceso <strong>de</strong> prueba. El or<strong>de</strong>n está ya pre<strong>de</strong>terminado <strong>en</strong> la herrami<strong>en</strong>ta <strong>de</strong> modo que, a medida<br />

que se van utilizando los servicios, los botones que los repres<strong>en</strong>tan cambian <strong>de</strong> estado (activo<br />

o inactivo), <strong>de</strong> acuerdo a la etapa <strong>de</strong>l proceso que se este llevando a cabo. De esta forma, <strong>el</strong><br />

proceso <strong>de</strong> prueba para un Bean consiste <strong>de</strong> los sigui<strong>en</strong>tes pasos:<br />

1. Abrir <strong>el</strong> archivo JAR para i<strong>de</strong>ntificar los <strong>compon<strong>en</strong>tes</strong> cont<strong>en</strong>idos <strong>en</strong> él. Este servicio<br />

está repres<strong>en</strong>tado por <strong>el</strong> botón Abrir archivo JAR..<br />

2. G<strong>en</strong>erar automáticam<strong>en</strong>te los casos <strong>de</strong> prueba. Servicio repres<strong>en</strong>tado por <strong>el</strong> botón<br />

G<strong>en</strong>erar Casos <strong>de</strong> <strong>Prueba</strong>.<br />

3. Ejecutar los casos <strong>de</strong> prueba previam<strong>en</strong>te g<strong>en</strong>erados, esto mediante <strong>el</strong> botón Ejecutar<br />

Casos <strong>de</strong> <strong>Prueba</strong>.<br />

4. De manera opcional, <strong>el</strong> usuario podría proponer casos <strong>de</strong> prueba manualm<strong>en</strong>te. Si se<br />

<strong>de</strong>sea realizar esta actividad, se <strong>de</strong>be presionar Editar Casos <strong>de</strong> <strong>Prueba</strong>.<br />

a. Si <strong>el</strong> usuario ha propuesto algunos casos <strong>de</strong> prueba, <strong>el</strong> sigui<strong>en</strong>te paso consiste<br />

<strong>en</strong> la ejecución <strong>de</strong> los mismos. Para <strong>el</strong>lo se <strong>de</strong>be presionar <strong>el</strong> botón Ejecutar<br />

Casos Editados.<br />

5. Finalm<strong>en</strong>te, una vez ejecutados todos los casos <strong>de</strong> prueba se proce<strong>de</strong> a la lectura <strong>de</strong> los<br />

resultados. Para los casos g<strong>en</strong>erados <strong>de</strong> forma automática <strong>de</strong>be utilizarse <strong>el</strong> botón Ver<br />

Resultados.<br />

De igual forma se recomi<strong>en</strong>da invocar <strong>el</strong> servicio ofrecido por <strong>el</strong> botón Información<br />

interna, que permitirá realizar <strong>el</strong> análisis <strong>de</strong> algunos aspectos r<strong>el</strong>acionados con la<br />

implem<strong>en</strong>tación <strong>de</strong>l Bean.<br />

a. Si fuera <strong>el</strong> caso, para ver los resultados <strong>de</strong> los casos editados se utiliza <strong>el</strong> botón<br />

Ver Resultados <strong>de</strong> CE.<br />

6. Una vez concluido <strong>el</strong> proceso <strong>de</strong> prueba, si se <strong>de</strong>sea llevar a cabo una nueva sesión, se<br />

recomi<strong>en</strong>da limpiar <strong>el</strong> <strong>en</strong>torno <strong>de</strong> operación mediante <strong>el</strong> botón Limpiar.<br />

A continuación se explican <strong>de</strong> forma más amplia los servicios que ofrece PACJavaBeans.<br />

94


Abrir archivo JAR.<br />

Normalm<strong>en</strong>te, los Beans se ofrec<strong>en</strong> <strong>de</strong>ntro <strong>de</strong> un archivo JAR. Este archivo, <strong>en</strong>tre otras<br />

cosas, empaqueta uno o más Beans <strong>de</strong>ntro <strong>de</strong> una sola unidad. At<strong>en</strong>di<strong>en</strong>do esta característica,<br />

es necesario contar con un medio que permita extraer <strong>el</strong> cont<strong>en</strong>ido <strong>de</strong>l archivo JAR, a<strong>de</strong>más<br />

<strong>de</strong> i<strong>de</strong>ntificar y disponer <strong>de</strong> las <strong>compon<strong>en</strong>tes</strong> que este conti<strong>en</strong>e.<br />

Si se presiona <strong>el</strong> botón Abrir archivo JAR <strong>de</strong>s<strong>de</strong> <strong>el</strong> pan<strong>el</strong> lanzador, se ejecutará <strong>el</strong><br />

Módulo <strong>de</strong> Apertura <strong>de</strong> archivos JAR. Al inicio, <strong>el</strong> módulo ti<strong>en</strong>e la apari<strong>en</strong>cia que se muestra<br />

<strong>en</strong> la figura.<br />

Para indicar <strong>el</strong> nombre <strong>de</strong>l archivo JAR que se <strong>de</strong>sea analizar <strong>de</strong>be presionarse <strong>el</strong> botón<br />

Abrir JAR...., localizado <strong>en</strong> la parte superior <strong>de</strong>recha <strong>de</strong>l módulo. Esta acción <strong>de</strong>splegará un<br />

s<strong>el</strong>eccionador <strong>de</strong> archivos.<br />

El s<strong>el</strong>eccionador mostrará los archivos JAR cont<strong>en</strong>idos <strong>en</strong> <strong>el</strong> directorio /jars, lugar<br />

don<strong>de</strong> <strong>de</strong>b<strong>en</strong> ser colocados los JAR que se <strong>de</strong>sean evaluar, por <strong>el</strong>lo es indisp<strong>en</strong>sable que estos<br />

archivos se copi<strong>en</strong> <strong>de</strong>ntro <strong>de</strong> este directorio con anterioridad. La apari<strong>en</strong>cia <strong>de</strong>l s<strong>el</strong>eccionador<br />

<strong>de</strong> archivos se pres<strong>en</strong>ta a continuación.<br />

95


Una vez que se ha s<strong>el</strong>eccionado un archivo <strong>de</strong> la lista pres<strong>en</strong>tada, es necesario<br />

presionar <strong>el</strong> botón Op<strong>en</strong> para iniciar <strong>el</strong> proceso <strong>de</strong> extracción. De lo contrario presionar <strong>el</strong><br />

botón Canc<strong>el</strong>.<br />

Si <strong>el</strong> archivo s<strong>el</strong>eccionado es una archivo válido, es <strong>de</strong>cir, es un archivo JAR que<br />

conti<strong>en</strong>e JavaBeans, se realiza <strong>el</strong> proceso <strong>de</strong> extracción <strong>de</strong>l mismo y se informan los<br />

resultados. La sigui<strong>en</strong>te figura pres<strong>en</strong>ta la información final <strong>de</strong>spués <strong>de</strong> haberse llevado a cabo<br />

<strong>el</strong> procedimi<strong>en</strong>to anteriorm<strong>en</strong>te <strong>de</strong>scrito para <strong>el</strong> archivo puzzle.jar<br />

96


G<strong>en</strong>erar Casos <strong>de</strong> <strong>Prueba</strong>.<br />

El botón G<strong>en</strong>erar Casos <strong>de</strong> <strong>Prueba</strong>, permite ejecutar <strong>el</strong> módulo que lleva a cabo la<br />

g<strong>en</strong>eración automática <strong>de</strong> casos <strong>de</strong> prueba. Para llevar a cabo esta actividad, es necesario que<br />

la apertura <strong>de</strong>l archivo JAR se haya realizado.<br />

El Módulo <strong>de</strong> G<strong>en</strong>eración <strong>de</strong> Casos <strong>de</strong> <strong>Prueba</strong> buscará las clases que hayan sido<br />

extraídas <strong>de</strong>l archivo JAR y que correspondan Beans. El nombre <strong>de</strong> cada una <strong>de</strong> estas clases se<br />

<strong>de</strong>spliega <strong>en</strong> una lista que se pres<strong>en</strong>ta <strong>en</strong> la interfaz <strong>de</strong>l módulo. Para que <strong>el</strong> proceso <strong>de</strong><br />

g<strong>en</strong>eración pueda iniciarse, es necesario que se s<strong>el</strong>eccione un nombre <strong>de</strong> la lista y<br />

posteriorm<strong>en</strong>te presionar <strong>el</strong> botón G<strong>en</strong>erar Casos como se aprecia a continuación.<br />

97


Al término <strong>de</strong>l proceso <strong>de</strong> g<strong>en</strong>eración <strong>de</strong> casos, <strong>en</strong> la interfaz <strong>de</strong>l módulo se pres<strong>en</strong>ta<br />

un resum<strong>en</strong> que informa las acciones efectuadas.<br />

Editar Casos <strong>de</strong> <strong>Prueba</strong>.<br />

Con la int<strong>en</strong>ción <strong>de</strong> proveer otra alternativa para la g<strong>en</strong>eración <strong>de</strong> casos <strong>de</strong> prueba, se<br />

implem<strong>en</strong>ta <strong>el</strong> servicio <strong>de</strong> edición <strong>de</strong> casos, <strong>el</strong> cual permite que la herrami<strong>en</strong>ta pueda admitir<br />

casos propuestos por <strong>el</strong> usuario; esto <strong>de</strong> forma manual mediante la modificación <strong>de</strong>l archivo<br />

“casosp.txt”.<br />

Presionando <strong>el</strong> botón Editar Casos <strong>de</strong> <strong>Prueba</strong>, <strong>de</strong>s<strong>de</strong> <strong>el</strong> pan<strong>el</strong> lanzador se activa un<br />

s<strong>en</strong>cillo editor <strong>de</strong> textos que carga <strong>el</strong> archivo anteriorm<strong>en</strong>te m<strong>en</strong>cionado y permite que este sea<br />

modificado por <strong>el</strong> usuario. Con <strong>el</strong> propósito <strong>de</strong> que <strong>el</strong> proceso <strong>de</strong> ejecución <strong>de</strong> estos casos se<br />

lleve a cabo <strong>de</strong> forma correcta, es necesario que la escritura <strong>de</strong> este archivo se realice <strong>de</strong><br />

acuerdo a ciertas consi<strong>de</strong>raciones.<br />

Como pue<strong>de</strong> observarse <strong>en</strong> la sigui<strong>en</strong>te figura, <strong>el</strong> cont<strong>en</strong>ido inicial <strong>de</strong>l archivo consiste<br />

<strong>en</strong> un texto que <strong>de</strong>scribe algunos <strong>de</strong> los métodos cont<strong>en</strong>idos <strong>en</strong> la clase que implem<strong>en</strong>ta al<br />

Bean (valor <strong>de</strong> retorno, nombre y argum<strong>en</strong>tos) y, una especie se separador <strong>en</strong>tre <strong>el</strong>los (<strong>el</strong><br />

asterisco). Los métodos que aparecerán escritos <strong>en</strong> <strong>el</strong> archivo, son únicam<strong>en</strong>te aqu<strong>el</strong>los que<br />

98


correspon<strong>de</strong>n a las propieda<strong>de</strong>s <strong>de</strong>l Bean y para los que <strong>el</strong> sistema conoce <strong>el</strong> tipo <strong>de</strong><br />

argum<strong>en</strong>tos que utilizan.<br />

Al escribir los valores para g<strong>en</strong>erar los casos <strong>de</strong> prueba, es importante i<strong>de</strong>ntificar <strong>el</strong><br />

tipo <strong>de</strong> argum<strong>en</strong>to, y <strong>de</strong> esta forma, escribir los valores afines <strong>en</strong>tre <strong>el</strong> nombre <strong>de</strong>l método y <strong>el</strong><br />

terminador asterisco. Por ejemplo, <strong>en</strong> la sigui<strong>en</strong>te figura, se observa que <strong>el</strong> método<br />

setImageFile requiere un argum<strong>en</strong>to <strong>de</strong> tipo String, <strong>de</strong> esta forma se ha propuesto dos casos <strong>de</strong><br />

prueba con los valores “flor.bmp” y “animal”; estos se han escrito <strong>en</strong>tre <strong>el</strong> nombre <strong>de</strong>l método<br />

y <strong>el</strong> asterisco. Así mismo, sigui<strong>en</strong>do esta s<strong>en</strong>cilla regla, se ha propuesto <strong>el</strong> valor “false” para <strong>el</strong><br />

método setShadowLab<strong>el</strong>s y <strong>el</strong> valor “-123” para <strong>el</strong> método setGap.<br />

99


No es necesario escribir casos <strong>de</strong> prueba para todos los métodos, ni <strong>el</strong> mismo número<br />

<strong>de</strong> casos para todos los métodos. Una vez terminado <strong>el</strong> proceso <strong>de</strong> edición, se proce<strong>de</strong> a salvar<br />

<strong>el</strong> cont<strong>en</strong>ido <strong>de</strong>l archivo.<br />

Ejecutar Casos <strong>de</strong> <strong>Prueba</strong>.<br />

Si se presiona <strong>el</strong> botón Ejecutar Casos <strong>de</strong> <strong>Prueba</strong> <strong>de</strong>s<strong>de</strong> <strong>el</strong> pan<strong>el</strong> lanzador, se ejercita <strong>el</strong><br />

Módulo <strong>de</strong> Ejecución <strong>de</strong> Casos <strong>de</strong> <strong>Prueba</strong>. Este módulo lleva a cabo la ejecución <strong>de</strong> los casos<br />

<strong>de</strong> prueba que han sido g<strong>en</strong>erados <strong>de</strong> forma automática por la herrami<strong>en</strong>ta.<br />

Una vez que <strong>el</strong> módulo ha sido activado, es necesario s<strong>el</strong>eccionar <strong>el</strong> nombre <strong>de</strong>l Bean<br />

al que correspon<strong>de</strong>n los casos <strong>de</strong> prueba <strong>de</strong>s<strong>de</strong> la lista disponible <strong>en</strong> la interfaz <strong>de</strong>l usuario y,<br />

posteriorm<strong>en</strong>te, presionar <strong>el</strong> botón Ejecutar Casos. Esto se ilustra a continuación:<br />

100


Una vez que <strong>el</strong> proceso ha finalizado, <strong>el</strong> módulo pres<strong>en</strong>ta un resum<strong>en</strong> que informa las<br />

activida<strong>de</strong>s realizadas.<br />

101


Ejecutar Casos Editados.<br />

El botón ejecutar casos, invoca al Módulo <strong>de</strong> Ejecución <strong>de</strong> Casos Editado. Este realiza<br />

una función equival<strong>en</strong>te a la que se <strong>de</strong>scribió antes, solo que <strong>en</strong> esta ocasión, los casos <strong>de</strong><br />

prueba que se ejecutan correspon<strong>de</strong>n a los que se escribieron <strong>en</strong> <strong>el</strong> archivo “casosp.txt“.<br />

Casos.<br />

La operación y comportami<strong>en</strong>to <strong>de</strong> este módulo es igual al <strong>de</strong> Modulo <strong>de</strong> Ejecución <strong>de</strong><br />

Ver resultados.<br />

El botón Ver Resultados permite que los resultados <strong>de</strong>l proceso <strong>de</strong> prueba puedan<br />

observarse. Al presionar este botón, se activará <strong>el</strong> módulo que pres<strong>en</strong>ta los resultados que<br />

correspon<strong>de</strong>n a los casos g<strong>en</strong>erados <strong>de</strong> forma automática. La sigui<strong>en</strong>te figura pres<strong>en</strong>ta los<br />

resultados obt<strong>en</strong>idos <strong>de</strong>spués <strong>de</strong> aplicar haber probado la compon<strong>en</strong>te Puzzle.<br />

102


En la parte superior, los resultados se pres<strong>en</strong>tan al usuario <strong>en</strong> un formato <strong>de</strong> árbol, mismo<br />

que permite que <strong>el</strong> usuario pueda visualizar los resultados <strong>de</strong> un modo más organizado. Este<br />

árbol conti<strong>en</strong>e la sigui<strong>en</strong>te información:<br />

a) Nombre <strong>de</strong> la clase a la que correspon<strong>de</strong> <strong>el</strong> Bean.<br />

b) El nombre <strong>de</strong>l método bajo <strong>el</strong> sigui<strong>en</strong>te formato:<br />

número_<strong>de</strong>_i<strong>de</strong>ntificación (número_<strong>de</strong>_casos_g<strong>en</strong>erados) <strong>en</strong>cabezado<br />

c) Datos <strong>de</strong>l caso <strong>de</strong> prueba bajo <strong>el</strong> sigui<strong>en</strong>te formato:<br />

Caso: valores_<strong>de</strong>l_caso ... valor_que_regresó_<strong>el</strong>_método<br />

d) Datos que <strong>de</strong>scribe <strong>el</strong> estado final <strong>de</strong>l Bean, específicam<strong>en</strong>te sus propieda<strong>de</strong>s, bajo <strong>el</strong><br />

sigui<strong>en</strong>te formato:<br />

nombre_<strong>de</strong>_la_propiedad = valor_final<br />

En la parte inferior <strong>de</strong>l módulo se pres<strong>en</strong>ta información que <strong>de</strong>scribe <strong>el</strong> estado inicial<br />

<strong>de</strong>l Bean, es <strong>de</strong>cir, <strong>el</strong> valor <strong>de</strong> las propieda<strong>de</strong>s antes <strong>de</strong> ejecutarse <strong>el</strong> método con su caso<br />

correspondi<strong>en</strong>te. Se pret<strong>en</strong><strong>de</strong> que esta información pueda ser utilizada para realizar algunas<br />

comparaciones. Su formato es <strong>el</strong> sigui<strong>en</strong>te:<br />

Ver resultados <strong>de</strong> CE.<br />

nombre_<strong>de</strong>_la_propiedad = valor_inicial<br />

El botón Ver Resultados CE, invoca al módulo que pres<strong>en</strong>ta la información refer<strong>en</strong>te a<br />

la ejecución <strong>de</strong> los casos propuestos por <strong>el</strong> usuario. Prácticam<strong>en</strong>te este modulo ti<strong>en</strong>e un<br />

comportami<strong>en</strong>to similar al que se <strong>de</strong>scribió anteriorm<strong>en</strong>te.<br />

Ver Información interna.<br />

Con la finalidad <strong>de</strong> ofrecer más información que permita al usuario <strong>en</strong>riquecer su<br />

evaluación, <strong>el</strong> Modulo Información interna, que se ejecuta al presionar <strong>el</strong> botón información<br />

interna. Despliega información r<strong>el</strong>acionada con la implem<strong>en</strong>tación <strong>de</strong> la clase como:<br />

103


a) Descripción <strong>de</strong> la variables privadas.<br />

b) Descripción <strong>de</strong> la variables protegidas.<br />

c) Descripción <strong>de</strong> otro tipo <strong>de</strong> variables.<br />

d) Descripción <strong>de</strong> los métodos que correspon<strong>de</strong>n a propieda<strong>de</strong>s.<br />

e) Descripción <strong>de</strong> otros métodos.<br />

A continuación se pres<strong>en</strong>ta una vista <strong>de</strong> este módulo.<br />

Limpiar.<br />

El botón limpiar permite establecer <strong>el</strong> <strong>en</strong>torno inicial que se requiere para llevar a cabo<br />

un proceso <strong>de</strong> prueba. Este procedimi<strong>en</strong>to consiste fundam<strong>en</strong>talm<strong>en</strong>te <strong>en</strong> la <strong>el</strong>iminación <strong>de</strong><br />

archivos temporales que almac<strong>en</strong>an resultados <strong>de</strong> pruebas realizadas con anterioridad.<br />

104


Este procedimi<strong>en</strong>to es recom<strong>en</strong>dable efectuarlo al final <strong>de</strong> un proceso <strong>de</strong> prueba y<br />

antes <strong>de</strong> iniciar uno nuevo. De igual forma este procedimi<strong>en</strong>to pue<strong>de</strong> utilizarse aún sin haberse<br />

completado todas las etapas <strong>de</strong>l proceso <strong>de</strong> prueba.<br />

105


ANEXO C<br />

Elem<strong>en</strong>tos Notacionales <strong>en</strong> UML.<br />

El Unified Mo<strong>de</strong>ling Mo<strong>de</strong>ling Language (UML), <strong>en</strong> un l<strong>en</strong>guaje visual <strong>de</strong> propósito<br />

g<strong>en</strong>eral que se utiliza para especificar, visualizar, construir y docum<strong>en</strong>tar cualquier sistema.<br />

UML pret<strong>en</strong><strong>de</strong> unificar la técnicas <strong>de</strong> mo<strong>de</strong>lado, con <strong>el</strong> propósito <strong>de</strong> capturar la información<br />

<strong>de</strong> la estructura estática <strong>de</strong> sistema, así como <strong>de</strong> su comportami<strong>en</strong>to. Para <strong>el</strong>lo, <strong>el</strong> l<strong>en</strong>guaje<br />

incluye una serie <strong>de</strong> <strong>el</strong>em<strong>en</strong>tos que incluy<strong>en</strong> conceptos semánticos, notación y directrices, los<br />

cuales se clasifican <strong>en</strong> las sigui<strong>en</strong>tes áreas:<br />

a) Estructura Estática.<br />

Se consi<strong>de</strong>ran los conceptos claves <strong>de</strong> la aplicación, sus propieda<strong>de</strong>s y las r<strong>el</strong>aciones<br />

<strong>en</strong>tre objetos.<br />

b) Comportami<strong>en</strong>to Dinámico.<br />

Trata con la repres<strong>en</strong>tación <strong>de</strong>l o <strong>de</strong> los objetos y su interacción con <strong>el</strong> mundo, así<br />

como con los patrones <strong>de</strong> comunicación <strong>en</strong>tre objetos necesarios para implem<strong>en</strong>tar un<br />

comportami<strong>en</strong>to específico.<br />

c) Implem<strong>en</strong>tación.<br />

Se conc<strong>en</strong>tra <strong>en</strong> <strong>el</strong> manejo <strong>de</strong> constructores que repres<strong>en</strong>tan las implem<strong>en</strong>taciones <strong>de</strong><br />

ciertos <strong>el</strong>em<strong>en</strong>tos.<br />

d) Organización <strong>de</strong> Mo<strong>de</strong>los.<br />

Cuando se manejan sistemas muy gran<strong>de</strong>s, convi<strong>en</strong>e dividir la información <strong>en</strong> un<br />

conjunto <strong>de</strong> piezas coher<strong>en</strong>tes que realic<strong>en</strong> <strong>el</strong> trabajo <strong>en</strong> difer<strong>en</strong>tes partes <strong>de</strong> manera<br />

concurr<strong>en</strong>te.<br />

e) Mecanismos <strong>de</strong> Ext<strong>en</strong>sión.<br />

Conv<strong>en</strong>ciones que ti<strong>en</strong><strong>en</strong> <strong>el</strong> propósito <strong>de</strong> permitir la inclusión <strong>de</strong> nuevos <strong>el</strong>em<strong>en</strong>tos <strong>en</strong><br />

forma or<strong>de</strong>nada sin necesidad <strong>de</strong> realizar cambios significativos <strong>en</strong> <strong>el</strong> l<strong>en</strong>guaje.<br />

106


Los <strong>el</strong>em<strong>en</strong>tos <strong>de</strong> UML utilizados durante la <strong>de</strong>scripción <strong>de</strong>l diseño <strong>de</strong> la herrami<strong>en</strong>ta<br />

que se <strong>de</strong>scribe <strong>en</strong> este trabajo, incluy<strong>en</strong> los Diagramas <strong>de</strong> Clases y los Diagramas <strong>de</strong><br />

Activida<strong>de</strong>s, los cuales correspon<strong>de</strong>n a las áreas <strong>de</strong> Estructura Estática y Comportami<strong>en</strong>to<br />

Dinámico respectivam<strong>en</strong>te. Estos se abordan con mayor <strong>de</strong>talle a continuación.<br />

Diagramas <strong>de</strong> Clases.<br />

Un diagrama <strong>de</strong> estructura estática muestra <strong>el</strong> conjunto <strong>de</strong> clases importantes que<br />

conforman parte <strong>de</strong> un sistema, junto con las r<strong>el</strong>aciones exist<strong>en</strong>tes <strong>en</strong>tre <strong>el</strong>las. Muestra <strong>de</strong> una<br />

manera estática la estructura <strong>de</strong> información <strong>de</strong>l sistema y la visibilidad que ti<strong>en</strong>e cada una <strong>de</strong><br />

las clases, dada por sus r<strong>el</strong>aciones con las <strong>de</strong>más <strong>en</strong> <strong>el</strong> mo<strong>de</strong>lo.<br />

A continuación se pres<strong>en</strong>ta una tabla que conc<strong>en</strong>tra a los <strong>el</strong>em<strong>en</strong>tos gráficos que se<br />

utilizaron <strong>en</strong> los diagramas <strong>de</strong> clases que conti<strong>en</strong>e este docum<strong>en</strong>to.<br />

Elem<strong>en</strong>to Descripción<br />

Clase<br />

Asociación<br />

Agregación<br />

G<strong>en</strong>eralización<br />

Repres<strong>en</strong>tada por un rectángulo con tres<br />

divisiones internas, que alojan <strong>el</strong> nombre <strong>de</strong> la<br />

clase, sus atributos y sus métodos,<br />

respectivam<strong>en</strong>te. Son los <strong>el</strong>em<strong>en</strong>tos<br />

fundam<strong>en</strong>tales <strong>de</strong>l diagrama.<br />

Permit<strong>en</strong> t<strong>en</strong>er una mejor información sobre las<br />

r<strong>el</strong>aciones <strong>en</strong>tre los objetos <strong>de</strong> un sistema. Se<br />

repres<strong>en</strong>ta como una línea etiquetada con la<br />

palabra que <strong>de</strong>scribe la r<strong>el</strong>ación exist<strong>en</strong>te.<br />

Es una r<strong>el</strong>ación que permite <strong>de</strong>scribir a un “todo”<br />

y sus partes. Se repres<strong>en</strong>ta con línea con un<br />

rombo <strong>en</strong> uno <strong>de</strong> sus extremos, <strong>el</strong> rombo <strong>de</strong>be ir<br />

situado <strong>de</strong>l lado <strong>de</strong>l objeto que repres<strong>en</strong>ta <strong>el</strong><br />

“todo”.<br />

Es una r<strong>el</strong>ación <strong>en</strong>tre una <strong>de</strong>scripción más<br />

g<strong>en</strong>eral y una más especifica variedad <strong>de</strong> cosas.<br />

Aspectos como qué o quién construye a un<br />

objeto o quién lo exti<strong>en</strong><strong>de</strong>. Este <strong>el</strong>em<strong>en</strong>to se<br />

utiliza para repres<strong>en</strong>tar la her<strong>en</strong>cia. Se repres<strong>en</strong>ta<br />

con línea con un triángulo <strong>en</strong> uno <strong>de</strong> sus<br />

extremos, <strong>el</strong> triángulo <strong>de</strong>be ir situado <strong>de</strong>l lado <strong>de</strong>l<br />

objeto que repres<strong>en</strong>ta la vista g<strong>en</strong>eral.<br />

Repres<strong>en</strong>tación<br />

Gráfica<br />

107


Diagrama <strong>de</strong> Activida<strong>de</strong>s.<br />

Un diagrama <strong>de</strong> activida<strong>de</strong>s es un caso especial <strong>de</strong> un diagrama <strong>de</strong> estados <strong>en</strong> <strong>el</strong> cual<br />

casi todos los estados, son estados <strong>de</strong> acción (i<strong>de</strong>ntifican qué acción se ejecuta al estar <strong>en</strong> él).<br />

Pue<strong>de</strong> dar <strong>de</strong>talle a un caso <strong>de</strong> uso, un objeto o un m<strong>en</strong>saje <strong>en</strong> un objeto. Sirv<strong>en</strong> para<br />

repres<strong>en</strong>tar transiciones internas, sin hacer mucho énfasis <strong>en</strong> transiciones o ev<strong>en</strong>tos externos.<br />

G<strong>en</strong>eralm<strong>en</strong>te mo<strong>de</strong>lan los pasos <strong>de</strong> un algoritmo.<br />

A continuación se pres<strong>en</strong>ta una tabla que conc<strong>en</strong>tra a los <strong>el</strong>em<strong>en</strong>tos gráficos que se<br />

utilizan <strong>en</strong> los diagramas <strong>de</strong> clases, así como una <strong>de</strong>scripción <strong>de</strong> su significado.<br />

Elem<strong>en</strong>to Descripción<br />

Estado <strong>de</strong> acción<br />

Transiciones<br />

Decisiones<br />

Fin <strong>de</strong>l proceso<br />

Repres<strong>en</strong>ta un estado con acción interna, con por<br />

lo m<strong>en</strong>os una transición que i<strong>de</strong>ntifica la<br />

culminación <strong>de</strong> la acción (por medio <strong>de</strong> un<br />

ev<strong>en</strong>to implícito).<br />

Las flechas <strong>en</strong>tre estados repres<strong>en</strong>tan<br />

transiciones con ev<strong>en</strong>to implícito. Pue<strong>de</strong>n t<strong>en</strong>er<br />

una condición <strong>en</strong> <strong>el</strong> caso <strong>de</strong> <strong>de</strong>cisiones.<br />

Se repres<strong>en</strong>ta mediante una transición múltiple<br />

que sale <strong>de</strong> un estado, don<strong>de</strong> cada camino ti<strong>en</strong>e<br />

una etiqueta distinta.<br />

Establec<strong>en</strong> <strong>el</strong> punto <strong>en</strong> <strong>el</strong> que concluy<strong>en</strong> cada una<br />

<strong>de</strong> las activida<strong>de</strong>s pres<strong>en</strong>tadas <strong>en</strong> <strong>el</strong> diagrama.<br />

Repres<strong>en</strong>tación<br />

Gráfica<br />

108


Refer<strong>en</strong>cias Bibliográficas.<br />

[AMB99] Ambler, S. “Object testing patterns”.<br />

http:///www.sdmagazine.com/uml/articles/s997dcl.shtml. Julio 1999.<br />

[BAS99] Bashir, I. y Go<strong>el</strong> A. “Testing object-ori<strong>en</strong>ted <strong>software</strong>. Life cycle solutions”.<br />

Springer-Verlag New York , Inc.1999.<br />

[BER93] Berard, E.V. “Essays on object ori<strong>en</strong>ted <strong>software</strong> <strong>en</strong>gineering”. Volum<strong>en</strong> 1,<br />

Addison-Wesley, 19993.<br />

[BIN95-A] Bin<strong>de</strong>r, R. “Testing object-ori<strong>en</strong>ted systems: A status report”.<br />

http:///www.rbsc.com/pages/ootstat.html. Docum<strong>en</strong>to <strong>en</strong> Línea. Abril 1995.<br />

[BIN95-B] Bin<strong>de</strong>r, R. “Object-ori<strong>en</strong>ted testing”.<br />

http:///www.rbsc.com/pages/myths.html. Docum<strong>en</strong>to <strong>en</strong> Línea. Mayo 1995.<br />

[BIN96] Bin<strong>de</strong>r, R. “Testing object-ori<strong>en</strong>ted <strong>software</strong>: a survey”. Software testing,<br />

Verification and R<strong>el</strong>iability, v 6, pp 125-252<br />

[DSO99] D´Souza, D. F. y Cameron W. A, “Objects, compon<strong>en</strong>ts and frameworks with<br />

UML. The catalysis approach”. Addison-Wesley, Reading Mass, 1999.<br />

[FER99] Fernán<strong>de</strong>z, J. M. “<strong>Prueba</strong> <strong>de</strong> <strong>software</strong> basado <strong>en</strong> <strong>compon<strong>en</strong>tes</strong>. Estado actual”.<br />

Informe Técnico N° 28 Serie Ver<strong>de</strong>, CIC, IPN. 1999.<br />

[IEE90] “IEEE Standard Glossary of Software Engineering Terminology”. 1990<br />

[JAC92] Jacobson, I. “Object-ori<strong>en</strong>ted <strong>software</strong> testing. A use case driv<strong>en</strong> approach”. ACM<br />

Press.1992.<br />

109


[JOR95] Jorg<strong>en</strong>s<strong>en</strong>, D.C. “Software testing. A craftsman´s approach”, CRC Press, Boca<br />

Raton, Florida.1995.<br />

[KIR94] Kirani, S. and Tsai, W. “Method sequ<strong>en</strong>ce specification and verification of classes”.<br />

Testing Object-Ori<strong>en</strong>ted Software. IEEE Computer Society, 1998. pp 43-57<br />

[KIT96] Kit, E. “Software testing in the real world. Improving the process”, ACM<br />

Press.1996.<br />

[KUN96] Kung, D., Lu Y, V<strong>en</strong>ugopalan, N., Sia, P., toyoshima, Y., Ch<strong>en</strong> C. y Gao, J.<br />

“Object State testing and fault analisys for r<strong>el</strong>iable <strong>software</strong> systems”. Testing Object-<br />

Ori<strong>en</strong>ted Software. IEEE Computer Society, 1998. pp 133-142.<br />

[MAR96] Martin, R.H. y O<strong>de</strong>ll. “Object ori<strong>en</strong>ted methodology: pragmatic consi<strong>de</strong>rations”.<br />

Pr<strong>en</strong>tice Hall, Upper Saddle River.1996.<br />

[MCG94] McGregror, J.D. y Korson, T. “Integrated object-ori<strong>en</strong>ted testing and<br />

<strong>de</strong>v<strong>el</strong>opm<strong>en</strong>t processes”. CACM 37:9, pp 59-77. 1994.<br />

[MIC00] ”Compon<strong>en</strong>t Object Mo<strong>de</strong>l”.<br />

http://www.microsoft.com/com Docum<strong>en</strong>to <strong>en</strong> línea. 2000.<br />

[MUR94] Murphy, G.C., Towns<strong>en</strong>d P., y Wong P.S. “Experi<strong>en</strong>ces with cluster and class<br />

testing”. CACM 37:9, pp 39-47. 1994.<br />

[MYE79] Myers G. “The art of <strong>software</strong> testing”. Wiley. 1979.<br />

[ORG00] “CORBA”. http://www.corba.org . Docum<strong>en</strong>to <strong>en</strong> línea. 2000.<br />

[PER90] Perry, D. y Kaiser, G. “A<strong>de</strong>cuate testing y object-ori<strong>en</strong>ted programming”. Testing<br />

Object-Ori<strong>en</strong>ted Software. IEEE Computer Society, 1998. pp 11-17.<br />

110


[PRE98] Pressman, R. “Ing<strong>en</strong>iería <strong>de</strong>l <strong>software</strong>. Un <strong>en</strong>foque práctico”. Cuarta Edición.<br />

McGraw-Hill/Interamaericana <strong>de</strong> España. 1998.<br />

[SIR97] Sirer, E.G. “Kimera. A system architecture for networked computers”<br />

http://kimera.cs.washington.edu/ Docum<strong>en</strong>to <strong>en</strong> linea, 1997<br />

[SUN00] “Enterprise JavaBeans ”.<br />

http://java.sun.com/ejb . Docum<strong>en</strong>tación <strong>en</strong> línea. 2000.<br />

[SUN97] SUN “Java Beans”. http:///java.sun.com . 1997.<br />

[SZY97] Szyperski, C. “Compon<strong>en</strong>t <strong>software</strong>. Beyond object-ori<strong>en</strong>ted programming”.<br />

Addison-Wesley y ACM Press, 1997.<br />

[TRU99] “Trusted compon<strong>en</strong>ts for the <strong>software</strong> industry”.<br />

http://www.eiff<strong>el</strong>.com/doc/manuals/technology/bmarticles/computer/trusted/pa<br />

ge.html Docum<strong>en</strong>to <strong>en</strong> linea. 1999.<br />

[TUR93] Turner, C. y Robson D. “The sate-based testing of object-ori<strong>en</strong>ted programs”.<br />

Testing Object-Ori<strong>en</strong>ted Software. IEEE Computer Society, 1998. pp 133-142.<br />

[VAN98] Vanh<strong>el</strong>suwe , L. “Mastering Java Beans” Sybex, Inc. 1998.<br />

[VOA98] Voas, J.M. “Certifying off-the-sh<strong>el</strong>f <strong>software</strong> compon<strong>en</strong>ts”. IEEE Computer, junio<br />

1998. pp 53-59.<br />

[WOH98] Wohlin C. y Regn<strong>el</strong>l B., “R<strong>el</strong>iability certification of <strong>software</strong> compon<strong>en</strong>ts”.<br />

Proceedings Fifth international Confer<strong>en</strong>ce on Software Reuse, Canada, 1998. pp 56-65.<br />

111

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!