Programación II: Verificación, Validación y Pruebas de Software
Verificación: consiste en comprobar que el producto está de acuerdo con la especificación. Es el proceso de evaluación de un sistema para determinar si los productos de una fase satisfacen las condiciones impuestas.
Validación: consiste en asegurar que el producto satisface las expectativas del cliente. Determina si satisface los requisitos marcados. Dentro de este proceso hay dos pasos complementarios:
- Inspecciones del software: análisis y comprobación de los documentos requeridos, diagramas y código fuente. Solo pueden comprobar la correspondencia entre un programa y su especificación. No pueden demostrar que el software es útil.
- Pruebas de software: ejecución de la implementación con datos de prueba. Es la técnica principal de V&V (Verificación y Validación). Implica la ejecución del programa con datos similares a los reales. Los defectos se descubren analizando el programa.
Tipos de Pruebas de Software
Pruebas de Integración
Se enfocan en el sistema o subsistema. La integración se realiza a partir de sus componentes y se comprueba que los elementos funcionan juntos de manera correcta.
- Integración descendente: se desarrolla el esqueleto del sistema y se le añaden los componentes progresivamente.
- Integración ascendente: se integran los componentes de la infraestructura y se le añaden funcionalidades. Se debe realizar una aproximación incremental añadiendo componentes de forma sucesiva.
- Entrega y aceptación: intentan demostrar al cliente que el sistema satisface los requerimientos. Las pruebas derivan de la especificación del sistema. Hay que comprobar que los resultados son los esperados y que los errores son causados por las entradas.
- Rendimiento y estrés: se realizan con el sistema ya integrado. Se prueba el rendimiento y la fiabilidad. Se debe diseñar un perfil operacional intentando reflejar la combinación real de transacciones. Prueba el comportamiento del fallo y sobrecarga el sistema.
Pruebas Unitarias
Consisten en las pruebas de forma independiente de cada clase que forma el programa.
- Integración ascendente: se combinan módulos del nivel más bajo, se construye un monitor de prueba para gestionar casos de prueba, se prueba el grupo, se eliminan los monitores sustituyéndolos por módulos reales y se realizan pruebas de regresión.
- Integración descendente: se utiliza como control del programa principal, se construyen módulos colaboradores, se sustituyen los módulos colaboradores por reales, se prueba cada vez que se integra uno nuevo y se reemplazan todos los colaboradores.
Pruebas en Sistemas Orientados a Objetos (OO)
Se dividen en varios niveles: métodos y operaciones individuales de la clase, clases individuales, agrupaciones de objetos y el sistema completo. En las pruebas de clases, el objetivo es probar las operaciones, los atributos y ejecutar los objetos en todos los estados posibles.
Gestión de Excepciones y Errores
- Try: define un bloque de código donde se puede generar una excepción. Va seguido de uno o más bloques catch y, opcionalmente, un finally.
- Catch: define el bloque de sentencias que se ejecutarán cuando se haya producido una excepción en el try.
- Finally: bloque que se ejecuta siempre, independientemente de si hubo una excepción o no.
- Throw: se ejecuta para indicar que ha ocurrido una excepción o para realizar el lanzamiento de una. Especifica el objeto que se lanzará.
- Throws: palabra clave utilizada en la firma de un método para listar las excepciones que puede lanzar y que no va a manejar internamente.
- Error: fallo del que no se puede recuperar la ejecución normal del programa; por lo general, no se pueden tratar.
- Exception: condición anormal que puede ser resuelta durante la ejecución.
Algoritmos de Búsqueda y Ordenación
Búsqueda
- Búsqueda Secuencial: se realiza desde el inicio de la colección hasta el final. No requiere que los elementos estén ordenados.
- Búsqueda Binaria: la colección debe estar ordenada. Se requiere conocer el número de elementos y tener acceso directo al elemento por posición en la lista.
Ordenación
- Inserción Directa: la colección se descompone en dos partes: una cuyos elementos mantienen el orden y otra desordenada. Inicialmente, la parte ordenada consta del primer elemento. Se localiza la posición que correspondería en la parte ordenada al primer elemento de la desordenada y se inserta.
- Selección Directa (Burbuja): se basa en realizar pasadas sucesivas sobre los elementos de la colección. En cada pasada, se compara cada elemento y se realiza el intercambio si es requerido.
Estructuras de Datos y Colecciones
Enumerados
Los Enumerados sirven para restringir la selección de valores a un conjunto predefinido. Permite que una variable tenga solo un valor de entre los permitidos.
Colecciones
Una Colección es un objeto que recopila y organiza otros objetos. Define las formas específicas en las que se puede acceder y gestionar dichos objetos. Existen colecciones lineales y no lineales.
- Interface Collection: representa una secuencia de elementos individuales a los que se aplican reglas.
- List: almacena elementos en el orden en que fueron insertados.
- Set: una colección que no puede tener elementos duplicados.
- Map: representa un grupo de parejas de objetos clave-valor que permite realizar búsquedas eficientes de objetos.
Conjuntos y Mapas Específicos
- HashSet: se basa en una tabla hash para almacenar objetos. Es una implementación de Set que representa un conjunto de valores sin duplicados.
- HashMap: basado en una tabla hash, es una implementación de Map que representa una colección para almacenar objetos mediante claves y valores.
Iteradores
Los Iteradores permiten recorrer todos los elementos de una colección. El Iterator es la interfaz básica, mientras que ListIterator permite un recorrido bidireccional.
