Articulo de referencia

Marco de plantillas de prueba

El Test Template Framework ( TTF ) es un marco de pruebas basado en modelos (MBT) propuesto por Phil Stocks y David Carrington [ 1 ] para la realización de pruebas de software ....

El Test Template Framework ( TTF ) es un marco de pruebas basado en modelos (MBT) propuesto por Phil Stocks y David Carrington [ 1 ] para la realización de pruebas de software . Aunque el TTF fue concebido para ser independiente de la notación, la presentación original se realizó utilizando la notación formal Z. Es uno de los pocos marcos MBT que se acercan a las pruebas unitarias .

Introducción

El TTF es una propuesta específica de pruebas basadas en modelos (MBT). Considera los modelos como especificaciones Z. Cada operación dentro de la especificación se analiza para derivar o generar casos de prueba abstractos . Este análisis consta de los siguientes pasos:

  1. Defina el espacio de entrada (EI) de cada operación.
  2. Derive el espacio de entrada válido (VIS) a partir del IS de cada operación.
  3. Aplique una o más tácticas de prueba , [ 1 ] comenzando desde cada VIS , para construir un árbol de prueba para cada operación. Los árboles de prueba se llenan con nodos llamados clases de prueba , especificaciones de prueba o condiciones de prueba.
  4. Pode cada uno de los árboles de prueba resultantes .
  5. Encuentra uno o más casos de prueba abstractos en cada hoja de cada árbol de pruebas .

Una de las principales ventajas del TTF es que todos estos conceptos se expresan en la misma notación de la especificación, es decir, la notación Z. Por lo tanto, el ingeniero solo necesita conocer una notación para realizar el análisis, incluso para generar casos de prueba abstractos .

Conceptos importantes

En esta sección se describen los principales conceptos definidos por el TTF.

Espacio de entrada

DejarOpag{\displaystyle Op}Sea una operación Z.incógnita1incógnitanorte{\displaystyle x_{1}\dots x_{n}}sean todas las variables de entrada y de estado (no primadas) a las que se hace referencia enOpag{\displaystyle Op}, yT1Tnorte{\displaystyle T_{1}\dots T_{n}}sus tipos correspondientes. El espacio de entrada (EI) deOpag{\displaystyle Op}, escritoOpagis{\displaystyle Op_{is}}, es el cuadro de esquema Z definido por[incógnita1:T1incógnitanorte:Tnorte]{\displaystyle [x_{1}:T_{1}\dots x_{n}:T_{n}]}.

Espacio de entrada válido

DejarOpag{\displaystyle Op}Sea una operación Z.pre Opag{\displaystyle {\text{pre }}Op}ser la condición previa deOpag{\displaystyle Op}. El espacio de entrada válido (VIS) deOpag{\displaystyle Op}, escritoOpagvis{\displaystyle Op_{vis}}, es el cuadro de esquema Z definido por[Opagis|pre Opag]{\displaystyle [Op_{is}|{\text{pre }}Op]}.

Clase de prueba

DejarOpag{\displaystyle Op}ser una operación Z y dejarPAG{\displaystyle P}sea ​​cualquier conjunción de predicados atómicos que dependan de una o más de las variables definidas enOpagvis{\displaystyle Op_{vis}}. Luego, el cuadro de esquema Z[Opagvis|PAG]{\displaystyle [Op_{vis}|P]}es una clase de prueba deOpag{\displaystyle Op}. Tenga en cuenta que este esquema es equivalente a[Opagis|pre OpagPAG]{\displaystyle [Op_{is}|{\text{pre }}Op\land P]}Esta observación puede generalizarse diciendo que siOpagdo{\displaystyle Op_{c}}es una clase de prueba deOpag{\displaystyle Op}, luego el cuadro de esquema Z definido por[Opagdo|PAG]{\displaystyle [Op_{c}|P]}es también una clase de prueba deOpag{\displaystyle Op}Según esta definición, el VIS también es una clase de prueba.

SiOpagdo{\displaystyle Op_{c}}es una clase de prueba deOpag{\displaystyle Op}, entonces el predicadoPAG{\displaystyle P}enOpagdo==[Opagdo|PAG]{\displaystyle Op_{c'}==[Op_{c}|P]}Se dice que es el predicado característico deOpagdo{\displaystyle Op_{c'}}oOpagdo{\displaystyle Op_{c'}}se caracteriza porPAG{\displaystyle P}.

Las clases de prueba también se denominan objetivos de prueba, plantillas de prueba, especificaciones de prueba y condiciones de prueba.

Táctica de prueba

En el contexto de la TTF, una táctica de prueba [ 1 ] es un medio para particionar cualquier clase de prueba de cualquier operación. Sin embargo, algunas de las tácticas de prueba utilizadas en la práctica no siempre generan una partición de algunas clases de prueba.

Algunas de las tácticas de prueba propuestas originalmente para el TTF son las siguientes:

  • Forma Normal Disyuntiva (FND). Al aplicar esta táctica, la operación se escribe en Forma Normal Disyuntiva y la clase de prueba se divide en tantas clases de prueba como términos tenga el predicado de la operación resultante. El predicado que se agrega a cada nueva clase de prueba es la precondición de uno de los términos del predicado de la operación.
  • Particiones estándar (PE). Esta táctica utiliza una partición predefinida de algún operador matemático. [ 1 ] Por ejemplo, la siguiente es una buena partición para expresiones de la formaST{\displaystyle S\spadesuit T}dónde{\displaystyle \spadesuit }es uno de{\displaystyle \cup },{\displaystyle \cap }y{\displaystyle \setminus }(véase Teoría de conjuntos ).
    S=,T=S,T,STS=,TS,T,TSS,T=S,T,T=SS,T,ST=S,T,ST,¬(ST),¬(TS),ST{\displaystyle {\begin{array}{l|l}S=\emptyset ,T=\emptyset &S\neq \emptyset ,T\neq \emptyset ,S\subset T\\\hline S=\emptyset ,T\neq \emptyset &S\neq \emptyset ,T\neq \emptyset ,T\subset S\\\hline S\neq \emptyset ,T=\emptyset &S\neq \emptyset ,T\neq \emptyset ,T=S\\\hline S\neq \emptyset ,T\neq \emptyset ,S\cap T=\emptyset &S\neq \emptyset ,T\neq \emptyset ,S\cap T\neq \emptyset ,\lnot (S\subseteq T),\lnot (T\subseteq S),S\neq T\end{array}}}
    Como puede observarse, las particiones estándar pueden variar en función de la cantidad de pruebas que el ingeniero desee realizar.
  • Propagación de subdominios (SDP). Esta táctica se aplica a expresiones que contienen:
    1. Dos o más operadores matemáticos para los que ya existen particiones estándar definidas, o
    2. Operadores matemáticos que se definen en términos de otros operadores matemáticos.
    En cualquiera de estos casos, las particiones estándar de los operadores que aparecen en la expresión o en la definición de una compleja se combinan para producir una partición para la expresión. Si la táctica se aplica al segundo caso, la partición resultante puede considerarse como la partición estándar para ese operador. Stocks y Carrington ilustran esta situación conRGRAMO=(dom GRAMOR)GRAMO{\displaystyle R\oplus G=({\text{dom }}G\ntriangleleft R)\cup G}, dónde{\displaystyle \ntriangleleft }significa anti-restricción de dominio , al proporcionar particiones estándar para{\displaystyle \ntriangleleft }y{\displaystyle \cup }y propagándolos para calcular una partición para{\displaystyle \oplus }.
  • Mutación de especificación (SM). El primer paso de esta táctica consiste en generar una versión modificada de la operación Z. Una versión modificada de una operación Z es similar en concepto a una versión modificada de un programa , es decir, es una versión modificada de la operación. El ingeniero introduce la modificación con la intención de descubrir un error en la implementación. La versión modificada debe ser la especificación que el ingeniero supone que el programador ha implementado. A continuación, el ingeniero debe calcular el subconjunto del VIS que produce resultados diferentes en ambas especificaciones. El predicado de este conjunto se utiliza para derivar una nueva clase de prueba.

Otras tácticas de prueba que también se pueden utilizar son las siguientes:

  • En la Extensión de Conjuntos (ISE). Se aplica a predicados de la formamiincógnitapagr{miincógnitapagr1,,miincógnitapagrnorte}{\displaystyle expr\in \{expr_{1},\dots ,expr_{n}\}}. En este caso, genera n clases de prueba tales que un predicado de la formamiincógnitapagr=miincógnitapagri{\displaystyle expr=expr_{i}}se añade a cada uno de ellos.
  • Conjunto de pruebas obligatorio (MTS). Esta táctica asocia un conjunto de valores constantes a una variable VIS y genera tantas clases de prueba como elementos haya en el conjunto. Cada clase de prueba se caracteriza por un predicado de la formavar=val{\displaystyle var=val}donde var es el nombre de la variable y val es uno de los valores del conjunto.
  • Intervalos enteros (IS). Esta táctica se aplica únicamente a las variables de VIS de tipoZ{\displaystyle \mathbb {Z} }(o su "subtipo")norte{\displaystyle \mathbb {N} }). Consiste en asociar un rango a una variable y derivar clases de prueba comparando la variable con los límites del rango de alguna manera. Más formalmente, sea n una variable de tipoZ{\displaystyle \mathbb {Z} }y dejar[i,j]{\displaystyle [i,j]}sea ​​el rango asociado. Luego, la táctica genera las clases de prueba caracterizadas por los siguientes predicados:norte<i{\displaystyle n<i},norte=i{\displaystyle n=i},i<nortenorte<j{\displaystyle i<n\land n<j},norte=j{\displaystyle n=j},norte>j{\displaystyle n>j}. La táctica se generaliza fácilmente a una lista de números enteros .
  • Tipo suma (ST). Esta táctica genera tantas clases de prueba como elementos se pueden construir en un tipo suma aplicando todos los constructores del tipo. En otras palabras, si un modelo define el tipo COLOUR  ::= red | blue | green y alguna operación usa c de tipo COLOUR , entonces al aplicar esta táctica cada clase de prueba se dividirá en tres nuevas clases de prueba: una en la que c es igual a red , otra en la que c es igual a blue y la tercera en la que c es igual a green .
  • Subconjunto propio de extensión de conjunto (PSSE). Esta táctica utiliza el mismo concepto de ISE, pero aplicado a inclusiones de conjuntos. PSSE ayuda a probar operaciones que incluyen predicados comomiincógnitapagr{miincógnitapagr1,,miincógnitapagrnorte}{\displaystyle expr\subset \{expr_{1},\dots ,expr_{n}\}}Cuando se aplica PSSE, genera2norte1{\displaystyle 2^{n}-1}clases de prueba donde un predicado de la formamiincógnitapagr=Ai{\displaystyle expr=A_{i}}coni[1,2norte1]{\displaystyle i\in [1,2^{n}-1]}yAiPAG{miincógnitapagr1,,miincógnitapagrnorte}{{miincógnitapagr1,,miincógnitapagrnorte}}{\displaystyle A_{i}\in \mathbb {P} \{expr_{1},\dots ,expr_{n}\}\setminus \{\{expr_{1},\dots ,expr_{n}\}\}}, se añade a cada clase.{miincógnitapagr1,,miincógnitapagrnorte}{\displaystyle \{expr_{1},\dots ,expr_{n}\}}está excluido dePAG{miincógnitapagr1,,miincógnitapagrnorte}{\displaystyle \mathbb {P} \{expr_{1},\dots ,expr_{n}\}}porque expr es un subconjunto propio de{miincógnitapagr1,,miincógnitapagrnorte}{\displaystyle \{expr_{1},\dots ,expr_{n}\}}.
  • Cardinalidad de conjunto (SC). Esta táctica se aplica a variables de tipo conjunto. El usuario selecciona una de dichas variables (v{\displaystyle v}) y un número entero positivo (norte{\displaystyle n}). La táctica genera una especificación de prueba caracterizada por|v|=metro{\displaystyle |v|=m}para cadametro[0,norte]{\displaystyle m\in [0,n]}.

Árbol de prueba

La aplicación de una táctica de prueba al VIS genera algunas clases de prueba. Si algunas de estas clases de prueba se subdividen aplicando una o más tácticas de prueba, se obtiene un nuevo conjunto de clases de prueba. Este proceso puede continuar aplicando tácticas de prueba a las clases de prueba generadas hasta el momento. Evidentemente, el resultado de este proceso puede representarse como un árbol con el VIS como nodo raíz, las clases de prueba generadas por la primera táctica de prueba como sus hijos, y así sucesivamente. Además, Stocks y Carrington proponen utilizar la notación Z para construir el árbol, como se muestra a continuación.

VIS==[IS|PAG]TdoLT11==[VIS|PAGT11]TdoLT1norte==[VIS|PAGT1norte]TdoLT21==[TdoLT1i|PAGT21]TdoLT2metro==[TdoLT1i|PAGT2metro]TdoLT31==[TdoLT2j|PAGT31]TdoLT3k==[TdoLT2j|PAGT3k]{\displaystyle {\begin{aligned}VIS&==[IS|P]\\TCL_{T_{1}}^{1}&==[VIS|P_{T_{1}}^{1}]\\&\dots \\TCL_{T_{1}}^{n}&==[VIS|P_{T_{1}}^{n}]\\TCL_{T_{2}}^{1}&==[TCL_{T_{1}}^{i}|P_{T_{2}}^{1}]\\&\dots \\TCL_{T_{2}}^{m}&==[TCL_{T_{1}}^{i}|P_{T_{2}}^{m}]\\&\dots \\TCL_{T_{3}}^{1}&==[TCL_{T_{2}}^{j}|P_{T_{3}}^{1}]\\&\dots \\TCL_{T_{3}}^{k}&==[TCL_{T_{2}}^{j}|P_{T_{3}}^{k}]\\&\dots \\&\dots \\&\dots \end{aligned}}}

Prueba de poda de árboles

Las tácticas de prueba en TTF tienden a generar clases de prueba insatisfactorias. Estas clases deben eliminarse del árbol de pruebas porque representan combinaciones imposibles de valores de entrada; es decir, no se puede derivar ningún caso de prueba abstracto a partir de ellas.

Caso de prueba abstracto

Un caso de prueba abstracto es un elemento que pertenece a una clase de prueba . El TTF indica que los casos de prueba abstractos deben derivarse solo de las hojas del árbol de pruebas . Los casos de prueba abstractos también pueden escribirse como cajas de esquema Z.Opag{\displaystyle Op}sea ​​alguna operación, dejemosOpagvis{\displaystyle Op_{vis}}ser el VIS deOpag{\displaystyle Op}, dejarincógnita1:T1incógnitanorte:Tnorte{\displaystyle x_{1}:T_{1}\dots x_{n}:T_{n}}sean todas las variables declaradas enOpagvis{\displaystyle Op_{vis}}, dejarOpagdo{\displaystyle Op_{c}}ser una clase de prueba (hoja) del árbol de prueba asociado aOpag{\displaystyle Op}, dejarPAG1PAGmetro{\displaystyle P_{1}\dots P_{m}}sean los predicados característicos de cada clase de prueba deOpagdo{\displaystyle Op_{c}}arriba aOpagvis{\displaystyle Op_{vis}}(siguiendo los bordes desde el hijo hasta el padre ), y dejarv1:T1vnorte:Tnorte{\displaystyle v_{1}:T_{1}\dots v_{n}:T_{n}}sernorte{\displaystyle n}valores constantes que satisfacenPAG1PAGmetro{\displaystyle P_{1}\land \dots \land P_{m}}. Luego, un caso de prueba abstracto deOpagdo{\displaystyle Op_{c}}es el cuadro de esquema Z definido por[Opagdo|incógnita1=v1incógnitanorte=vnorte]{\displaystyle [Op_{c}|x_{1}=v_{1}\land \dots \land x_{n}=v_{n}]}.

Véase también

Referencias

  • Stocks, Phil; Carrington, David (1996), "Un marco para pruebas basadas en especificaciones", IEEE Transactions on Software Engineering , 22 (11): 777–793 , doi : 10.1109/32.553698.
  • Utting, Mark; Legeard, Bruno (2007), Pruebas prácticas basadas en modelos: un enfoque de herramientas (1.ª  ed.), Morgan Kaufmann , ISBN 978-0-12-372501-1.
  • Stocks, Phil (1993), Aplicación de métodos formales a las pruebas de software , Departamento de Ciencias de la Computación, Universidad de Queensland, tesis doctoral.

Notas

  1. 1 2 3 4 Stocks y Carrington utilizan el término estrategias de prueba en ( Stocks & Carrington 1996 ) .