Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Contenidos:
1.- Introducción....................................................................................................................................1
2.- Evaluación del riesgo de errores en una aplicación........................................................................2
3.- Calculo de la complejidad ciclomática. Modelo estructural...........................................................2
3.1 Construcción del grafo de control..............................................................................................3
3.1.1. Estrategia descendente......................................................................................................4
3.1.2. Estrategia ascendente .......................................................................................................5
3.1.3. Condiciones con varios predicados...................................................................................6
3.2 Cálculo de la complejidad ciclomática......................................................................................7
4.- Selección de caminos con la prueba estructurada...........................................................................9
4.1.- Método simplificado................................................................................................................9
4.2.- Método general......................................................................................................................10
4.3.- Generación de casos de prueba..............................................................................................11
Fuentes de Información......................................................................................................................13
1.- Introducción.
La Complejidad Ciclomática (Cyclomatic Complexity) es una métrica del software en ingeniería del
software que proporciona una medición cuantitativa de la complejidad lógica de un programa. Es
una de las métricas de software de mayor aceptación, ya que ha sido concebida para ser
independiente del lenguaje.
Esta métrica, propuesta por Thomas McCabe en 1976, se basa en el diagrama de flujo determinado
por las estructuras de control de un determinado código. De dicho análisis se puede obtener una
medida cuantitativa de la dificultad de crear pruebas automáticas del código y también es una
medición orientativa de la fiabilidad del mismo.
La idea de esta métrica no es contar los bucles en el código de un programa sino en el resultado de
contar el número de ciclos diferentes que se siguen en un fragmento de código de un programa
habiendo creado una rama imaginaria desde el nodo de salida al nodo de entrada del
diagrama de flujo correspondiente a este fragmento de código.
Un nombre más adecuado podría ser Complejidad condicional ya que el cálculo de esta métrica se
ajusta más al hecho de buscar condiciones que contar ejecuciones de predicados dentro de bucles.
La complejidad ciclomática define el número de caminos independientes dentro de un
fragmento de código y determina la cota superior del número de pruebas que se deben realizar
para asegurar que se ejecuta cada sentencia al menos una vez.
La medida resultante puede ser utilizada en el desarrollo, mantenimiento y recodificación del
código para estimar el riesgo, costo y estabilidad. Algunos estudios experimentales indican la
existencia de distintas relaciones entre la métrica de McCabe y el número de errores existentes en el
código fuente, así como el tiempo requerido para encontrar y corregir esos errores.
A partir del análisis de muchos proyectos McCabe encontró que un valor 10 es un límite superior
práctico para el tamaño de un módulo. Cuando la complejidad supera dicho valor se hace muy
difícil probarlo, entenderlo y modificarlo.
La limitación deliberada de la complejidad en todas las fases del desarrollo ayuda a evitar los
problemas asociados a proyectos de alta complejidad.
El límite propuesto por McCabe sin embargo es fuente de controversias. Algunas organizaciones
han utilizado el valor 15 con bastante éxito. Otras valoraciones en una rutina lo hace de la siguiente
manera:
• 0–5. La rutina es probablemente buena
• 6–10. Comienza a pensar formas de simplificar al rutina .
• 10 o mas. Extrae partes de las rutinas a otras y llámalas desde la primera.
1. Como primer paso, se identifica la estructura principal que es un mientras, que abarca de la
línea 6 a la 14. Cuando el mientras concluya, seguirá
la instrucción 15.
2. En un segundo paso, el mientras (línea 5) se estructura
de acuerdo a los patrones, quedando como se muestra.
3. En el tercer paso, el mientras tiene un if principal
(línea 7) con dos ramas: la línea 10 y las líneas 11 a
13. Al concluir el if regresa al inicio el mientras. Note
que todas las líneas de control regresan al nodo 5 y
cuando falle el mientras, del nodo 5 seguirá el 15.
4. Un cuarto paso expande el nodo del if más interno (11
a 13) en dos ramas: 12 y 13. Al terminar, ambas
regresan al nodo 5. Algunos prefieren agregar nodos
redundantes que sirven para ligar, pero no representan
ninguna operación. Tales nodos se etiquetan con un 0,
el resultado de esta operación quedaria de esta forma.
1. (a). En el primer paso se tiene una serie de nodos individuales. Recorriendo el grafo hasta
niveles que no tengan anidamiento, se podrá identificar un grupo, correspondiente al Si de la
línea 11, formando un grupo con los nodos 11, 12 y 13. En este caso el uso de nodos
conectores es muy útil, por lo cual se usarán en éste y los siguientes pasos.
2. (b). En el siguiente paso se identifica el otro Si de la línea 7, que forma una estructura con el
nodo 10 y el grupo previamente identificado (11 a 13), dando el grafo de la Figura 3.8 b).
3. (c). En el siguiente paso identificamos el mientras de la línea 5, que incluye los grupos antes
identificados, con su regreso.
4. (d). Finalmente, se conecta el mientras con el nodo final.
ν(G) = a – n + 2
Esta es la forma clásica de calcular la complejidad ciclomática,
adecuada en programas que lo hacen en forma automática.
En el ejemplo anterior, si se suman el número de arcos resulta un
total de once arcos y hay un total de nueve nodos. Por tanto, la
complejidad ciclomática resulta ser:
v(G) = 11 – 9 + 2 = 4
Definición 2:
Sea nps el número de nodos con predicado simple (es decir,
nodos de los que parten dos caminos). La complejidad ciclomática
o número ciclomático se define como:
ν(G) = 1 + nps
Notese que se dice “predicados simples”. Es decir, supone que ya se
expandieron los predicados múltiples.
En el ejemplo anterior, de los nodos número cinco, siete y once
parten dos flechas. por tanto la complejidad ciclomática es:
v(G) = 1 + 3 = 4
Definición 3:
ν(G) = regcer + 1
Esta definición es de utilidad cuando se calcula manualmente la complejidad ciclomática, ya que se
identifican las áreas cerradas en forma visual. En cálculo automatizado no es muy conveniente.
En el ejemplo anterior, se distinguen tres regiones:
• 5-7-10-0-5.
• 7-10-0-0-12-11-7.
• 11-12-0-13-11.
v(G) = 3 + 1 = 4
Existe una manera más formal de definir ν(G), como la cardinalidad de la base del conjunto de
caminos posibles en el grafo, pero este concepto se usa, más bien como dato para saber cuántos son
los caminos básicos. Ésto se utilizará en lo que sigue.
Veamos otro ejemplo. Sea la siguiente función.
1 numAdh = 0
2 Para i de 0 hasta nt1-1
3 Para j de 0 hasta nt2-1
4 Si tok1[i]=tok2[j] entonces
5 numAdh = numAdh +1
6 total = tok1 + tok2 – numAdh
7 cohesión = numAdh / total
8 regresa cohesión
El grafo de esta función viene dado por el grafo de la figura.
Podemos entonces comprobar que su complejidad ciclomática es
cuatro de las tres formas vistas.
1. El número de vértices (nodos) es ocho y el número de
aristas (lineas) es diez. Por tanto v(G) = 10 – 8 + 2 = 4.
2. Hay tres nodos que son predicados simples nodos de los
que salen dos o mas lineas): 4, 3’, 2’ → v(G) = 1 + 3 = 4.
3. Se pueden distinguir tres regiones cerradas. Estas son las
siguientes: 2-3-4-5-3’-2’-2, 3-4-3’-3 y 4-5-3’
→ v(G) = 3 + 1 = 4
2 1-2-3-4-5-3’-2’-6
3 1-2-3-4-5-3’-3-4-3’-2’-6
4 1-2-3-4-5-3’-3-4-3’-2’-2-3-4-3’-2’-6
2 1-2-3-4-3’-4-5-3’-2’-6
3 1-2-3-4-3’-2’-6
4 1-2-3-4-5-3’-2’-6
Se toma el primer camino, donde hay una primera condición (línea 5): “Si cant>1000”;
retrocediendo, se observa que es una entrada; así pues, como el camino lleva por el lado negativo,
se sabe que cant debe ser menor o igual a 1000. Analizando la siguiente condición (línea 8): “Si
cant > 100”, opera sobre la misma variable y ahora en caso afirmativo, es decir, cant es mayor a