o Debe realizar revisiones técnicas efectivas. Al hacerlo, eliminará muchos errores antes de comenzar
la prueba.
o La prueba comienza en los componentes y opera “hacia afuera”, hacia la integración de todo el sistema
de cómputo.
o Diferentes técnicas de prueba son adecuadas para distintos enfoques de ingeniería de software y en
diferentes momentos en el tiempo.
o Las pruebas las realiza el desarrollador del software y (para proyectos grandes) un grupo de prueba
independiente.
o Prueba y depuración son actividades diferentes, pero la depuración debe incluirse en cualquier
estrategia de prueba.
Una estrategia debe proporcionar una guía para el profesional y un conjunto de guías para el jefe de proyecto
Verificación y validación
La prueba de software es un elemento de verificación y validación (V&V). La verificación se refiere al
conjunto de tareas que garantizan que el software implementa correctamente una función específica. La
validación es un conjunto diferente de tareas que aseguran que el software que se construye sigue los
requerimientos del cliente.
La verificación y la validación incluyen un amplio arreglo de actividades SQA: revisiones técnicas, auditorías
de calidad y configuración, monitoreo de rendimiento, simulación, estudio 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.
o La prueba de unidad se concentra en cada unidad (por ejemplo, componente, clase o un objeto de
contenido de una webapp).
o La prueba de integración, el enfoque se centra en el diseño y la construcción de la arquitectura
del software.
o La prueba de validación, los requerimientos establecidos como parte de su modelado se validan
confrontándose con el software que se construyó.
o La prueba del sistema, el software y otros elementos del sistema se prueban como un todo.
Aspectos Estratégicos
Una estrategia de software triunfará cuando quienes prueban el software:
Especifican los requerimientos del producto en forma cuantificable mucho antes de comenzar con las
pruebas.
Establecen de manera explícita los objetivos de las pruebas.
Entienden a los usuarios del software y desarrollan un perfil para cada categoría de usuario.
Desarrollan un plan de prueba que enfatice “pruebas de ciclo rápido”.
Construyen software “robusto” que esté diseñado para probarse a sí mismo.
Las revisiones técnicas pueden ser tan efectivas como probar para descubrir errores.
Desarrollan un enfoque de mejora continuo para el proceso de prueba.
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 módulo de software.
Consejo: No es mala idea diseñar casos de prueba de unidad antes de desarrollar el código para un componente.
Eso ayuda a garantizar que se desarrollará un código que pasará las pruebas.
o Un controlador no es más 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.
o Los representantes (en inglés stubs) sirven para sustituir módulos que están subordinados al
(invocados por el) componente que se va a probar.
Pruebas de integración
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. El objetivo es tomar los componentes
probados de manera individual y construir una estructura de programa que se haya dictado por diseño.
Tendencias:
o Big bang: Todos los componentes se combinan por adelantado. Todo el programa se prueba como un
todo (la corrección se dificulta pues el aislamiento de las causas se complica por la vasta extensión de
todo el programa).
o Integración incremental: El programa se construye y prueba en pequeños incrementos, donde los
errores son más fáciles de aislar y corregir; las interfaces tienen más posibilidades de probarse por
completo; y puede aplicarse un enfoque de prueba sistemático.
Prueba de regresión.
La prueba de regresión es la nueva ejecución de algún subconjunto de pruebas que ya se realizaron a fin de
asegurar que los cambios no propagaron efectos colaterales no deseados.
o La suite de prueba de regresión (el subconjunto de pruebas que se va a ejecutar) contiene tres clases
diferentes de casos de prueba:
Pruebas que ejercitarán todas las funciones de software.
Pruebas adicionales que se enfocan en las funciones del software que probablemente resulten
afectadas por el cambio.
Pruebas que se enfocan en los componentes del software que cambiaron.
Prueba de humo. La prueba de humo es un enfoque de prueba de integración que se usa cuando se desarrolla
software de producto. Abarca las siguientes actividades:
Los componentes de software traducidos en código se integran en una construcción.
Se diseña una serie de pruebas para exponer los errores que evitarán a la construcción realizar adecuadamente
su función.
La construcción se integra con otras construcciones, 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.
Productos 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. Este producto de trabajo incorpora un
plan de prueba y un procedimiento de prueba, y se vuelve parte de la configuración del software.
Plan de prueba, contiene:
o Calendario para la integración.
o El desarrollo de software de sobrecarga del sistema.
o Se establecen las fechas de inicio y fin de cada fase y se definen “ventanas disponibles” para módulos
de prueba de unidad.
o Se describe el entorno y los recursos de la prueba.
o Configuraciones inusuales de hardware, simuladores peculiares y herramientas o técnicas de prueba
especial.
En un Reporte de prueba, que puede anexarse a la Especificación pruebas si se desea, se registra una historia
de resultados, problemas o peculiaridades de prueba reales.
o La primera, la prueba basada en hebra, 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.
o El segundo, la prueba basada en uso, comienza la construcción del sistema al probar dichas clases
(llamadas clases independientes) que usan muy pocas clases servidor (si es que usan alguna).
Después, se prueba la siguiente capa de clases, llamadas dependientes, que usan las clases
independientes.
o La prueba de grupo es un paso en la prueba de integración del software OO. Un grupo de clases
colaboradoras se ejercita al diseñar casos de prueba que intentan descubrir errores en las
colaboraciones.
CLAVE: Una importante estrategia para la prueba de integración del software OO es la prueba basada en hebra.
Las hebras son conjuntos de clases que responden a una entrada o evento. Las pruebas basadas en uso se enfocan
en clases que no colaboran fuertemente con otras clases.
Pruebas De Validación
Las pruebas de validación comienzan en la culminación de las pruebas de integración.
Las pruebas se enfocan en las acciones visibles para el usuario y las salidas del sistema reconocibles por el
usuario.
Revisión de la configuración
La intención de la revisión es garantizar que todos los elementos de la configuración del software se desarrollaron
de manera adecuada, y que se cataloga y se tiene el detalle necesario para reforzar las actividades de apoyo.
Prueba de Recuperación
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.
o Si la recuperación es automática (realizada por el sistema en sí), se evalúa: el reinicio, los mecanismos
de puntos de verificación, la recuperación de datos y la reanudación para correcciones.
o Si la recuperación requiere intervención humana, se evalúa el tiempo medio de reparación (TMR)
para determinar si está dentro de límites aceptables.
Prueba de Seguridad
La prueba de seguridad intenta verificar que los mecanismos de protección que se construyen en un sistema en
realidad lo protegerán de cualquier penetración impropia.
Pruebas de Esfuerzo
La prueba de esfuerzo ejecuta un sistema en forma que demanda recursos en cantidad, frecuencia o volumen
anormales.
Prueba de sensibilidad:
o Más común ocurre en algoritmos matemáticos.
o Un rango muy pequeño de datos contenidos dentro de las fronteras de los datos válidos para un
programa pueden causar procesamiento extremo, e incluso erróneo, o profunda degradación del
rendimiento.
Prueba de Rendimiento
La prueba de rendimiento se diseña para poner a prueba el rendimiento del software en tiempo de corrida,
dentro del contexto de un sistema integrado (ocurre a lo largo de todos los pasos del proceso de prueba).
Con frecuencia se aparean con las pruebas de esfuerzo.
Prueba de Despliegue
La prueba de despliegue, en ocasiones llamada prueba de configuración, ejercita el software en cada entorno
en el que debe operar.
La prueba de despliegue, examina todos los procedimientos de instalación y el software de instalación
especializado (por ejemplo, “instaladores”) que usarán los clientes, así como toda la documentación que se
usará para introducir el software a los usuarios finales.
El Arte De La Depuración
La depuración ocurre como consecuencia de las pruebas exitosas. Es decir, cuando un caso de prueba descubre un
error, la depuración es el proceso que da como resultado la remoción del error.
Proceso de depuración
Consideraciones psicológicas
La depuración es un rasgo humano innato. Algunas personas son buenas en ello y otras no lo son. Aunque la evidencia
experimental de la depuración está abierta a muchas interpretaciones, se reportan grandes variaciones en la habilidad
depuradora para programadores con la misma educación y experiencia.
Capítulo 23 – Métricas de Producto
¿Qué es? Las métricas de producto ayudan a los ingenieros de software a obtener comprensión acerca del diseño y
la construcción del software que elaboran, al enfocarse en atributos mensurables específicos de los productos de
trabajo de la ingeniería del software.
¿Por qué es importante? Las métricas de producto proporcionan una base desde donde el análisis, el diseño, la
codificación y las pruebas pueden realizarse de manera más objetiva y valorarse de modo más cuantitativo.
Las métricas examinan el modelo de requerimientos con la intención de predecir el “tamaño” del sistema resultante.
En ocasiones (más no siempre), el tamaño es un indicador de la complejidad del diseño y casi siempre es un indicador
creciente de codificación, integración y esfuerzo de pruebas.
Métrica basada en funciones
La métrica de punto de función (PF) puede usarse: 0) medir la funcionalidad que entra a un sistema; 1) estimar el
costo o esfuerzo requerido para diseñar, codificar y probar el software; 2) predecir el número de errores que se
encontrarán durante las pruebas y 3) prever el número de componentes y/o de líneas fuente proyectadas en el sistema
implementado.
Los puntos de función se derivan usando una relación empírica basada en medidas contables (directas) del dominio
de información del software:
Número de entradas externas (EE).
Número de salidas externas (SE).
Número de consultas externas (CE).
Número de archivos lógicos internos (ALI).
Número de archivos de interfaz externos (AIE).
Profundidad del árbol de herencia (PAH). “la máxima longitud desde el nodo hasta la raíz del árbol”.
Número de hijos (NDH). Las subclases que son inmediatamente subordinadas a una clase en la jerarquía de clase se
denominan hijos.
Acoplamiento entre clases de objetos (ACO). ACO es el número de colaboraciones citadas para una clase en su
tarjeta índice CRC.
Respuesta para una clase (RPC). “Conjunto de métodos que potencialmente pueden ejecutarse en respuesta a un
mensaje recibido por un objeto de dicha clase”.
Falta de cohesión en métodos (FCOM). FCOM es el número de métodos que acceden a uno o más de los mismos
atributos.
Métricas de cohesión. Definen una colección de métricas que proporcionan un indicio de la cohesión de un módulo
Métricas de acoplamiento. El acoplamiento de módulo proporciona un indicio de cuán “conectado” está un módulo
con otros módulos, con datos globales y con el entorno exterior. Dhama propuso una métrica para acoplamiento de
módulo que abarca acoplamiento de datos y flujo de control, acoplamiento global y acoplamiento ambiental.
Métricas de complejidad. Pueden usarse para predecir información crucial acerca de la confiabilidad y el
mantenimiento de los sistemas de software a partir de análisis automáticos de código fuente [o información de
diseño procedimental].
Métricas orientadas a operación
Tres métricas simples, propuestas por Lorenz y Kidd [Lor94], son apropiadas:
Tamaño promedio de operación (TOprom). El tamaño puede determinarse al contar el número de líneas
de código o el de mensajes enviados por la operación.
Complejidad de la operación (CO). La complejidad de una operación puede calcularse usando cualquiera
de las métricas de complejidad propuestas para software convencional.
Número promedio de parámetros por operación (NPprom). Mientras más grande sea el número de
parámetros de operación, más compleja es la colaboración entre objetos.
RESUMEN
Las métricas para el modelo de requerimientos se enfocan en los tres componentes del modelo: la función, los
datos y el comportamiento.
Las métricas para diseño consideran arquitectura, diseño en el nivel de componentes y conflictos en el diseño de
interfaz.
Las métricas de diseño arquitectónico consideran los aspectos estructurales del modelo de diseño.
Las métricas de diseño en el nivel de componente proporcionan un indicio de la calidad del módulo al
establecer medidas indirectas para cohesión, acoplamiento y complejidad.
Las métricas de diseño de interfaz de usuario ofrecen un indicio de la facilidad con la que puede usarse una
GUI.
Las métricas webapp consideran aspectos de la interfaz de usuario, así como estética, contenido y navegación de
la webapp.
Las métricas para los sistemas OO se enfocan en mediciones que pueden aplicarse a las características de clase
y de diseño (localización, encapsulación, ocultamiento de información, herencia y técnicas de abstracción de
objeto) que hacen única a la clase.
Capítulo 22 - ADMINISTRACIÓN DE LA CONFIGURACIÓN DEL SOFTWARE
¿Qué es? La administración de la configuración del software (ACS), también llamada gestión del cambio, es
un conjunto de actividades diseñadas para administrar el cambio mediante la identificación de los productos
de trabajo que es probable que cambien, el establecimiento de relaciones entre ellos, la definición de
mecanismos para administrar diferentes versiones de dichos productos de trabajo y el control de los cambios
impuestos, así como la auditoría y reporte de los cambios realizados.
¿Qué es?
o Mantenimiento: reparar, parchar, extender su funcionalidad.
o Reingeniería: crear un producto con funcionalidad agregada, mejor desempeño y confiabilidad,
así como mantenibilidad mejorada.
¿Quién lo hace? En el nivel de la organización, el mantenimiento lo realiza el personal de apoyo que es
parte de la organización de ingeniería de software. La reingeniería la realizan especialistas en negocios
(con frecuencia compañías consultoras). En el nivel de software, la reingeniería la realizan ingenieros de
software.
¿Cuáles son los pasos?
o El mantenimiento corrige los defectos, adapta el software para satisfacer un entorno cambiante y
mejorar la funcionalidad a fin de cubrir las necesidades evolutivas de los clientes.
o La reingeniería de procesos de empresa (RPE) define las metas empresariales, identifica y evalúa
los procesos empresariales existentes y crea procesos empresariales revisados que satisfacen
mejor las metas del momento.
o La reingeniería de software abarca análisis de inventarios, restructuración de documentos,
ingeniería inversa, reestructuración de programas y datos e ingeniería hacia adelante.
1. El código fuente no estructurado (“sucio”) se reestructura de modo que sólo contenga los constructos de
programación estructurados (esto hace que el código fuente sea más fácil de leer y que proporcione la base
para todas las actividades de ingeniería inversa posteriores).
2. Núcleo de la ingeniería inversa => extracción de abstracciones. Evalúa el programa antiguo y, a partir del
código fuente, desarrolla una especificación significativa del procesamiento que se realiza, de la interfaz de
usuario que se aplica y de las estructuras de datos del programa o de la base de datos que se usa.
29.7 REESTRUCTURACIÓN
La reestructuración de software modifica el código fuente y/o los datos con la intención de hacerlos sensibles
a cambios futuros (no modifica la arquitectura global del programa).
o Se enfoca en detalles de diseño de módulos individuales y sobre estructuras de datos locales definidas
dentro de módulos. Si la reestructuración se extiende a la arquitectura del software, la reestructuración
se convierte en ingeniería hacia adelante.
29.7.1 Reestructuración de código
La reestructuración de código se realiza para producir un diseño que produzca la misma función pero con
mayor calidad que el programa original.
Las técnicas de reestructuración de código modelan la lógica del programa usando álgebra booleana y luego
aplican una serie de reglas de transformación que producen lógica reestructurada.