L'affermazione che hai citato è vera, ma non direttamente utile a causa della prevalenza degli operatori di cortocircuito nelle lingue moderne. Non è corretto interpretare &&
o ||
in linguaggi di tipo C come operatori logici. Invece, sono operatori di flusso di controllo e un punto di sequenza. Altri linguaggi rendono questo più chiaro (ad es. Il logico and
rispetto al flusso di controllo andalso
in Standard ML).
Per un programma che utilizza solo operatori di cortocircuito, è possibile interpretare la copertura di più condizioni in base alla copertura della diramazione e alla copertura delle condizioni semplice. Quindi, la copertura del percorso include la copertura di più condizioni. Questa interpretazione è sostanzialmente corretta, ma non molto utile.
La copertura di più condizioni non riguarda fondamentalmente il flusso di controllo del programma, ma il flusso di dati . La copertura delle condizioni richiede: i valori di cui sono state trattate le espressioni booleane? La copertura di più condizioni è quindi interessata alle combinazioni di sottoespressioni booleane all'interno di un operatore decisionale. Ai fini del calcolo di questa metrica di copertura, può essere ragionevole ignorare il comportamento di cortocircuito.
Quindi, in una condizione senza cortocircuitare gli operatori booleani o quando si trascura il comportamento di cortocircuito, è chiaro che la copertura completa del percorso per if (a & b) ...
può essere ottenuta con due soli casi (ad esempio a=false, b=false
e a=true, b=true
) , mentre mancano i test per la copertura completa di più condizioni (qui: a=false, b=true
e a=true, b=false
).
Un vantaggio pratico dell'utilizzo della copertura delle condizioni è dimostrare che la condizione può effettivamente influenzare il risultato della decisione. In caso contrario, potremmo inaspettatamente avere un codice morto. Per questo, la copertura multipla delle condizioni non è necessaria, ma la copertura delle condizioni / decisione modificata è sufficiente. Per l'esempio if (a & b)
, avremmo bisogno di tre casi di test per MC / DC: a=true, b=true
; %codice%; %codice%. Pertanto, la copertura del percorso non implica nemmeno la copertura MC / DC.
Un problema con qualsiasi tipo di copertura delle condizioni è che questa metrica può essere facilmente utilizzata utilizzando operatori di flusso di controllo invece di operatori logici. Inoltre, la creazione progressiva di una decisione come a=true, b=false
rende non ovvio come a=false, b=true
e bool d = true; d &= a; d &= b; if (d) ...
contribuiscano alla decisione. Pertanto, le metriche di copertura delle condizioni sono generalmente prive di significato a meno che non siano associate a uno stile di codifica specifico.