1 DISEÑO DE SISTEMAS DE INFORMACIÓN Tema Evaluación / Pruebas del Software Héctor Cuadra, hcuadra@uta.cl 2 Tema 3. Evaluación / Pruebas del Software Héctor Cuadra, hcuadra@uta.cl 3 Índice • Introducción – Objetivos y principios de las pruebas • Diseño de casos de prueba del software – ¿Cuál debe ser el conjunto de casos de prueba que tenga la mayor probabilidad de descubrir defectos en el software? • Estudio de técnicas de diseño de casos de prueba: caja negra y caja blanca • Las pruebas en el proceso unificado de desarrollo de software – ¿Cómo integrar las técnicas de diseño de casos de prueba en una serie de pasos bien planificados que obtienen una construcción correcta del software? Héctor Cuadra, hcuadra@uta.cl 4 Introducción. Objetivos de una prueba • La prueba es un proceso de ejecución con la intención de descubrir errores. • Un buen caso de prueba es aquel que tiene una probabilidad muy alta de descubrir un nuevo error. • Un caso de prueba no debe ser redundante. • Debe ser el mejor de un conjunto de pruebas de propósito similar. • No debe ser ni muy sencillo ni excesivamente complejo: es mejor realizar cada prueba de forma separada si se quiere probar diferentes casos. • Una prueba tiene éxito si descubre un nuevo error • Lo que no hace una prueba… Una prueba no asegura la ausencia de defectos, sólo puede demostrar que existen errores en el software. Héctor Cuadra, hcuadra@uta.cl 5 Introducción. Principios de las pruebas • Se debe hacer un seguimiento hasta ver si se cumplen los requisitos del cliente. • Las pruebas deberán planificarse mucho antes de que empiecen. • El principio de Pareto es aplicable a la prueba del software. – El 80% de los errores está en el 20% de los módulos. – Hay que identificar esos módulos y probarlos muy bien • Empezar por lo pequeño y progresar hacia lo grande. • No son posibles las pruebas exhaustivas. • Son más eficientes las pruebas dirigidas por un equipo independiente. Héctor Cuadra, hcuadra@uta.cl 6 Caso de prueba • Es un conjunto de entradas de prueba, condiciones de ejecución y resultados esperados • Tiene un objetivo concreto (probar algo) Ejemplo: CASO de PRUEBA CP1 para CASO de USO “Entrada Sistema” ENTRADA: usuario “hacker” password “kaixo” CONDICIONES DE EJECUCIÓN: no existe en la tabla CUENTA(usuario,pass,intentos) la tupla <“hacker”, “kaixo”,x> pero sí una tupla <“hacker”,“hola”,x> RESULTADO ESPERADO: no deja entrar y cambia la tupla a <“hacker”,“hola”,x+1> Objetivo del caso de prueba: comprobar que no deja entrar a un usuario existente con un password equivocado. Héctor Cuadra, hcuadra@uta.cl 7 Procedimiento de prueba • Pasos que hay que llevar a cabo para probar uno (o varios) casos de prueba: ¿cómo probar el caso de prueba y verificar si ha tenido éxito? Ejemplo: Procedimiento de prueba para CP1 - Ejecutar la clase Presentacion - Comprobar que en la BD “passwords.mdb” existe la tupla <“hacker”,“hola”,x> - Escribir “hacker”en la interfaz gráfica (en el campo de texto etiquetado “Escribe nombre usuario” - Escribir “kaixo”en la interfaz gráfica (en el campo de texto “Escribe password”) - Pulsar botón “Acceder al sistema” - Comprobar que no deja entrar al sistema y que en la BD la tupla ha cambiado a <“hacker”,“hola”,x+1> Héctor Cuadra, hcuadra@uta.cl 8 Componente de prueba • Programa que automatiza la ejecución de uno (o varios) casos de prueba • Una vez escrito, se puede probar muchas veces (cada vez que haya un cambio en el código de una clase que pueda afectarle) public class ComponentePruebaEntrSistema { InterfaceLogicaNegocio ln; InterfaceOperacionesParaPruebas lp; public static void main(String[] args) { lp.aniadirUsuario(“hacker”,”hola”,3); // Crea usuario con pass y numInt. boolean b = ln.hacerLogin(“hacker”,”kaixo”); if (b) System.out.println(“Error CP1: Permite entrada”); else { int j = lp.comprobarUsuario(“hacker”,”hola”); // Dev. Nº intentos if (j!=4) System.out.println(“Error CP1: No incr.”); else System.out.println(“CP1 correcto”);} // Fin caso prueba CP1 NOTA: se necesitarán otros métodos como comprobarUsuario,aniadirUsuario que pueden pertenecer a la lógica del negocio o no (en este caso se considera que no) Héctor Cuadra, hcuadra@uta.cl 9 ¿Cómo escribir componentes de prueba? • Se puede escribir “ad hoc” – Por cada caso de prueba, se escribe el código correspondiente en el componente (cambiaría el código) – Se escribe el código del componente de tal manera que recorra en una BD los casos de prueba y los ejecute. • Cada vez que se añada un caso de prueba, simplemente se añade en la BD, pero el código del componente no cambiaría • Se pueden usar entornos de trabajo disponibles para pruebas – Ejemplo: JUnit para Java Héctor Cuadra, hcuadra@uta.cl 10 Diseño de casos de prueba. • Definir los casos de prueba que tengan la mayor probabilidad de encontrar el mayor número de errores con la mínima cantidad de esfuerzo y tiempo. – Pruebas de caja blanca • Encontrar casos de prueba “viendo” el código interno – Pruebas de caja negra • Encontrar casos de prueba “viendo” los requisitos funcionales Héctor Cuadra, hcuadra@uta.cl 11 Pruebas de Caja Blanca: “viendo” el código interno • Aseguran que la operación interna del programa se ajusta a las especificaciones y que todos los componentes internos se han probado adecuadamente. – Usa la estructura de control para obtener los casos de prueba. – Intentan garantizar que todos los caminos de ejecución del programa quedan probados. • Pruebas de estructura de control: – Del camino básico: Diseñar un caso de prueba por cada camino indpte – De condición: Diseñar casos de prueba para que todas las condiciones del programa se evalúen a cierto/falso – De bucles: Diseñar casos de prueba para que se intente ejecutar un bucle 0,1,…,n-1,n y n+1 veces (siendo n el número máximo) Héctor Cuadra, hcuadra@uta.cl 12 Ejemplo: EsPrimo El método Esprimo.esPrimo puede ser llamado con un array de Strings Héctor Cuadra, hcuadra@uta.cl 13 Ejemplo: casos de prueba de caja blanca para EsPrimo ENTRADA OBJETIVO A PROBAR -Probar todos los caminos -Probar todas las condiciones Héctor Cuadra, hcuadra@uta.cl -Probar bucles 14 Ejemplo: Componente de prueba para EsPrimo public class ComponentePruebaEsPrimo { public static void main(String[] args) { String[] s1 = new String[0]; try {boolean b1 = Esprimo.esPrimo(s1); System.out.println(“CP1 incorrecto”);} catch (ErrorFaltaParametro e) {System.out.println(“CP1 correcto”);} catch (Exception e) {System.out.println(“CP1 incorrecto”);} String[] s2 = new String[2]; s2[0]=“xx”; s2[1]=“yy”; try {boolean b1 = Esprimo.esPrimo(s2); System.out.println(“CP2 incorrecto”);} catch (ErrorSolo1Parametro e) {System.out.println(“CP2 correcto”);} catch (Exception e) {System.out.println(“CP2 incorrecto”);} ...} Héctor Cuadra, hcuadra@uta.cl 15 Ejemplo: Componente de prueba para EsPrimo (usando JUnit) java junit.swingui.TestRunner PruebasConJUnit.ComponentePruebaEsPrimo package PruebasConJUnit; public class ComponentePruebaEsPrimo { // Un método por cada caso de prueba public void testPrimoSinPars() { num = new String[0]; try {result= Esprimo.esPrimo(num); assertTrue(false);} catch (Exception e) {assertTrue(e instanceof ErrorFaltaParametro);} } // RESTO DE CASOS DE PRUEBA... } Héctor Cuadra, hcuadra@uta.cl 16 Pruebas de Caja Negra • Se centra en los requisitos funcionales del software. • Permite obtener un conjunto de condiciones de entrada que ejerciten completamente los requisitos funcionales del programa. • No es una alternativa a la prueba de caja blanca. – Complementan a las pruebas de caja blanca Mejor diseñar los casos de prueba usando los dos tipos de técnicas Héctor Cuadra, hcuadra@uta.cl 17 Prueba de Caja Negra • Prueba de los valores límite – Los errores suelen situarse en los límites. – Si la entrada se encuentra en el rango a..b entonces hay que probar con los valores a -1, a, a + 1, b - 1, b y b + 1 – Si la entrada es un conjunto de valores entonces hay que probar con los valores max-1, max, max+1, min-1, min y min+1 Héctor Cuadra, hcuadra@uta.cl 18 Ejemplo: casos de prueba de caja negra para EsPrimo ENTRADA Héctor Cuadra, hcuadra@uta.cl OBJETIVO A PROBAR -Valores límite 19 Prueba de Caja Negra • Prueba de la partición equivalente – Método de prueba de caja negra que divide el dominio de entrada de un programa en un conjunto de clases de datos de los que se pueden derivar casos de prueba – Si la entrada es un código formado por 2 partes, la primera un prefijo opcional de 3 dígitos, que empiece por 9 y la contraseña que sea una cadena de hasta 6 caracteres que empiece necesariamente por una letra y que puede contener letras, dígitos y el símbolo $ prefijo contraseña ⇒ Se pueden diseñar casos de prueba, cada uno de los cuales representa a un conjunto de casos de prueba Héctor Cuadra, hcuadra@uta.cl 20 Prueba de Caja Negra • prefijo puede ser – – – – – “ ” “743” “935” “1983” “8pW” prefijo contraseña representa a entrada en blanco representa a número <900 representa a número entre 900 y 999 representa a número >999 representa a cadena que contiene carácter no dígito • contraseña puede ser – “ ” representa a entrada en blanco – “4a2cd$” representa a cadena que empieza por dígito y que sólo contiene letras, dígitos y $ – “4a;2c$” representa a cadena que empieza por dígito y que contiene algún carácter no letra, dígito o $ – “$ab4$b” representa a cadena que no empieza por dígito y que sólo contiene letras, dígitos y $ – “b$$;a5” representa a cadena que no empieza por dígito y que contiene algún carácter no letra, dígito o $ Héctor Cuadra, hcuadra@uta.cl 21 Ejemplo: casos de prueba de caja negra para EsPrimo Los siguientes casos de prueba (que ya estaban) también salen aplicando el criterio “partición equivalente” Héctor Cuadra, hcuadra@uta.cl 22 Pruebas en entornos y aplicaciones especializadas • Pruebas de interfaces gráficas de usuario – Pruebas sobre ventanas. – Pruebas sobre menús y uso del ratón. – Pruebas de entrada de datos. • Pruebas de documentación y de ayuda. Héctor Cuadra, hcuadra@uta.cl 23 Ejemplo: casos de prueba de negra para EsPrimo Ejemplos de CASOS de PRUEBA Héctor Cuadra, hcuadra@uta.cl -Al cerrar (minimizar,..) la ventana se cierra (minimiza,…) -Al pulsar el botón, aparece en el campo de texto el resultado -Buscar ayuda de cómo utilizar la interfaz Ejercicio Diseñar un caso de prueba de caja blanca, un caso de prueba de caja negra basado en la partición equivalente, un caso de prueba de caja negra basado en los valores límites y un caso de prueba de interfaz de usuario gráfica para el caso de uso ENTRAR EN EL SISTEMA que se describe a continuación. El flujo de eventos del caso de uso ENTRAR EN EL SISTEMA -El usuario escribe su nombre y el password -El sistema comprueba que existe una cuenta con ese nombre y password y, si es así, se le da permiso para entrar en el sistema. -Si existe el nombre de usuario pero el password es incorrecto permite reintroducir el password hasta un máximo de tres veces. Requisitos no funcionales del caso de uso ENTRAR EN EL SISTEMA -El password no debe ser visible -Los nombres de usuarios sólo pueden contener letras y como mínimo 5 letras. Héctor Cuadra, hcuadra@uta.cl 24 25 Ejercicio: Escribir componente de prueba, que pruebe el siguiente CP Caso de prueba CP2 Entrada: usuario “correcto” password “acertado” Condiciones de ejecución: en la tabla existe ese usuario con ese password y con 1 intento fallido anterior (número inferior a 3) Resultado esperado: dar paso y el número de intentos en la tabla USUARIO(cuenta,passord,numIntentos) para “correcto” es 0 Héctor Cuadra, hcuadra@uta.cl 26 Pruebas en el proceso unificado Inicio Elaboración Construcción Transición Requisitos Análisis Diseño Implementación Prueba Iteraciones: ite r. #1 ite r. #2 ite r. #n ite r. # n+ 1 ite r. # n+2 ite r. #m ite r. #m +1 • Objetivos: Planificar // Diseñar e implementar // Realizar las pruebas Héctor Cuadra, hcuadra@uta.cl 27 Modelo de pruebas 1 Modelo de pruebas * X Caso de prueba Héctor Cuadra, hcuadra@uta.cl Sistema de pruebas * * X Procedimiento de prueba Componente de prueba 28 Modelo de pruebas • Artefacto: caso de prueba – Un caso de prueba especifica una forma de probar el sistema, incluyendo la entrada y salida con la que se ha de probar y las condiciones bajo las que ha de probarse • Artefacto: procedimiento de prueba – Un procedimiento de prueba especifica cómo realizar uno o varios casos de prueba • Artefacto: componente de prueba – Automatiza uno o varios procedimientos de prueba o partes de ellos. Héctor Cuadra, hcuadra@uta.cl Actividad del flujo de trabajo de Implementación 29 • Actividad: realizar prueba de unidad – Probar componentes implementados como unidades individuales – prueba de especificación (de caja negra) que verifica el comportamiento observable externamente – prueba de estructura (de caja blanca) que verifica la implementación interna Héctor Cuadra, hcuadra@uta.cl Actividades del flujo de trabajo de Prueba • Actividad: planificar prueba – Describir una estrategia de prueba, estimar los requisitos y planificar el esfuerzo de la prueba • Actividad: diseñar prueba – identificar casos de prueba y procedimientos de prueba • diseñar casos de prueba de integración (para verificar que los componentes interaccionan correctamente) • diseñar la prueba del sistema (para verificar que el sistema funciona correctamente como un todo) • diseñar los casos de prueba de regresión – Al añadir un nuevo módulo puede haber problemas con módulos que antes iban bien. Las pruebas de regresión son un conjunto de pruebas (ya realizadas antes) que aseguran que los cambios no han dado lugar a cambios colaterales. Héctor Cuadra, hcuadra@uta.cl 30 31 Actividades del FT de Prueba • Actividad: implementar prueba – Automatizar los procedimientos de prueba, creando componentes de prueba, si es posible. • Actividad: realizar pruebas de integración – Realizar las pruebas, comparar con los resultados esperados e informar de los defectos • Actividad: realizar prueba de sistema – Se comienzan después de las de integración y se realizan de manera análoga (realizar, comparar e informar) • Actividad: evaluar prueba – Se comparan los resultados de las pruebas con los objetivos esbozados en el plan de prueba. Hay que preparar métricas que permitan determinar el nivel de calidad del software y la cantidad de pruebas a realizar. Héctor Cuadra, hcuadra@uta.cl 32 Prueba de unidad de EsPrimo Componente Prueba de Esprimo Casos de prueba NUM RESULTADO CodPr 1 2 3 4 5 6 7 8 9 10 11 NUM SalidaEsper SalReal ResPrueba 0 no positivo 1 primo 2 primo 3 primo 4 no primo 23 primo -4 no positivo 78298234 no primo -123412341234123 no positivo “patata” no positivo 782.98234 no primo Héctor Cuadra, hcuadra@uta.cl no positivo primo no primo EsPrimo El Componente Prueba de Esprimo recorre la tabla PRU_UNIDAD_ESPRIMO y llama al módulo Esprimo con el valor de entrada NUM. El resultado obtenido lo escribe en SalReal y si es igual al valor de SalidaEsper deja OK en ResPrueba, en caso contrario deja ERROR Tabla PRU_UNIDAD_ESPRIMO 33 Prueba de unidad de EsPrimo Componente Prueba de EsPrimo Algoritmo: ComponentePruebaEsPrimo ResSQL := ejecutarBD(“Select CodPr, NUM, SalidaEsper from PRU_UNIDAD_ESPRIMO”) mientras no fin (ResSQL) hacer <CP,N,SE> := siguiente(ResSQL) ResEsPrimo := EsPrimo(N) si ResEsPrimo = SE entonces Prueba := “OK” sino Prueba := “ERROR” ejecutarBD(“Update PRU_UNIDAD_ESPRIMO Set ResPrueba = %Prueba, SalReal = %ResEsPrimo where CodPr= %CP”) Tabla PRU_UNIDAD_ESPRIMO CodPr Héctor Cuadra, hcuadra@uta.cl NUM SalidaEsper SalReal ResPrueba Prueba de unidad de SiguientePrimo Algoritmo: SiguientePrimo Entrada: num (entero) Salida: entero SiguientePrimo si num <= 0 entonces devolver 1 si no sig := num + 1 mientras EsPrimo(sig) ≠ “primo” hacer 0 sig := sig + 1 1 fin mientras 2 devolver sig 4 Tabla finsi 18 PRU_UNIDAD_SIGUIENTEPRIMO PROBLEMA: si hay errores, ¿cómo saber a qué módulo corresponden? SiguientePrimo o EsPrimo Héctor Cuadra, hcuadra@uta.cl EsPrimo 1 2 3 5 19 17 19 patata no número 17.356 19 .... 34 35 Prueba de integración ascendente de SiguientePrimo y EsPrimo SiguientePrimo EsPrimo ORDEN EN EL QUE SE HACEN LAS PRUEBAS: 1º ) Prueba de Unidad de EsPrimo 2º ) Prueba de Unidad de SiguientePrimo donde se supone que el módulo EsPrimo ya no contiene errores (en este caso coincide con la prueba de integración de ambos) Héctor Cuadra, hcuadra@uta.cl 36 Prueba de integración descendente de SiguientePrimo y EsPrimo (o cómo probar SiguientePrimo si EsPrimo no está disponible) SiguientePrimo SiguientePrimo SE PRUEBA ASÍ EsPrimo Resguardo de EsPrimo ORDEN EN EL QUE SE HACEN LAS PRUEBAS: 1º ) Prueba de Unidad de SiguientePrimo usando un Resguardo de Esprimo 2º ) Prueba de Unidad de EsPrimo 3º ) Prueba de integración de SiguientePrimo con EsPrimo Héctor Cuadra, hcuadra@uta.cl 37 Prueba de integración descendente de SiguientePrimo y EsPrimo (o cómo probar SiguientePrimo si EsPrimo no está disponible) Algoritmo: SiguientePrimo Entrada: num (entero) Salida: entero SiguientePrimo si num <= 0 entonces devolver 1 Resguardo de si no sig := num + 1 EsPrimo mientras EsPrimo(sig) ≠ “primo” hacer sig := sig + 1 SE LLAMA AL fin mientras Resguardo de EsPrimo devolver sig finsi Tabla PRU_UNIDAD_ESPRIMO CodPr Héctor Cuadra, hcuadra@uta.cl NUM SalidaEsper SalReal ResPrueba 38 Prueba de unidad de SiguientePrimo Resguardo de EsPrimo Algoritmo: ResguardoEsPrimo Entrada: numEnt (entero) Salida: String (“primo”, “no primo”, “no positivo”) ResSQL := ejecutarBD(“Select SalidaEsper from PRU_UNIDAD_ESPRIMO where NUM = %numEnt”) si fin (ResSQL) entonces devolver “no primo” sino <SE> := siguiente(ResSQL) devolver SE CodPr NUM SalidaEsper SalReal ResPrueba 1 0 no positivo fin si 2 1 primo 3 2 primo 4 3 primo ..................................................................... Héctor Cuadra, hcuadra@uta.cl Tabla PRU_UNIDAD_ESPRIMO 39 Creación de un resguardo Resguardo de EsPrimo Algoritmo: ResguardoEsPrimo Entrada: numEnt (entero) Salida: String (“primo”, “no primo”, “no positivo”) ResSQL := ejecutarBD(“Select SalidaEsper from PRU_UNIDAD_ESPRIMO where NUM = %numEnt”) si fin (ResSQL) entonces devolver “no primo” sino <SE> := siguiente(ResSQL) devolver SE CodPr NUM SalidaEsper SalReal ResPrueba 1 0 no positivo fin si 2 1 primo 3 2 primo 4 3 primo ..................................................................... Héctor Cuadra, hcuadra@uta.cl Tabla PRU_UNIDAD_ESPRIMO 40 Creación de un resguardo Resguardo de EsPrimo package resguardo; public class Esprimo { public static boolean esPrimo(String args[]) throw … if (args[0].equals(“0”)) throw new ErrorNoNumeroPositivo(); else if (args[0].equals(“1”)) return true; else if (args[0].equals(“2”)) return true; else if (args[0].equals(“3”)) return true; ... return false; }} CodPr NUM SalidaEsper SalReal ResPrueba 1 0 no positivo 2 1 primo 3 2 primo 4 3 primo ..................................................................... Tabla PRU_UNIDAD_ESPRIMO Héctor Cuadra, hcuadra@uta.cl 41 Bibliografía • Ingeniería del Software. Un enfoque práctico (5ª edición) – Roger S. Pressman – Editorial Mc. Graw Hill, 2001 – Capítulos 17 y 18 • El proceso unificado de desarrollo de software – Jacobson, Booch, Rumbaugh – Editorial Addison Wesley, 1999 – Capítulo 11 Héctor Cuadra, hcuadra@uta.cl 42 Ejercicio: Escribir componente de prueba, que pruebe el siguiente CP Caso de prueba CP2 Entrada: usuario “correcto” password “acertado” Condiciones de ejecución: en la tabla existe ese usuario con ese password y con 1 intento fallido anterior (número inferior a 3) Resultado esperado: dar paso y el número de intentos en la tabla USUARIO(cuenta,passord,numIntentos) para “correcto” es 0 Héctor Cuadra, hcuadra@uta.cl 43 Solución public class ComponentePruebaEntrSistema { InterfaceLogicaNegocio ln; OperacionesParaPruebas lp; public static void main(String[] args) { // Obtener lógica negocio y operaciones para pruebas // CP2: usuario y passwords correctos, nº intentos no superado lp.aniadirUsuario(“correcto”,“acertado”,1); boolean b = ln.hacerLogin(“correcto”,“acertado”); if (!b) System.out.println(“Error CP2: No permite entrada”); else {int j = lp.comprobarUsuario(“correcto”,“acertado”); // Dev. Nº intentos if (j!=0) System.out.println(“Error CP2: No puesto a 0.”); else System.out.println(“CP2 correcto”);} } Héctor Cuadra, hcuadra@uta.cl 44 Ejercicio: Escribir componente de prueba, que pruebe el siguiente CP Caso de prueba CP3 Entrada: usuario “correcto” password “acertado” Condiciones de ejecución: en la tabla existe ese usuario con ese password y con 4 intentos fallidos (número superior a 3) Resultado esperado: no dar paso y el número de intentos en la tabla USUARIO(cuenta,passord,numIntentos) para “correcto” es 5 Héctor Cuadra, hcuadra@uta.cl 45 Solución public class ComponentePruebaEntrSistema { InterfaceLogicaNegocio ln; OperacionesParaPruebas lp; public static void main(String[] args) { // Obtener lógica negocio y operaciones para pruebas // CP3: usuario y passwords correctos, nº intentos superado lp.aniadirUsuario(“correcto”,“acertado”,4); boolean b = ln.hacerLogin(“correcto”,“acertado”); if (b) System.out.println(“Error CP3: Permite entrada”); else {int j = lp.comprobarUsuario(“correcto”,“acertado”); // Dev. Nº intentos if (j!=5) System.out.println(“Error CP3: No incrementa.”); else System.out.println(“CP3 correcto”);} } Héctor Cuadra, hcuadra@uta.cl Ejercicio Diseñar un caso de prueba de caja blanca, un caso de prueba de caja negra basado en la partición equivalente, un caso de prueba de caja negra basado en los valores límites y un caso de prueba de interfaz de usuario gráfica para el caso de uso ENTRAR EN EL SISTEMA que se describe a continuación. El flujo de eventos del caso de uso ENTRAR EN EL SISTEMA -El usuario escribe su nombre y el password -El sistema comprueba que existe una cuenta con ese nombre y password y, si es así, se le da permiso para entrar en el sistema. -Si existe el nombre de usuario pero el password es incorrecto permite reintroducir el password hasta un máximo de tres veces. Requisitos no funcionales del caso de uso ENTRAR EN EL SISTEMA -El password no debe ser visible -Los nombres de usuarios sólo pueden contener letras y como mínimo 5 letras. Héctor Cuadra, hcuadra@uta.cl 46 47 Solución al ejercicio Caso de prueba de caja blanca: No se puede ya que el código fuente no está accesible. Caso de prueba de caja negra basado en la partición equivalente 1) Entrada: usuario “pepita” password: “e445dr” Salida: dar paso (usuario y password válidos; suponiendo que se encuentran en la BD) 2) Entrada: usuario “pepita2” password “e445dr” Salida: no dar paso (usuario no válido por contener caracteres “no letras” y más de 5) 3) Entrada: usuario “pepi” password “e445dr” Salida: no dar paso (usuario no válido por contener menos de 5 letras) 4) Entrada: usuario “pep3” password “e445dr” Salida: no dar paso (usuario no válido por contener menos de 5 letras, y algunas no ser letras) 5) Entrada: usuario “” password “e445dr” Salida: no dar paso (usuario “en blanco”) 6) Entrada: usuario “3432432” password “e445dr” Salida: no dar paso (usuario no válido por no contener ni una sola letra, aunque sí más de 5 caracteres) 7) Entrada: usuario “pepita” password: “” Salida: no dar paso (usuario válido pero password no, suponiendo que se encuentra en la BD) 48 Solución al ejercicio Caso de prueba de caja negra basado en los valores límite 1) Entrada: usuario “pepita” password: “malPassw” Salida: no obtener paso intentar otra vez: usuario “pepita” password: “malPassw” Salida: no obtener paso intentar otra vez: usuario “pepita” password: “malPassw” Salida: no obtener paso y comprobar que se bloquea // Intenta 4 veces (suponiendo usuario válido pero password incorrecto) 2) Entrada: usuario “pepita” password: “malPassw” Salida: no obtener paso intentar otra vez: usuario “pepita” password: “malPassw” Salida: no obtener paso intentar otra vez: usuario “pepita” password: “e445dr” Salida: obtener paso // Intenta 3 veces (suponiendo usuario válido pero password incorrecto) 3) Entrada: usuario “pepito” password: “malPassw” => no obtener paso intentar otra vez: usuario “pepito” password: “malPassw” => no obtener paso intentar otra vez: usuario “pepito” password: “malPassw” Salida: no obtener paso pero comprobar que no se bloquea // Intenta 3 veces (suponiendo tanto usuario como password incorrectos) 4) Entrada: usuario “pepita” password: “malPassw” => no obtener paso intentar otra vez: usuario “pepita” password: “e445dr” Salida: obtener paso // Intenta 2 veces (suponiendo usuario “pepita” válido y password “e445dr” válido) Héctor Cuadra, hcuadra@uta.cl 49 Solución al ejercicio Caso de prueba de interfaz gráfica de usuario: 1) Entrada: usuario “pepita” password: “malPassw” Salida: comprobar passw. NO visible 2) Entrada: pulsar botón “acceder al sistema” Salida: comprobar que “responde” 3) Entrada: pulsar icono “minimizar ventana” Salida: comprobar que se minimiza Héctor Cuadra, hcuadra@uta.cl 50 Héctor Cuadra, hcuadra@uta.cl 51 Solución al ejercicio Caso de prueba de caja blanca: No se puede ya que el código fuente no está accesible. Caso de prueba de caja negra basado en la partición equivalente 1) Entrada: usuario “pepita” password: “e445dr” Salida: dar paso (usuario y password válidos; suponiendo que se encuentran en la BD) 2) Entrada: usuario “pepita2” password “e445dr” Salida: no dar paso (usuario no válido por contener caracteres “no letras” y más de 5) 3) Entrada: usuario “pepi” password “e445dr” Salida: no dar paso (usuario no válido por contener menos de 5 letras) 4) Entrada: usuario “pep3” password “e445dr” Salida: no dar paso (usuario no válido por contener menos de 5 letras, y algunas no ser letras) 5) Entrada: usuario “” password “e445dr” Salida: no dar paso (usuario “en blanco”) 6) Entrada: usuario “3432432” password “e445dr” Salida: no dar paso (usuario no válido por no contener ni una sola letra, aunque sí más de 5 caracteres) 7) Entrada: usuario “pepita” password: “” Salida: no dar paso (usuario válido pero password no, suponiendo que se encuentra en la BD) Caso de prueba de caja negra basado en los valores límite 1) Entrada: usuario “pepita” password: “malPassw” Salida: no obtener paso intentar otra vez: usuario “pepita” password: “malPassw” Salida: no obtener paso intentar otra vez: usuario “pepita” password: “malPassw” Salida: no obtener paso y comprobar que se bloquea // Intenta 4 veces (suponiendo usuario válido pero password incorrecto) 2) Entrada: usuario “pepita” password: “malPassw” Salida: no obtener paso intentar otra vez: usuario “pepita” password: “malPassw” Salida: no obtener paso intentar otra vez: usuario “pepita” password: “e445dr” Salida: obtener paso // Intenta 3 veces (suponiendo usuario válido pero password incorrecto) 3) Entrada: usuario “pepito” password: “malPassw” => no obtener paso intentar otra vez: usuario “pepito” password: “malPassw” => no obtener paso intentar otra vez: usuario “pepito” password: “malPassw” Salida: no obtener paso pero comprobar que no se bloquea // Intenta 3 veces (suponiendo tanto usuario como password incorrectos) 4) Entrada: usuario “pepita” password: “malPassw” => no obtener paso intentar otra vez: usuario “pepita” password: “e445dr” Salida: obtener paso // Intenta 2 veces (suponiendo usuario “pepita” válido y password “e445dr” válido) Caso de prueba de interfaz gráfica de usuario: 1) Entrada: usuario “pepita” password: “malPassw” Salida: comprobar passw. NO visible 2) Entrada: pulsar botón “acceder al sistema” Salida: comprobar que “responde” 3) Entrada: pulsar icono “minimizar ventana” Salida: comprobar que se minimiza Héctor Cuadra, hcuadra@uta.cl 52 Solución al ejercicio Caso de prueba de caja blanca: No se puede ya que el código fuente no está accesible. Caso de prueba de caja negra basado en la partición equivalente 1) Entrada: usuario “pepita” password: “e445dr” Salida: dar paso (usuario y password válidos; suponiendo que se encuentran en la BD) 2) Entrada: usuario “pepita2” password “e445dr” Salida: no dar paso (usuario no válido por contener caracteres “no letras” y más de 5) 3) Entrada: usuario “pepi” password “e445dr” Salida: no dar paso (usuario no válido por contener menos de 5 letras) 4) Entrada: usuario “pep3” password “e445dr” Salida: no dar paso (usuario no válido por contener menos de 5 letras, y algunas no ser letras) 5) Entrada: usuario “” password “e445dr” Salida: no dar paso (usuario “en blanco”) 6) Entrada: usuario “3432432” password “e445dr” Salida: no dar paso (usuario no válido por no contener ni una sola letra, aunque sí más de 5 caracteres) 7) Entrada: usuario “pepita” password: “” Salida: no dar paso (usuario válido pero password no, suponiendo que se encuentra en la BD) 53 Solución al ejercicio Caso de prueba de caja negra basado en los valores límite 1) Entrada: usuario “pepita” password: “malPassw” Salida: no obtener paso intentar otra vez: usuario “pepita” password: “malPassw” Salida: no obtener paso intentar otra vez: usuario “pepita” password: “malPassw” Salida: no obtener paso y comprobar que se bloquea // Intenta 4 veces (suponiendo usuario válido pero password incorrecto) 2) Entrada: usuario “pepita” password: “malPassw” Salida: no obtener paso intentar otra vez: usuario “pepita” password: “malPassw” Salida: no obtener paso intentar otra vez: usuario “pepita” password: “e445dr” Salida: obtener paso // Intenta 3 veces (suponiendo usuario válido pero password incorrecto) 3) Entrada: usuario “pepito” password: “malPassw” => no obtener paso intentar otra vez: usuario “pepito” password: “malPassw” => no obtener paso intentar otra vez: usuario “pepito” password: “malPassw” Salida: no obtener paso pero comprobar que no se bloquea // Intenta 3 veces (suponiendo tanto usuario como password incorrectos) 4) Entrada: usuario “pepita” password: “malPassw” => no obtener paso intentar otra vez: usuario “pepita” password: “e445dr” Salida: obtener paso // Intenta 2 veces (suponiendo usuario “pepita” válido y password “e445dr” válido) Héctor Cuadra, hcuadra@uta.cl 54 Solución al ejercicio Caso de prueba de interfaz gráfica de usuario: 1) Entrada: usuario “pepita” password: “malPassw” Salida: comprobar passw. NO visible 2) Entrada: pulsar botón “acceder al sistema” Salida: comprobar que “responde” 3) Entrada: pulsar icono “minimizar ventana” Salida: comprobar que se minimiza Héctor Cuadra, hcuadra@uta.cl 55 Ejercicio Esprimo (camino básico) num<= 0 1 1-3-10 primo:=true i:=2 1-2-4-7-8-10 3 2 devolver “no positivo” 1-2-4-7-9-10 1-2-4-5-6-7-9-10 i<= num-1 4 1-2-4-5-6-7-8-10 num resto i = 0 i:=i+1 1-2-4-5-4-5-4-7-9-10 primo 1-2-4-5-4-5-4-5-7-9-10 devolver “primo” V(G) = 5 Héctor Cuadra, hcuadra@uta.cl 10 9 FIN 7 5 6 primo:=false devolver “no primo” 8 56 Algoritmo Esprimo • CP 1) Entrada: 1 Salida: “primo” • CP 2) Entrada: 2 Salida: “primo” • CP 3) Entrada: 4 Salida “no primo” – es el primer no primo • CP 4) Entrada: 32342342342341234 Salida: “no primo” – número muy grande (mayor que el máximo entero) • CP 5) Entrada: 0 Salida: “no positivo” • CP 6) Entrada: -4 Salida: “no positivo” • CP 7:) Entrada: -123412341234123 Salida: “no positivo” • CP 8) Entrada: “patata” Salida: “no positivo” • CP 9) Entrada: 782.98234 Salida: “no primo” – debe tomar 782 como el número de entrada Héctor Cuadra, hcuadra@uta.cl Algoritmo Esprimo • CP 1) Entrada: 0 Salida: “no positivo” si num <= 0 entonces devolver “no positivo” • CP 2) Entrada: 2 Salida: “primo” para i de 2 a num - 1 hacer (para que no entre) si primo entonces devolver “primo” (que entre) • CP 3) Entrada: 3 Salida: “primo” para i de 2 a num - 1 hacer (ejecutar 1 vez) • CP 4) Entrada: 4 Salida: “no primo” para i de 2 a num - 1 hacer si num resto i = 0 entonces (para que entre) si no devolver “no primo” (para que entre) • CP 5) Entrada: 23 Salida: “no primo” para i de 2 a num - 1 hacer si num resto i = 0 entonces (para que NO entre) Héctor Cuadra, hcuadra@uta.cl 57 58 Prueba del camino básico Construcciones estructurales en forma de grafo de flujo: Secuencia Condición IF Bucle (While) Bucle (Hasta) Sentencia case NODO: representa condición o sentencia procedimental ARISTA: representa flujo de control Héctor Cuadra, hcuadra@uta.cl 59 Prueba de bucles Bucles simples Héctor Cuadra, hcuadra@uta.cl Bucles anidados Bucles concatenados Bucles no estructurados 60 Prueba de bucles • Prueba de bucles simples – Diseñar casos de prueba para que se ejecute el bucle: 0, 1, 2, m, n-1, n y n+1 veces (siendo n el nº máximo de veces que se puede ejecutar el bucle y m<n) • Prueba de bucles anidados – Si cada bucle se probara como bucle simple aumentaría mucho el número de casos de prueba – Probar el bucle más interno como un bucle simple (0, 1, 2, m, n1, n y n+1 veces) entrando en todos los bucles externos el número mínimo de veces (1) – Ir hacia fuera probando cada bucle externo como un bucle simple y dejando que sus bucles internos se ejecuten m veces (valor típico) y que sus bucles externos se ejecuten 1 vez (valor mínimo) Héctor Cuadra, hcuadra@uta.cl 61 Prueba de bucles • Prueba de bucles concatenados – En este caso puede ocurrir que el segundo bucle se ejecute un número de veces que depende del primero. – Si son bucles independientes entonces se prueban como dos bucles simples, y si no lo son, entonces se prueban como bucles anidados • Prueba de bucles no estructurados – En este caso, merece la pena transformar el código de entrada usando bucles estructurados y hacer las pruebas correspondientes Héctor Cuadra, hcuadra@uta.cl 62 Prueba de bucles • Por supuesto, no hay por qué considerar el siguiente bucle como no estructurado: repetir acción1 si cond1 entonces salir acción2 hasta cond2 • Se puede probar para que se ejecute 0, 1, 2, m, n-1, n y n+1 combinando las 2 condiciones de salida (cond1 y cond2) Héctor Cuadra, hcuadra@uta.cl 63 Prueba de Caja Negra • Tipos de errores que se encuentran: – Funciones incorrectas o ausentes. – Errores de interfaz. – Errores de estructuras de datos o en accesos a bases de datos externas. – Errores de rendimiento. – Errores de inicialización o de terminación. Héctor Cuadra, hcuadra@uta.cl Ejemplo: Algoritmo Esprimo Algoritmo: Esprimo Entrada: num (entero) Salida: String (“no positivo”, “primo”, “no primo”) si num <= 0 entonces devolver “no positivo” si no primo := true para i de 2 a num - 1 hacer si num resto i = 0 entonces primo := false DISEÑAR CASOS salir del bucle DE PRUEBA DE fin si CAJA BLANCA fin para si primo entonces devolver “primo” si no devolver “no primo” fin si fin si Héctor Cuadra, hcuadra@uta.cl 64 65 Ejemplo: Algoritmo Esprimo entero Esprimo “es primo” “no primo” “no positivo” DISEÑAR CASOS DE PRUEBA DE CAJA NEGRA Héctor Cuadra, hcuadra@uta.cl 66 Ejemplo: Algoritmo Esprimo DISEÑAR CASOS DE PRUEBA DE LA INTERFAZ Y DE LA DOCUMENTACIÓN Héctor Cuadra, hcuadra@uta.cl 67 Ejercicio: Tomar en Préstamo la Copia de un Libro DISEÑAR LOS CASOS DE PRUEBA DE ESTE CASO DE USO Héctor Cuadra, hcuadra@uta.cl 68 Introducción • Las pruebas del software son un elemento crítico para la garantía de calidad del software y representa una revisión final de las especificaciones, del diseño y de la codificación. • Las pruebas de software son siempre necesarias. • En algunos casos ocupan hasta un 40% del tiempo de un proyecto informático. Héctor Cuadra, hcuadra@uta.cl 69 Estrategias de prueba de Software ¿Cómo integrar las técnicas de diseño de casos de prueba en una serie de pasos bien planificados que obtienen una construcción correcta del software? Ingeniería del sistema S Requisitos R Diseño D Codificación Héctor Cuadra, hcuadra@uta.cl C U Prueba de unidad I Prueba de integración V Prueba de validación ST Prueba del sistema 70 Prueba de unidad • Centra el proceso en el módulo. • Se prueban los caminos de control importantes para descubrir errores dentro del límite del módulo. • Está orientado a pruebas de caja blanca. • Puede realizarse paralelamente en varios módulos. Héctor Cuadra, hcuadra@uta.cl 71 Prueba de unidad Interfaz Condiciones límite Caminos independientes Caminos de manejo de errores Casos de prueba Héctor Cuadra, hcuadra@uta.cl Módulo 72 Prueba de unidad Interfaz Condiciones límite Caminos independientes Caminos de manejo de errores Controlador Módulo que se va a probar Casos de prueba Resguardo Resguardo RESULTADOS Héctor Cuadra, hcuadra@uta.cl 73 Prueba de integración Integración descendente M1 M2 M5 M8 Héctor Cuadra, hcuadra@uta.cl M3 M6 M7 M4 74 Prueba de integración Resguardos Resguardo A Mostrar un mensaje de traza Resguardo B Mostrar el parámetro pasado = Dirección del flujo de datos Héctor Cuadra, hcuadra@uta.cl Resguardo C Resguardo D Devolver un valor de una tabla (o archivo externo) Hacer una búsqueda en una tabla de un parámetro de entrada y devolver el parámetro asociado 75 Prueba de integración Integración ascendente Mc Ma D1 Mb D2 D3 Grupo 3 Grupo 1 Grupo 2 Héctor Cuadra, hcuadra@uta.cl 76 Prueba de integración Controladores Controlador A Controlador B Controlador C Y Invocar al subordinado Enviar el parámetro de una tabla (o archivo externo) = Dirección del flujo de datos Héctor Cuadra, hcuadra@uta.cl Mostrar parámetro Controlador D A B Una combinación de los controladores ByC 77 Prueba de integración • Prueba de regresión: – Al añadir un nuevo módulo el software cambia y se establecen nuevos caminos de flujo de datos, nueva E/S y nueva lógica de control. – Puede haber problemas con funciones que antes iban bien. – Se ejecutarán un conjunto de pruebas que se han realizado anteriormente para asegurarse que los cambios no han dado lugar cambios colaterales. Héctor Cuadra, hcuadra@uta.cl 78 Prueba de validación • Se lleva a cabo cuando se ha terminado la prueba de Integración: el software está ensamblado y se han eliminado todos los errores de interfaz. • La validación se consigue cuando el software funciona según las expectativas del usuario. • Generalmente son pruebas de caja negra. Héctor Cuadra, hcuadra@uta.cl 79 Prueba del sistema • Realizado el software debe integrarse en el sistema. Estas pruebas sirven para verificar que se han integrado adecuadamente todos los elementos del sistema y que realizan las funciones apropiadas. • Tipos de pruebas: – prueba de recuperación – prueba de seguridad – prueba de resistencia – prueba de rendimiento Héctor Cuadra, hcuadra@uta.cl 80 Depuración de errores La depuración es el proceso que elimina el error Ejecución de casos Pruebas adicionales Casos de prueba Resultados Causas sospechadas Pruebas de regresión Depuración Correcciones Héctor Cuadra, hcuadra@uta.cl Causas identificadas