You are on page 1of 45

Una estrategia de prueba de software proporciona una guía que describe los pasos que deben realizarse como

parte de la prueba, cuando se planean y se llevan a cabo dichos pasos, y cuanto esfuerzo, tiempo y recursos se requieran. Por tanto, cualquier estrategia de prueba debe incorporar la planificación de la prueba, el diseño de casos de prueba, la ejecución de la prueba y la recolección y evaluación de los resultados. Una estrategia de prueba de software debe ser suficientemente flexible para promover un uso personalizado de la prueba. Al mismo tiempo, debe ser suficientemente rígida para alentar la planificación razonable y el seguimiento de la gestión conforme avanza el proyecto.

Verificación y validación
La prueba de software es un elemento de un tema mas amplio que usualmente se conoce como verificación y validación se refiere al conjunto de tareas que garantizan que el software implementan correctamente una función especifica. La validación es un conjunto Diferente de tareas que aseguran que el software que se construye sigue los requerimientos del cliente. Verificación : “¿ construimos el producto correctamente?” Validación : “¿construimos el producto correcto?” La definición de V&V abarca muchas actividades de aseguramiento De calidad del software . La verificación y la validación incluye un amplio arreglo de actividades SQA:

revisiones tecnicas,auditorias de calidad y configuraciones, Monitoreo de rendimiento, simulación, estudio de, revisión de factibilidad, revisión de documentación , revisión de base de datos, Análisis de algoritmos, pruebas de desarrollo, pruebas de Usabilidad, pruebas de calificación, pruebas de aceptación y Pruebas de instalación.

Organización de las pruebas del software
En todo proyecto de software hay un conflicto inherente de intereses que ocurre conforme comienzan las pruebas. Hoy en día, Las personas que construyen el software se les pide probarlo. En si, esto parece sencillo; después de todo, ¿Quién conoce mejor El programa que sus desarrolladores tienen mucho interés en Demostrar que el programa esta libre de errores, que funciona de acuerdo con los requerimientos del cliente y se completará a Tiempo y dentro del presupuesto. Cada uno de estos intereses tienen un efecto negativo sobre las pruebas mas cuidadosas. Desde un punto de vista psicológico, el análisis y diseño de Software (junto con la codificación) son tareas destructivas .

Cuando comienzan las pruebas hay un sutil. las pruebas pueden considerarse como (psicológicamente) destructivas. pero definitivo. modela. y luego crea un programa de computadora y su documentación. De modo que el constructor actuará con cuidado. diseñará y ejecutará pruebas Que demostrarán que el programa funciona. Desde el punto de vista del constructor. los errores estarán presentes.El ingeniero de software analiza. Y si el ingeniero de software no los encuentra !el cliente lo hará! . en lugar de descubrir errores. intento por “romper” lo que construyó el ingeniero de software. Desafortunadamente. Como cualquier constructor el ingeniero de software esta orgulloso del edificio que construyo y Ve con desconfianza a quien intente derrumbarlo.

Desempeño restricciones y validación de información para el Software. se llega al diseño y finalmente a la codificación. Al avanzar hacia adentro a lo largo de la espiral. donde se Establecen los criterios de dominio. Visión general Inicialmente la ingeniería de sistemas define el papel del software y conduce el análisis de los requerimientos del mismo. . función. Una estrategia para probar el software también puede verse en el contexto de la espiral . comportamiento.Estrategia de prueba del software. se avanza en espiral hacia adentro(contra las manecillas del reloj) a lo largo de una línea que reduce el nivel de abstracción en cada vuelta. Para desarrollar software De computadoras.

se llega ala prueba del sistema. . donde el software y otros elementos del sistema se prueban como un todo. Al dar otra vuelta hacia fuera de la Espiral . hacia la prueba de integración Donde el enfoque se centra en el diseño y la construcción de la arquitectura del software.La prueba de unidad comienza en el vértice de la espiral y se concentra en cada unidad (por ejemplo. se encuentra la prueba de validación. La prueba avanza al moverse hacia afuera a lo largo de la espiral. clase o un objeto de contenido de una webapp) del software como se implemento en el código fuente. donde los Requerimientos establecidos como parte de su modelado se validan confrontándose con el software que se construyo. componente. Finalmente .

la carga simplemente pasa de usted (el ingeniero de software) al Usuario final". Lamentablemente . cada vez que el usuario ejecuta un programa de computo. Este instructivo subraya la importancia de otras actividades a fin de garantizar la calidad del software. el programa se pone aprueba. . pero existen algunas respuestas Pragmáticas e intentos tempranos a manera de guía empírica. no hay una respuesta Definitiva a esta pregunta . surge una pregunta Clásica: “¿Cuándo terminan las pruebas ?”. Una respuesta a la pregunta es: “nunca se termina de probar. otra respuesta (un tanto cínica.¿Cómo se sabe que se ha probado lo suficiente?”.Criterios para completar las pruebas Cada vez que se analiza la prueba del software. mas no obstante precisa) es: “ las pruebas terminan cuando se agota el tiempo o el dinero”.

una buena estrategia de prueba también valor otras características de la calidad .Aspectos estratégicos Una estrategia de software triunfará cuando quienes prueben el software:  Especifican los requerimientos del producto en forma cuantificable mucho antes de comenzar con las pruebas. de modo que los resultados de las pruebas no sean ambiguos. Aunque el objeto predominante de una prueba es encontrar errores. como la portabilidad. el mantenimiento y la facilidad de uso. . Esto debe especificarse en una forma medible.

La densidad de defectos restantes o la frecuencia de ocurrencia. . el costo por descubrir y corregir defectos. la efectividad de las pruebas. su cobertura. Los casos de uso que describen el escenario de interacción para cada clase de usuario pueden reducir el esfuerzo de prueba global al enfocar las pruebas en el uso real del producto. y las horas de trabajo de prueba deben enunciarse dentro del plan de la prueba.  Entienden a los usuarios del software y desarrollan un perfil para cada categoría del usuario. Los objetivos especificados de las pruebas pueden enunciarse en términos medible. Por ejemplo. el tiempo medio antes de aparecer una falla. Establecen de manera explicita los objetivos de las pruebas.

los incrementos de funcionalidad y/o la mejora de la calidad”. Desarrollan un plan de prueba que enfatice “prueba de ciclo rápido”. . Recomienda que un equipo de software “aprenda a probar en ciclos rápidos (2 por ciento del esfuerzo proyecto) de clienteUtilidad al menos la ‘comprobabilidad’ en campo. La retroalimentación Generada a partir de estas pruebas de ciclo rápido puede usarse para controlar niveles de calidad y las correspondientes estrategias de prueba.

Además el diseño debe incluir pruebas automatizadas y pruebas de regresión. las revisiones pueden reducir la cantidad del esfuerzo de pruebas que se requieren para producir software de alta calidad. Por esta razón. Las revisiones técnicas pueden ser tan efectivas como probar para descubrir errores. Construyen software “robusto” que esté diseñado para probarse a si mismo.  . el software debe poder diagnosticar ciertas clases de errores. El software debe diseñarse en forma que use técnicas anti errores es decir. Usan revisiones técnicas efectivas como filtro previo a las pruebas.

Desarrollan un enfoque de mejora continuo para el proceso de prueba. Las métricas recopiladas durante las pruebas deben usarse como parte de un enfoque de control de proceso estadístico para la prueba del software. omisiones y errores evidentes en el abordaje de las pruebas. Realizan revisiones técnicas para valorar la estrategia de prueba y los casos de prueba. La estrategia de pruebas debe medirse. Esto ahorra tiempo y también mejora la calidad del producto. Las revisiones de prueba pueden descubrir inconsistencias.  .

algunos desarrolladores de software son reacios a usarlo. podrían realizarse pruebas diariamente. puede esperarse hasta que el sistema esté completamente construido y luego realizar las pruebas sobre el sistema total. . Dara como resultado software defectuoso que desilusionará a todos Participantes. simplemente no funciona.Estrategias de prueba para software convencional Existen muchas estrategias que pueden usarse para probar el software. aunque atractivo. En un extremo. con la esperanza de encontrar errores. En el otro extremo. aunque menos atractivo para muchos. puede ser muy efectivo. Este enfoque. Por desgracia. siempre que se construya alguna parte del sistema. Este enfoque.

Las pruebas de unidad se enfocan en la lógica de procesamiento interno de las estructuras de datos dentro de las fronteras de un componente.la relativa complejidad de las pruebas y los errores que descubren están limitados por el ámbito restringido que se establece para la prueba de unidad. las rutas de control importantes se prueban para descubrir errores dentro de la frontera del modulo.Prueba de unidad La prueba de unidad enfoca los esfuerzos de verificación en la unidad más pequeña del diseño de software: el componente o modulo de software. Al usar la descripción del diseño de componentes como guía. . Este tipo de pruebas puede realizarse en paralelo para múltiples componentes.

Todas las rutas independientes a través de la estructura de control se ejercitan para asegurar que todos los estatutos en un modulo se ejecuten al menos una vez.Consideraciones de las pruebas de unidad Las pruebas de unidad se ilustran de manera esquemática . Las estructuras de datos locales se examinan para asegurar que los datos almacenados temporalmente mantienen su integridad durante todos los pasos en la ejecución de un algoritmo. . la interfaz del modulo Se prueba para garantizar que la información fluya de manera adecuada hacia y desde la unidad de software que se está probando.

con frecuencia debe desarrollarse software controlador y/o de resguardo para cada prueba de unidad.Procedimientos de prueba de unidad Las pruebas por lo general se consideran como adjuntas al paso de codificación. . En la mayoría de las Aplicaciones un controlador no es mas que un “programa principal” que acepta datos de caso de prueba pasa tales datos al componente (que va a ponerse a prueba) e imprime resultados relevantes. El diseño de las pruebas de unidad pueden ocurrir antes de comenzar la codificación o después de generar el código fuente: la revisión de la información del diseño proporciona una guía para establecer casos de prueba que es probable que descubran errores en cada una de las Categorías analizadas anteriormente. Cada caso de prueba debe acoplarse con un conjunto de resultados esperados. Puesto que un componente no es un programa independiente.

un componente puede tener un inadvertido efecto adverso sobre otro. Desde luego el problema es “juntarlos todos”: conectarlos. Los datos pueden perderse atreves de una interfaz. Lamentablemente. la imprecisión aceptable individualmente puede magnificarse a niveles inaceptables .Pruebas de integración Un neófito en el mundo del software podrá plantear una pregunta aparentemente legitima una vez que todos los módulos se hayan probado de manera individual: “si todos ellos funcionan Individualmente. la lista sigue y sigue. . las estructuras de datos globales pueden presentar problemas. ¿Por qué dudan que funcionará cuando se junten todos?”.

Las pruebas de integración son una técnica sistemática para construir la arquitectura del software mientras se llevan a cabo pruebas para descubrir errores asociados con la interfaz. Con frecuencia existe una tendencia a intentar la Integración no incremental. todo programase prueba como un todo. Todos los componentes se combinan por adelantado. . La corrección se dificulta pues el aislamiento de las causas se complica por la vasta extensión de todo el programa. !Y usualmente resulta el caos! Se descubre un conjunto de errores. Una vez corregido estos errores. es decir a construir el programa usando un enfoque de big bang. otros nuevos aparecen y el proceso continua en un bucle aparentemente interminable. El objetivo es tomar los componentes probados de manera individual y construir una estructura de programa que se haya dictado por diseño.

los módulos subordinados al modulo de control principal se incorporan en la estructura en una forma de primero en profundidad o primero en anchura. comenzando con el modulo de control principal(programa principal).Integración descendente Es un enfoque incremental a la construcción de la arquitectura de software. Los módulos se integran al moverse hacia abajo a través de la jerarquía de control. . Con frecuencia la integración primero en profundidad integra todos los componentes sobre una ruta de control mayor de la estructura del programa.

componentes en los niveles inferiores dentro de la estructura del programa). Una estrategia de integración ascendente puede implementarse con los siguientes pasos:  Los componentes en el nivel inferior se combinan en grupos ( en ocasiones llamados construcciones o builds) que realizan una subsunción de software específica. .Integración ascendente Como su nombre lo implica. la funcionalidad que proporcionan los componentes subordinados en determinado nivel siempre está disponible y se elimina la necesidad de representantes (sus). comienza la construcción y la prueba con módulos atómicos (es decir. Puesto que los componentes se integran de abajo hacia arriba.

Se prueba el grupo.   . Se escribe un controlador(un programa de control para pruebas) a fin de coordinar la entrada y salida de casos de prueba. Los controladores se remueven y los grupo se combinan moviéndolos hacia arriba en la estructura del programa.

ocurren nuevas operaciones de entrada/salida y se invoca nueva lógica de control. . el software cambia. y los errores deben corregirse. En el contexto de una estrategia de prueba de integración. En un contexto mas amplio. las pruebas exitosas (de cualquier tipo) dan como resultado el descubrimiento de errores. su documentación o los datos que sustenta). cambia algún aspecto de la configuración del software(el programa.Prueba de regresión Cada vez que agrega un nuevo modulo como parte de las pruebas de integración. Dichos cambios pueden causar problemas con las funciones que anteriormente trabajaban sin fallas. Se establecen nuevas rutas de flujo de datos. Siempre que se corrige el software . la prueba de regresión es la nueva ejecución de algún subconjunto de prueba que ya se realizaron a fin de asegurar que los cambios no propagaron efectos colaterales no deseados.

Prueba de humo La prueba de humo es un enfoque de integración que se usa cuando se desarrolla software de producto. En esencia. . el enfoque de prueba de humo abarca las siguientes actividades:  Los componentes de software traducidos en código se integran en una construcción. módulos reutilizables y componentes sometidos a ingeniería que se requieren para implementar una o mas funciones del producto. bibliotecas. Se diseña como un mecanismo de ritmo para proyectos críticos en el tiempo. Una construcción incluye todos los archivos de datos. lo que permite al equipo del software valorar el proyecto de manera frecuente.

y todo el producto (en su forma actual) se somete a prueba de humo diariamente.  . El enfoque de integración puede ser descendente o ascendente. Se diseña una serie de pruebas para exponer los errores que evitaran a la construcción realizar adecuadamente su función. La intención debe ser descubrir errores “paralizantes” que tengan la mayor probabilidad de retrasar el proyecto. La construcción se integra con otras construcciones.

Opciones estratégicas Ha habido mucha discusión acerca de las relativas ventajas y desventajas de las pruebas de integración descendente en comparación con las ascendentes. Este inconveniente se atempera con la mayor facilidad en el diseño de casos de Prueba y la falta de representantes. . La principal desventaja del enfoque descendente es la necesidad de representantes y las dificultades de prueba que pueden asociarse con ellos los problemas asociados con los representantes puede compensarse con la ventaja de probar tempranamente las principales funciones de control. las ventajas de una estrategia tienden a ser desventajas para la otra. La principal desventaja de la integración ascendente es que “ el problema como entidad no existe hasta que se agrega al ultimo módulo” . En general.

por ejemplo la prueba de integración para el sistema de seguridad CasaSegura puede dividirse en las siguientes fases de prueba:  Interacción con el usuario(entrada y salida de comandos. Este producto de trabajo incorpora un plan de prueba y un procedimiento de prueba. procesamiento y representación de errores) . y se vuelve parte de la configuración del software. La prueba se divide en fases y construcciones que abordan características del software funcionales y de comportamiento específicas. representación de despliegue.Producto de trabajo de las pruebas de integración Un plan global para integración del software y una descripción de las pruebas específicas se documentan en una especificación de pruebas.

Procesamiento de sensores (adquisición de salida de sensor. determinación de condiciones del sensor . acciones requeridas como consecuencia de las condiciones)  Funciones de comunicación( capacidad para comunicarse con la estación de monitoreo central)   Procesamiento de alarma(pruebas de acciones del software que ocurren cuando cuando se encuentran una alarma) .

Se realizan pruebas diseñadas para descubrir errores funcionales ocultos. Se realizan pruebas diseñadas para verificar los limites del rendimiento establecidos durante el diseño del software. Se realizan pruebas diseñadas para descubrir errores ocultos asociados con las estructuras de datos locales o globales Rendimiento.  .  Contenido de la información.Los siguientes criterios y pruebas correspondientes se aplican a todas las fases de prueba:  Integridad de interfaz: las interfaces internas y externas se prueban conforme cada modulo(o grupo) se incorpora en la estructura.  Validez funcional.

Puesto que una clase puede contener unas operaciones diferentes. el concepto de unidad cambia. las operaciones (métodos) dentro de la clase son las unidades comprobables mas pequeñas. Esto significa que cada clase y cada instancia de una Clase empaqueta los atributos (datos) y las operaciones que manipulan estos datos. La encapsulación determina la definición de clases Y objetos. Ya no es posible probar una sola operación en aislamiento (la visión convencional de la prueba de unidad) sino mas bien como parte de una clase. Por lo general. las tácticas aplicadas a la prueba de unidad debe cambiar. No obstante.Prueba de unidad en el contexto OO Cuando se considera software orientado a objeto. una clase encapsulada es el foco de la prueba de unidad. y una operación particular puede existir como parte de algunas clases diferentes. .

integra el conjunto de clases requeridas para responder a una entrada o evento para el sistema. Cada hebra se integra y prueba de manera individual la prueba de regresión se aplica para asegurar que no ocurran efectos colaterales. Además con frecuencia es imposible integrar las operaciones a a la vez en una clase (el enfoque de integración incremental convencional) debido alas “interacciones directa e indirecta de los componentes que construyen la clase” existen dos estrategias diferentes para la prueba de integración de los sistemas OO la primera la prueba basada en hebra. las estrategias tradicionales descendente y ascendente tiene poco significado. .Prueba de integración en el contexto OO Puesto que el software orientado a objeto no tiene una estructura de control jerárquico obvia.

.  La prueba de grupo es un paso en la prueba de integración del software OO. comienza la construcción del sistema al probar dichas clases (llamadas clases independientes) que usan muy pocas clases servidor (si es que usan algunas). se prueba la siguiente capa de clases llamadas dependientes. la prueba basada en uso. Esta secuencia de probar capas de clases dependientes continua hasta que se construye todo el sistema. Aquí. que usan las clases independientes. un grupo de clases colaboradoras (determinadas al examinar el CRC y el modelo objeto relacional) se ejercita al diseñar casos de prueba que intente descubrir errores en las colaboraciones. Después de probar las clases independientes.

Se prueba la navegación a lo largo de toda la arquitectura. La interfaz de usuario se prueba para descubrir errores en los mecanismos de presentación y/o navegación. A cada componente funcional se le aplica una prueba de unidad. El modulo de diseño para la weapp se revisa para descubrir errores de navegación.       . el modulo de interfaz se revisa para garantizar que todos los casos de uso pueden adecuarse.Estrategias de prueba para webapps Los siguientes pasos resumen el enfoque: El modulo de contenido para webapp se revisa para describir errores.

Las pruebas de seguridad se realizan con la intención de explotar vulnerabilidades en la webapp o dentro de su ambiente. preocupaciones de facilidad de uso . . Los resultados de su interacción con el sistema se evalúan por errores de contenido y navegación. así como confiabilidad y rendimiento de la webapp. preocupaciones de compatibilidad. Se realizan pruebas de rendimiento La webapp se prueba mediante una población de usuarios finales controlada y monitoreada.    La webapp se implementa en varias configuraciones ambientales diferentes y se prueba en su compatibilidad con cada configuración.

. el software esta completamente ensamblado como un paquete y los errores de interfaz se descubrieron y corrigieron.Pruebas de validación Las pruebas de validación comienzan en la culminación de las pruebas de integración . En el nivel de validación o de sistema. desaparece la distinción entre software convencional. software orientado a objetos y webapp. La validación es exitosa cuando el software funciona en una forma que cumpla con las expectativas razonables del cliente. Las pruebas se enfocan en las acciones visibles para el usuario y las salidas del sistema reconocibles por el usuario. cuando se ejercitaron componentes individuales.

se logran todas las características de comportamiento. compatibilidad. recuperación de errores. mantenimiento).Criterios de prueba de validación La validación del software se logra atreves de una serie de pruebas que demuestran conformidad con los requerimientos. todo el contenido es preciso y se presenta de manera adecuada. la documentación es correcta y se satisfacen la facilidad de uso y otros requerimientos (por ejemplo transportabilidad. un plan de prueba subraya las clases de prueba que se van a realizar y un procedimiento de prueba define casos de prueba específicos que se diseñan para garantizar que: se satisfacen todos los requerimientos de funcionamientos de funcionamiento. . se logran todos los requerimientos de rendimiento .

y que se cataloga y se tiene el detalle necesario para reforzar las actividades de apoyo. . La intención de la revisión es garantizar que todos los elementos de la configuración del software se desarrollaron de manera adecuada .Revisión de la configuración Un elemento importante del proceso de validación es una revisión de la configuración.

regularmente pueden usarse combinaciones extrañas de datos.Pruebas alfa y beta Virtualmente es imposible que un desarrollador de software prevea como usara el cliente realmente un programa. Cuando se construye software a la medida para un cliente. . El software se usa en un escenario natural con el desarrollador “mirando sobre el hombro” de los usuarios y registrando los errores y problemas de uso. La prueba alfa se lleva acabo en el sitio del desarrollador por un grupo representativo de usuarios finales. Las instrucciones para usarlo pueden malinterpretarse. Las pruebas alfa se realizan en un ambiente controlado. se realiza una serie de pruebas de aceptación a fin de permitir al cliente validar todos los requerimientos. la salida que parecía clara a quien realizo la prueba puede ser ininteligible para un usuario.

es posible hacer modificaciones y luego preparar la liberación del producto de software a toda la base de clientes. . A diferencia de la prueba alfa. Por tanto la prueba beta es una aplicación “en vivo” del software en un ambiente que no puede controlar el desarrollador. por lo general el desarrollador no esta presente.La prueba beta se realiza en uno o mas sitios del usuario final. Como resultado de los problemas reportados durante las pruebas beta. El cliente registra todos los problemas (reales o imaginarios) que se encuentran durante la prueba beta y los reporta al desarrollador periódicamente.

Si la recuperación es automática (realizada por el sistema en si). las fallas del procesamiento no deben causar el cese del funcionamiento del sistema global.Pruebas de recuperación Muchos sistemas basados en computadoras deben recuperarse de fallas y reanudar el procesamiento con poco o ningún tiempo de inactividad. la recuperación de datos y la reanudación para correcciones. los mecanismos de puntos de Verificación. la falla de un sistema debe corregirse dentro de un periodo de tiempo especifico u ocurran severos daños economicos. La recuperación es una prueba del sistema que fuerza al software a fallar en varias Formas y que verifica que la recuperación se realice de manera adecuada. En otros casos. . un sistema debe ser tolerante a las Fallas. es decir. En algunos casos. se evalúa el reinicio.

desde luego .Pruebas de seguridad La penetración abarca un amplio rango de actividades: hackers que intentan penetrar en los sistemas por deporte. “ la seguridad del sistema debe.” . empleados resentidos que intentan penetrar por venganza. individuos deshonestos que intentan penetrar para obtener ganacia personal ilícita. probarse para ser invulnerable ante ataques frontales. La prueba de seguridad intenta verificar que los mecanismos de protección que se construyen en un sistema en realidad lo protegeran de cualquier penetración impropia. pero también debe probarse su invulnerabilidad contra ataques laterales y traseros.

. la no correspondencia de los datos es un síntoma de una causa subyacente y escondida. El proceso de depuración intenta relacionar síntomas con causa. Por lo general. el proceso de depuración dará como resultado que: 1) la causa se encontrará y corregirá o 2) la causa no se encontrará.El proceso de depuración El proceso de depuración comienza con la ejecución de un caso de prueba. lo que por tanto conduce a la corrección del error. En muchos casos. Los resultados se valoran y se encuentra la falta de Correspondencia entre el rendimiento esperado y el real.

Van vleck sugiere sugiere tres preguntas simples que deban plantearse antes de hacer la “corrección” que remueva la causa de un error:  ¿la causa del error se produce en otra parte del programa? En muchas situaciones . un defecto de programa es causado por un patrón de lógica erróneo que puede producirse en alguna otra parte. . como ya se señaló. hacer más daño que bien. Pero. debe corregirse.Corrección de errores Una vez encontrado el error. La consideración explicita del patrón lógico puede resultar en el descubrimiento de otros errores. la corrección de un error puede introducir otros errores y por tanto.

el diseño) para valorar el acoplamiento de las estructuras lógica y de datos. ¿Qué “siguiente error” puede introducirse con la corrección que esta a punto de realizar? Antes de hacer la corrección. Si la corrección se realizará en una sección altamente acoplada del programa. mejor.  . debe evaluarse el código fuente (o. ¿Qué debió hacerse para evitar este error desde el principio? Esta pregunta es el primer paso hacia el establecimiento de un enfoque de aseguramiento de calidad estadística del software si se corrigen tanto el proceso como el producto. el error se removerá del programa actual y podrá eliminarse de todos los programas futuros. debe tenerse especial cuidado cuando se realice algún cambio.

GRACIAS PUBLICO .