Introducción al Testing de Estructural



Documentos relacionados
Verificación y Validación de Software

Práctica 4: Testing de Software

Problemas de Recursividad

Complejidad de Algoritmos

TÉCNICAS DE CAJA BLANCA

Estructuras de Control

CAPÍTULO 1 INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS

ESTRUCTURAS DE CONTROL

CEIP Mediterráneo. 1º relación de divisibilidad: múltiplos y divisores.

Introducción a las sentencias de control

La herramienta ArtEM: Aritmética Entera y Modular

Fundamentos de Pruebas de Software

Proposiciones Condicionales

MATEMÁTICAS 2º ESO. TEMA 1

Los números naturales

Testing Unitario. Laboratorio de Testing y Aseguramiento de la Calidad del Software

Análisis de problemas

DIVISIBILIDAD. 1º relación de divisibilidad: múltiplos y divisores.

Tema I Testing Estructurado

INSTITUTO SUPERIOR DE FORMACIÓN TÉCNICA Nº 177

Estructuras de control. Secuencial, condicional y repetitivas.

CLASE # 5 TÉCNICAS DE CAJA BLANCA

Teoría de Autómatas y Lenguajes Formales. Capítulo 1: Introducción. Teoría de Autómatas y Lenguajes formales es un repaso a la informática teórica.

Diseño de algoritmos paralelos

Introduc)on to Programming (in C++) Ejemplos de tratamiento de secuencia de secuencias. Emma Rollón Departament of Computer Science

DaVinciTEXTIL. Codificación de artículos

Realizar en una hoja blanca el diseño de su menú de navegación y la abstracción de los elementos principales de su proyecto.

DISPOSITIVOS ELÉCTRICOS DE CONTROL

Funciones & Estructuras de control

operaciones inversas Para unificar ambas operaciones, se define la potencia de exponente fraccionario:

CURSOSO. Aritmética: Númerosnaturalesyenteros. Númerosracionalesyfraciones. MATEMÁTICAS. AntonioF.CostaGonzález

Práctica 3. CÁLCULO DE LA FUNCIÓN SENO UTILIZANDO UN DESARROLLO EN SERIE

Tema 3. Estructuras de control

Programación Digital I

Modelo de Cómputo. Programación concurrente

Estructuras de control

descripción del argumento identificador tipo longitud condición restricción

3. Estructuras iterativas

TEMA 2: TEORÍA DE CONJUNTOS Y CONJUNTOS NUMÉRICOS.

PRUEBAS DE CAJA BLANCA

ESTRUCTURA SECUENCIAL ESTRUCTURA SELECTIVA

A continuación estudiaremos a qué se refiere el término «programación», qué es un lenguaje de programación y veremos alguna terminología propia de

Tema 2. Divisibilidad. Múltiplos y submúltiplos.

UNIDAD 1: NÚMEROS NATURALES

4. ACTIVIDADES Y ESTRATEGIAS DE APRENDIZAJE

LENGUAJES DE PROGRAMACION I. Propósito del curso :

Sistema electrónico digital (binario) que procesa datos siguiendo unas instrucciones almacenadas en su memoria.

3. Métodos clásicos de optimización lineal

Programación de los problemas de Física en.

Proceso de testing. Ingeniería del Software I. Actividades del proceso de testing. Actividades del proceso de testing

Control de Flujo. Estructuras de Control! Experiencia Educativa de Algorítmica CONTROL DE FLUJO

Laboratorio 3 Tema 5. Estructuras Iterativas

TESTS EXAMEN ISG ACTUALIZADO SEP TEMA 6 PRUEBAS DEL SOFTWARE

Algoritmos y Diagramas de flujo

TEMA 1: NÚMEROS NATURALES, DIVISIBILIDAD 1º ESO. MATEMÁTICAS

EJEMPLO DE CÓDIGO JAVA BÁSICO. CREAR CLASES CON CAMPOS, CONSTRUCTOR Y MÉTODOS. LA PALABRA CLAVE THIS (CU00652B)

FUNDAMENTOS DE PROGRAMACIÓN C#

Práctica 4. Contenido: Estructuras de control iterativas (while, do-while, for). Sentencias break y continue.

UNIDAD: ÁLGEBRA Y FUNCIONES ECUACIÓN DE SEGUNDO GRADO Y FUNCIÓN CUADRÁTICA

Unidad 1 Números. Los números naturales son aquellos que se utilizan para contar los elementos de un conjunto.

Tema 4: Múltiplos y Divisores

Introducción a MATLAB

TEMA 5. PROGRAMACIÓN BÁSICA EN MATLAB /OCTAVE

Estructuras de Control (y su forma en Python y en C) Clase 5 Introducción a la Computación Patricia Borensztejn

MICROSOFT ACCESS 2007

Tema 3. Análisis de riesgo. Tema 3. Análisis de riesgo

Computación III. Objetivo de aprendizaje del tema

ACTIVIDADES INCLUIDAS EN LA PROPUESTA DIDÁCTICA: DE REFUERZO

Programación Orientada a Objetos Profr. Pedro Pablo Mayorga

PROGRAMACIÓN LINEAL. 1. Introducción

Estructuras de control

Informática I para Bachillerato

Ingeniería de Software I - Material y Bibliografía

INGENIERÍA EN COMPUTACIÓN. INGENIERÍA EN COMPUTACIÓN División Departamento Licenciatura

Introducción a la programación

Sentencias iterativas

INSTITUTO POLITÉCNICO NACIONAL ESCUELA SUPERIOR DE INGENIERIA MECANICA Y ELECTRICA INGENIERIA EN COMUNICACIONES Y ELECTRÓNICA ACADEMIA DE COMPUTACIÓN

El cuerpo de los números reales

MATEMÁTICAS 5º PRIMARIA DIVISIBILIDAD: MÚLTIPLOS Y DIVISORES

AUTORES PRÓLOGO...13 INTRODUCCIÓN CAPÍTULO 1. INICIACIÓN A LA PROGRAMACIÓN EN MAPLE...19

TEMA 3: Estructuras de Control: Iterativas

INSTRUCCIONES PARA EL USO DEL SOFTWARE (IS)

DIAGRAMAS DE FLUJOS. Qué son Los Diagramas de Flujo y Para qué se Usan?

1. PRINCIPIOS BÁSICOS DE PROGRAMACIÓN

LA DIVISIÓN EN LOS NÚMEROS NATURALES

INTRODUCCIÓN A LA PROGRAMACIÓN

INSTITUTO TECNOLÓGICO

Conocimientos previos

Estructuras de Control Selección o Decisión

Tema 1 INTRODUCCIÓN A LOS LENGUAJES DE PROGRAMACIÓN

Operadores. Java es un lenguaje rico en operadores, que son casi idénticos a los de C/C++.

Transcripción:

Introducción al Testing de Estructural Maximiliano Cristiá Ingeniería de Software Facultad de Ciencias Exactas, Ingeniería y Agrimensura Universidad Nacional de Rosario Noviembre de 2009 Resumen En este apunte de clase se introducen brevemente los conceptos básicos del testing estructural basado en flujo de control. Índice 1. Introducción 1 2. Grafo de flujo de control de un programa 2 3. Criterio de cubrimiento de sentencias 4 4. Criterio de cubrimiento de flechas 4 5. Criterio de cubrimiento de condiciones 5 6. Criterio de cubrimiento de caminos 6 7. Otros criterios 6 1. Introducción Como ya hemos explicado, en el testing estructural los casos de prueba se seleccionan según la estructura del código fuente del programa que se está testeando. Los conjuntos de prueba que se seleccionan siguiendo técnicas de testing estructural deben cumplir con lo que se denomina criterio de selección de casos de prueba. Un criterio de selección de casos de prueba, o simplemente criterio de prueba o criterio de selección, es un subconjunto de FID donde ID es el dominio de entrada del programa que se está testeando este concepto fue presentado en el capítulo anterior. Es decir que un criterio de selección dene los conjuntos de prueba que se pueden utilizar para testear el programa. Si C es un criterio de selección y T es un conjunto de prueba que pertenece a C, se dice que T satisface C. Se espera que los criterios de selección sean consistentes. Un criterio de selección C es consistente sí y solo sí para cualesquiera conjuntos de prueba T 1 y T 2 que satisfacen C, T 1 no encuentra un error sí y solo sí T 2 tampoco lo hace [GJM91]. De esta forma el tester debe elegir un único conjunto de prueba de un criterio puesto que todos los otros darán los mismos resultados. Aunque los criterios que se usan en la práctica no son consistentes, se trabaja 1

como si lo fueran por lo que los testers eligen cualquier conjunto de prueba que satisface el criterio que están aplicando. El testing estructural puede dividirse según cómo se denen los criterios de selección. Testing estructural basado en el flujo de control. En este caso los criterios de selección se denen en base a reglas que sobre el flujo de control de los programas, y en particular se tienen en cuenta los valores de verdad de las condiciones usadas en sentencias condicionales e iterativas. En otras palabras, un criterio de selección exige que los conjuntos de prueba que lo satisfacen recorran el programa siguiendo el flujo de control de una forma especíca y haciendo que las condiciones asuman valores de verdad especícos. Esta forma de testing estructural es la más antigua y simple de aplicar, aunque la menos potente. Es la que se suele aplicar en la industria [PJR08] y es la que estudiaremos en este capítulo. Testing estructural basado en el flujo de datos. En esta forma de testing estructural los criterios se denen de forma tal que cumplan con ciertas reglas que gobiernan el flujo de datos de los programas. No estudiaremos criterios basados en el flujo de datos pues, si bien son más poderosos que los basados en flujo de control, el cálculo de conjuntos de prueba es muy laborioso. Uno de los trabajos seminales sobre esta forma de testing estructural es el de Rapps y Weyuker [RW82]; en general cualquier trabajo de Elaine Weyuker sobre este tema será una excelente referencia. En ambos casos es posible denir un orden parcial entre los criterios de forma tal que quedan ordenados según la cantidad de casos de prueba que exigen sean ejecutados. Por consiguiente los testers pueden elegir el criterio que mejor se adapte al presupuesto o tiempo disponible. El resto del apunte está basado en [GJM91, capítulo 6]. 2. Grafo de flujo de control de un programa Los criterios de selección basados en flujo de control se denen en base a lo que se denomina el Grafo o Diagrama de Flujo de Control (CFG o CFD) del programa. El CFG es una abstracción del programa que captura los aspectos estructurales más importantes obviando detalles especícos tanto del programa como del lenguaje de programación. Asumamos que el lenguaje de programación con el cual se escriben los programas a testear tiene la gramática presentada en la Figura 1. En ese caso el CFG de cualquier programa se construye inductivamente como se indica más abajo, teniendo en cuenta que en los CFG las flechas representan sentencias y los nodos los puntos de entrada y salida de la sentencia respectiva. 1. Para cada BasicSentence se dibuja un grafo como el de la Figura 2a. 2. Si S es un P rogram cuyo CFG es G entonces el CFG del programa if cond then S es el de la Figura 2b. 3. Si S 1 y S 2 son dos P rogram cuyos CFG son, respectivamente, G 1 y G 2, entonces el CFG del programa if cond then S 1 else S 2 es el de la Figura 2c. 4. Si S es un P rogram cuyo CFG es G entonces el CFG del programa while cond do Sdone es el de la Figura 2d. 5. Si S 1 y S 2 son dos P rogram cuyos CFG son, respectivamente, G 1 y G 2, entonces el CFG del programa S 1 ; S 2 es el de la Figura 2e. 2

BasicSentence ::= skip var := Expr call(arg 1,..., arg n ) ConditionalSentence ::= if Cond then P rogram if Cond then P rogram else P rogram while Cond do P rogramdone Sentence ::= BasicSentence ConditionalSentence P rogram ::= Sentence P rogram ; P rogram Figura 1: Gramática de un lenguaje de programación imperativo simple. Los no terminales Cond y Expr se dejan sin especicar porque no tienen influencia sobre el CFG. (a) (b) (c) (d) (e) Figura 2: Construcción inductiva del CFG (fuente [GJM91]). El grafo correspondiente a una secuencia de BasicSentence se puede abreviar con un grafo como el de la Figura 2a, es decir dos nodos y una sola flecha, puesto que el flujo de control indefectiblemente debe seguir la secuencia. La Figura 3a es la codicación en nuestro lenguaje del algoritmo de Euclides para calcular el máximo común divisor (MCD) entre dos números naturales, y 3b es el CFG correspondiente. En este caso hemos etiquetado las flechas con las sentencias del programa para que sea más simple comprender cómo se genera el CFG a partir del programa, aunque esto no es necesario. Notar que hemos abreviado las dos primeras sentencias del programa con una sola flecha y dos nodos, como explicamos más arriba. Se supone que el CFG debe ser obtenido automáticamente a partir del código fuente del programa. Los criterios basados en flujo de control se denen en base a los caminos del CFG que se deben recorrer para testear el programa. Es decir se deben seleccionar los casos de prueba que sean necesarios para que entre todos ellos se recorran todos los caminos que exige el criterio que se esté aplicando. En las secciones que siguen veremos los criterios de testing estructural basado en flujo de control más 3

read(x); read(y); while x y do if x > y then x := x y; else y := y x; done mcd := x; (a) (b) Figura 3: Algoritmo de Euclides para calcular el MCD (3a) y el CFG correspondiente (3b). comunes. Los criterios están ordenados desde el menos exigente hacia el más exigente. 3. Criterio de cubrimiento de sentencias En realidad la denición de este criterio no requiere analizar el CFG debido a que es muy simple. Seleccionar un conjunto de prueba T tal que, al ejecutar P para cada d en T, cada sentencia básica de P es ejecutada al menos una vez. Por ejemplo nuestra implementación del algoritmo de Euclides puede testearse con el conjunto de prueba CS = { x = 4, y = 3, x = 3, y = 4 }, para cumplir con el criterio. 4. Criterio de cubrimiento de flechas Este criterio se enuncia de la siguiente manera: Seleccionar un conjunto de prueba T tal que, al ejecutar P para cada d en T, cada flecha del CFG de P es atravesada al menos una vez. Importante: en este criterio y en todos los que siguen se debe tener en cuenta que el arco que sale de un bucle cuando la condición es falsa debe ser recorrido al menos una vez sin haber recorrido el interior del bucle en la misma ejecución. En otras palabras es necesario un caso que no lleve el flujo de control al interior del bucle. Un conjunto de prueba que satisface el criterio es CF = { x = 4, y = 3, x = 3, y = 4, x = 3, y = 3 }. Observar que el último caso fue agregado debido a la aclaración efectuada más arriba porque de otra forma sin ese caso igual se hubieran recorrido todas las flechas. El cubrimiento de flechas es un criterio más fuerte que el de cubrimiento de sentencias lo cual se evidencia cuando el programa contiene sentencias if then o bucles, pues hay flechas que no representan sentencias básicas y que deben ser recorridas con casos especícos. 4

search(int a[ ], int max, int elem) : int found := false; if max 0 then counter := 1; while not found and counter max do if a[counter] = elem then found := true; counter := counter + 1; done if found then return counter 1; else return 1; (a) (b) Figura 4: Búsqueda secuencial. 5. Criterio de cubrimiento de condiciones El criterio de cubrimiento de condiciones se enuncia de la siguiente forma: Seleccionar un conjunto de prueba T tal que, al ejecutar P para cada d en T, cada flecha del CFG de P es atravesada al menos una vez y las proposiciones simples que forman condiciones toman los dos valores de verdad. Importante: en este criterio y en todos los que siguen se debe tener en cuenta que la condición que gobierna a un bucle debe ser falsa de todas las formas indicadas por cada criterio sin antes haber sido verdadera (en el momento de evaluarla) en la misma ejecución. Este criterio no puede ser claramente ejemplicado con la implementación del algoritmo de Euclides debido a que no contiene condiciones compuestas. Por este motivo en la Figura 4a introducimos una implementación de la búsqueda secuencial en un arreglo de longitud max cuyo CFG se muestra en la Figura 4b. Un conjunto de prueba que satisface el criterio es CC = { max = 0, a = [ ], elem = 2 max = 2, a = [5, 2], elem = 2, max = 2, a = [5, 2], elem = 7 }. Observar que el criterio exige testear el programa según algunas de las alternativas funcionales más importantes: El arreglo es vacío. El arreglo no es vacío y el elemento que se busca está en el arreglo. El arreglo no es vacío pero el elemento que se busca no está en el arreglo. 5

Sin embargo, no se exige testear el programa, por ejemplo, con un arreglo donde el primer elemento sea el elemento buscado, o con un arreglo donde el último elemento sea el elemento buscado, etc. 6. Criterio de cubrimiento de caminos Este criterio en general es impracticable pero se lo suele incluir en las presentaciones por una simple cuestión de completitud teórica. Seleccionar un conjunto de prueba T tal que, al ejecutar P para cada d en T, se recorren todos los caminos completos posibles del CFG P. Dado que es impracticable testear la mayoría de los programas siguiendo este criterio, se lo debe tener como una referencia para tratar de cubrir los caminos más críticos. La heurística mínima que debe seguirse cuando aparecen bucles es la siguiente: Iterar sobre cada bucle cero veces. Iterar sobre cada bucle el máximo número de veces posible. Iterar sobre cada bucle un número promedio de veces. 7. Otros criterios En la práctica se verán dos criterios más que surgen a partir del criterio de cubrimiento de condiciones. Referencias [GJM91] Carlo Ghezzi, Mehdi Jazayeri, and Dino Mandrioli. Fundamentals of sofware engineering. Prentice Hall, Upper Saddle River, New Jersey, 1991. [PJR08] [RW82] Alan Page, Ken Johnston, and Bj Rollison. How We Test Software at Microsoft. Microsoft Press, 2008. Sandra Rapps and Elaine J. Weyuker. Data flow analysis techniques for test data selection. In ICSE 82: Proceedings of the 6th international conference on Software engineering, pages 272 278, Los Alamitos, CA, USA, 1982. IEEE Computer Society Press. 6