De qué hablamos:
Testing de Software:
“Las pruebas intentan demostrar que un programa hace lo que se intenta que haga, así como
descubrir defectos en el programa antes de usarlo.”
Métodos formales:
“El uso de especificaciones formales y modelos que eliminan la ambigüedad y reducen las
posibilidades de introducir errores durante el proceso de desarrollo”.
Satisfacer
Percepción del Propiedades
necesidades/requi
cliente inherentes
sitos
Genichi Taguchi: “pérdida generada por el producto a la sociedad desde el momento en que
un producto es despachado hasta el final de su vida útil medido de alguna manera ($,hs…)”
Se enfoca en “medir”
Feigenbaum: “sistema eficaz para integrar los esfuerzos de mejora de la calidad de los distintos
grupos de una organización, para proporcionar productos y servicios a niveles que permitan la
satisfacción del cliente”.
Se enfoca en “sistema”
Entonces;
¿es solo cumplir con las expectativas del cliente?
NO, va más allá, es crear un sistema, es gestionar, es involucrar
a todos los interesados es formar un sistema (partes relacionadas
con un objetivo).
“producto bien hecho con un proceso bien hecho en una
organización bien “organizada” (coloquialmente)
Calidad, QA y Control de la Calidad
Calidad: grado en el que un conjunto de características inherentes a un objeto (producto, servicio,
proceso, persona, organización, sistema o recurso) cumple con los requisitos. [ISO 9001]
QA: conjunto de acciones planificadas y sistemáticas necesarias para dar la confianza adecuada de
que un producto o servicio satisface los requerimientos dados sobre calidad. [ISO 8402]
Control de la Calidad: conjunto de los mecanismos, acciones y herramientas realizadas para detectar
la presencia de errores.
Conjugamos:
Calidad de Software: la “disciplina”, el conjunto de prácticas para lograr un software calidad. Para
“Gestionar la calidad” + “Aportar herramientas”.
Software de calidad: el que cumple los requisitos, el que produce poco impacto, el que se produce
con un proceso gestionado, el que satisface necesidades.
3. A nivel de los Proyectos: establecer un plan de calidad para el proyecto que establezca metas
de calidad para el proyecto y defina cuáles procesos y estándares se usarán.
Resumiendo
RESUMIENDO:
Hay que:
Asegurar la calidad o QA -> definir políticas, procesos, estándares
Controlar la calidad -> usar los procesos, seguir los estándares, cumplir
las políticas, auditar el uso de los procesos
¿Y quien lo hace?
“…el equipo QA responsable de administrar el proceso de pruebas de liberación.
Se aplican las pruebas del software antes de que éste se libere a los clientes.
Equipo responsable de comprobar que las pruebas del sistema cubran los requerimientos y de
mantener los registros adecuados del proceso de pruebas”
Desmenuzamos:
existe un equipo de QA,
el equipo administra el proceso de QA ,
este proceso es para liberar un software (darle el OK),
debe asegurarse que las pruebas de sistemas cubran los requerimientos,
mantener registros Aparece acá “Pruebas de Sistemas” … el Testing del Software
Tolerancia
Es aceptable en software?
La tolerancia en manufactura es conocida.
En software, la cantidad de defectos es conocida?
Esto es polémico?
¿Podemos especificar completamente y sin ambigüedades un software? (así como se pueden
especificar las dimensiones y forma de un engranaje)
Los requerimientos dependen de la interpretación/visión del analista, desarrollador, cliente
Si el relevamiento de los requerimientos… ¿no incluyó a todos los interesados? Puede
que estos no vean alguna de sus necesidades satisfecha y opinen que el SW es “de mala
calidad” aun cuando cumplió con sus requerimientos.
No todas las características son medibles, ni pueden tener tolerancia. EJ: “mantenibilidad”,
“reusabilidad de las clases”.
Hay mucha subjetividad por lo que la definición de Crosby no es muy aplicable.
Incertidumbre
◦ Puede que NO estén incluidos el 100% de los interesados
◦ Puede que NO sea factible relevar el 100% de los requisitos
◦ Puede que la especificación sea interpretada de diferentes maneras por las partes involucradas
en el proceso
¿Entonces?
La valoración de calidad del software es un proceso subjetivo e implica responder:
1. ¿En el proceso de desarrollo se siguieron los estándares de programación y documentación?
2. ¿El software se verificó de manera adecuada? (según el proceso establecido)
3. ¿El software es suficientemente confiable para usarse? (no falla)
4. ¿El rendimiento del SW es aceptable para uso normal? (soporta el proceso y sus tiempos)
5. ¿El software es utilizable? (fácil de usar, de navegar, ux)
6. ¿El software está bien estructurado y es comprensible? (el código)
7. ¿El software es seguro? (ethical hacking)
Al ser subjetivo, hay 5 visiones (o puntos de vistas) según a donde me paro para ver la calidad:
COSTO DE LA CALIDAD: Hacer calidad cuesta, pero los errores evitables también cuestan.
Costos en que se incurren cuando se diseña, implementa, opera y mantiene los sistemas de calidad
de una organización, costos empresariales ligados a los procesos de mejora continua.
COSTO DE LA NO-CALIDAD: costos de sistemas, productos y servicios que NO dieron frutos al ser
rechazados por el mercado.
Costo de la calidad o NO-calidad, el gasto en $$$ que representa obtener la calidad o el gasto en
$$$ que aparece por NO obtenerla.
Verificación:
se enfoca más al proceso de evaluación del sistema o componentes ya que permite determinar si
los productos de una determinada fase del desarrollo satisfacen las condiciones impuestas en el
inicio de la etapa.
“¿Estamos construyendo el producto CORRECTAMENTE?”.
(trabajamos bien cumpliendo lo que pide el proceso que fijo QA y sus entregables y verificando que
paso que damos apunta a satisfacer los requisitos)
Validación:
validar el software para asegurarse de que cumple lo que el cliente quiere.
Es una evaluación del sistema o componentes solo que es en el transcurso o al final del proceso del
desarrollo para determinar si cumple con las necesidades del cliente.
“¿Estamos construyendo el producto CORRECTO?”. (hicimos lo que nos pidieron?)
Testing: 2 objetivos:
1. Demostrar al desarrollador y cliente q el SW cumple con los requerimientos (pruebas de validación)
2. Encontrar situaciones donde el comportamiento del SW sea incorrecto, indeseable o no esté de
acuerdo con su especificación. (pruebas de defecto)
DEFINICIONES “Pruebas intentan DEMOSTRAR que un programa hace lo que se intenta que haga, así
TESTING
como DESCUBRIR defectos en el programa ANTES de usarlo”. [Ian Sommerville]
“Proceso de ejecutar un programa con la intención de detectar errores”
Un test es “exitoso” cuando encuentra nuevos errores. [The Art of SW testing – Glenford Myers]
“Proceso compuesto por todas las actividades del ciclo de vida del SW, (estáticas y dinámicas),
concernientes a planificación, preparación y evaluación de productos de software y productos
relacionados para determinar si satisfacen los requerimientos especificados, para demostrar que se
adecuan al propósito y detector defectos”. [ISTQB]
La definición del ISTQB es más completa:
Proceso
Actividades en todo el ciclo de vida
Actividades estáticas (inspeccionar) y dinámicas (testear, ejecutar)
Planear (incluir dentro del proyecto)
Preparar (pensar las pruebas y armarlas)
Evaluar (chequear las pruebas)
Software y productos relacionados (soft, documentación …)
Planear: Las actividades tienen lugar antes y después de la ejecución de la prueba. Necesitamos
administrar las pruebas; EJ: planeamos lo que queremos hacer; Controlamos las actividades de
prueba; Informamos sobre el progreso de las pruebas y el estado del software bajo prueba; Y
finalizamos o cerramos las pruebas cuando se completa una fase.
Preparar: elegir qué pruebas harán, seleccionando condiciones de prueba y diseñando CP.
Evaluar: Ejecutar las pruebas, comprobar los resultados y evaluar el SW bajo prueba y los criterios
de finalización, para decidir si terminamos las pruebas y si el producto de SW ha superado las
pruebas.
¿Quién tiene la culpa? la persona … todos somos falibles, el testing es la herramienta para
ayudarnos a encontrar los errores, pero no para echar la culpa… (aspecto psicológico)
Al hacer testing yo resultados o comportamientos que NO son los que debería observar, pero NO
observo el defecto, el bug, luego … es tarea de desarrollo buscar el bug.
NIVELES DE TESTING:
Existen varios modelos de desarrollo (modelo de desarrollo en cascada, modelo de desarrollo en V,
el modelo de desarrollo Scrum).
c/u lleva incorporado el test dentro, como etapa o actividad.
1)Testing de Componentes:
Punto de vista de Desarrollador (Son pruebas de Desarrollador)
Busca defectos, y prueba componentes de código que pueden ser separados.
Se prueba cada componente tras su construcción.
Alcance:
◦ Solo se prueban componentes individuales
◦ Cada componente es probado de forma independiente
Base de pruebas:
◦ Requisitos de componentes
◦ Diseño detallado
◦ Código
Objetos de prueba típicos:
◦ Componentes
◦ Programas
◦ Conversión de datos / programas de migración
◦ Módulos de bases de datos
2)Testing de Integración:
Punto de vista de Desarrollador
Prueba la interface entre distintos componentes, y las interacciones con otras partes del sistema, o
con el sistema operativo, o con el hardware o con otros sistemas.
Cuanto mayor sea el alcance de la integración, más difícil se hace para aislar las fallas de un
elemento o sistema específico, que puede conducir a un aumento del riesgo.
Las estrategias sistemáticas de integración pueden estar basadas en la arquitectura del sistema (EJ:
de arriba abajo y de abajo hacia arriba), tareas funcionales, las secuencias de procesamiento de
transacciones, o algún otro aspecto del sistema o componente.
Alcance:
◦ Se prueban grupos de componentes
◦ Se puede implementar a nivel subsistemas si se tiene un grupo de los mismos
◦ Comprueban la interacción entre componentes respecto de la especificación de
interfaces.
Base de pruebas:
◦ Diseño de software y de sistema
◦ Arquitectura
◦ Flujos de trabajo
◦ Casos de uso
Objetos de prueba típicos:
◦ Subsistemas
◦ Implementación de base de datos
◦ Infraestructura
◦ Interfaces
◦ Configuración del sistema y datos de configuración
3)Testing de Sistemas:
Punto de vista de Usuario
Se verifica contra los requerimientos.
Se usa un entorno de prueba similar al de producción. Se prueban procesos de negocio, casos de
uso, u otras descripciones de alto nivel del comportamiento del sistema.
Alcance:
Adecuación (Suitability): ¿Las funciones implementadas son adecuadas para su uso esperado?
Exactitud (Accuracy): ¿Las funciones presentan los resultados correctos (acordados)?
Interoperabilidad (Interoperability): ¿Las interacciones con el entorno del sistema presentan algun
problema?
Cumplimiento de Funcionalidad (Compliance): ¿El sistema cumple con normas y reglamentos
aplicables?
Seguridad (Security): ¿Están protegidos los datos/programas contra acceso no deseado o perdida?
Base de pruebas:
Especificación de requisitos del sistema y del software
Casos de uso
Especificaciones funcionales
Informes de análisis de riesgos
Objetos de prueba típicos:
Manuales de sistema, usuario y funcionamiento
Configuración del sistema y datos de configuración
4)Testing de Aceptación:
Punto de vista de Usuario (responsabilidad de clientes y/o usuarios de un sistema).
Objetivo establecer confianza en el sistema, las partes del sistema o características específicas y NO
funcionales del sistema.
Evalúan la disposición del sistema para el uso, aunque NO es necesariamente el nivel final de las
pruebas. Son pruebas parciales y de alto nivel.
Alcance:
Se verificará que el software satisface los requisitos del cliente
Base de pruebas:
Requisitos de usuario
Requisitos de sistema
Casos de uso
Procesos de negocio
Informes de análisis de riesgos
Objetos de prueba típicos:
Procesos de negocio en sistema completamente integrado
Procesos operativos y de mantenimiento
Procedimientos de usuario
Formularios
Informes
Datos de configuración
Modelo en V:
Mejora inconvenientes del modelo en cascada (Ej:
los defectos se encontraban al final del proceso).
La idea de este modelo es que el testing comience
lo antes posible.
Rama izquierda: análisis y definición del proyecto.
La base es la implementación que transcurre a lo
largo de un tiempo.
Rama derecha: es la integración y verificación de
lo desarrollado. Diferencia con modelo en cascada
en la preparación temprana de los distintos test.
Aspectos Psicológicos:
La mentalidad necesaria para desarrollar es diferente de la mentalidad para testear. El testing puede
ser visto como ‘algo destructivo’ más que constructivo.
Identificar fallas durante un test pueden ser percibidas como críticas contra el producto o autor.
Si los errores son comunicados de una forma constructiva los malos sentimientos entre testeadores
y desarrolladores/analistas pueden ser evitados.
A su vez, que el mismo desarrollador pruebe su propia creación no lo libera de volver a omitir en el
test un punto que omitió en el desarrollo. O un testeador dentro del equipo puede verse presionado
por el desarrollo o por el líder del proyecto. El test es mejor si es independiente.
Ética Profesional
Tener en cuenta al realizar el test:
Garantizar la confidencialidad al cliente (dado que manejaremos info privilegiada).
Cuidar la integridad/reputación del cliente.
Ser honesto.
Acordar los objetivos con el cliente.
Comunicar claramente y a tiempo los resultados y confirmar que los entendieron.
Evitar que personas ajenas alteren la información/accedan a las herramientas.
Seguir los lineamientos de seguridad laboral.
CLASE3
Depuracion Vs Test (Según ISTQB)
El proceso de depuración y el proceso de pruebas son diferentes.
Las pruebas dinámicas identifican fallos provocados por defectos.
Depuración actividad de desarrollo que localiza, analiza y elimina la causa del fallo (el defecto).
Depuración (Debbuging)
Es una excelente herramienta de test.
Los programadores hacen algunas pruebas del código que desarrollaron.
Revela con frecuencia defectos del programa que deben eliminarse.
Prueba de defectos: establece la existencia de defectos
Depuración: localiza y corrige dichos defectos.
Para ser formales, las pruebas unitarias, prueba de componentes debería ir más allá de la
depuración.
Ventajas:
- Todo el código escrito tiene al menos 1 test
- Continuamente estoy armando los casos para
hacer un test de regresión
El test se escribe antes del código, se codifica y lo que se codifico se prueba, si no pasa … no avanzo
en el desarrollo, si pasa el test me muevo a la próxima iteración.
Código se desarrolla incrementalmente, junto con una prueba para ese incremento
Proceso de Testing:
Etapa de Pruebas
1. Testing de Desarrollo. El Sistema es testeado durante el desarrollo para encontrar defectos.
◦ Testing de Unidad busca defectos, prueba el funcionamiento de cada
componente, lo prueba aislado, puede automatizarse.
◦ Testing de Componentes la unidad que forman actúa según lo especificado,
Prueba interfaces entre los componentes, NO es aislado, puede automatizarse.
◦ Testing de Sistemas funcional, el sistema actúa correctamente, Prueba las
interacciones entre componentes. Es la prueba de un “todo”, puede automatizarse.
2. Testing de Release (de liberación). Un equipo de testing separado del de desarrollo, prueba
una versión complete del Sistema antes de liberarla al usuario.
3. Testing de Usuario. El usuario prueba el Sistema en su propio entorno para aceptarlo.
Testing de componentes
Prueban la interface de los componentes, fallas que puedan ocurrir por defectos en las interfaces o
por supuestos inválidos en las mismas.
“Estos errores NO suelen ocurrir cuando se los prueba individualmente, porque el mismo testeador
define los valores que le pasa a cada componente, pero en la prueba de componentes son otros
“componentes” los que definen esos valores”.
Testing de sistemas
Los componentes son compatibles?
Los datos que se transfieren entre ellos están OK?
El comportamiento del Sistema esta OK?
2. Testing de Release (de liberación): Lo hace un equipo de testing separado del de desarrollo.
prueba una versión complete del Sistema antes de liberarla al usuario (o del proceso de desarrollo).
Se enfoca más en validar el software que en encontrar fallas.
Objetivo: convencer que funciona y que puede usarse
Técnicas usadas técnicas de caja negra
test de regresión
test basado en requerimientos
test de performance
test de usuario (alfa beta y de aceptación)
1. Pruebas alfa, donde los usuarios del software trabajan con el equipo de diseño para probar el
software en el sitio del desarrollador.
2. Pruebas beta, una versión del software se pone a disposición de los usuarios, para permitirles
experimentar y descubrir problemas que encuentran con los desarrolladores del sistema.
3. Pruebas de aceptación, donde los clientes prueban un sistema para decidir si está o no listo para
ser aceptado por los desarrolladores del sistema y desplegado en el entorno del cliente.
-Pruebas de Funciones:
Las funciones son “lo que” el sistema hace. Se deja documentado en especificación de requisitos,
casos de uso o una especificación funcional, o incluso pueden no estar documentadas.
Las pruebas funcionales pueden llevarse a cabo en todos los niveles de pruebas.
Tienen en cuenta el comportamiento externo del software (pruebas de caja negra).
Se deben obtener condiciones de prueba y casos de prueba a partir de la funcionalidad requerida
de un software.
BASADAS EN ESPECIFICACION
Aparecio un concepto:
Cuando planeo la prueba determino estas condiciones de prueba, en las etapas de análisis y diseño
(ISTQB) derivo (analizo) las condiciones de prueba de los requisitos del cliente y en base a ellas
diseño casos de prueba.
Condiciones:
1) Cuando un nombre de usuario y pass correctos son ingresados, el usuario es logueado al sistema
2) Cuando un nombre de usuario es ingresado con un password incorrecto, se muestra un mensaje de error
3) Cuando un nombre de usuario invalido es ingresado con un pass incorrecto se muestra un mensaje de error
4) Cuando un nombre de usuario correcto es ingresado todo en mayúscula o todo en minúscula o combinaciones y con
una pass correcta entonces el usuario es logueado al sistema
5) Cuando no hay conexión a internet o al servidor se muestra un mensaje de error
6) Cuando una vez ingresado el nombre de usuario y la pass, correcto o no, se demora mas de 10 segundos se debe
mostrar un mensaje de error
incluyen, pero sin limitarse a ello, pruebas de rendimiento, pruebas de carga, pruebas de estrés,
pruebas de usabilidad, pruebas de mantenibilidad, pruebas de fiabilidad y pruebas de portabilidad.
pueden ejecutarse a todos los niveles de prueba
Las pruebas no funcionales tienen en cuenta el comportamiento externo del software y, en la
mayoría de los casos, para ello utiliza técnicas de diseño de pruebas de caja negra.
BASADAS EN ESPECIFICACION
Pruebas de Estructura / Arquitectura
Las pruebas estructurales (caja blanca) pueden realizarse en todos los niveles de prueba.
Utiliza técnicas de caja blanca. Se usan después de las técnicas “basadas en especificación” para
determinar la cobertura, para medir la exhaustividad de las pruebas.
“La cobertura es la medida en que un juego de pruebas ha probado una estructura, expresada
como porcentaje de los elementos cubiertos”. (código, sentencia, decisiones).
Las pruebas estructurales pueden basarse en la arquitectura del sistema, como por ejemplo una
jerarquía de llamadas.
Pruebas de Mantenimiento
El sistema, sus datos de configuración o su entorno son objeto de frecuentes correcciones,
modificaciones o ampliaciones.
Además de probar lo que se ha modificado, las pruebas de mantenimiento incluyen pruebas de
regresión a partes del sistema que no han sido objeto de modificaciones.
Casos de Prueba
“Un conjunto de valores de entrada, precondiciones de ejecución, resultados esperados, y
poscondiciones de ejecución, desarrollados para probar un objetivo en particular o una condición
de test así como también para verificar la conformidad con un requisito”.
[ISTQB - Glosario]
Para verificar por completo que todos los requerimientos de una aplicación se cumplan, tiene que
haber por lo menos dos Casos de Prueba para cada requerimiento: uno positivo y otro negativo
Resultados
◦ Salida esperada: Contiene una descripción de lo que el analista debería ver tras
haber completado todos los pasos de la prueba.
◦ Salida obtenida: Contiene una breve descripción de lo que el analista encuentra
después de que los pasos de prueba se hayan completado.
◦ Resultado: Indica el resultado cualitativo de la ejecución del caso de prueba, a
menudo con un Correcto/Fallido.
◦ Severidad: Indica el impacto del defecto en el sistema: Grave, Mayor, Normal,
Menor.
◦ Evidencia: En los casos que aplica, contiene información, bien un link al print de
pantalla (screenshot), bien una consulta a una base de datos, bien el contenido de
un fichero de trazas, donde se evidencia la salida obtenida.
◦ Seguimiento: Si un caso de prueba falla, frecuentemente la referencia al defecto
implicado se debe enumerar en esta columna. Contiene el código correlativo del
defecto, a menudo corresponde al código del sistema de tracking de bugs que se esté
usando.
◦ Estado: Indica si el caso de prueba está: No iniciado, En curso, o terminado.
Aspectos Psicologicos:
La mentalidad necesaria para desarrollar es diferente de la mentalidad necesaria para testear. El
testing puede ser visto como ‘algo destructivo’ mas que constructivo.
Identificar fallas durante un test pueden ser percibidas como críticas contra el producto o contra su
autor. Por lo que suele verse como “algo destructivo” (algo malo). Cuando en realidad es una
poderosa herramienta.
Si los errores son comunicados de una forma constructiva los malos sentimientos entre testeadores
y desarrolladores/analistas pueden ser evitados.
A su vez, que el mismo desarrollador pruebe su propia creación no lo libera de volver a omitir en el
test un punto que omitió en el desarrollo. O un testeador dentro del equipo puede verse presionado
por el desarrollo o por el líder del proyecto. El test es mejor si es independiente.
Etica Profesional
Tener en cuenta al realizar el test:
◦ Garantizar la confidencialidad al cliente (dado que manejaremos info privilegiada).
◦ Cuidar la integridad/reputación del cliente.
◦ Ser honesto.
◦ Acordar los objetivos con el cliente.
◦ Comunicar claramente y a tiempo los resultados y confirmar que los entendieron.
◦ Evitar que personas ajenas alteren la información/accedan a las herramientas.
◦ Seguir los lineamientos de seguridad laboral.
Estáticas Dinámicas
Pruebas Estáticas: se realizan examinando los productos de software pero sin ejecutar el código,
por ejemplo, revisando ‘requerimientos’, ‘diseños’, ‘un plan de test’ o ‘un manual de usuario’.
Pruebas Dinámicas: se realizan ejecutando código. Son técnicas para detectar defectos (fallas
observables).
Pruebas Estructurales: de caja blanca o basada en el código. Revisamos los caminos que sigue el
Soft, el algoritmo. Toma el punto de vista del desarrollador. Verificar que cada componente es
operativo.
Pruebas Funcionales: de caja negra o basado en la especificación del usuario o de caja negra. La
idea es verificar que el comportamiento observado del software cumple o no con sus
especificaciones. La prueba funcional toma el punto de vista del usuario.
Prueba no incremental:
◦ Primero se efectúa la prueba de componentes separados. Luego se integran para
formar el programa completo.
◦ La prueba de cada módulo requiere de otro, que lo llame y llamados.
Prueba incremental:
◦ El siguiente componente en ser probado se combina con los ya probados.
◦ La prueba puedes ser BottomUp o Top Down.
Pruebas Bottom Up: desde abajo (componentes) integrando hacia arriba (subsistema, sistema)
Hasta que tenemos cierta cantidad de componentes desarrollados … la aplicación no es “visible”.
Pruebas Top Down: desde arriba, el sistema, y profundizando en cada componente.
Requiere dummies para los componentes aun no desarrollados.
Requiere regresión.
Puede demorarse la prueba de una funcionalidad completa (porque no está desarrollada en su
totalidad).
Técnicas de Testing
Técnicas Estáticas:
El objetivo fundamental de las pruebas estáticas es mejorar la calidad de los productos de software
ayudando a los ingenieros a reconocer y corregir sus propios defectos a principios del proceso de
desarrollo de software.
Mientras que las técnicas de prueba estática no resolverán todos los problemas, son enormemente
eficaces.
Las pruebas estáticas no deben considerarse un reemplazo para las pruebas dinámicas, pero todas
las organizaciones de software deben considerar el uso de revisiones en todos los aspectos
principales de su trabajo, incluyendo requisitos, diseño, implementación, pruebas y mantenimiento.
Lo mas usado es la revisión o inspección por pares. Buscando posibles errores u omisiones.
La revisión debe comprobar la coherencia e integridad de los documentos o el código objeto de
prueba, y asegurarse de que se han seguido las normas de calidad.
No sólo es acerca de la comprobación de conformidad con las normas, sino también se utiliza para
ayudar a descubrir problemas y omisiones en la documentación del software o proyecto.
También… ayuda a que los participantes aprendan acerca del Proyecto en el que están
involucrados.
Y… nos ayuda a determinar donde están los productos mas riesgosos. Testing dinámico sobre todo
y con todos los casos de prueba posibles es muy improbable, priorizamos por riesgo o criticidad, las
revisión nos da una idea de riesgos (donde encontramos mas problema durante la inspección? y
que parte vimos mas compleja?)
Revisiones e Inspecciones
Digamos, las inspecciones son las revisiones mas formales. En la práctica las revisiones informales
son las mas utilizadas. El grado de formalidad depende mucho de factores como la madurez del
proceso de desarrollo, de regulaciones legales, o de algún requerimiento para una auditoria.
Pueden participar dos o mas personas.
En las primeras etapas del desarrollo una persona puede solicitar a un colega … que revise un
documento, un diseño, un relevamiento.
En etapas mas avanzadas pueden ser grupos de personas reunidos cumpliendo una formalidad y
dejando asentado el resultado.
El objetivo es … ayudar al quien lo solicito a mejorar la calidad de su trabajo.
FASES
Fase: PLANEAR
1. Planificación:
◦ Definir los criterios de revisión (¿Qué vamos a buscar dentro de los entregables?)
◦ Seleccionar al personal
◦ Asignar funciones (al menos un moderador, un líder, y un “secretario”; que tipos de
defectos busca cada uno)
◦ Definir los criterios de entrada y salida para tipos de revisión más formales (EJ: las
inspecciones)
◦ Seleccionar qué partes de los documentos deben revisarse
Fase: Preparación
3. Preparación individual
◦ Prepararse para la reunión de revisión repasando los documentos
◦ Anotar posibles defectos, preguntas y comentarios
Fase: reunión de revisión
4. Examen/evaluación/registro de los resultados (reunión de revisión)
◦ Debatir o registrar, mediante resultados documentados o actas (para tipos de
revisión más formales)
◦ Anotar defectos, hacer recomendaciones sobre cómo manejar los defectos, tomar
decisiones de los defectos
◦ Examinar/evaluar y registrar problemas durante reuniones físicas o registrar
cualquier comunicación electrónica del grupo
◦ • Critical: defects will cause downstream damage; the scope and impact of
the defect is beyond the document under inspection.
◦ • Major, defects could cause a downstream effect (e.g. a fault in a design can
result in an error in the implementation).
◦ • Minor, defects are not likely to cause downstream damage (e.g. non-compli
ance with the standards and templates).
Fase: retrabajo o reconstrucción
5. Reconstrucción (del producto que inspeccionamos)
◦ Corregir los defectos detectados (normalmente a cargo del autor)
◦ Registrar el estado actualizado de los defectos (en revisiones formales)
Fase: Seguimiento
6. Seguimiento
◦ Comprobar que los defectos han sido tratados
◦ Recopilar métricas
◦ Comprobar los criterios de salida (para tipos de revisión más formales)
Tipos de Revisiones
* Informal
* Guiada (Walkthrough)
* Técnica
* Inspección
[ISTQB Foundation Level Syllabus Cap. 3 - 3.2.3]
Revisión Informal
1. Ausencia de un proceso formalizado por la organización
2. Puede adoptar la forma de programación en pareja o una revisión por parte de un líder
3. técnico de los diseños y el código
4. Los resultados pueden estar documentados
5. Su utilidad varía en función de los revisores
6. Objetivo principal: forma barata de obtener beneficios
Revisión Técnica
1. Proceso documentado y definido para la detección de defectos que incluye la participación
de pares y expertos técnicos, siendo la participación de la dirección opcional
2. Puede llevarse a cabo como una revisión entre pares sin la participación de la dirección
3. Idealmente está dirigida por un moderador formado (distinto del autor)
4. Preparación previa a la reunión por parte de los revisores
5. Uso opcional de listas de comprobación
6. Elaboración de un informe de revisión en el que se incluya la lista de hallazgos, el veredicto
de si el producto de software cumple los requisitos y, si procede, recomendaciones en base
a los hallazgos
7. Puede variar en la práctica desde bastante informal hasta muy formal
8. Objetivos principales: debatir, tomar decisiones, evaluar alternativas, encontrar defectos,
resolver problemas técnicos y comprobar la conformidad con las especificaciones, los planes,
la normativa y los estándares
Inspección
1. Dirigida por un moderador formado (distinto del autor)
2. Generalmente celebrada como una examinación entre pares
3. Funciones definidas
4. Incluye recopilación de métricas
5. Proceso formal basado en normas y listas de comprobación
6. Criterios de entrada y salida especificados para la aceptación del producto de software
7. Preparación previa a la reunión
8. Informe de inspección en el que se incluye una lista de hallazgos
9. Proceso de seguimiento formal (con proceso de mejora de componentes opcional)
10. Lector opcional
11. Objetivo principal: identificar defectos
Usamos un checklist
Con frecuencia se usa una lista de verificación de errores comunes de programación para enfocar la
búsqueda de bugs.
Esta lista de verificación se basa en ejemplos de libros, o bien, en el conocimiento de defectos
normales en un dominio de aplicación común.
Para diferentes lenguajes de programación se usan distintas listas de verificación, puesto que cada
lenguaje tiene sus errores característicos.
METRICAS
Complejidad Ciclomática
Es una métrica cuantitativa de la complejidad lógica de un código.
Se basa en el cálculo de la cantidad de caminos independientes dentro del programa.
Un camino es independiente cuando se introduce una nueva sentencia o una nueva condición
respecto de los anteriores.
Los caminos se identifican a partir de las estructuras de control (condiciones, bucles, …) y a partir
del diagrama de flujo de cada uno de nuestros métodos.
Al calcular la complejidad ciclomática obtenemos el número máximo de casos a probar, por lo que
es importante para el testing.
Propuesta por Thomas McCabe en 1976 (si, en 1976)
Se calcula:
1- Sumando la cantidad de decisiones binarias en el código (if, while, for …) y agregándole 1
2- Por detección y recuento de caminos independientes.
3- En el diagrama de flujo, visualmente:
◦ CC = nro. de regiones cerradas + 1
◦ CC = nro. de decisiones simples + 1 (if+1)
4- Con fórmula:
◦ CC = A –N + 2 donde A es el nro. de aristas y N el nro. de nodos
◦ CC = A –N + 2*S donde S es el nro. de nodos de salida
A partir de un grafo
Caja Blanca: o basada en el código. Revisamos los caminos que sigue el Soft, el algoritmo. Toma el
punto de vista del desarrollador. Verificar que cada componente es operativo. §Se enfoca en
verificar Comportamiento interno y Estructura.
Caja Negra: o basado en la especificación del usuario o de caja negra. La idea es verificar que el
comportamiento observado del software cumple o no con sus especificaciones. La prueba funcional
toma el punto de vista del usuario. §Se enfoca en verificar el Comportamiento en función de sus
entradas y salidas.
TECNICAS DE TESTING
Prueba de Caja Blanca
◦ Prueba de camino básico
◦ Prueba de bucles
◦ Prueba de bucles no estructurados
Prueba de Caja Negra
◦ Partición equivalente
◦ Valores límites
◦ Tablas de decisión
◦ Transición de estados
Prueba de Carga y Stress
Prueba de Humo
Prueba de Regresión
Prueba de UI
Prueba de Ayuda
Ethical Hacking
CLASE 5
Para testear tenemos que diseñar
Es muy importante la creación de los casos de prueba, dado que no se puede probar el 100%,
entonces:
¿Qué conjunto de casos de prueba tiene la máxima probabilidad de encontrar la mayor cantidad de
errores?
1. Al menos uno que pruebe el escenario básico, que sea positivo, el curso normal, que
demuestre que el requerimiento ha sido satisfecho.
2. Otro para reflejar que es inaceptable, anormal o inesperada la condición o dato, algo
negativo.
3. La idea es cubrir la mayor parte con técnicas de caja negra y, si es necesario, cubrir algunos
aspectos con técnicas de caja blanca.
4. Debemos seguir criterios que nos permitan mediante métricas … establecer la cobertura.
Descripción
Precondiciones
condiciones necesarias para ejecutar el caso de prueba.
◦ Si no se cumplen no se puede iniciar el caso.
◦ Lo que se representa es un estado y no la ejecución de una serie de acciones.
Ejemplos:
◦ [Tabla / Parámetro/ Variable / Atributo, Campo, etc] debe estar configurada/o con el
valor…
◦ Se debe estar en la pantalla …
◦ La sesión debe estar iniciada …
◦ Se debe haber ejecutado el proceso …
Datos de Entrada
Conjunto de valores de entradas y salidas esperadas: especificamos los valores “correctos” y los
“incorrectos”.
Cada paso tiene un resultado esperado. El formato para la respuesta esperada será el siguiente:
◦ Que se + suceda algo
◦ Que algo sea…
Ejemplos:
◦ Que se visualice por pantalla…
◦ Que se genere el archivo…
◦ Que el valor por defecto del campo sea…
Post Condiciones
“Condiciones de entorno y estado, del software, que deben ser satisfechas tras la ejecución de una
prueba o un procedimiento de pruebas”.
Lo que se representa es un estado y no la ejecución de una serie de acciones (previas o posteriores
al caso de uso)
Resultado
Del caso de pruebas:
Salida esperada: Contiene una descripción de lo que el analista debería ver tras haber
completado todos los pasos de la prueba. El estado esperado del sistema, el valor esperado
de las variables o los datos que se espera que devuelva.
Salida obtenida: Contiene una breve descripción de lo que el analista encuentra después de
que los pasos de prueba se hayan completado. El estado real del sistema, el valor real de las
variables o los datos que devolvió.
Resultado: Indica el resultado cualitativo de la ejecución del caso de prueba, a menudo con
un Correcto/Fallido.
Estado: Indica si el caso de prueba está: No iniciado, En curso, o terminado.
Ejemplos:
Métricas
“Cuando se puede medir aquello de lo cual se está hablando y se puede expresar en números, se
sabe realmente acerca de ello; pero cuando no puede medirse, y no puede expresarse en números,
el conocimiento que se tiene de ello es escaso e insatisfactorio, o puramente subjetivo.”
Lord Kelvin [1890] no es sommerville, y fue en 1890!
“Una métrica de software es una característica de un sistema de software, documentación
de sistema o proceso de desarrollo que puede medirse de manera objetiva”.
[Ian Sommerville – Ing. de Soft. 9° ed. Cap. 24.4]
Ejemplos:
De control:
esfuerzo promedio
el tiempo requerido para reparar los defectos reportados
De predicción:
complejidad ciclomática
longitud de los indicadores
cantidad de atributos y métodos de una clase
Objetivo
Objetivo
Metricas y Calidad
“Atributo de la calidad” … es una propiedad del producto, que cuando es asociada con la calidad se
relaciona con los elementos que considera el cliente para aceptar o rechazar el producto.
• Las métricas se basan en atributos del producto.
• Los atributos del producto pueden clasificarse en internos y externos.
• Los atributos internos describen al producto basado en el producto mismo.
Se miden de manera estática basado en tamaño, funcionalidad, complejidad y reusabilidad.
• Los atributos externos describen al producto de la manera como funciona en el ambiente.
• El cliente define usualmente estos atributos.
• Algunos atributos externos son adaptabilidad del producto para el problema definido,
conformidad con las especificaciones, grado de excelencia, puntualidad.
Metricas
2. Métricas estáticas, las cuales se recopilan mediante mediciones hechas de representaciones del
sistema, como el diseño, el programa o la documentación. Ejemplos de mediciones
estáticas son el tamaño del código y la longitud promedio de los identificadores que se
usaron.
Predecir
Estáticas:
Valorar el riesgo de un producto
Para planear el testing
O a donde enfocar los esfuerzos
Dinámicas
El objetivo de la monitorización de las pruebas es facilitar información de retorno y visibilidad sobre
las actividades de pruebas.
◦ * Porcentaje de trabajo realizado durante la preparación del caso de prueba (o
porcentaje
◦ de casos de prueba planificados preparados)
◦ * Porcentaje de trabajo realizado durante la preparación del entorno de pruebas
◦ * Ejecución de casos de prueba (por ejemplo, número de casos de prueba
ejecutados/no
◦ ejecutados, y casos de prueba pasados/fallados)
◦ * Información sobre defectos (por ejemplo, densidad de los defectos, defectos
detectados y
◦ corregidos, tasa de fallos y resultados de la repetición de pruebas)
◦ * Cobertura de las pruebas de los requisitos, riesgos o código
Cobertura
Es un concepto importantísimo del testing.
¿Cuánto de xxxx cubrí con las pruebas?
Cobertura de Código
En un código de 1000 líneas pruebo 700 líneas, la cobertura es del 70%.
¿Para qué sirve?
Aumenta la calidad del código, al revisar más % de mi código minimizo la cantidad de errores. Lo
mejor es tener una alta cobertura, que tienda al 100%.
¿Una cobertura del 100% implica que el programa no tiene errores? NO, solo que probé el 100%
del código. (puedo no haber probado todas las condiciones …)
Cobertura de Sentencias: se escriben casos de prueba suficientes para que cada sentencia (o un
cierto %) en el programa se ejecute, al menos, una vez. Los bucles solo se consideran una vez (al
contrario que la cobertura de caminos).
Cobertura de Condiciones: se escriben casos de prueba suficientes para que cada condición en una
decisión tenga una vez resultado verdadero y otra falso. No solo considero el resultado final de una
condición, ya que puede estar constituida por múltiples condiciones atómicas (SI a>0 y b>100
ENTONCES…)
Cobertura de Caminos: se escriben casos de prueba suficientes para que se ejecuten todos los
caminos de un programa. Entendiendo camino como una secuencia de sentencias encadenadas
desde la entrada del programa hasta su salida. Un solo camino a través de un bucle es suficiente.
Se podría agregaría un caso de prueba adicional para cada ejecución del bucle. Cada incremento en
el contador del bucle añade un nuevo caso de prueba pero no es práctico… es una locura.
Cobertura de Métodos de Objetos: se escriben casos de prueba suficientes para que se ejecuten
todos los métodos de todos los objetos.
CLASE 6
Vimos la clase pasada:
- Derivación de Casos de Prueba de Casos de Uso (no es caja blanca)
- Cobertura de Código pensado como métrica (acá empezamos caja blanca)
pensado como técnica para diseñar casos de prueba
* cobertura de sentencias
* cobertura de decisiones
* cobertura de condiciones
* cobertura de bucles (0, 1, + de 1, antes, cond, desp cond)
-> se llaman coberturas lógicas
-> caja blanca / nivel componentes
- Cobertura funcional (no es caja blanca)
- Cobertura de requerimientos (no es caja blanca)
Oráculo
En testing se presupone la existencia de lo que se llama un oráculo, que es algún tipo de método
para determinar que una salida dada, luego de un testing, es la salida esperada.
◦ Este oráculo puede ser un humano; por ejemplo, el futuro usuario del sistema.
◦ En general, el oráculo más confiable lo constituirá una especificación formal del
sistema a testear.
Driver: es un módulo de software que se usa para invocar el modulo bajo test y por lo general
proveerle de entradas, controlar y monitorear su ejecución y reporter los resultados.
Dummy/Stub: es un programa de computadora que sustituye a otro o parte de otro que está siendo
definido o lo será más adelante, y que debe simular su comportamiento real hasta que se lo
desarrolle.
Se usan en pruebas de caja blanca, donde ejecutamos códigos, que de alguna manera debemos
llamar y que probablemente no tenga los demás componentes con los cuales se relacionan
terminados.
Las pruebas estructuradas de McCabe se basan en un conjunto de caminos básicos que deducimos
del grafo de control. O dicho de otra manera, el grafo de control es una herramienta para
determinar los caminos y los casos de prueba.
Se construye un grafo equivalente al entregable de código bajo testing. Con las siguientes reglas:
◦ Existen solo un nodo inicial y solo uno final.
◦ Cada nodo representa una secuencia de instrucciones (o ninguna).
◦ La relación entre los nodos es “… el control pasa a...”.
◦ De cada nodo se desprenden uno o dos nodos hijos. Máximo DOS.
◦ Un nodo tendrá dos sucesores si dada una condición se desprenden dos caminos
posibles.
◦ For, While, Until, Case, Switch se reducen a grupos de nodos con dos sucesores (con
un máximo de DOS).
◦ Un nodo puede tener 1…n antecesores.
La ejecución de los programas es secuencial … a menos que haya un salto, o bifurcación, o vuelta
atrás por un bucle … estos cambios es lo que se modela en el grafo.
Método de McCabe
Esto significa que las secuencias de instrucciones donde no haya bifurcaciones las podemos modelar
como un solo nodo.
int a = 10; 1
int b = 10;
int x = a + b;
2
if (x > 21) {
writeln(‘mayor a 21’); 3
} else { 4
writeln(‘menor a 21’);
}
5
writeln(‘fin’);
Método de McCabe
Como sigo después:
- Cálculo la complejidad ciclomática:
CC = Aristas -Nodos + 2
1. cc = a -n + 2, siendo a el número de arcos o aristas del grafo y n el número de nodos.
2. cc = r, siendo r el número de regiones cerradas del grafo.
3. cc = c + 1, siendo c el número de nodos de condición.
Y ahora … calculo los caminos básicos.
Método simplificado:
Se comienza seleccionando el camino más corto(el vector con menor cantidad de ‘1’).
Buscar un segmento no de una decisión recorrido, tomarlo y regresar al camino base lo más pronto
posible.
Se finaliza al llegar a tener tantos caminos como la complejidad ciclomática.
Este método tiende a recorrer primero los errores, las excepciones y las salidas de emergencias.
Método general.
Se elige el camino que funcionalmente es el correcto, el que representa la operación normal del
software.
Se va variando en cada paso, agregando un arco no recorrido y volviendo tan pronto como sea
posible al camino básico.
Se finaliza al llegar a tener tantos caminos como la complejidad ciclomática.
Ahora, se generan los casos de prueba (¿Qué contienen mínimamente un caso de prueba?)
• Se selecciona un camino.
• Se avanza hasta la primera condición.
• Se identifican las variables, si son externas se deduce el valor que deben tener para tomar el
arco siguiente del camino.
• Si son internas hay que retroceder hasta encontrar las variables externas de las cuales
provienen.
• Avanzar a la próxima decisión y repetir el proceso.
Seleccionamos los caminos de prueba… en función de la cobertura que deseamos utilizar (y por
supuesto medir):
• Que se ejecuten todos los nodos. Cobertura de sentencias.
• Que se ejecuten los nodos de decisión. Cobertura de decisiones.
• Que se ejecuten los bucles. Cobertura de bucles.
• Que se ejecuten los caminos básicos. Cobertura de caminos.
Flujo de Datos
¿Que pretendo probar con la prueba de flujo de datos?
◦ Una variable que es declarada pero nunca usada dentro del programa.
◦ Una variable que es usada pero nunca declarada.
◦ Una variable que es definida varias veces antes de usarse.
◦ Destrucción de variables antes de usarlas.
Prueba de flujos de datos.
Seleccionar las rutas de pruebas de acuerdo con las ubicaciones de las definiciones, uso y
destrucción de los datos del programa. La ruta sería la secuencia de cambios de estados de los datos.
1. Se determinan potenciales errores examinando los “patrones” de uso de los datos (de las
variables).
2. Con uso se refiere a: la creación, el uso en predicados (IF), el uso en cálculos, y la destrucción.
(respectivamente: d, p-use, c-use, k).
3. Partimos del flujo del programa, lo convertimos en un gráfico de flujo de datos de los datos.
4. Posibles anomalías:
5. Anomalías de flujo de datos representa patrones de uso de datos que pueden generar una
incorrecta ejecución del código.
6. Buscamos los patrones como pares (entre dos nodos) de uso, de fin, o desasignación de la
variable.
• ADUP(alldu paths) probar cada camino du, desde la definición de la variable hasta el uso de
esta definición.
• AU(alluses) probar al menos un camino desde cada definición de cada variable a cada uso
que puede ser alcanzado por dicha definición.
• APU+C(allp-uses/somec-uses) para cada variable y cada definición de esa variable incluir al
menos un camino desde la definición hasta cada predicado que lo usa. Si existe una
definición de la variable sin un uso en un predicado agregar el camino desde dicha definición
hasta un uso en un calculo.
• ACU(allc-uses) para cada variable y cada definición de esa variable incluir al menos un
camino desde la definición hasta cada calculo que lo usa. Si existe una definición sin un
calculo … se la quita de los casos de prueba-