Criterio di copertura dei comandi

Un test \(\ T\) soddisfa il criterio di copertura dei comandi se e solo se ogni comando eseguibile del programma è eseguito in corrispondenza di almeno un caso di test \(t \in T\).
La metrica è dunque la frazione di comandi eseguibili su quelli eseguiti dall’intero test.

Consideriamo per esempio il seguente programma in pseudocodice:

Esempio 1: copertura dei comandi
Pseudocodice Diagramma di flusso di esecuzione
01  void main(){
02      float x, y;
03      read(x);
04      read(y);
05      if (x != 0)
06          x = x + 10;
07      y = y / x;
08      write(x);
09      write(y);
10  }

Esempio criterio copertura comandi

È possibile ricostruire un diagramma di flusso di esecuzione del codice trasformando ogni comando in un nodo del diagramma: coprire tutti i comandi significa quindi visitare tutti i nodi raggiungibili.

Applicare il criterio di copertura dei comandi significa quindi trovare un insieme di casi di test in cui per ogni nodo esiste un caso di test che lo attraversa.

Nel nostro esempio il singolo caso di test \( \langle 3, \, 7 \rangle\) risulterebbe quindi sufficiente, dato che la sua esecuzione permette di coprire tutti i comandi del programma. Tuttavia, pur massimizzando la metrica di copertura dei comandi tale test non è in grado di rilevare l’anomalia alla riga 7, in cui viene fatta una divisione senza prima controllare che il divisore sia diverso da zero.

Soddisfare il criterio di copertura dei comando non garantisce dunque la correttezza del programma. Come sappiamo infatti un’anomalia non sempre genera un malfunzionamento, per cui eseguire semplicemente tutte le righe di codice raggiungibili non assicura di rilevare eventuali errori.