Capítulo 2. Modelado y generación automática de pruebas para STR
2.2. Máquinas Proposicionales
2.2.2. Generación de pruebas
La generación automática de pruebas de caja negra para una MP se basa completamente en la generación para su ME asociada.
Modelado y generación automática de pruebas para STR
Dada una MP, la generación de casos de prueba para la misma consistirá en obtener la ME asociada (caso de que la MP sea consistente), y después generar los casos de prueba para ella, tal y como se describió en la sección 2.1.2. Dado que en el presente trabajo solo se ha contemplado la generación de casos de prueba para ME deterministas y totalmente definidas56, habremos de comprobar primero que la MP es consistente, está totalmente definida y es determinista (en cuyo caso la ME asociada también tendrá esas propiedades).
Dicha comprobación pasaría por probar que, para cada posible combinación de entradas y condiciones (es decir, para cada posible valuación de la unión de los conjuntos de entradas y condiciones) de la MP, existe exactamente una combinación posible de salidas y postcondiciones. La complejidad computacional asociada a dicho chequeo es de orden exponencial. Incluso para MPs de pequeño tamaño, el tiempo de ejecución podría resultar excesivo (por ejemplo, en una MP con solo 10 condiciones y 10 entradas, el número de combinaciones a chequear sería de ʹଶൌ ͳǤͲͶͺǤͷ).
Se presentan a continuación una técnica que ayuda a disminuir el tiempo de ejecución de dicho análisis. Dicha técnica consiste básicamente en reducir la libertad del modelador del sistema libertad a la hora de describirlo.
Definición 2.2.3.Forma Normal de Descomposición Funcional (FNDF) de una MP Diremos que una MP ܯ ൌ ۃܥǡ ܫǡ ܱǡ ܴǡ Ȱۄ está expresada en FNDF sobre dos conjuntos no vacíos ܥԢ ك ܥ y ܱԢ ك ܱ si y solo si:
Ȱ contiene una única fórmula de la forma
ሥ ݈
אᇲ
ǡ
y para toda regla ۃ߶ǡ ߶ǡ ߶௨௧ǡ ߶௦௧ۄ א ܴ, ߶ tiene la forma ሺ߶ᇲሻ ר ൫߶തതതᇲ൯
y ߶௨௧ y ߶௦௧ son conjunciones de literales sobre ܱԢ ሼݐݎݑ݁ሽ y ܥԢ ሼݐݎݑ݁ሽ, respectivamente.
ז
Nótese que, por convención,
ሥ ߶
א
؝ ݐݎݑ݁ǡ
Modelado y generación automática de pruebas para STR
por lo que si el conjunto ܥതതതᇱ de la anterior definición es vacío, la correspondiente fórmula ߶ sería de la forma ሺ߶ᇲሻ ר ሺݐݎݑ݁ሻ.
Obsérvese que, a partir de la definición de una MP como un conjunto de MPs en Forma Normal de Descomposición Funcional, la complejidad asociada a la verificación de las propiedades de definición total y determinismo y la construcción de la parte ejecutable de la ME asociada se reduce drásticamente.
Primero, el chequeo de las condiciones enunciadas en el 2.2.21 para cada MP es sencillo. Habrá simplemente que chequear que, en cada regla, todas las condiciones y salidas pertenecientes a los conjuntos determinados aparecen en las fórmulas (conjunciones de literales) correspondientes, y que no lo hacen aquellas pertenecientes a los conjuntos no determinados (si la MP está correctamente descrita en FNDF, no se dará el caso de que dos reglas distintas difieran en las condiciones o salidas que aparecen). Bastará con recorrer una sola vez el conjunto de reglas y las fórmulas ߶௨௧ y
߶௦௧ de cada una de ellas para verificar que (1), (2) y (3) se cumplen. Una vez hecho esto, el chequeo de las condiciones que aparecen en (a) y (b) es trivial. Si todas se cumplen, concluiremos que la MP unión es consistente y determinista (en caso contrario, este procedimiento no decide; obsérvese que las anteriores condiciones son suficientes pero no necesarias).
Modelado y generación automática de pruebas para STR
Algoritmo 2.2.4.Chequeo de MP en FNDF
Entradas: Una MP ܯ ൌ ۃܥǡ ܫǡ ܱǡ ܴǡ Ȱۄ y dos conjuntos no vacíos ܥᇱ ك ܥ y ܱᇱك ܱ. Salidas: true si la MP está en FNDF sobre ܥᇱ y ܱᇱ; false en otro caso.
߶ ؔ ߶ א ȰǢ if ȁȰȁ ͳor߶ ് ٿאᇲ݈ then return ۃ݂݈ܽݏ݁ǡ Ȱۄ end if for eachݎ ൌ ۃ߶ǡ ߶ǡ ߶௨௧ǡ ߶௦௧ۄ א ܴ do if ߶݊ݐ݈݂݅݁݊݁ܽݎ݉ܽሺ߶ᇲሻ ר ൫߶തതതᇲ൯or ߶ᇲ݊݁ݏݑ݂݊ܽ×ݎ݉ݑ݈ܽݏ݈ݏܾݎ݁ܥᇱor ߶തതതᇲ݊݁ݏݑ݂݊ܽ×ݎ݉ݑ݈ܽݏ݈ݏܾݎ݁ܥതതതᇱ or ߶௨௧݊݁ݏݑ݆݊ܽܿ݊ݑ݊ܿ݅×݈݊݀݁݅ݐ݁ݎ݈ܽ݁ݏݏ݈ݏܾݎܱ݁ᇱ ሼݐݎݑ݁ሽor ߶௦௧݊݁ݏݑ݆݊ܽܿ݊ݑ݊ܿ݅×݈݊݀݁݅ݐ݁ݎ݈ܽ݁ݏݏ݈ݏܾݎ݁ܥᇱ ሼݐݎݑ݁ሽthen return ۃ݂݈ܽݏ݁ǡ ݎۄ end if end do return ۃݐݎݑ݁ۄ ז
Nótese que bastará con recorrer una sola vez cada fórmula para chequear si tienen la forma esperada. Por ejemplo, para verificar ߶ ് ٿ ݈אூ bastará con recorrer ߶ verificando todos los operadores que encontramos son “ר”, que dichos operadores solo aparecen entre literales (un solo símbolo proposicional o un símbolo precedido de un operador “”) y que cada símbolo proposicional aparece una sola vez y pertenece a ܫ.
Nótese además que el anterior algoritmo admite sencillas modificaciones que permitan devolver información más completa acerca de los motivos por los que la regla en cuestión viola no cumple la notación FNDF.
Modelado y generación automática de pruebas para STR
Algoritmo 2.2.5.Chequeo de propiedades de una MP
Entradas: Una MP ܯ ൌ ۃܥǡ ܫǡ ܱǡ ܴǡ Ȱۄ en FNDF sobre ܥᇱ ك ܥ y ܱᇱ ك ܱ.
Salidas: true si la MP es virtualmente consistente, está virtualmente totalmente definida y es virtualmente determinista respecto de ܥᇱ y ܱᇱ, y false en otro caso.
ݏ ؔ ࣷ א ܵܽݐᇲሺȰሻǢܵ ؔ ܵǢ ܵ௩௦௧ ؔ Ǣ
ࣣ ؔ ܸ݈ܽሺܫሻǢ ࣝ ؔ ܸ݈ܽሺܥതതതሻǢᇱ while ܵ ് do
ݏ ؔ ࣷ א ܵǢܵ ؔ ܵെ ሼݏሽǢܵ௩௦௧ ؔ ܵ௩௦௧ ሼݏሽǢ for eachݏᇱא ࣝ and ࣻ א ࣣ do
ܱݑݐ ؔ Ǣ ܲݏݐ ؔ for eachݎ ൌ ۃ߶ǡ ߶ǡ ߶௨௧ǡ ߶௦௧ۄ א ܴ such that ݏ ݏᇱ٧ ߶ and ࣻ ٧ ߶ do ܱݑݐ ؔ ܱݑݐ ሼ߶௨௧ሽǢ ܲݏݐ ؔ ܲݏݐ ൛߶௦௧ൟǢ end do if ܱݑݐ ൌ then return ݂݈ܽݏ݁ if ( א ܮ݅ݐ݁ݎ݈ܽݏሺܱݑݐሻ and א ܮ݅ݐ݁ݎ݈ܽݏሺܱݑݐሻ ) or ( א ܮ݅ݐ݁ݎ݈ܽݏሺܲݏݐሻ and ܿ א ܮ݅ݐ݁ݎ݈ܽݏሺܲݏݐሻ ) then return ݂݈ܽݏ݁ end if if ȁܵݕܾ݈݉ݏሺܱݑݐሻȁ ് ȁܱᇱȁ or ȁܵݕܾ݈݉ݏሺܲݏݐሻȁ ് ȁܥᇱȁ then return ݂݈ܽݏ݁ end if ݏᇱؔ ࣷ א ܵܽݐ ᇲሺܲݏݐሻǢ if ݏᇱ ב ܵ ௩௦௧ then ܵ ؔ ܵ ሼݏᇱሽǢend if end do end do returnݐݎݑ݁ ז
Modelado y generación automática de pruebas para STR La sentencia ݒ ؔ ݒᇱא ܵܽݐ
ሺȰሻ significa que ݒ es una valuación cualquiera del conjunto de valuaciones ܵܽݐሺȰሻ (sobre el conjunto de variables proposicionales ܲ) que satisfacen el conjunto de fórmulas Ȱ. Obsérvese que, dado que ܯ está en FNDF, obtener las valuaciones del tipo ܵܽݐሺȰሻ que aparecen en el algoritmo es trivial; bastará con recorrer las fórmulas de Ȱ una sola vez. Para las evaluaciones ݒ ٧ ߶ de las fórmulas será también suficiente recorrer las mismas una sola vez.
Si el anterior algoritmo devuelve ݐݎݑ݁, tenemos garantizado que la MP es virtualmente consistente, está virtualmente totalmente definida y es virtualmente determinista respecto de ܥᇱ y ܱᇱ. Asumiendo que forma parte
La construcción de la parte ejecutable de la ME asociada es también sencilla. Primero, generaremos la MP unión correspondiente (de la cual, como se explicó arriba, ya sabremos que es consistente y determinista). Obtendremos el estado inicial de dicha ME simplemente “leyendo” las fórmulas contenida en Ȱ (las cuales serán simples conjunciones de literales, ya que las MP originales estaban en FNDF). A partir de dicho estado (que representa una valuación concreta de las condiciones de la MP), se pueden ir recorriendo las reglas de la MP y, para todas aquellas que se disparan a partir del estado inicial (esto es, el estado inicial satisface ߶), obtener las entradas que se han definido para ese estado (“leyendo” las fórmulas ߶ de las reglas disparadas; cada entrada de la ME será una valuación concreta del conjunto de entradas), y para cada una de ellas obtener la salida y estado alcanzado correspondientes (“leyendo” respectivamente las fórmulas ߶௨௧ y ߶௦௧ de las reglas disparadas por el estado inicial y la correspondiente entrada). Cada una de las entradas obtenidas formará, junto al estado inicial y la salida y estado alcanzado asociados a los primeros, una transición de la ME. Repetiremos el proceso para cada uno de los estados alcanzados, hasta que no quede ningún estado alcanzado que no hayamos procesado. El resultado será una ME que representará la parte ejecutable de la ME asociada a la MP en cuestión.
Para obtener la parte no alcanzable de dicha ME, tendremos que obtener aquellas valuaciones del conjunto de condiciones (estados) que no hayan sido alcanzadas mediante el procedimiento anterior. En el peor de los casos, esto exige hallar todas las valuaciones de dicho conjunto, problema de complejidad exponencial, y hacer la diferencia con el conjunto alcanzado. Sin embargo, no estaremos en general interesados en construir la parte no alcanzable de la ME correspondiente, ya que, además de carecer de verdadero interés práctico, ésta no podrá en ningún caso evaluarse usando pruebas de caja negra.
Nótese que, durante el anterior procedimiento, también podremos comprobar si la ME está o no totalmente definida o no, simplemente observando si el conjunto de entradas “obtenidas” a partir de las reglas disparadas por un estado coincide con el conjunto total de entradas (el número total es conocido a priori: ʹȁூȁ, con ܫ el conjunto de entradas de
Modelado y generación automática de pruebas para STR
la MP, por lo que simplemente tendremos que verificar si dicho número coincide con el número de entradas “obtenidas” para cierto estado).
Obsérvese que también se podrían determinar fácilmente las propiedades de consistencia y determinismo de la MP correspondiente según aplicamos este procedimiento. Sin embargo, hacerlo a partir del análisis de las MP que participan en la unión que genera la MP, permite deducir tales propiedades de manera rápida sin tener que consumir memoria generando la correspondiente ME asociada.
Modelado y generación automática de pruebas para STR
Algoritmo 2.2.6.Generación de la ME asociada a una MP bajo las asunciones de Entradas: Una MP ܯ ൌ ۃܥǡ ܫǡ ܱǡ ܴǡ Ȱۄ consistente, determinista y totalmente definida, formada como la unión simple de un conjunto de MPs en FNDF.
Salidas: La parte ejecutable de la ME asociada a ܯ.
ݏ ؔ ݒ א ܵܽݐሺȰሻǢ ܵ ؔ Ǣ ࣣ ؔ ܸ݈ܽሺܫሻǢ ࣩ ؔ Ǣ ܶ ؔ Ǣܵ ؔ ሼݏሽǢ ܵ ؔ ܵǢ while ܵ ് do ݏ ؔ ݏᇱא ܵ Ǣܵ ؔ ܵെ ሼݏሽǢ for each ࣻ א ࣣdo ܱݑݐ ؔ Ǣ ܲݏݐ ؔ for eachݎ ൌ ۃ߶ǡ ߶ǡ ߶௨௧ǡ ߶௦௧ۄ א ܴ such that ݏ ٧ ߶ and ࣻ ٧ ߶ do
ܱݑݐ ؔ ܱݑݐ ሼ߶௨௧ሽǢ ܲݏݐ ؔ ܲݏݐ ൛߶௦௧ൟǢ end do Մ ؔ ݒ א ܵܽݐைሺܱݑݐሻǢ ݏᇱ ؔ ࣷ א ܵܽݐሺܲݏݐሻǢ ܵ ؔ ܵ ሼݏሽǢ ࣩ ؔ ࣩ ሼՄሽǢ ܶ ؔ ܶ ሼۃݏǡ ࣻǡ Մǡ ݏᇱۄሽǢ if ݏᇱ ב ܵthen ܵ ؔ ܵ ሼݏᇱሽǢend if end do end do return ۃܵǡ ࣣǡ ࣩǡ ܶǡ ܵۄ ז
La generación de los casos de prueba correspondientes de basaría en la Me construida usando el anterior algoritmo.
Para aquellas MP de las que dispongamos de una descomposición ortogonal, podremos ahorrar tiempo de ejecución generando los casos de prueba únicamente para las ME asociadas a cada MP de la descomposición ortogonal. Nótese que si tenemos una descomposición ortogonal con dos MP independientes ܯଵ y ܯଶ con conjuntos de entradas ܥଵ y ܥଶ, si construimos las ME asociadas a cada una de ellas en lugar de la ME
Modelado y generación automática de pruebas para STR
asociada a su MP unión, tendremos que explorar ʹȁభȁ ʹȁమȁ൏ ʹȁభమȁ ൌ ʹȁభȁʹȁమȁ,
cuando ȁܥଵȁ ͳ o ȁܥଶȁ ͳ. Incluso para conjuntos de condiciones de tamaño relativamente pequeño, hay una diferencia significativa (por ejemplo, para ȁܥଵȁ ൌ ͷ y
ȁܥଶȁ ൌ ͷ, tenemos Ͷ ൌ ʹହ ʹହ ൏ ʹଵൌ ͳͲʹͶ).
Teorema 2.2.7.Conjunto de casos de prueba completo bajo la asunción de tamaño Dada una MP ܯ, una descomposición ortogonal ൛ܯൟୀଵ de ܯ y un conjunto de casos de prueba ൛ܶܥൟୀଵ , con ݊ ͳ.
Si para todo ͳ ݆ ݊, ܶܥ es un conjunto de casos de prueba completo (bajo la asunción de tamaño) para ܯܧ൫ܯ൯, entonces
ራ ܶܥ ୀଵ ݁ݏݑ݆݊ܿ݊ݑ݊ݐ݈ܿ݉݁ݐ݀݁ܿܽݏݏ݀݁ݎݑܾ݁ܽܽݎܽܯܧ ቌራ ܯ ୀଵ ቍ ז
Propuesta de diseño para herramienta de modelado y pruebas