Calidad Del Software 2
Calidad Del Software 2
SOFTWARE
CICLO DE VIDA SOFTWARE: marco de referencia que define el enfoque general del desarrollo software,
indicando los procesos y actividades a realizar desde la definición del producto software hasta su
finalización de uso; así como los entregables que se van a generar y entregar al cliente (ISO 12207).
Modelo en cascada (clásico) Modelo iterativo (RUP, XP, etc.)
Existe un problema psicologico, requiere un cambio de actitud ya que naturalmente somos contructivos
ERROR: una equivocacion de una persona al desarrollar alguna actividad de desarrollo de software
FALLA: es un desvio respecto del comportamiento esperado del sistema, puede producirse en cualquier
etapa
PRINCIPIOS
• Una parte necesario de un test es la definicion de los resultados esperads
• Un programador debe evitar probar su propio desarrollo
• Revise los resultados de los test en profundidad
• Los test deben incluir entradas invalidas e inesperadas asi como las validas y esperadas
• Revisar un programa para verificar que hace lo que se espera que haga es solo la miitad de la
prueba; la otra mitad consiste en comprobar que no haga lo que no se espera
• No tirar los test a la basura a menos que el pgrama sea basura
• No planear esfuerzos de pruebas asumiendo que no se encontraran errores
• La probabilidad de encontrar errores en una seccion de un programa es proporcional al numero de
errores ya encontrados en esa seccion
• El testing conituye una tarea creativa e intelectualmente desafiante
NIVELES DE PRUEBAS
PRUEBAS UNITARIS
PRUEBAS UNITARIAS: Alcance
• Sólo se prueban componentes individuales (clases, funciones, módulos, etc.)
• Cada componente se prueba de forma independiente.
• Descubre errores producidos por defectos internos
• Los casos de prueba podrá ser obtenidos a partir de:
• Código fuente, modelo de datos, Diseño software.
• Se pueden realizar pruebas de caja blanca y de caja negra para probar los módulos completamente.
• Las pruebas de caja negra (los casos de prueba) se pueden especificar antes de que programar el
modo, no así las pruebas de caja blanca.
La idea es escribir casos de prueba para cada función no trivial o método en el módulo, de forma que
cada caso sea independiente del resto. Luego, con las Pruebas de Integración, se podrá asegurar el
correcto funcionamiento del sistema o subsistema en cuestión.
PRUEBAS UNITARIA
Para que una prueba unitaria tenga la calidad suficiente se deben cumplir las siguientes:
CARACTERISTICAS:
• Automatizable: No debería requerirse una intervención manual. Esto es especialmente útil para
integración continua.
• Completas: Deben cubrir la mayor cantidad de código.
• Repetibles o Reutilizables: No se deben crear pruebas que sólo puedan ser ejecutadas una sola vez.
También es útil para integración continua.
• Independientes: La ejecución de una prueba no debe afectar a la ejecución de otra.
• Profesionales: Las pruebas deben ser consideradas igual que el código, con la misma
profesionalidad, documentación, etc.
PRUEBAS UNITARIA
VENTAJAS:
• Fomentan el cambio: las pruebas unitarias facilitan que el programador cambie el código para
mejorar su estructura, puesto que permiten hacer pruebas sobre los cambios y así asegurarse de
que los nuevos cambios no han introducido errores.
• Simplifica la integración: puesto que permiten llegar a la fase de integración con un grado alto de
seguridad de que el código está funcionando correctamente, de esta manera se facilitan las pruebas
de integración.
• Documenta el código: las propias pruebas son documentación del código puesto que ahí se puede
ver cómo utilizarlo.
• Separación de la interfaz y la implementación: dado que la única interacción entre los casos de
prueba y las unidades bajo prueba son las interfaces de estas últimas, se puede cambiar cualquiera
de los dos sin afectar al otro, a veces usando objetos mock (mock object) para simular el
comportamiento de objetos complejos.
• Los errores están más acotados y son más fáciles de localizar
PRUEBAS UNITARIA
HERRAMIENTAS:
• JUnit: Entorno de pruebas para Java creado por Erich Gamma y Kent Beck. Se encuentra basado
en SUnit creado originalmente para realizar pruebas unitarias para el lenguaje Smalltalk.
• TestNG: Creado para suplir algunas deficiencias en JUnit.
• JTiger: Basado en anotaciones, como TestNG.
• SimpleTest: Entorno de pruebas para aplicaciones realizadas en PHP.
• PHPUnit: Sistema para la realización pruebas unitarias en PHP.
• CPPUnit: Versión del framework para lenguajes C/C++.
• NUnit: Versión del framework para la plataforma.NET.
• FoxUnit: Entorno OpenSource de pruebas unitarias para Microsoft Visual FoxPro
• MOQ: Entorno para la creación dinámica de objetos simuladores (mocks). «MOQ».
• QUnit: Librería para pruebas unitarias en Javascript. Creada por la fundación jQuery, ha sido
reescrita para ser independiente de la librería jQuery.
• libunittest: Librería portable para pruebas unitarias en C++ que usa el nuevo estándar C++11.
• CUnit: Entorno para escribir, administar y correr test unitarios en lenguaje C.
• PyUnit: Framework para la elaboración de pruebas unitarias en python.
• QtTest: Clases para pruebas unitarias en la biblioteca Qt (C++)
PRUEBAS MODULARES
Assert.
La mayoria de las herramientas tienen assert, que son afirmaciones que son usada para
comprobar suposiciones en el programa, colocada donde el desarrollador considera
que su ennunciado es siempre verdadero.
Esto da lugar a que existan afirmaciones y por lo tanto condiciones antes
(precondiciones) y despues (postcondiciones) de la ejecución de determinadas lineas
de código, lo que da lugar a las pruebas unitarias.
Ejemplo
int b= 3;
b= b+8;
System.out.println(“b tiene valor: “, b);
(b==11) //assert
b= b*2;
PRUEBAS MODULARES
Assert Junit (java)
METODO assertxxx() de JUnit lo que comprueba
assertTrue(expresion) comprueba que expresion evalue a
true
assertFalse(expresion) comprueba que expresion evalue a
false
assertEquals(esperando,real) comprueba que esperando sea igual
a real
assertNull(objeto) comprueba que el objeto sea null
assertNotNull(objeto) comprueba que el objeto no sea null
assertSame(Objeto_esperado, comprueba que el Objeto_esperado y
Objeto_real) el Objeto_real sean el mismo objeto
AssertNotSame(Objeto_esperado, comprueba que el Objeto_esperado y
Objeto_real) el Objeto_real no sean el mismo
objeto
fail() hace que el test termine con fallo
PRUEBAS DE INTEGRACION
PRUEBASDE INTEGRACIÓN: Alcance
• Las pruebas de integración comprueban la interacción mutua entre componentes (subsistemas)
software entre sí. Se asumen que los componentes ya han sido aprobados.
• Tendencia a intentar una integración no incremental:
• Combinar todos los módulos y probar el sistema en su conjunto.
• Resultado previsible: CAOS !!!
• Recomendación: aplicar integración incremental:
• El software se prueba en pequeñas porciones.
• En la detección y resolución de errores es más: Fácil, controlable y gestionable.
• Los casos de prueba podrá ser obtenidos a partir de:
• Especificación de interfaces, diseño de la arquitectura y modelo datos
PRUEBAS DE INTEGRACION
Falla de Intercomponentes
• Falla de interoperatividad
1. - Pruebas de carga
Las pruebas de carga consisten en simular demanda sobre una aplicación de software y medir el
resultado. Estas pruebas se realizan bajo demanda esperada y también en condiciones de sobrecarga
(picos en la demanda).
Para ejecutar estas pruebas, se requiere del uso de herramientas que simulen la carga, como por
ejemplo SoapUI.
Las pruebas de carga ayudan a identificar la máxima capacidad operativa de una aplicación, así como
en el identificar cuellos de botella y las causas de posible degradación del desempeño.
Cuando la carga de prueba se eleva por encima de los parámetros esperados, a estas pruebas se les
conoce como pruebas de estrés.
PRUEBAS NO FUNCIONALES
2. - Pruebas de estrés
Son pruebas de carga que se realizan con demandas mayores a la capacidad operativa, con frecuencia
hasta llegar al punto de ruptura.
Este tipo de prueba de software se utiliza para determinar la estabilidad de un sistema o aplicación, con
especial atención en la disponibilidad y manejo de errores cuando se enfrenta a la sobrecarga.
PRUEBAS NO FUNCIONALES
3. - Pruebas de volumen
Las pruebas de volumen consisten en validar el funcionamiento de la aplicación con ciertos volúmenes
de datos.
Por ejemplo, si se quiere ver el comportamiento de una aplicación con un tamaño de base de datos
específico, se expande el tamaño de base de datos a dichos parámetros y luego e realizan consultas,
procesos o funcionalidades de la aplicación, midiendo su desempeño.
El sujeto de pruebas no está limitado a bases de datos, también se puede usar por ejemplo para medir
el desempeño de una interfaz cuando el archivo de interfaz (un archivo de texto, xml, etc.) supera cierto
tamaño.
El objetivo es ver si dado ciertos volúmenes de datos la aplicación funciona con normalidad, cuales son
los límites máximos de volúmenes de datos para la operación e identificar condiciones de falla.
PRUEBAS NO FUNCIONALES
3. - Pruebas de volumen
Las pruebas de volumen consisten en validar el funcionamiento de la aplicación con ciertos volúmenes
de datos.
Por ejemplo, si se quiere ver el comportamiento de una aplicación con un tamaño de base de datos
específico, se expande el tamaño de base de datos a dichos parámetros y luego e realizan consultas,
procesos o funcionalidades de la aplicación, midiendo su desempeño.
El sujeto de pruebas no está limitado a bases de datos, también se puede usar por ejemplo para medir
el desempeño de una interfaz cuando el archivo de interfaz (un archivo de texto, xml, etc.) supera cierto
tamaño.
El objetivo es ver si dado ciertos volúmenes de datos la aplicación funciona con normalidad, cuales son
los límites máximos de volúmenes de datos para la operación e identificar condiciones de falla.
PRUEBAS NO FUNCIONALES
4. - Pruebas de configuración
En lugar de probar el desempeño de una aplicación desde la perspectiva de la carga, las pruebas de
configuración se usan para validar que efectos en el desempeño tienen ciertos cambios en la
configuración.
Un ejemplo típico de esta situación es experimentar con diferentes métodos de balanceo de cargas y ver
la respuesta de la aplicación a niveles similares de sobrecarga.
En las pruebas de usabilidad, los testers de software se enfocan en validar que tan fácil de usar es una
determinada aplicación.
Facilidad de aprendizaje: Que tan fácil es para los usuarios realizar funciones básicas la primera vez que
utilizan la aplicación.
Eficiencia: Que tan rápido los usuarios experimentados pueden realizar sus tareas.
Memorización: Que tan fácil de memorizar es el uso de la aplicación, esto es, cuando un usuario pasa
mucho tiempo sin usar la aplicación, puede recordar lo suficiente para usarla con efectividad la próxima
vez, o tiene que empezar a aprender de nuevo.
Errores: Cuantos errores atribuibles al diseño comete el usuario, que tan severos son y que tan fácil es
recuperarse de los mismos.
Satisfacción: Que tanto le gusta (o desagrada) al usuario utilizar el sistema.
PRUEBAS NO FUNCIONALES
6. - Pruebas de seguridad
Consiste en probar los atributos o características de seguridad del sistema, si es un sistema seguro o
no, si puede ser vulnerado, si existe control de acceso por medio de cuentas de usuario, si pueden ser
vulnerados estos accesos.
Las pruebas de seguridad también sirven para validar si el equipo de desarrollo de software ha seguido
prácticas de seguridad recomendadas en su programación.
Las pruebas de resistencia implican someter a un Sistema o aplicación a una carga determinada durante
un período de tiempo, para determinar cómo se comporta luego de un uso prolongado.
Un sistema informático puede comportarse de forma normal durante las primeras horas, sin embargo,
luego de cierto tiempo, problemas como fugas de memoria suelen ocasionar fallas.
Estos defectos en el desarrollo de software no pueden identificarse bajo pruebas funcionales normales,
por lo que es conveniente involucrar pruebas de resistencia entre los tipos de pruebas de software.
PRUEBAS NO FUNCIONALES
8. - Pruebas de escalabilidad
Las pruebas de escalabilidad consisten en verificar la capacidad de una aplicación de escalar cualquiera
de sus características no funcionales, como por ejemplo la carga que soporta, número de transacciones,
volúmenes de datos, entre otros.
Probar en bloques incrementales significa por ejemplo primero probar con niveles de demanda bajos,
luego incrementar a niveles de demanda medios y finalmente probar con altos niveles de carga. De esta
manera se puede determinar que también escala la aplicación y los problemas que comienzan a surgir
en distintos niveles.
Para que los resultados sean confiables, los ambientes de prueba y su configuración deben mantenerse
constantes.
PRUEBAS NO FUNCIONALES
9. - Pruebas de recuperación
Las pruebas de recuperación se realizan para verificar que tan rápido y que tan bien se recupera una
aplicación luego de experimentar un falló de hardware o software.
Por lo tanto, para realizar pruebas de recuperación se requiere forzar la falla y luego verificar si la
recuperación ocurre adecuadamente.
Por ejemplo, cuando una aplicación esté funcionando desconectar el cable de red, o en una aplicación
móvil interrumpir la conexión con la red Wi-Fi o con la operadora, para luego restablecer la conexión.
PRUEBAS NO FUNCIONALES
9. - Pruebas de recuperación
Las pruebas de recuperación se realizan para verificar que tan rápido y que tan bien se recupera una
aplicación luego de experimentar un falló de hardware o software.
Por lo tanto, para realizar pruebas de recuperación se requiere forzar la falla y luego verificar si la
recuperación ocurre adecuadamente.
Por ejemplo, cuando una aplicación esté funcionando desconectar el cable de red, o en una aplicación
móvil interrumpir la conexión con la red Wi-Fi o con la operadora, para luego restablecer la conexión.
PRUEBAS NO FUNCIONALES
10. - Pruebas de mantenibilidad
Básicamente consisten en evaluar que tan fácil es realizar el mantenimiento de un sistema o aplicación.
Esto significa que tan fácil es analizar, cambiar y probar estos cambios.
Para realizar esta prueba deben evaluarse la forma en que está implementada la aplicación, siguiendo
buenas prácticas de ingeniería de software. Es decir, que se estén siguiendo los patrones
recomendados de ingeniería de software y que no se estén introduciendo inadvertidamente anti
patrones, esto es, que no se estén cometiendo errores comunes de programación.
TECNICAS PRUEBAS ASEGURAMIENTO DE LA CALIDAD
TECNICAS ESTATICAS
REVISIONES:
OBJETIVO: mejorar la calidad del producto y reducir propagación de errores entre fases (modelo-v)
• La detección temprana de errores ahorra costes a posteriori.
• Defectos potencialmente detectables en:
• Documentos de especificación y arquitectura
• Especificaciones de interfaces
• Desviaciones respecto a estándares acordados (e.g. Guías de programación)
• Tarea eminentemente manual.
ANALISIS ESTATICO:
OBJETIVO: Buscar errores en la especificación de objetos de prueba (e.g. Código fuente, script, etc.) sin
ejecutar el objeto de prueba.
• Aspectos a detectar:
• Reglas y estándares de programación
• Diseño de un programa (análisis del flujo de control)
• Uso de datos (análisis flujo de datos)
• Complejidad de la estructura de un programa (métricas)
• Existen herramientas compiladores, analizadores
• Detectar lógica errónea (bucles potencialmente infinitos)
• Detectar estructuras lógicas complejas, inconsistencias entre interfaces, etc.
• Supone menor esfuerzo que una inspección
TECNICAS DINAMICAS
CAJA NEGRA:
• El tester observar el objeto de prueba como una caja negra.
• La estructura interna del objeto de prueba es irrelevante o desconocida.
• Los casos de prueba se obtienen a partir del análisis de la especificación (funcional o no funcional) de
un componente o sistema
• Prueba de comportamiento entrada/salida
A = 6 (true) B = 9 (false) A>2 OR B<6 (true) A = 1 (false) B = 2 (true) A>2 OR B<6 (true)
TECNICAS DINAMICAS
CAJA BLANCA:
Método: Cobertura de Condición MÚLTIPLE
• Todas las combinaciones que pueden ser creadas utilizando permutaciones de las subcondiciones
atómicas deben formar parte de las pruebas.
Ejemplo: considerar la condición A>2 OR B<6. En los casos de prueba para la cobertura de condición
múltiple podrían ser (por ejemplo):
• Con sólo 4 casos de prueba se puede lograr una cobertura de condición múltiple.
• Se han creado todas las combinaciones verdadero/falso.
• Se han logrado todos los posibles resultados de la condición.