Está en la página 1de 32

Verificacin y Validacin

2
Ingeniera
IngenieraSoftware
software
0
0
8
44 Fsicas
de Fsicas

Verificacin y Validacin

Jos M. Drake y Patricia Lpez


Computadores y Tiempo Real

Santander, 2008
1

Ingeniera de Programacin (4 Fsicas) J.M. Drake 1


Verificacin y Validacin

2
0
0
8
Situacin dentro del proceso de desarrollo

Verificacin de software:

Prueba:
Prueba de unidades
Identificar practicas Pruebas de integracin. Mantenimiento
corporativas
Inspeccin: Pruebas orientadas a fallos
Bancos de pruebas
Inspeccin y prueba
Inspeccin del software. Integracin
Identificar practicas Anlisis esttico automatizado y validacin
corporativas

Anlisis de requisitos Verificacin

Anlisis Codificacin
Diseo

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 2

El objetivo de este tema es introducir la verificacin y validacin del software con nfasis
en las tcnicas de verificacin esttica y en la prueba dinmica de cdigo. Objetivo de este
tema son:
Comprender la diferencia entre verificacin y validacin del software.
Valorar la inspeccin del software y el anlisis esttico como mtodos de descubrir fallos y
mejorar la calidad del software.
Conocer las tcnicas de pruebas para descubrir fallos en el cdigo.
Analizar las tcnicas especficas para las pruebas de componentes y pruebas de sistemas
orientados a objetos.
Importancia de las herramientas CASE para la verificacin de software y apoyar el
desarrollo de las pruebas.

Ingeniera de Programacin (4 Fsicas) J.M. Drake 2


Verificacin y Validacin

2
0
0
8
Verificacin y Validacin

Verificacin:
Estamos construyendo el producto correctamente?
Se comprueba que el software cumple los requisitos funcionales y no
funcionales de su especificacin.

Validacin:
Estamos construyendo el producto correcto?
Comprueba que el software cumple las expectativas que el cliente espera.

Con V&V se pretende certificar que el sistema desarrollado se ajusta a lo


esperado de la forma mas satisfactoria posible. Nuca se puede demostrar
que est libre de defectos

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 3

La verificacin y la validacin no son la misma cosa , aunque es muy fcil confundirlas,


Boehm (1979) expres la diferencia entre ellas de forma sucinta:
Verificacin: Estamos construyendo el producto correctamente?
El papel de la verificacin comprende comprobar que el software est de
acuerdo con su especificacin. Se comprueba que el sistema cumple los
requerimientos funcionales y no funcionales que se le han especificado.
Validacin: Estamos construyendo el producto concreto?
La validacin es un proceso mas general. Se debe asegurar que el software
cumple las expectativas del cliente. Va mas all de comprobar si el
sistema est acorde con su especificacin, para probar que el software
hace lo que el usuario espera a diferencia de lo que se ha especificado.
Es importante llevar a cabo la validacin de los requerimientos del sistema de forma inicial.
Es fcil cometer errores y omisiones durante la fase de anlisis de requerimientos del
sistema y, en tales casos, el software final no cumplir la expectativas de los clientes. Sin
embargo, en la realidad, la validacin de los requerimientos no puede descubrir todos los
problemas que presenta la aplicacin. Algunos defectos en los requerimientos solo pueden
descubrirse cuando la implementacin del sistema se completa.

Ingeniera de Programacin (4 Fsicas) J.M. Drake 3


Verificacin y Validacin

2
0
0
8
Tcnicas de Verificacin y Validacin

En el proceso de Verificacin y Validacin se utilizan dos


tcnicas de comprobacin y anlisis:
Inspecciones del Software:
z Se contrasta estticamente las diferentes representaciones del sistema
(diagramas de requerimientos, diagramas de diseo y cdigo fuente) en
bsqueda de defectos.
z No requiere que el cdigo se ejecute
z Debe realizarse durante todo el ciclo de desarrollo.
Las pruebas del Software:
z Se contrasta dinmicamente la respuesta de prototipos ejecutables del
sistema con el comportamiento operacional esperado.
z Requiere disponer de prototipo ejecutables y esto slo es posible en las
fases finales del proceso de desarrollo.

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 4

Dentro del proceso de Verificacin y validacin se utilizan dos tcnicas de comprobacin y


anlisis de sistemas:
1. Las inspecciones del software analizan y comprueban las representaciones del sistema
como el documento de requerimientos, los diagramas de diseo y y el cdigo fuente del
programa. Se aplica a todas las etapas del proceso de desarrollo. Las inspecciones se
complementan con algn tipo de anlisis automtico del texto fuente o de los
documentos asociados. Las inspecciones del software y los anlisis automatizados son
tcnicas de verificacin y validacin estticas puesto que no requieren que el sistema se
ejecute.
2. Las pruebas del software consiste en contrastar las respuestas de una implementacin
del software a series de datos de prueba y examinar las respuestas del software y su
comportamiento operacional, para comprobar que se desempee conforme a lo
requerido. Llevar a cabo las pruebas es una tcnica dinmica de la verificacin y
validacin ya que requiere disponer de un prototipo ejecutable del sistema.

Ingeniera de Programacin (4 Fsicas) J.M. Drake 4


Verificacin y Validacin

2
0
0
8
Verificacin y validacin esttica y dinmica

Inspecciones
de software

Especificacin Diseo de la Especificacin Diseo Codificacin


de requerimientos arquitectura formal detallado

Prototipo Prueba de programas

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 5

En el esquema se muestra el lugar que ocupan las inspecciones y las pruebas dentro del
proceso de desarrollo de software. Las flechas indican las fases del proceso en las que se
utilizan las tcnicas. Las inspecciones de software se pueden utilizar en todas las etapas del
proceso, mientras que las tcnicas de prueba slo se pueden cuando est disponible un
prototipo o cdigo ejecutable.
Las tcnicas de inspeccin incluyen inspeccin de programas, anlisis automatizado de
cdigo fuente y verificacin formal. Sin embargo las tcnicas estticas slo pueden
comprobar la correspondencia entre un programa y su especificacin (verificacin) y no
puede probar que el software es de utilidad operacional, y mucho menos que las
caractersticas no funcionales del software son las correctas. Por lo tanto, para validar un
sistema de software, siempre se requieren llevar a cabo ciertas pruebas.
Aunque en la actualidad las inspecciones se utilizan ampliamente, las pruebas de los
programas es an la tcnica de verificacin y validacin predominante.

Ingeniera de Programacin (4 Fsicas) J.M. Drake 5


Verificacin y Validacin

2
0
0
8
Proceso de depuracin

Proceso de depuracin: Proceso que localiza y corrige los errores descubiertos por
las pruebas.
Es un proceso complicado pues no siempre los errores se detectan cerca del punto en
que se generaron.
Se utilizan herramientas de depuracin, que facilitan el proceso
Despus de reparar el error, hay que volver a probar el sistema (pruebas de
regresin).
La solucin del primer fallo puede dar lugar a nuevos fallos.

Resultados de Casos de pruebas


prueba Especificacin

Disear reparacin Probar de nuevo el


Localizar error Reparar errores
errores programa

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 6

Al proceso de eliminacin de los errores que se descubren durante las fases de prueba se denomina
depuracin. Es un proceso independiente que no tiene porqu estar integrado:
La verificacin y validacin establece la existencia de defectos en el programa.
La depuracin es el proceso que localiza el origen y corrige estos defectos.
No existe un proceso sencillo para la depuracin de programas. Los mejores depuradores buscan
patrones en los resultados de las pruebas donde el defecto se detecta, y para localizar el defecto
utilizan el conocimiento que tienen sobre el tipo de defecto, el patrn de salida, as como del
lenguaje y proceso de programacin. El conocimiento del proceso es importante. Los depuradores
conocen los errores de los programadores comunes (como olvidad incrementar un contador, errores
de direccionamiento de punteros en lenguaje C, etc.) y los comparan contra los patrones observados.
Localizar los fallos es un proceso complejo porque los fallos no necesariamente se localizan cerca del
punto en que se detectan. Para localizar un fallo de un programa el programador responsable de la
depuracin tiene que disear programas de prueba adicionales que repitan el fallo original y que
ayudan a descubrir el origen del fallo. En estos casos las herramientas de depuracin que permiten
rastrear el programa y visualizar los resultados intermedios es de una gran ayuda.
Las herramientas de depuracin son habitualmente parte de las herramientas de apoyo al lenguaje y que
sirven de base al compilador. Proporcionan un entorno especial de ejecucin que permiten acceder a
las tablas de smbolos del compilador, a travs de ella a los valores de las variables del programa.
Habitualmente, permiten controlar la ejecucin paso a paso sobre el cdigo del programa.
Despus de que se descubre el origen del fallo en el programa, este debe corregirse y entonces reevaluar
el sistema. Esto implica repetir de nuevo las pruebas anteriores (pruebas de regresin). Estas pruebas
se hacen para comprobar que los cambios introducidos resuelven definitivamente el fallo y no
introducen nuevos fallos. La estadstica muestra que la reparacin de un fallo frecuentemente es
incompleta y adems introduce nuevos fallos.
Ingeniera de Programacin (4 Fsicas) J.M. Drake 6
Verificacin y Validacin

2
0
0
8
Inspecciones del software

Consisten en revisiones sistemticas tanto de los documentos generados


como de los cdigos fuentes con el nico objetivo de detectar fallos.
Permiten detectar entre un 60 y un 90% de los fallos a unos costes mucho mas
bajos que las pruebas dinmicas.
Permiten detectar mltiples defectos en una simple inspeccin, mientras que
las pruebas solo suelen detectar un fallo por prueba.
Permite utilizar el conocimiento del dominio y del lenguaje, que determinan
los principales tipos de fallos que se suelen cometer.
Las inspecciones son tiles para detectar los fallos de mdulos, pero no
detectan fallos a nivel de sistema, que ha de hacerse con pruebas.
La inspecciones no son tiles para la deteccin de niveles de fiabilidad y
evaluacin de fallos no funcionales.
Las inspecciones se pueden aplicar a la deteccin de fallos en cualquiera de los
documentos generados

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 7

Llevar a cabo pruebas sistemticas de los programas requiere que se desarrollen, ejecuten y
examinen diferentes pruebas. Este proceso es muy largo y caro. Cada ejecucin de una
prueba suele descubrir, en el mejor de los casos, un nico fallo, ya que la cada del sistema o
la corrupcin de los datos que puede implicar hace que sea difcil encontrar el siguiente.
Por el contrario la inspeccin del software no requiere que el programa se ejecute cono lo
que se puede utilizar como tcnica de verificacin antes de que el sistema est totalmente
implementado. Durante una inspeccin, se examina el cdigo fuente del sistema y se
compara con la especificacin del mismo que se dispone.
Se ha comprobado estadsticamente que la inspeccin es una tcnica mucho mas eficiente
para la deteccin de errores que la verificacin basada en pruebas. Es mas barato encontrar
errores a travs de la inspeccin que con pruebas, y adems se considera que el 60% de los
errores se detectan mediante una inspeccin rutinaria, y hasta un 90% de los errores se
detectan mediante una inspeccin sistemtica.
Existen dos razones por las que las inspecciones son mas efectivas que las pruebas:
Varios defectos se detectan en una sola inspeccin. El problema con las pruebas
es que slo pueden detectar nico fallo por prueba, ya que los defectos de la
primera que se detecte puede afectar a la deteccin de las siguientes.
Usa el conocimiento del dominio y del lenguaje de programacin que se utiliza.
En esencia, es mas probable que los revisores vean los tipos de errores que
comnmente ocurre el lenguaje de programacin particulares y en los tipos
particulares de la aplicacin.

Ingeniera de Programacin (4 Fsicas) J.M. Drake 7


Verificacin y Validacin

2
0
0
8
Inspeccin del cdigo fuente: Anlisis esttico automatizado

Los analizadores estticos de programas son herramientas de software que


rastrean el texto fuente de un programa, en busca de errores no detectados por
el compilador.

En algunos lenguajes de programacin no son muy tiles pues el compilador


ofrece una gran informacin acerca de posibles errores (incluso en ejecucin).

Aspectos habitualmente analizados son:


Anlisis de flujo de control: Identifica y seala los bucles con mltiples puntos de salida y las
secciones de cdigo no alcanzable.
Anlisis de utilizacin de datos: Seala como se utilizan las variables del programa: Variables sin
utilizacin previa, que se declaran dos veces, declaradas y nunca utilizadas. Condiciones lgicas
con valor invariante, etc.
Anlisis de interfaces: Verifica la declaracin de las operaciones y su invocacin. Esto es intil en
lenguajes con tipado fuerte (Java, Ada) pero si en los restantes.
Anlisis de flujo de informacin: se identifican las dependencias entre las variables de entrada y
las de salida
Anlisis de la trayectoria: Identifica todas las posibles trayectorias del programa y presenta las
sentencias ejecutadas en cada trayectoria.

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 8

Los analizadores estticos de programas son herramientas de software que rastrean el texto fuente de
un programa y detecta los fallos y anomalas. No requieren que el programa se ejecute, mas bien,
analizan sintcticamente el cdigo fuente e identifica las diferentes sentencias que contiene. Despus
puede detectar si las sentencias estn bien formadas, hacer inferencias sobre los flujos de control, y de
los valores que se asignan a las variables.
Constituyen un recurso para ayudar a la deteccin de los fallos. Su funcin no es habitualmente
detectarlos, sino identificar las anomalas o situaciones heterodoxas que pueden serlo.

Ingeniera de Programacin (4 Fsicas) J.M. Drake 8


Verificacin y Validacin

2
0
0
8
Lista de fallos (1)

Fallos de datos:
Las variables se inicializan antes que de que se utilicen los valores?.
Todas las constantes tienen nombre?
El lmite superior de los arrays es igual al tamao de los mismos?
Las cadenas de caracteres tienen delimitadores explcitos.
Existe posibilidad que el buffer se desborde?
Fallos de control:
Para cada instruccin condicionalEs correcta la condicin?
Todos los ciclo terminan?
Los bloques estn delimitados correctamente?
En las instrucciones case Se han tomado en cuenta todos los casos?
Si se requiere un break Se ha incluido?.
Fallos de entrada/salida:
Se utilizan todas las variables de entrada?
Antes de que salgan Se le han asignado valores a las variables de salida?
Provocan corrupcin de los datos las entradas no esperadas?

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 9

El proceso de inspeccin siempre se realiza utilizando una lista de los errores comunes de
los programadores. Esta se somete a discusin por el personal con experiencia y se actualiza
frecuentemente segn se vaya teniendo experiencia.
La lista de errores debe ser funcin del lenguaje de programacin que se utilice. Por ejemplo
un compilador Ada comprueba que las funciones tienen el nmero correcto de argumentos,
mientras que C no. Muchos de los fallos en C tienen relacin con los punteros, estos no se
pueden producir en Java.
La cantidad de cdigo que se puede inspeccionar debe estar limitado, ya que a partir de un
tiempo de inspeccin se baja la atencin y se hace ineficaz. Existen estudios que establecen
que no deberan examinarse mas de 125 lneas de cdigo por sesin, y no mas de 2 horas.

Ingeniera de Programacin (4 Fsicas) J.M. Drake 9


Verificacin y Validacin

2
0
0
8
Lista de fallos(2)

Fallos de la interfaz:
Las llamadas a funciones y mtodos tienen el nmero correcto de parmetros?
Concuerdan los tipos de los parmetros formales y reales?
Estn los parmetros en el orden adecuado?
Si los componentes accede a memoria compartida, Tienen el mismo modelo de la
memoria compartida?
Fallos de gestin de almacenamiento:
Si una estructura con punteros se modifica, Se reasignan correctamente todos los
punteros?
Si se utiliza almacenamiento dinmico, se asigna correctamente el espacio?
Se desasigna explcitamente la memoria despus de que se libera?
Fallos de gestin de las excepciones:
Se toman en cuenta todas las condiciones de errores posibles?.

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 10

Ingeniera de Programacin (4 Fsicas) J.M. Drake 10


Verificacin y Validacin

2
0
0
8
Pruebas del software

Las pruebas se realizan en cuatro etapas:


Prueba de unidades (prueba de mtodos y clases)
z se prueba cada mtodo y clase de forma independiente
Prueba de integracin o de subsistemas
z se prueban agrupaciones de clases relacionadas
Prueba de sistema
z se prueba el sistema como un todo
Prueba de validacin (o de aceptacin)
z prueba del sistema en el entorno real de trabajo con intervencin del
usuario final
El descubrimiento de un defecto en una etapa requerir la
repeticin de las etapas de prueba anteriores

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 11

Prueba de unidades: Se prueba cada componente individual de forma independiente (en OO


cada clase, con sus correspondientes mtodos). Encontrar fallos en modulos de forma
aislada es mucho mas fcil que encontrarlos cuando ya se encuentran ensamblados dentro de
la aplicacin.

Ingeniera de Programacin (4 Fsicas) J.M. Drake 11


Verificacin y Validacin

2
0
0
8
Tipos de pruebas del software

Existen dos tipos diferentes de pruebas:


Las pruebas de defectos:
z Buscan las inconsistencias entre un programa y su especificacin.
z Las pruebas se disean para buscar los errores en el cdigo.
z Demuestran la presencia, y no la ausencia, de defectos
Las pruebas estadsticas:
z Buscan demostrar que satisface la especificacin operacional y su
fiabilidad.
z Se disean para reflejar la carga de trabajo habitual.
z Sus resultados se procesan estadsticamente para estimar su
fiabilidad (contando el nmero de cadas del sistema) y sus
tiempos de respuesta.

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 12

Llevar a cabo pruebas consiste en ejecutar el sistema con datos de entrada especficamente
formulados para la prueba que se realiza. La prueba de insuficiencias o defectos del
programa se obtienen analizando las respuesta que proporciona y buscando anomalas
respecto de lo esperado. Las pruebas se pueden llevar a cabo durante la fase de
implementacin para verificar que el software se comporta tal como los pretendi el
diseador, y despus de que la implementacin est completa.
Existen dos tipos diferentes de prueba, que se utilizan en las diferentes etapas de
desarrollo del software:
1. Las pruebas de defectos: Pretenden encontrar las inconsistencias entre un
programa y su especificacin. Estas inconsistenacias se deben habitualmente a
los fallos o defectos en el cdigo del programa. Las pruebas se disean para
revelar la presencia de defectos en el sistema, mas que para evaluar su
capacidad operacional.
2. Las pruebas estadsticas: se utilizan para probar el desempeo y la fiabilidad
del programa y comprobar como trabaja bajo condiciones operacionales. Las
pruebas se disean para reflejar las entradas de los usuarios y su frecuencia.
Despus de llevar a cabo las pruebas, se puede hacer una estimacin de la
fiabilidad operacional del sistema contando el nmero de cadas observadas en
el sistema. La capacidad del programa se valora midiendo el tiempo de
ejecucin y el tiempo de respuesta del sistema cuando procesa los datos
estadsticos de la prueba.
No existe una separacin clara entre estos dos tipos de pruebas. Durante las pruebas de
defectos los desarrolladores obtienen una visin intuitiva de la fiabilidad, y durante las
pruebas estadsticas, se descubren obviamente muchos fallos.
Ingeniera de Programacin (4 Fsicas) J.M. Drake 12
Verificacin y Validacin

2
0
0
8
Pruebas de defectos

El objetivo de las pruebas de defecto es detectar los defectos latentes de


un sistema software antes de entregar el producto.
Una prueba de defectos exitosa es aquella que descubre un fallo, esto es, un
comportamiento contrario a la especificacin.
La pruebas de defectos demuestran la existencia de un fallo, y no la ausencia
de cualquier fallo.

Las pruebas exhaustivas no son posibles y deben sustituirse por


subconjunto basados en polticas de prueba. Por ejemplo:
Se deben probar todas las funciones del sistema que se acceden a travs de
men.
Se deben probar las combinaciones de funciones que se acceden a travs de
men.
Si la entrada es introducida por el operador, todas las funciones deben
probarse con entradas correctas e incorrectas.

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 13

Ingeniera de Programacin (4 Fsicas) J.M. Drake 13


Verificacin y Validacin

2
0
0
8
Proceso de pruebas de defectos

Casos de prueba Datos de prueba Resultados de Informe de


la prueba la prueba

Ejecutar el programa Comparar resultados


Disear casos de prueba Preparar datos de prueba
con los datos de prueba con los casos de prueba

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 14

En la figura se muestra un modelo general del proceso de prueba de defectos. Los casos de
prueba son especificaciones de las entradas a la prueba y de la salida esperada del sistema,
mas una declaracin de lo que se prueba. Los datos de prueba son las entradas seleccionadas
para probar el sistema. Dichos datos se generan, algunas veces, de forma automtica, pero
esto no es frecuente, ya que en tal caso no se dispone de las respuesta que hay que esperar
del sistema (sin fallo).

Ingeniera de Programacin (4 Fsicas) J.M. Drake 14


Verificacin y Validacin

2
0
0
8
Pruebas funcionales ( Caja negra)

Las pruebas funcionales o de caja negras es una poltica de seleccin de


casos de pruebas basado en la especificacin del componente o
programa.
Las pruebas se seleccionan en funcin de la especificacin y no de la
estructura interna del software.
Entrada de datos
de prueba Ee

Entradas que provocan


comportamiento anmalo

Sistema

Salidas que revelan la


presencia de defectos

Resultados de Se
las prueba

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 15

Las pruebas funcionales o de caja negra son una estrategia para seleccionar las pruebas de
fallos basndose en las especificaciones de los componentes y programas, y no del
conocimiento de su implementacin. El sistema se considera como una caja negra cuyo
comportamiento slo se puede determinar estudiando las entradas y de contrastarlas con las
respuestas que proporciona el sistema.
Este enfoque se puede aplicar de igual forma a los sistemas que estn organizados como
libreras de funciones, o como objetos. El probador introduce las entradas en los
componentes del sistema y examina las salidas correspondientes. Si las salidas no son las
previstas, entonces la prueba ha detectado exitosamente un fallo en el software.
El problema clave para el probador de defectos es seleccionar la entrada que tienen una alta
probabilidad de ser miembro del conjunto Ee. En muchos casos la seleccin se basa en la
experiencia previa de los ingenieros de pruebas. Ellos utilizan el conocimiento del dominio
para identificar los casos de prueba que probablemente van a mostrar fallos. Tambin se han
propuesto enfoques sistemticos de la seleccin de datos de prueba.

Ingeniera de Programacin (4 Fsicas) J.M. Drake 15


Verificacin y Validacin

2
0
0
8
Particiones de equivalencia

En general es imposible probar un mtodo con todas las combinaciones


posibles de entradas

Solucin: Clasificar los datos de entrada en grupos que tienen un


comportamiento similar respecto de la lgica de programa.

Una particin de equivalencia es cada grupo de datos de entrada que


generan igual respuesta cualitativa.

Los casos de pruebas se eligen en funcin de las particiones:


Se elige un caso central por particin: Caso tpico.
Se elige casos correspondientes a las fronteras con otras particiones: casos
atpicos.

Las particiones se identifican utilizando la especificacin del programa o


la documentacin del usuario.

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 16

Los datos de entrada a un programa se pueden clasificar en diferentes clases, de acuerdo con
la funcionalidad del programa. Los datos de un mismo grupo tienen un tratamiento similar
por parte del programa. Un enfoque sistemtico para las pruebas de defectos se basan en
identificar todas las particiones de equivalencia y basar en ellas las pruebas de fallos.
Una vez identificado un conjunto de particiones, se eligen los casos de prueba de cada una
de estas particiones. Un buen criterio de seleccin de los casos de prueba es elegir dichos
casos de los lmites de las particiones junto con casos cercanos al punto medio de la
particin. Con ello, se consideran los casos tpicos para los programadores que son los que
tienen un tratamiento lejano a las decisiones de control crticas, y valores atpicos que son
los que tienen un tratamiento prximo a los casos en que se cambian de tratamiento.

Ingeniera de Programacin (4 Fsicas) J.M. Drake 16


Verificacin y Validacin

2
0
0
8
Ejemplo de particiones de equivalencia

Nmero de valores de entrada

Entrada no vlidas Entrada vlidas


4 11
3 7 10

menor que 4 entre 4 y 10 mas de 10

Sistema Valores de entrada


10000 100000

9999 50000 99999

menor 10000 entre 10000 y 99999 mas de 99999


Salidas

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 17

Las particiones de equivalencia se identifican utilizando las especificaciones del programa o


la documentacin del usuario y el probador utiliza la experiencia para predecir que clases de
valores de entrada son probables que detecten errores.
Por ejemplo, suponga que una especificacin del programa indica que el programa acepta de
entre 4 y 10 valores de entradas de nmeros de 5 cifras mayores de 10000. En la figura se
indica una serie de valores de pruebas utilizando las particiones de equivalencia.

Ingeniera de Programacin (4 Fsicas) J.M. Drake 17


Verificacin y Validacin

2
0
0
8
Pruebas estructurales (Caja blanca)

En las pruebas estructurales las pruebas se seleccionan en


funcin del conocimiento que se tiene de la implementacin
del mdulo.
Se suelen aplicar a mdulos pequeos.
El probador analiza el cdigo y deduce cuantos y que
conjuntos de valores de entrada han de probarse para que al
menos se ejecute una vez cada sentencia del cdigo.
Se pueden refinar los casos de prueba que se identifican con
pruebas de caja negra.

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 18

Ingeniera de Programacin (4 Fsicas) J.M. Drake 18


Verificacin y Validacin

2
0
0
8
Ejemplo de prueba estructural

Public static void search (int key,


int[] elemArray, Result r) elemArray key r
{ int bottom= 0;
int top =elemArray.length-1; 17 17 (true,1)
int mid;
17 0 (false,??)
r.found=false; r.index=-1;
while (bottom <=top) 17,21,23,29 17 (true,1)
{ mid=(top+bottom/2;
if (elemArray[mid] ==key) 9,16,18,30,31,41,45 45 (true,7)
{r.index=mid; r.found=true;
return;} 17,18,21,23,29,38,41 23 (true,4)
else
{if elemArray[mid]<key)
17,18,21,23,29,33,38 21 (true,3)
bottom =mid+1; 12,18,21,23,32 23 (true,4)
else
top=mid-1; } 21,23,29,33,38 25 (false,?)
}}}

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 19

El ejemplo Java, consiste en una funcin de bsqueda binaria que busca el entero key dentro
del elemArray, retornando en el objeto r un campo booleano r.found que indica si ha sido
encontrado, y un campo r.index que retorna la posicin del elemento encontrado.
Las 8 pruebas que se proponen, hacen que todas las sentencias del cdigo se ejecuten al
menos una vez, y que en todas las sentencias condicionales se elijan cada una de las dos
opciones que tienen.

Ingeniera de Programacin (4 Fsicas) J.M. Drake 19


Verificacin y Validacin

2
0
0
8
Pruebas de integracin

Se prueban la respuesta de grupos de mdulos interconectados


a fin de detectar fallos resultantes de la interaccin entre los
componentes.

Las pruebas de integracin se realizan con referencia a las


especificaciones del programa.

La principal dificultad de las pruebas de integracin es la


localizacin de los fallos.

Para facilitar la deteccin de los errores se utilizan tcnicas


incrementales.

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 20

Una vez que se han probado los componentes individuales del programa, deben integrarse
para crear un sistema parcial o completo. En el proceso de integracin hay que probar el
sistema resultante con respecto a los problemas que surjan de las interacciones de los
componentes.
Las pruebas de integracin se desarrollan a partir de la especificacin del sistema y se
inician tan pronto como estn disponible versiones utilizables de alguno componentes del
sistema.
La principal dificultad que surge en las pruebas de integracin es localizar los errores que
se descubren durante el proceso. Existen interacciones complejas entre los componentes del
sistema y cuando se descubre una salida anmala, es difcil encontrar la fuente de error.
Para hacer mas fcil la localizacin de errores , siempre se utiliza un enfoque incremental
para la integracin y prueba del sistema. De forma inicial se deben integrar un conjunto
operativo mnimo, y probarlo. Luego se agregan nuevos componentes a esta configuracin
mnima y se prueba despus de que se agrega cada incremento.

Ingeniera de Programacin (4 Fsicas) J.M. Drake 20


Verificacin y Validacin

2
0
0
8
Niveles de pruebas en sistemas orientados a objetos

En un sistema orientado a objetos se pueden identificar cuatro


niveles de prueba:
Probar las operaciones individuales asociadas a los objetos.
Probar clases de objetos individualmente.
Probar grupos de objetos.
Probar el sistema.
Para probar una clase se requiere:
Pruebas aisladas de cada operacin de su interfaz.
La verificacin de los valores que se asignan a los atributos de la
clases
La ejecucin de los objetos en todos los estados posibles en la clase.

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 21

Las tcnicas de pruebas para sistemas orientados a objetos han madurado rpidamente y hoy
en da existe una gran cantidad de informacin disponibles sobre ellas.
En un sistema orientado a objetos se pueden identificar cuatro niveles de prueba:
Probar las operaciones individuales asociadas a los objetos: Es pruebas de
funciones y se pueden utilizar las tcnicas de caja negra y blanca.
Probar clases de objetos individualmente: Dado que las diferentes funciones de
una clase estn interrelacionadas requiere un mtodo especial.
Probar grupos de objetos: En este caso nos son apropiadas las integraciones
descendente o ascendente. Se requieren nuevos enfoques.
Probar el sistema: La verificacin y validacin es la comparacin con la
especificacin de requisitos disponibles, y se realiza igual que en el caso funcional
estructurado.

Ingeniera de Programacin (4 Fsicas) J.M. Drake 21


Verificacin y Validacin

2
0
0
8
Herramienta JUnit

JUnit es un conjunto de clases que permite desarrollar y


ejecutar conjuntos de pruebas de forma sencilla y sistemtica.
Est integrada en el entorno Eclipse
Orientada a pruebas unitarias (prueba de clases en Java)

Los casos de prueba que se generan son clases Java, que


pueden ser almacenadas y reejecutadas cuando sea necesario
=> Se generan bancos de pruebas asociados al proyecto

Configuracin del proyecto para hacer uso de JUnit:


Botn derecho en el proyecto => Configure Build Path => Add
Library => seleccionar JUnit => next => Elegir JUnit 3.8.1
Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 22

Ingeniera de Programacin (4 Fsicas) J.M. Drake 22


Verificacin y Validacin

2
0
0
8
Elementos del framework JUnit

Casos de prueba (Test Case) : Clases que incluyen una serie


de mtodos para probar los mtodos de una clase concreta. Por
cada clase que queramos crear podemos crear una clase de
prueba
Mtodos de prueba : Son los mtodos que la herramienta va a
ejecutar automticamente al ejecutar la clase de prueba.
Aserciones (Asserts): Las pruebas en JUnit se basan en
programacin con aserciones
Grupos de pruebas (Test Suite): Sirven para agrupar varias
clases de prueba, y poder ejecutarlas todas seguidas.

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 23

En los ltimos aos se han desarrollado un conjunto de herramientas que facilitan la


elaboracin de pruebas unitarias en diferentes lenguajes. Dicho conjunto se denomina
XUnit. De entre dicho conjunto, JUnit es la herramienta utilizada para realizar pruebas
unitarias en Java.
El concepto fundamental en estas herramientas es el caso de prueba (test case), y la suite
de prueba (test suite). Los casos de prueba son clases o mdulos que disponen de mtodos
para probar los mtodos de una clase o mdulo concreta/o. As, para cada clase que
quisiramos probar definiramos su correspondiente clase de caso de prueba. Mediante las
suites podemos organizar los casos de prueba, de forma que cada suite agrupa los casos de
prueba de mdulos que estn funcionalmente relacionados.
Las pruebas que se van construyendo se estructuran as en forma de rbol, de modo que las
hojas son los casos de prueba, y podemos ejecutar cualquier subrbol (suite).
De esta forma, construimos programas que sirven para probar nuestros mdulos, y que
podremos ejecutar de forma automtica. A medida que la aplicacin vaya avanzando, se
dispondr de un conjunto importante de casos de prueba, que servir para hacer pruebas de
regresin. Eso es importante, puesto que cuando cambiamos un mdulo que ya ha sido
probado, el cambio puede haber afectado a otros mdulos, y sera necesario volver a
ejecutar las pruebas para verificar que todo sigue funcionando.
Aplicando lo anterior a Java, JUnit es un conjunto de clases opensource que nos permiten
probar nuestras aplicaciones Java. Podemos encontrar informacin actualizada de JUnit en:

Ingeniera de Programacin (4 Fsicas) J.M. Drake 23


Verificacin y Validacin

2
0
0
8
Creacin de una clase de prueba (Test Case)

Pulsar con el botn derecho sobre la clase a probar y elegir New


=> Other => Java => JUnit => JUnit Test Case
En la ventana que aparece a continuacin marcar que deseamos
que se cree el mtodo setUp() y pulsar next
Seleccionar los mtodos que queremos probar y pulsar Finish
Se crea la clase de prueba, de nombre <NombreClase>Test, que
extiende a junit.framework.TestCase
La clase incluye un mtodo de prueba por cada mtodo que se
quiere probar, de nombre test<nombreMetodo>
Podemos aadir ms mtodos de prueba (tambin debern
comenzar por la palabra test)

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 24

Ingeniera de Programacin (4 Fsicas) J.M. Drake 24


Verificacin y Validacin

2
0
0
8
Ejemplo: Clase de prueba para la clase Moda

import junit.framework.TestCase;

public class ModaTest extends TestCase {

protected void setUp() throws Exception {


super.setUp();
}

public void testNuevoDato() {


fail("Not yet implemented");
}

public void testModa() {


fail("Not yet implemented");
}

public void testNumVecesValor() {


fail("Not yet implemented");
}

public void testNumDatos() {


fail("Not yet implemented");
}

Santander,
} 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 25

Ingeniera de Programacin (4 Fsicas) J.M. Drake 25


Verificacin y Validacin

2
0
0
8
Mtodos de prueba

Cuando se ejecute la clase de prueba, todos los mtodos de prueba son


ejecutados automticamente.

Debemos escribir en ellos los casos de prueba que queramos verificar.

En general, la construccin de pruebas sigue siempre el mismo patrn:


Construccin de los objetos de prueba: El mtodo setUp() de la clase de prueba se
ejecuta antes de cualquier mtodo de prueba, por lo que se emplea para inicializar
variables u objetos en el estado que nos interese para cada prueba.
Verificacin de propiedades de la clase a travs de aserciones => Permiten
verificar el correcto funcionamiento de los mtodos invocados.

La ejecucin de un mtodo de prueba puede tener tres resultados posibles:


Correcto: Finaliza sin producirse ningn fallo
Failure: Se ha producido un fallo esperado, de los que estamos comprobando a
travs del caso de prueba. Se lanza la excepcin AssertionFailedError
Error: Se ha producido un error no esperado

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 26

En general la construccin de pruebas sigue siempre estos mismos patrones: construir los
objetos de prueba, y llamar al mtodo assertTrue(...) (o cualquier otro mtodo
assertXXX(...) de TestCase) para que verifique si cierta propiedad se ha cumplido o no. En
el caso de que se cumpla, se supone que la prueba ha sido satisfactoria (en nuestro caso,
comparar la matriz calculada con la que debera haber salido).

Ingeniera de Programacin (4 Fsicas) J.M. Drake 26


Verificacin y Validacin

2
0
0
8
Aserciones

Una asercin es una sentencia que nos permite probar una proposicin que debera
ser siempre cierta de acuerdo con la lgica del programa.
Ejemplo: Si invoco el mtodo clear() en una lista (elimina todos los elementos)
z Asercin de comprobacin: list.size() == 0

Cada asercin evala una expresin booleana que se supone que ser cierta si el
programa ejecuta correctamente
Si no es cierta, el sistema lanza una excepcin, poniendo de manifiesto un error en el
programa

Uso de aserciones en JUnit, a travs de estos mtodos:


void assertTrue (String msj, Boolean cond)
z Si cond es evaluada a true no pasa nada
z Si cond es evaluada a false, se lanza la excepcin AssertionFailedError y se muestra el mensaje msj.
z Ej de la lista
z assertTrue(Error en clear, list.size()==0);
void fail(String msj): Lanza siempre la excepcin AssertionFailedError y muestra el mensaje
msj. (Para mostrar fallos en excepciones)
z Equivalente a assertTrue (msj, false);

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 27

Ingeniera de Programacin (4 Fsicas) J.M. Drake 27


Verificacin y Validacin

2
0
0
8
Ejemplo
import junit.framework.TestCase;

public class ModaTest extends TestCase {

Moda m;

// Procedimiento de inicializacin (ejecutado antes de cada mtodo)


protected void setUp() throws Exception {
super.setUp();
m = new Moda(3);
}

// Procedimiento de prueba para el constructor


public void testModa() {
//Numero de datos debe ser 0
assertTrue("Error en constructor",m.numDatos()==0);
for (int i=0; i<3; i++){
assertTrue("Error en constructor para el valor+i, m.numVecesValor(i)==0);
}
}

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 28

Ingeniera de Programacin (4 Fsicas) J.M. Drake 28


Verificacin y Validacin

2
0
0
8
Ejemplo (cont.)

// Procedimiento de prueba de Moda y NuevoDato


public void testModayNuevoDato() {
// Cuando est vaco debe lanzar la excepcin NoHayValores
try {
int valor = m.moda();
fail("Excepcion NoHayValores no lanzada);
} catch (NoHayValores e) {
}
//Aado un elemento
m.nuevoDato(1);
// El nmero de datos debe haber aumentado en 1
assertTrue("Fallo actualizacin numDatos",m.numDatos()==1);
// La moda debe ser 1
try {
assertTrue("Fallo Moda", m.moda()==1);
} catch (NoHayValores e) {
fail("No se deberia haber lanzado la excepcion");
}
// Despues de llamar a moda todo se inicializa
assertTrue("Fallo inicializacin", m.numDatos()==0);
}

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 29

Ingeniera de Programacin (4 Fsicas) J.M. Drake 29


Verificacin y Validacin

2
0
0
8
Ejemplo (cont.)

//Aado un conjunto de valores


m.nuevoDato(0);
m.nuevoDato(1);
m.nuevoDato(2);
m.nuevoDato(2);
m.nuevoDato(0);
m.nuevoDato(2);
m.nuevoDato(4);
//Comprobamos el nmero de datos y el numero de veces de cada valor aadido
assertTrue("El numero de datos = "+m.numDatos()+ "deberia ser 6",m.numDatos()==6);
assertTrue("Fallo en numero de veces valor", m.numVecesValor(0)==2);
assertTrue("Fallo en numero de veces valor", m.numVecesValor(1)==1);
assertTrue("Fallo en numero de veces valor", m.numVecesValor(2)==3);

// Comprobamos el valor de la moda


try {
assertTrue("Fallo Moda", m.moda()==2);
} catch (NoHayValores e) {
fail("No se deberia haber lanzado la excepcion");
}
}

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 30

Ingeniera de Programacin (4 Fsicas) J.M. Drake 30


Verificacin y Validacin

2
0
0
8
Grupos de prueba

Se pueden agrupar varias clases de prueba en un grupo de pruebas (Test


Suite), de forma que se ejecuten todas juntas.

Las pruebas que se van construyendo se estructuran as en forma de rbol,


de modo que las hojas son los casos de prueba, y podemos ejecutar
cualquier subrbol (suite).
P.e.: Agrupar todos las clases de prueba de las clases correspondientes a un
paquete o a un grupo de clases relacionadas (Moda, MedMaxMin,
Acumulador, etc.)

Para crear un TestSuite


Botn derecho en un paquete => New => Other => Java=> JUnit=> JUnit Test
Suite
En la ventana que aparece, damos nombre al grupo y seleccionamos las clases
de prueba que queremos aadir al grupo

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 31

Ingeniera de Programacin (4 Fsicas) J.M. Drake 31


Verificacin y Validacin

2
0
0
8
Ejecucin y Resultados

Para ejecutar una clase de prueba


o un grupo de prueba:
Botn derecho en la clase de
prueba => Run as => JUnit Test

Ejecucin sin fallos

Ejecucin con fallo esperado

Ejecucin con fallo inesperado

Santander, 2008 Ingeniera de Programacin: Verificacin y Validacin J.M. Drake 32

Ingeniera de Programacin (4 Fsicas) J.M. Drake 32