Los predicados de diseño son un método inventado por Thomas McCabe, [1] para cuantificar la complejidad de la integración de dos unidades de software. Cada uno de los cuatro tipos de predicados de diseño tiene una clasificación de complejidad de integración asociada. Para fragmentos de código que aplican más de un predicado de diseño, se pueden combinar calificaciones de complejidad de integración.
La suma de la complejidad de la integración para una unidad de código, más uno, es el número máximo de casos de prueba necesarios para ejercitar la integración por completo. Aunque un ingeniero de pruebas normalmente puede reducir esto cubriendo tantos predicados de diseño previamente descubiertos como sea posible con cada nueva prueba. Además, algunas combinaciones de predicados de diseño pueden ser lógicamente imposibles.
Tipos de llamadas
Llamada incondicional
La unidad A siempre llama a la unidad B. Esta tiene una complejidad de integración de 0. Por ejemplo:
unitA :: functionA () { unidadB-> funciónB ();}
Llamada condicional
La unidad A puede o no llamar a la unidad B. Esta integración tiene una complejidad de 1 y necesita dos pruebas: una que llama a B y otra que no.
unitA :: functionA () { si (condición) unidadB-> funciónB ();}
Llamada condicional mutuamente exclusiva
Esto es como la declaración de cambio de un lenguaje de programación . La unidad A llama exactamente una de varias unidades posibles. La complejidad de la integración es n - 1, donde n es el número de unidades posibles para llamar.
unitA :: functionA () { switch (condición) { caso 1: unidadB-> funciónB (); rotura; caso 2: unidadC-> funciónC (); rotura; ... defecto: unidadN-> funciónN (); rotura; }}
Llamada iterativa
En una llamada iterativa, la unidad A llama a la unidad B al menos una vez, pero tal vez más. Esta integración tiene una complejidad de 1. También requiere dos pruebas: una que llama a la unidad B una vez y una prueba que la llama más de una vez.
unitA :: functionA () { hacer { unidadB-> funciónB (); } while (condición);}
Combinar llamadas
Cualquier integración particular puede combinar varios tipos de llamadas. Por ejemplo, la unidad A puede llamar o no a la unidad B; y si lo hace, puede llamarlo una o más veces. Esta integración combina una llamada condicional, con su complejidad de integración de 1, y una llamada iterativa, con su complejidad de integración de 1. La complejidad de integración combinada suma 2.
unitA :: functionA () { if (someNumber> 0) { para (i = 0; iúnnúmero;> unidadB-> funciónB (); } }}
Numero de pruebas
Dado que el número de pruebas necesarias es la complejidad de integración total más uno, esta integración requeriría 3 pruebas. En uno, donde someNumber no es mayor que 0, no se llama a la unidad B. En otro, donde someNumber es 1, la unidad B se llama una vez. Y en la final, someNumber es mayor que 1, la unidad B se llama más de una vez.
Referencias
- ^ McCabe, Thomas J .; Butler, Charles W. (12 de diciembre de 1989). "Medición y ensayo de la complejidad del diseño". Comunicaciones de la ACM . 32 (12): 1415-1425. doi : 10.1145 / 76380.76382 .