Criterio di copertura delle definizioni
Un test \ T soddisfa il criterio di copertura delle definizioni se e solo se per ogni nodo i e ogni variabile x \in \operatorname{def}(i), T include un caso di test che esegue un cammino libero da definizioni da i ad almeno uno degli elementi di \operatorname{du}(i, x).
Ci si vuole cioè assicurare di testare tutte le definizioni, assicurandosi che funzionino osservando almeno un uso del valore da loro assegnato. Matematicamente si può dire che:
\begin{align*} T \in C_{def} \Longleftrightarrow& \forall i \in P, \ \forall x \in \operatorname{def}(i), \ \exists j \in \operatorname{du}(i, \, x), \\ & \exists t \in T \ \text{che esegue un cammino da $i$ a $j$ senza ulteriori definizioni di $x$}. \end{align*}
Riconsideriamo l’esempio già visto in precedenza, considerando la variabile \mathtt{a}:
01 void main() {
02 float a, b, x, y;
03 read(x);
04 read(y);
05 a = x;
06 b = y;
07 while (a != b)
08 if (a > b)
09 a = a - b;
10 else
11 b = b - a;
12 write(a);
13 }
Partiamo definendo gli insiemi dei nodi degli usi \operatorname{du}(i, \, \mathtt a):
- \operatorname{du}(5, \, \mathtt a) = {7, \, 8, \, 9, \, 11, \, 12};
- \operatorname{du}(9, \, \mathtt a) = {7, \, 8, \, 9, \, 11, \, 12}.
È solo un caso il fatto che in questo esempio tali insiemi siano uguali.
Comunque sia, l’obiettivo è per ognuna delle due definizioni ottenere un uso di tale definizione:
- Per la prima definizione la soluzione è banale, a riga 7 la variabile \mathtt a viene letta sempre: \D{5}\U{7}.
- Per la seconda, invece, è necessario scegliere un valore tale per cui il flusso di esecuzione entri almeno una volta nel ciclo ed esegua almeno una volta la riga 9: \D{9}\U{7}.
Un test che soddisfa totalmente il criterio può essere il seguente:
T = { \langle 8, \, 4 \rangle }.
Come si vede, il criterio di copertura delle definizioni non copre tutti i comandi e di conseguenza non implica il criterio di copertura dei comandi.